Microplastic detection and collect statistical tebular data.

Kong Wongpattanawut
4 min readJun 20, 2022

โดย นายภานุวัฒน์ วงศ์พัฒนวุฒิ สังกัด Mysterious-hedgehogs

ที่ปรึกษาโปรเจค :

  • นพ.ปิยะฤทธิ์ อิทธิชัยวงศ์ (นักวิจัยด้านปัญญาประดิษฐ์ในภาพถ่ายทางการเเพทย์ รพ.ศิริราช ปัจจุบันศึกษาต่อระดับปริญญาเอก ที่ รพ.St.Thomas,King’s College London)
  • นายณัฐพล ไตรจักร์วนิช(นักวิจัยด้าน Transformer เเละ NLP ปัจจุบันศึกษาต่อระดับปริญญาเอกที่ VISTEC)

Github:https://github.com/kongonggong

ปัจจุบัน นี้เทคโนโลยีมีความสำคัญต่อการดำรงชีวิตเพราะวิวัฒนาการเหล่านั้นแทรกซึม อยู่ในทุกตารางการใช้ชีวิตของมนุษย์ เพราะมนุษย์มีการพัฒนาคิดค้นสิ่งอำนวยความสะดวกสบายต่อการดำรงชีวิตเป็นอัน มาก เทคโนโลยีได้เข้ามาเสริมในศาสตร์ด้านต่างๆ เช่นในการตรวจจับวัตถุ หรือ Objecject detection.

ไมโครพลาสติก (Microplastics) คืออะไร

ไมโครพลาสติก (Microplastics) คือ อนุภาคพลาสติกที่มีขนาดเส้นผ่าศูนย์กลางเล็กกว่า 5 มิลลิเมตร มักเกิดจากการย่อยสลายหรือแตกหักของขยะพลาสติกขนาดใหญ่ หรือเกิดจากพลาสติกที่มีการสร้างให้มีขนาดเล็ก เพื่อให้เหมาะกับวัตถุประสงค์การใช้งาน ส่วนใหญ่มีรูปร่างทรงกลม ทรงรี หรือบางครั้งมีรูปร่างไม่แน่นอน

ที่มา:https://www.sciencedirect.com/science/article/pii/S0025326X19302036

ประเภทของไมโครพลาสติก

ที่มา: https://microplasticresearch.wordpress.com/what-is-microplastic/

เเบ่งตามลักษณะได้ 5 ประเภท

เฟรกเมนต์: อนุภาคที่เกิดจากชิ้นพลาสติกขนาดใหญ่ พวกมันมาในรูปทรงและสีที่หลากหลาย แฟรกเมนต์เป็นรูปร่างที่เกิดขึ้นมากที่สุด

เม็ด: อนุภาคที่เกิดจากเม็ดเรซินอุตสาหกรรม อาจเป็นทรงกระบอกหรือทรงกลมทั้งนี้ขึ้นอยู่กับสภาพดินฟ้าอากาศ โดยทั่วไปแล้วจะเป็นสีขาวโปร่งแสง แต่ก็สามารถเกิดขึ้นได้ในหลากหลายสี

ฟิล์ม: พลาสติกบาง ยืดหยุ่นเหมือนแผ่น มักมาจากถุงพลาสติก ฟอยล์พลาสติก หรือวัสดุบรรจุภัณฑ์อื่นๆ บางครั้งก็ยากที่จะแยกแยะระหว่างชิ้นส่วนที่บางเหมือนแผ่นหรือฟิล์มพลาสติก

โฟม: พลาสติกชนิดใดก็ได้ที่มีโครงสร้างเป็นโฟม ซึ่งอาจเป็นเช่น โฟมหรือพลาสติกขยายตัวหรือโฟมอื่นๆ เช่น โพลิสไตรีน (PS) โพลิเอทิลีน (PE) หรือโพลิไวนิลคลอไรด์ (PVC)

ไฟเบอร์: พลาสติกเส้นใยชนิดใดก็ได้ เส้นใยสังเคราะห์ส่วนใหญ่มาจากการซักเสื้อผ้า (Napper & Thompson 2016) การประเมินเส้นใยสังเคราะห์ในตัวอย่างอย่างถูกต้องอาจเป็นเรื่องยาก เนื่องจากอาจเกิดจากการปนเปื้อนทุติยภูมิจากอากาศหรือเสื้อผ้าของผู้แปรรูปตัวอย่าง

Dataset image

