บทความหลักที่อธิบายปัญหา รวมทั้งโปรแกรมทั้งหมดฉบับสมบูรณ์ดูได้ที่นี่ครับ
https://www.kaggle.com/pednoi/image-segmentation
มีคำถามอะไรเพิ่มเติมสามารถโพสต์ถามข้างล่างได้เลยครับผม
UPDATE (2020): ในส่วนล่างของบทความเราได้พูดคุยกับคุณ cc8 และได้แนะนำ segmentation model ที่ดีมากๆ อีกโมเดลหนึ่งชื่อว่า U-Net ครับผม
ตัวอย่างเพิ่มเติมการใช้ Mask-RCNN กับปัญหา Wheat Detection (ตรวจจับรวงข้าว) https://www.kaggle.com/ipythonx/keras-global-wheat-detection-with-mask-rcnn/
----
เพิ่มเติมเรื่อง Segmentation
Introduction to Image Segmentation by Jeremy Jordan ครับ ละเอียดดีมาก
https://www.jeremyjordan.me/semantic-segmentation/
แล้วก็ Implementation ของ loss functions ต่างๆ ใน TF/Keras
https://lars76.github.io/neural-networks/object-detection/losses-for-segmentation/
ณ เดือน 8 2019 , Kaggle นั้นมี Segmentation Competitions ถึง 4 การแข่งขันพร้อมๆ กัน อาทิเช่น
ทำ segmentation ของ จุดผิดปกติในปอดคนเราว่าป่วยอยู่หรือไม่
หาจุดที่เหล็กขึ้นสนิม
detect เมฆบนฟ้าใน 4 รูปแบบเพื่อทำความเข้าใจความเชื่อมโยงระหว่างเมฆ อุณหภูมิ และภาวะโลกร้อน
เราจะมาเซอร์เวย์การแข่งขันนี้เหล่านี้กันในอนาคตครับ
เนื่องด้วยผมสนใจปัญหาด้าน multiclass image segmentation คล้ายกับงานที่ทางเว็บไซต์ได้นำเสนอใน Workshop : iFashion 2019 — ได้เวลาให้ AI วิเคราะห์แฟชั่นด้วย Keras Mask-RCNN โดยผมมีคำถามเกี่ยวกับการ Prepare Dataset ของปัญหา multiclass image segmentation ซึ่งผมมีข้อมูลรูปภาพ และส่วนของ Mask แต่ไม่รู้วิธีการทำ label ที่มีส่วนของ class และ mask ดังนั้นจึงอยากให้ช่วยแนะนำวิธีการเตรียม dataset ให้เป็นไฟล์ เช่นเดียวกับไฟล์ label_description.json , ไฟล์ train.csv (ที่มีข้อมูลของ imageId, EncodedPixel, Hight, Width, class), และไฟล์ sample_submission.csv เหมือนใน workshop หรือ แนะนำวิธีการอื่น ๆ เพื่อจัดการกับข้อมูลครับ
สวัสดีครับคุณ @neural-engineer ผมทำปัญหาด้าน image segmentation ปัจจุบันผมมีข้อมูล ที่เป็นภาพ DICOM file และภาพ mask (png file) ที่ได้จาการเตรียมจาก DICOM structure contour คล้ายกับที่แสดง ดังภาพ
(ซ้าย)ภาพ DICOM file ที่จะเป็น input (ขวา) ภาพแสดง DICOM structure contour ที่ใช้เตรียม mask ที่แสดงด้านล่าง
ภาพ mask ที่จะใช้ train ส่วนของ tumor
ภาพประกอบจาก https://github.com/KeremTurgutlu/dicom-contour/blob/master/tutorial.ipynb
ปัญหาของผมคือผมต้องการ prepare dataset ในส่วนของ label ที่มีอยู่สองส่วน คล้ายกับที่ทางบอร์ดได้อธิบายไว้ใน work shop ได้แก่
- ส่วนของ class ที่ประกอบไปด้วย category เป็นประเภทของส่วนที่ต้องการ segmentation เช่น tumor, brain, eye …
- ส่วนของ mask ที่จะบอกว่าวัตถุคลาสต่าง ๆ ประกอบได้ด้วย pixel ไหนบ้าง
ซึ่งจากที่อ่านใน work shop ในขั้นตอน 2.4 Prepare Dataset ผมเห็นข้อมูลในส่วน ไฟล์ label_desscriptions.json , ไฟล์ train.csv (ที่มีข้อมูลของ imageId, EncodedPixel, Hight, Width, class), และไฟล์ sample_submission.csv
ผมเข้าใจว่าข้อมูลในลักษณะของผมสามารถเตรียมให้เป็นของมูลแบบใน work shop ก่อนจึงจะสามารถใช้เทรนโมเดลได้ จึงอยากรบกวนให้ช่วยอธิบายการเตรียมข้อมูลในลักษณะของผมหน่อยครับว่าจะต้องเตรียมข้อมูลอย่างไร เพื่อที่จะใช้เทรนโมเดลครับ
ขอบคุณคุณ @cc8 สำหรับข้อมูลเพิ่มเติมครับ
ตามที่คุณ cc8 เล่ามาแสดงว่าใน dicom 1 รูป เราอาจจะมี contour structure หลายรูป (หลายชนิด contour) ถูกต้องไหมครับ? ในไฟล์ label_descriptions.json นี้เราสามารถพิมพ์เขียนแบบ manual ได้เลยครับ เพราะหลักๆ คือการนิยาม class (ชนิดของ contour) เข้าใจว่ามีไม่กี่ประเภท ดังนั้นเราน่าจะสามารถพิมพ์เองได้ภายในเวลาอันสั้น
ส่วนใน train.csv นั้น จะมีอยู่ 1 column ที่ต้องเขียนฟังก์ชันนั่นคือ EncodedPixels ที่ใช้วิธี rle (run-length encoding) ซึ่งเป็นการเข้ารหัส mask แบบกระชับเพื่อประหยัดพื้นที่ครับ ซึ่งกรณีที่คุณ cc8 มี mask อยู่แล้วสามารถเรียกใช้ function mask2rle ได้เลยครับ ซึ่งสามารถ copy function ตาม kernel นี้ครับ
https://www.kaggle.com/paulorzp/rle-functions-run-lenght-encode-decode
เมื่อได้ rle แล้วเพื่อความชัวร์ ลองแปลง rle ที่ได้กลับเป็น mask แล้วลอง visualize ดูอีกครั้งเพื่อ recheck ความถูกต้องครับ เช่นตัวอย่างจาก kernel นี้ก็ได้ครับ
https://www.kaggle.com/titericz/building-and-visualizing-masks
สำหรับ columns อื่นๆ ใน train.csv เช่น height/width ก็เป็นเพียงขนาดของรูป หรือ class ซึ่งก็เป็นตามประเภทของ contour ซึ่งเราสามารถกำหนดได้ตามข้อมูลที่เรามีอยู่แล้ว
ในการวนลูปสร้าง train.csv จาก file รูปที่เรามีทั้งหมดนั้น เราอาจใช้โมดูล glob ซึ่งจะช่วยในการ browse path ทั้งหมดได้ง่ายๆ เลยครับ ซึ่งในรูป contour structure ของแต่ละรูปควรจะมีชื่อ label ของ contour นั้นๆ กำกับอยู่ เช่น ถ้ารูปปกติชื่อ pic1.dcm รูปที่แสดง contour อาจจะชื่อ pic1_label1.dcm เป็นต้น ซึ่งแสดงคร่าวๆ ดัง pseudo code นี้ครับ
import glob paths = glob.glob(DIR_DICOM+“*.dcm”) class_list, h_list, w_list = [],[], [] rle_list = [] for path in paths: if normal_picture: continue img = read_dcm(path) height, width = img.shape if ‘label1’ in path: class = label1 elif .... : #all labels rle = mask2rle(....) class_list.append(class) h_list.append(height) w_list.append(width) rle_list.append(rle) train_df = pd.DataFrame({"EncodedPixels": rle_list, "label": class_list, "width": w_list, "height": h_list}) train_df.to_csv('train.csv')