AI ก็ช่วยชีวิตคนได้! สร้างโมเดลช่วยทำนายโรค Alzheimer’s จากภาพ MRI ด้วย fastai
Github: https://github.com/Pinkshepz/Alzheimers-Class
Dataset: kaggle/alzheimers-dataset-4-class-of-images
ในปัจจุบันเทคโนโลยีปัญญาประประดิษฐ์ได้รับการพัฒนาอย่างก้าวกระโดด แต่จะดีแค่ไหนหากเราสามารถนำ AI มาเป็นเครื่องมือในการช่วยชีวิตคนได้ !
🧠 เมื่อพูดถึงโรคทางสมอง เชื่อว่าหลาย ๆ คนคงนึกถึงโรคอัลไซเมอร์ ซึ่งเป็นโรคที่เราคุ้นหูคุ้นตาเป็นอย่างมาก แต่รู้หรือไม่ว่าโรคนี้ร้ายกว่าที่เราคิดอย่างสิ้นเชิง
โรค Alzheimer’s
โรคอัลไซเมอร์ถือว่าเป็นหนึ่งในโรคที่ร้ายที่สุดก็ว่าได้ เพราะนอกจากจะทำให้ความทรงจำอันแสนมีค่าของเราหายไปแล้ว ยังเป็นโรคที่เกิดขึ้นและแอบซุ่มอยู่แบบเงียบ ๆ ทำให้คนส่วนมากคิดว่ามันเป็นแค่การหลงลืมเมื่ออายุมากขึ้น จะรู้ตัวอีกทีก็เข้าระยะรุนแรงแล้วซึ่งตอนนี้ก็ยังไม่มียารักษาให้หายขาด ;-;;
นอกจากนั้นในปัจจุบันยังไม่มีการวินิจฉัยโรคอัลไซเมอร์ที่ยืนยันผลการตรวจได้ 100% ทำให้หมอต้องใช้เครื่องมือและวิธีการตรวจจำนวนมากเพื่อใช้ประเมินดูว่าผู้ป่วยมีความเสี่ยงที่จะเป็นโรคมากแค่ไหน
โดยหนึ่งเครื่องมือและวิธีการที่หมอมักใช้ตรวจทำนายโรคหลัก ๆ นั่นก็คือการถ่ายภาพสมองด้วย Magnetic Resonance Imaging หรือ MRI นั่นเอง
โดยในการอ่านและแปลผลภาพ MRI นั้นจำเป็นต้องอาศัยบุคลากรผู้เชี่ยวชาญในการอ่าน features ต่าง ๆ ของภาพ ดังนั้นจึงเป็นโอกาสที่ดีในการนำ AI มาใช้ในการช่วยทำนายโรคผ่านภาพถ่าย MRI ที่นอกจากจะช่วยแบ่งเบาบุคลากรทางการแพทย์แล้วยังช่วยเพิ่มประสิทธิภาพในการทำนายโรคอัลไซเมอร์ให้ดียิ่งขึ้น
ในการสร้างโมเดลเราเลือกใช้ fastai v2 ซึ่งเป็น high-level API ที่ถูกสร้างบน pytorch โดยสาเหตุที่เลือกเพราะว่า fastai มีความยืดหยุ่นสามารถใช้ได้กับงานได้หลายระดับตั้งแต่ระดับ beginner จนถึงระดับที่ใช้ในอุตสาหกรรม อีกทั้งยังมีการปรับแต่งเพื่อการเทรนโมเดล เช่น data augmentation, learning rate finder, gradual unfreezing และ one-cycle learning rate schedule เพื่อเพิ่มประสิทธิภาพของโมเดลได้ง่าย ๆ อีกด้วย
Dataset MRI Image
ในการพัฒนา model ครั้งนี้ เราได้นำ dataset มาจาก Kaggle ตาม link นี้เลยย
>> kaggle/alzheimers-dataset-4-class-of-images <<
Dataset ประกอบด้วยรูปภาพถ่าย MRI ของสมองผู้ป่วย ซึ่งแบ่งเป็นสี่กลุ่มตั้งแต่กลุ่มปกติจนถึงกลุ่มที่มีภาวะสมองเสื่อมระดับปานกลางได้แก่ NonDemented, VeryMildDemented, MildDemented และ ModerateDemented
โดยในชุดข้อมูลพบว่ามีการแบ่งเป็น train กับ test set และถูกเก็บใน floder ต่อไปนี้
images
- train
- NonDemented: 2560 images
- VeryMildDemented: 1792 images
- MildDemented: 717 images
- ModerateDemented: 52 images - test
- NonDemented: 640 images
- VeryMildDemented: 448 images
- MildDemented: 179 images
- ModerateDemented: 12 images
ต่อมาเราก็จะมาสร้าง DataBlock เพื่อไว้จัดการกับข้อมูลรูปภาพ โดยกำหนดรายละเอียดของตัวแปรต่างๆ รวมถึงการทำ data augmentation เพื่อเพิ่มจำนวนรูปภาพที่ใช้เทรนโมเดลและช่วยให้โมเดลเรียนรู้รูปภาพในมุมมองที่แตกต่างทำให้ประสิทธิภาพในการแยกแยะดีขึ้น
โดยเราจะแบ่ง dataset ออกเป็น train กับ validation set อย่างสุ่มด้วยอัตราส่วน train:valid = 80:20 ด้วย RandomSplitter
นอกจากนั้นเราพบว่ารูป MRI ของเรามีขนาด 176*208 ซึ่งเป็นขนาดที่ยังไม่เหมาะ เพราะเราจะใช้ model resnet ซึ่ง input ของโมเดลนี้ต้องใช้ขนาด 224*224 เราจึงต้องปรับขนาดรูปให้เป็นไปตามที่ต้องการ
splitter = RandomSplitter(valid_pct=0.2, seed=42)dblock = DataBlock(
blocks=(ImageBlock, CategoryBlock), # (รูป, label)
get_x=ColReader(0), # นำเข้ารูป
get_y=ColReader(1), # นำเข้า label
splitter=splitter, # แบ่ง train-validation set
item_tfms=Resize(224, method=ResizeMethod.Squish), # ปรับขนาดรูป
batch_tfms=aug_transforms(size=224,),# resize รูป
)
Metrics
การเลือก metrics หรือตัวชี้วัดของ model นั้นก็เป็นเรื่องที่สำคัญเช่นกัน โดยสำหรับปัญหาที่ต้องแก้ไขคือการแยกผู้ป่วยที่เป็นกับไม่เป็นโรคออกจากกัน ซึ่งครั้งนี้เราเลือก precision เป็น metrics สำหรับปัญหาครั้งนี้ เพราะเราต้องการให้โมเดลทายอย่างมั่นใจว่าผู้ป่วยเป็นโรคจริง ๆ หรือพูดอีกนัยนึงก็คือเราต้องการลดอัตราการเกิด False positive ลง
หลังจากที่เราตัดสินใจเลือก metrics แล้วเราก็จะเริ่มเทรนโมเดลกัน
Train Model
เราเลือกใช้ resnet50 ใน fastai เนื่องจากเป็น model ที่เหมาะสำหรับ image classification ได้เป็นอย่างดี และการใช้ fastai นั้นทำให้เราได้ข้อดีที่ชัดเจนที่สุดคือทำให้เราเข้าถึงเทคนิคการเทรนโมเดลต่าง ๆ เช่น learning rate finder และ gradual freezing และ fastai ยังเป็น library ที่ได้รับการ optimized สำหรับการเทรนโมเดลได้เป็นอย่างดี
model.fine_tune(epochs=60,
base_lr=3e-2, #max learning rate
freeze_epochs=1, #epoch num to train frozen
lr_mult=100,
pct_start=0.2,
div=5.0,
cbs=[SaveModelCallback(monitor='precision_score'),])
ในการเทรนโมเดลครั้งนี้เราจะเทรน freeze epoch 1 ครั้งเพื่อปรับ layer สุดท้ายในโมเดลของเราให้คุ้นชินกับ dataset หลังจากนั้นค่อยเทรนทุก layer จำนวน 60 epochs คือให้โมเดลเราดูรูปทั้งหมดใน training set 60 รอบ โดยแต่ละรอบจะมีการทดสอบโมเดลด้วย validation set เพื่อเลือก โมเดลที่มี precision score ใน epoch ที่ดีที่สุด
เมื่อเทรนโมเดลเสร็จเรียบร้อยแล้วพบว่าได้ค่า precision score สูงสุดเท่ากับ 0.985
ผลที่ได้
interp = ClassificationInterpretation.from_learner(model)
interp.plot_confusion_matrix()
precision recall f1-score support
MildDemented 1.00 0.98 0.99 136 ModerateDemented 1.00 1.00 1.00 8
NonDemented 0.98 0.99 0.99 506
VeryMildDemented 0.98 0.98 0.99 374 accuracy 0.99 1024
macro avg 0.99 0.99 0.99 1024
weighted avg 0.99 0.99 0.99 1024
ทดสอบด้วย Test Set
จากการทดสอบโมเดลด้วย test set พบว่าได้ precision เท่ากับ 0.77
เทียบกับ Baseline โมเดลอื่น ๆ
ก่อนอื่นเลยเราจะนำโมเดลที่เราทำไว้ไปทดสอบกับ baseline model ซึ่งเป็นโมเดลที่ใช้ resnet34 ว่าโมเดลของเราดีขึ้นกว่า baseline จริง ๆ อย่างมีนัยสำคัญ โดยอาศัยการทดสอบทางสถิติ McNemar’s Test
Test Set Accuracy
Baseline model (resnet34) 0.64
Our model (resnet50) 0.74
จากการทดสอบพบว่าโมเดลของเราทำนายได้ดีกว่า baseline ที่ระดับนัยสำคัญ p < 0.0001 ได้ค่าสถิติเท่ากับ 67.27576 และค่า odds ratio เท่ากับ 0.375
เมื่อนำไปเทียบกับ model ที่คนอื่นได้ทำก่อนหน้านี้ซึ่งได้แก่ SVM, resnet34 และ DenseNet169 พบว่าโมเดลของเราทำนายได้แม่นยำเทียบเท่าและทำได้ดีกว่าในบางโมเดล
Conclusion
จากการลองพัฒนาโมเดลของเราพบว่าเราสามารถสร้างโมเดลทำนายโรคอัลไซเมอร์ได้จากภาพ MRI เพื่อช่วยในการวินิจฉัยโรคได้
เรายังสามารถพัฒนาโมเดลของเราให้ดียิ่งขึ้นได้ในอนาคต เช่นการ balance sampling ให้มีจำนวนภาพในแต่ละ class เท่า ๆ กัน การทำ data augmentation รวมไปถึงการลองปรับปรุงตัวโมเดล
หากโมเดลของเราได้รับการพัฒนาให้ดียิ่งขึ้นก็จะเป็นการเปิดทางไปสู่การนำไปใช้จริงตามโรงพยาบาล ซึ่งนอกจากจะช่วยเหลือบุคลาการทางการแพทย์แล้ว ยังเป็นการยกระดับคุณภาพชีวิตของประชาชนให้ดียิ่งขึ้น
สุดท้ายนี้โมเดลจะสร้างขึ้นมาไม่ได้เลยหากไม่มีโครงการ AI Builders ที่ช่วยสนับสนุน แนะนำ และสอนให้เราสามารถพัฒนา AI จนนำไปสู่การแก้ปัญหาในชีวิตจริงได้
AI Builders — a program for kids who want to build good AI (vistec-ai.github.io)