การพัฒนา model ครั้งนี้ ผู้จัดทำการเก็บตัวอย่างมาจากเเหล่งน้ำต่างๆในจังหวัดมุกดาหาร 6 เเหล่ง เเละนำมาถ่ายในไมโครสโคป ยี่ห้อ Olympus CX23 กำลังขยายเลนส์ใกล้ตา 10x ใกล้วัตถุ 4x

ผู้จัดทำได้ทำการเเบ่งชุดข้อมูลเป็น train , validation เเละ Testset ถูกเก็บใน floder ดังนี้

Dataset
-train
-image
-label
-val
-image
-label

จากDatasetทั้งหมดจำนวนโดยผ่านการAugmentation 349 ภาพ เป็น trainset 174 จำนวน ภาพใน folder train , validationset จำนวน 75 ภาพในfolder val โดยที่ชื่อไฟล์ระหว่าง image กับ label ต้องเหมือนกันด้วยนะ!

จำนวน Data ในเเต่ละคลาส จะเห็นได้ว่าคลาส Fibers เเละ Pellets มีจำนวนเยอะมาก ทำให้เกินความ Imbalance ของ Data ขึ้นมา เเม้จะทำการAugmentation เเล้วก็ตามเเละในอนาคตจะทำให้เเก้ความ Imbalance ด้วยเทคนิคต่างๆ

code ในการทำ Augmentation

Dataset_aug
-all
-image
-label
#########################################################################flip บนลงล่าง ############import pandas as pdimport sysimport osimport globfrom PIL import Imagen=0r = 0for i in glob.glob("/content/drive/MyDrive/microplastic/dataset/all/*.jpg"):# เปลี่ยนเป็นชิื่อไฟล์i = os.path.splitext(i)[0]file = i + '.jpg'if os.path.isfile(file):#df = pd.read_table('/content/drive/MyDrive/microplastic/dataset/val/labels/microplastic(29).txt',sep=' ')##print(df)file_txt = i+'.txt'with open(file_txt) as file:lines = file.readlines()for line in lines:line = (line.split(" "))while '\n' in line: line.remove('\n')df = lineval= dftry: # ใช้ทำต่อเพื่อผ่านเมื่อมีข้อยกเว้นเกิดขึ้นval=list(map(float, val))except:continueval[2]=1-val[2] # y การแปลงแบบบนลงล่างprint(int(val[0]),end=' ')print(val[1],end=' ')print(val[2],end=' ')print(val[3],end=' ')print(val[4]) # ที่นี่ หากคุณสร้างช่องว่าง yolo จะไม่รู้จักพื้นที่นั้น และไม่เป็นไรถ้าไม่ใช่ทศนิยม 6 ตำแหน่งr= r+1if(r == len(lines)):r = 0sys.stdout = open("/content/drive/MyDrive/microplastic/dataset/all/arg_tb_{}.txt".format(n),'w')#image = Image.open(i+'.jpg')## image.show()FlipImage = image.transpose(Image.FLIP_TOP_BOTTOM) #หมุนภาพบนลงล่าง เเละ เซฟFlipImage.save("/content/drive/MyDrive/microplastic/dataset/all/arg_tb_{}.jpg".format(n))# เซฟ txt filen += 1else:continue

ภาพตัวอย่าง dataset

Model

สำหรับ Model ผู้ศึกษาได้เลือกใช้ นั้นก็คือ yolov5 ที่สามารถใช้งานง่าย สะดวกรวดเร็ว ที่เป็นlibary ขนาดใหญ่ภายในมีโมเดลคุณภาพสูง จาก Torchvision เเละ Pytorcch image Models เเละยังสามารถ train ด้วย Pytorch-Lightingเเละ Fastaiได้อีกด้วย ครั้งนี้ผู้จัดทำ ได้ใช้ 2 weight ได้เเก่ yolov5 lเเละ yolov5 x เพราะมีความเเม่นยำที่สูง โดยที่ นำ 2 โมเดลนี้มาศึกษาเพราะ yolov5 xที่ได้ประสิทธิภาพสูงกว่า เเต่yolov5 l ที่มีความไวในการประมวลผลกว่าเราจะเลือกใช้ตัวไหน

ที่มา : https://github.com/ultralytics/yolov5

ที่มา :https://www.google.com/url?sa=i&url=https%3A%2F%2Fgithub.com%2Fultralytics%2Fyolov5%2Fissues%2F6094&psig=AOvVaw0kTF7kEszv9rYbe4-DjhVW&ust=1655912837726000&source=images&cd=vfe&ved=0CA0QjhxqFwoTCODdmZfyvvgCFQAAAAAdAAAAABAD

