Dairy
[Dairy] 6 weeks internship as AI Model Developer
บอกเล่าประสบการณ์การไปฝึกงานในฐานะAI Model Developer
.png&w=3840&q=75)
โปรเจคนี้เกิดจากการมาฝึกงานที่Singapodent Digitalที่ประเทศเวียดนามโดยMVPของโปรเจคนี้คือทำAiสำหรับplotจุดlandmarkบนภาพx-rayฟัน 2 มิติ(Cephalogram image — ในเนื้อหานี้จะเขียนย่อเหลือแค่ceph) และนำไปแสดงผลเป็นdashboard และหากมีเวลาเหลือจะมีการแสดงผลลัพท์ การวัดต่างๆตามที่คลินิกต้องการอีกที โดยการฝีกงานเป็นระยะเวลาทั้งหมด 6 สัปดาห์
โดยช่วงก่อนเริ่มผมได้ไปเทคคอร์ส AI for Medical Diagosis ประมาณ1สัปดาห์ก่อนเริ่มงาน ถึงแม้จะเรียนไม่จบ😅 เนื่องจากเนื้อหาหลังๆไม่ได้สอดคล้องกับงานที่ทำขนาดนั้น แต่ก็ทำให้ได้รู้ถึงการจัดการDataในมุมMedical รวมถึงปัญหาต่างๆที่มักจะเจอในMedical field
Week 1: ผมบินถึง HCMC วันที่ 2026–04–26 ซึ่งอาทิตย์แรกด้วยความที่อาทิตย์นี้เป็นเหมือนวันหยุดใหญ่ของเวียดนาม (วันกษัตริย์หุ่ง, วันปลดปล่อย-วันรวมประเทศ, วันแรงงาน, วันชาติ) เลยได้แค่เข้าคลินิคไปรวบรวมข้อมูล พูดคุยกับsupervisorที่คุมงาน ทำLiterature reviewและวางแผนสำหรับงาน โดยตอนแรกที่คุยกับsupervisorผมคาดว่าจะมีdataประมาณ 500–600 ซึ่งถือว่าปานกลางสำหรับโจทย์ของผม
หลักๆของอาทิตย์แรกคือการศึกษาและทำความเข้าใจฝั่งOrthondotistเช่นการtracing หรือtoolที่หมอมักใช้ในปัจจุบันเช่น Webceph
Week 2: วันแรกของอาทิตย์นี้มีการประชุมอีกรอบและสรุปภาพรวมของโปรเจค ซึ่งมีการเปลี่ยนแปลงเล็กน้อยที่scopeงานเล็กลง โดยสรุปงานที่ผมต้องทำทั้งหมดคือ
- Setup Cvat Local สำหรับให้Orthotontistเข้ามาannotation dataเพราะdataปัจจุบันยังเป็นraw data (มีหมอ3–4คน ซึ่งversion onlineที่ใช้ฟรีใช้ได้แค่2คน)
- สร้างmodelสำหรับ
Landmark Detection (10จุด)
- - Upper_tip X
- - Upper_ape
- - Labial_midroot
- - Palatal_midroot
- - Labial_crest
- - Palatal_crest
- - PNS แกนnormal อยู่ด้านใน X
- - ANS แกนnormal X
- - Palatal Bone
- - Labial Bone
Segmentation (3 class)
- - Upper incisor
- - Labial cortical bone
- - Palatal cortical bone
3. คำนวณผลที่คลินิกต้องการ รวมถึงเอาไปทำclassification ไม่ว่าจะเป็นการวัดแต่ละพาร์ทของกระดูกกับฟันเพื่อนำระยะห่างไปclassification (Bone Thickness) การเอียงของฟัน และอื่นๆ~
4. นำผลลัพท์ที่ได้ไปแสดงผลเป็นdashboard
โดยสุดท้ายผมได้dataมาทั้งหมด 382 ภาพ ในวันพุธที่ 2026–05–27 ซึ่งถือว่าค่อนข้างน้อยถ้ามองในมุมงานการแพทย์ที่ต้องการความแม่นยำสูง หลักๆที่ผมทำอาทิตย์แรกคือsetup cvatและสอนหมอแต่ละคนใช้cvatสำหรับannotation รวมถึงตัวหมอเองแต่ละคนที่ค่อนข้างยุ่งเนื่องจากคลินิกคนไข้เข้ามาปกติ
Week 3–4: อาทิตย์นี้เป็นอาทิตย์ที่ค่อนข้างชิว เนื่องจากยังไม่ได้dataจากหมอสิ่งที่ผมทำไปได้แก่
- เตรียมdata pipelineทั้งหมด ประกอบด้วย
- Calibrate จากpixel -> mm เพื่อการวัดค่า
- Data Augmentation (ไม่หันภาพซ้ายขวาเนื่องจากงานจริงเป็นภาพxrayที่กระโหลกหันขวาตลอด)
2. เตรียมpipeline สำหรับtrain model
- ผมเลือกใช้HRNet-W32ซึ่งเป็นpretrain modelที่นิยมในงานceph
- เลือกใช้loss fucntion เป็น adaptive wing loss เนื่องจากภาพcephส่วนที่เราโฟกัสจริงๆคือฟันซึ่งเป็นแค่ส่วนเล็กๆในภาพ ทำให้การทำlandmark detectแม่นยำขึ้น
3. เตรียมการสำหรับการวัดฟัน ซึ่งlogicในการวัดส่วนใหญ่ไม่ได้มีอะไรมาก ถ้าเราสามารถแปลงจากpixelเป็นmmได้แม่นยำ และโมเดลเราทำงานได้ดี
อาทิตย์ที่3มีการdiscussกันเล็กน้อยเรื่องการวัดbone thicknessว่า เราควรวัดยังไง อย่างคลินิกก็มีวิธีวัดของเค้า แต่ผมเองก็ไปเจอreportที่ใช้อีกแบบนึง แต่สุดท้ายก็จบด้วยทำทั้ง2วิธีไปเลย
4. ทำwebapสำหรับshow dashboard โดยversionแรกหมอต้องการแค่ให้show dashboard แต่เนื่องจากmodelของเราอาจไม่ได้แม่นมาก เลยเพิ่มฟีเจอร์สำหรับการeditจุดต่างๆที่modelเราplotให้ได้ด้วย ซึ่งจุดนี้เป็นงานที่ผมไม่ถนัดสุดๆเลยใช้Generative Aiอย่าง Sonnet 4.6 มาช่วยด้วย
ซึ่งช่วงท้ายๆของweek3ผมมีdataบ้างแล้วประมาณ 92 ภาพ ซึ่งก็ได้เอามาลองtrainแล้วแต่เนื่องจากภาพน้อยมาก จึงแทบใช้วัดผลอะไรไม่ได้มาก
Week 5: อาทิตย์นี้เรียกว่าเป็นช่วงที่เดือดสุดๆ ผมจำได้ดีเลยว่าผมได้dataที่annotateทั้งหมดตอนวันที่ 2026–05–25 ตอน2ทุ่ม แต่ประเด็นคือมันจะมีบางภาพที่คุณภาพไม่ถึง หรือเห็นไม่ชัดเนื่องจากมีวัติถุอื่นบังทำให้ภาพที่ใช้ได้จริงๆมีประมาณ 27X ภาพ (Quality Reject)
เรียกว่ารีบเร่งเครื่องสุดๆ สำหรับการtrain โดยรวมการtrainใช้เวลาค่อนข้างนาน ลองผิดลองถูกผลสุดท้ายก่อนจบอาทิตย์นี้คือ ตัวlandmark detectที่ใช้HRNet-W32มาpretrainทำ MREไปได้ 1.72mm ซึ่งถือว่าค่อนข้างสูง ในขณะที่segmentation modelซึ่งใช้Deeplabสำหรับpretrainทำได้ไม่ดีมากแต่เนื่องจากระบบสามารถeditจุดได้ จึงคิดว่าอย่างน้อยแค่ช่วยประหยัดเวลาหมอนิดนึงก็ยังพอได้
แต่สุดท้ายเอาไปส่งเรียกว่ามีสิ่งที่ต้องแก้เยอะมาก ทั้งrequirementเรียกว่าโดนแก้ยับ ความแม่นยำของโมเดลที่ไม่ถูกใจเท่าไหร่ เนื่องจากเรามี2 modelทำงานพร้อมกัน และผลลัพท์มันต้องrelateกัน ประเด็นแรกคือก่อนหน้านี้ผมได้ทำpre-prosessingที่ทำให้จุดlandmarkกับsegmentationที่วงได้ ไม่เหลือบกัน ซึ่งการเป็นว่าระบบนี้สร้างปัญหาให้กับความแม่นยำ รวมถึงความยากของหมอที่จะต้องแก้ ทำให้ทุกอย่างต้องมาจบที่อาทิตย์สุดท้าย
Week 6: ช่วงเวลานั้นผมค้นหาmodelท๊อปที่ขึ้นชื่อมาลองหมดแต่ก็แทบไม่มีโมเดลไหนที่มีท่าทีจะใช้ได้เนื่องจากmodelส่วนใหญ่เป็นtransformerแต่dataที่เรามีจำกัดมากทำให้ทำงานได้ดีไม่เท่าที่ควร สุดท้ายจบที่
YOLOv12-pose
ว่ากันตามตรงถ้ามองในมุมการวิจัยผมคิดว่าสิ่งที่ผมทำในอาทิตย์สุดท้ายค่อนข้างผิดหลักวิชาการหลายจุด เนื่องด้วยเวลาที่จำกัด ผมใช้YOLOสำหรับการcropภาพให้ไปโฟกัสแค่ที่ฟันเพื่อให้modelต่างๆสามารถโฟกัสไปแค่ที่ฟันอย่างเดียวไม่ต้องสนbackgroundโดยสำหรับlandmarkผมใช้ HRNet-W32เหมือนเดิมแต่เพิ่มepochในการtrain MREที่ทำได้อยู่ที่ 1.62 mm รวมถึงผมใช้ K-fold validation (K=5) ผมจึงนำทั้ง5modelมาทำensembleด้วย แต่เนื่องจากขั้นตอนการตรงนี้พึ่งคิดได้ทีหลัง ผมจึงไม่มีdataสำหรับtestผลลัพท์ได้ และsegmentationผมเปลี่ยนมาใช้nnU-Net ซึ่งได้Diceถึง 0.83 และแน่นอนว่าจับมาทำensembleเหมือนเดิม
ที่ผมทำทั้งหมดนี้ผ่านไปแปปๆก็ถึงวันศุกร์ที่ 2026–06–05 ใช่ครับวันสุดท้ายของการฝึกงาน เรียกว่าปั่นทุกอย่างและแน่นอนว่าถ้าขาดaiช่วยก็คงสาหัสอย่างมาก
โดยรวมการฝึกงานครั้งนี้ด้วยข้อจำกัดต่างๆ ผมคิดว่าผมยังทำได้ไม่เต็มที่ทั้งเรื่องด้วยเวลา ข้อมูล และสภาพแวดล้อม แต่ผมก็ได้ประสบการณ์อย่างมากในการมาทำงานในฝั่งcomputer visionครั้งแรก ขอบคุณอาจารย์ แพทย์ (Orthodontist) และทุกคนในบริษัทSingdentที่ให้ผมได้รับประสบการณ์ครั้งนี้
Read the next thing.
New articles, projects, Interactive Labs, and occasional professional or site announcements, primarily in Thai, with no more than one routine email a week.