ต่อมาเราจะมาบอก Modelให้ทราบได้ว่า path เก็บข้อมูลอยู่ที่ไหน , จำนวน class , เเต่ละ class มีชื่ออะไรบ้าง ใน file ที่เราสร้างขึ้นมา โดยผมสร้างขึ้นมาชื่อ custom_data.yaml(เข้าไปที่folder yolov5 > data>custom_data.yaml) ใส่ Path ข้อมูลของเราลงไป พร้อมเเก้ไขclass ให้เป็น class ของเราได้เลย

train: ../train/images #path train image
val: ../valid/images #path valid
nc: 6 # จำนวนคลาส
names: ['FRAGMENT','FLAKES','LINES','PELLETS','FIBERS',"FOILS"]#ชื่อคลาส

เมื่อเราทำการ save ไฟล์ custom_data.yaml ที่เเก้ไขไปข้างต้นเรียบร้อยเเล้ว ขั้นตอนถัดมาจะเป็นการ train model อย่างที่บอกไปผมใช้ model yolov5 lเเละ yolov5 x

ต่อมาเมื่อเราเลือกโมเดลเป็นที่เรียบร้อยเเล้วในขั้นตอนนี้เราจะใช้คำสั่งดังนี้เพื่อเริ่มทำการ train โมเดล โดยกำหนดให้

  • img(ขนาดรูป)=640
  • batch (ขนาด batch size) = 16
  • epochs(จำนวนที่ใช้รัน) = 25
  • data(ตำเเหน่งconfiguration file) = custom_data.yaml
  • weights(โมเดลที่เราเลือก) = yolov5x, yolov5l
!python train.py --img 640 --batch 16 epochs 25 --data custom_data.yaml --weights yolov5x.pt --cache

สามารถดูผลลัพธ์ได้ที่ yolov5/runs/detect เเละนี่คือตัวอย่างผลลัพธ์ที่ได้หลังจาก train เสร็จเรียบร้อยเเล้ว

สรุปจากผลจากโมเดลyolov5ทั้ง 2 ชนิด จะพบว่าโมเดล yolov5x มีประสิทธิภาพสูงกว่าyolov5l ค่อนข้างมากโครงงานนี้จึงเลือก yolov5x ในการใช้งาน

ตารางเปรียบเทียบประสิทธิภาพ yolov5x, yolov5l

จาก confusion mattrix ของweight yolov5 x เนื่องจากจำนวน Dataset มีน้อย เละ Imbalance มากๆจึงทำให้เกิด ข้อผิดพลาดขึ้น

กราฟเเสดงความผิดพลาดของโมเดลต่อจำนวนการเทรน

ตัวอย่างผลลัพธ์การทดสอบ สามารถจำเเนกประเภทได้ครบถ้วนเเละถูกต้อง เเต่ก็มีคลาสที่ผิดอยู่บ้างจากการทดสอบเเต่ถือว่าอยู่ในระดับที่รับได้ครับ

เเละนำไป deploy เป็น web application โดยใช้ Stremlit

โดย สามารถ วัดขนาดเส้นผ่านศูนย์กลาง ผ่านโค้ด เเละกำลังขยายที่ user ใส่

zoom = [1,2,3,4,10,20,40,60,100]# กำลังขยายarea_px = math.sqrt((int(xmax)-int(xmin))**2)+((int(ymax)-int(ymin))**2)# คำนวณเส้นผ่านศูนย์กลางจากมุม bboxRATIO_PIXEL_TO_MM = 78*10*ep_zoom*ol_zoom # 78 pixels are 1cm multiply zoom and 10 to covert to mmlength = round(area_px/RATIO_PIXEL_TO_MM, 2) คำนวณเส้นผ่านศูนย์กลางเเปลงเป็น mm

เเละเก็บข้อมูลเป็นตาราง csv สามาดาวโหลดได้ที่ปุ่ม Download Zip

การใช้รูปภาพรูปเดียวในการ จำเเนกประเภทไมโครพลาสติก

การใช้webcamในการ จำเเนกประเภทไมโครพลาสติก

project นี้จัดทำขึ้นภายใต้การดูเเลของโครงการ AI Builders 2022 ที่ช่วยสนับสนุน เเนะนำ เเละสอนให้เราสามารถพัฒนา AI เพื่อเเก้ปัญหาเเละนำไปประยุกต์ใช้ในชีวิตจริงได้

--

--