Image Classifier with Deep Learning Model

Mathee Prasertkijaphan
SCB TechX
Published in
7 min readApr 24, 2023

Introduction

ผมได้มีโอกาสทำงานวิจัยร่วมกับเพื่อนที่เรียนปริญญาโทด้วยกัน ในหัวข้อ Image Classifier with Deep Learning Model ทีให้โมเดลจำแนกว่า รูปที่เห็นนั้นเป็นรูปอะไร เช่น รูปบรรยากาศร้านอาหาร หรือเมนูอาหาร หรืออาหาร ซึ่งได้ข้อมูลบางอย่างที่น่าสนใจและคิดว่ามีประโยชน์ต่อผู้อ่าน จึงขอนำมาแชร์ให้กับทุกท่านนะครับ ก่อนอื่นขอเกริ่นนำก่อนว่า ในการทำ Deep Learning ของฝั่ง Data Science ทุกวันนี้ ปัญหาหลักที่เราพบเจอคือ ความซับซ้อนของ Parameter (Weight) ที่มีจำนวนมากมายมหาศาล เริ่มตั้งแต่การเทรนโมเดล เรื่อยไปจนถึงการปรับจูนค่า Parameter นอกจากนี้ยังมีปัญหาด้านเวลา ความล่าช้าในการคำนวณ ความซับซ้อนของโครงสร้างรูปภาพแต่ละชนิด ดังนั้น เทคนิคหนึ่ง ที่นิยมนำมาใช้ในการทำ Deep Learning คือ เทคนิค Transfer Learning ที่ช่วยลดเวลาการเทรนโมเดล Deep Learning ด้วยการนำบางส่วนของโมเดลในอดีตที่เทรนเรียบร้อยแล้ว กับงานที่ใกล้เคียงกัน มาใช้เป็นส่วนหนึ่งของโมเดลใหม่ ยกตัวอย่างเช่น การนำโมเดลในอดีต หรือ โมเดล ConvNet ที่เทรนกับชุดข้อมูล Dataset ขนาดใหญ่ (เช่น ImageNet ที่มีข้อมูลตัวอย่างจำนวน 1.2 ล้านรูป ประกอบด้วย 1000 หมวดหมู่) มาเป็นโมเดลเพื่อใช้ในการเทรนข้อมูลที่เราต้องการทำ Deep Learning เป็นต้น

ภาพ ของ อ.ดร.ณัฐโชติ พรหมฤทธิ์ ภาควิชาคอมพิวเตอร์ คณะวิทยาศาสตร์ มหาวิทยาลัยศิลปากร

ทั้งนี้ วิธีการวิจัยจะเป็นการเปรียบเทียบประสิทธิภาพของ Models ในการจำแนก รูปบรรยากาศร้านอาหาร เมนูอาหาร และ อาหาร ของ ResNet50 ซึ่งพัฒนามาจากทีม Microsoft , Inception V3ซึ่งพัฒนามาจากทีม GoogLeNet และ NASNetMobile ที่พัฒนามาจาก Google Brain Team

Data

เนื่องจากทางทีมวางแผนใช้วิธี Transfer Learning เข้ามาช่วยในการพัฒนาโมเดลจำแนกประเภทรูปภาพทั้ง 3 ประเภท 1 — บรรยากาศ(Atmosphere), 2-อาหาร(Food) และ 3-เมนู(Menu) ทำให้ลดปริมาณรูปที่ใช้ในการพัฒนาโมเดลได้ค่อนข้างเยอะ โดยทีมเก็บรวบรวมรูปภาพที่จะใช้ในการ Train รูปภาพทั้ง 3 ประเภท ประเภทละ 200 รูป รวมทั้งหมด 600 รูป จากการไปถ่ายจากร้านอาหาร และรวบรวมจากเว็บไซต์ต่างๆ โดยหลังจากเก็บรวบรวมรูปทั้งหมดเรียบร้อยแล้ว เพื่อให้สามารถนำมาใช้ในขั้นตอนต่อไปได้ง่าย จึงนำรูปทั้งหมดมาเตรียมไว้ให้อยู่ในรูป Numpy ทั้งหมด 3 ไฟล์

1. x_image : เก็บข้อมูลรูปภาพ โดยจะมีขนาด (Shape) เป็น 600 * w * h * 3 โดยที่ w, h คือความกว้าง และความสูงของรูปภาพที่เหมาะสมกับ Model ที่เลือกใช้ ( NASNetMobile w=224 h=224, ResNet50 w=224 h=224, InceptionV3 w=299 h=299)

2. y_image : เก็บข้อมูล ประเภท ของรูปภาพมีค่าเป็น 0, 1, 2

3. class_seq : เก็บข้อมูล dummy ของตัวเลขแต่ละ ประเภท โดยให้ 0 แทน Atmosphere, 1 แทน Food และ 2 แทน Menu

Training Strategy

ในส่วนของการทำ Training Strategy นั้น ได้แบ่ง Strategy ออกเป็น 6 Scenarios โดยจะแบ่งรูปแบบของการเปรียบเทียบ Result ออกเป็น 2 มุมมอง ดังนี้

1. เปรียบเทียบความแม่นยำ, Loss และ ROC ในมุมของ Model เพื่อที่จะทำการทดสอบดูว่า ถ้าเรา fix ค่าต่างๆ คงที่ เช่น Trainable Layers, Augmentation, Optimizer, Learning Rate, Loss Function, Batch Size และ Epoch (ดังตัวอย่าง table ด้านล่าง (Comparation 1)) แล้วดูว่า Result ที่ได้นั้นจะมีความแม่นยำแตกต่างกันมากเพียงไหน

2. เปรียบเทียบความแม่นยำ, Loss และ ROC ในมุมของการทำ Unfreeze Layer ของแต่ละ Model จะมี Effect กับค่าความแม่นยำในการทำนายของแต่ละประเภท มากน้อยแค่ไหน (ดังตัวอย่างรูปตารางด้านล่าง (Comparation 2)) ถ้าเกิดค่า Parameters ต่างๆถูก fix ค่าเหมือนกัน (เช่นเดียวกับ Comparation 1)

ตาราง Training Strategy

โดยทั้ง 6 Scenarios มี Dataset ทั้งหมด 3 ประเภท (ประเภท ละ 200 รูป) และทำการแบ่งจำนวน Training Data กับ Test Data เป็น 80:20 (ตามตัวแปร TEST_SIZE) เป็นต้น

Network Architecture

1. NASNetMobile

NASNet ถูกสร้างขึ้นมาโดยมีวัตถุประสงค์ เพื่อให้ตัวโมเดลเข้ามาช่วยค้นหา Architecture CNN ที่เหมาะสมที่สุด โดยจะเรียกส่วนนี้ว่า Neural Architecture Search (NAS) ที่ถูกพัฒนาบนข้อมูล CIFAR10 และ ImageNet โดย Google Brain ทั้งนี้ NASNetMobile เป็นเวอร์ชั่นย่อส่วนของ NASNet ตัวใหญ่ที่จะมีน้อยกว่า โดยที่ตัว NASNetMobile นี้มีจำนวน Layer ทั้งหมด 769 Layers และจำนวน Parameter ทั้งหมด 4,269,716 ตัว ซึ่งเราได้นำ pre training โมเดล ( NASNetMobile + Weight) มาเป็นส่วน Feature Extractor และเมื่อนำมารวมกับส่วน Classification Layer จะมีจำนวน Layer ทั้งหมด 775 Layer และจำนวน Parameter ทั้งหมด 17,780,119 ตัว

Freeze All Layers

นำ NASNetMobile โดยทำการ Freeze ทุก Layers หรือกล่าวคือไม่ให้โมเดลมีการปรับ Weight ในส่วน Feature Extractor ในขณะที่ Train โมเดล ซึ่งโมเดลสามารถปรับจูน Weight ในส่วน Classification Layer ได้เพียงอย่างเดียว ซึ่งจากการดำเนินการ Train โมเดลบน Google-Colab (gpu : Tesla V100-SXM2–16GB) ผลลัพธ์ดีที่สุดมี Loss อยู่ที่ 0.229, Accuracy อยู่ที่ 0.942 ( Atmosphere : 0.900, Food : 0.953, Menu : 0.973) และมี ROC อยู่ที่ 0.996 (Atmosphere : 0.993, Food : 0.996, Menu : 0.999)

ภาพ Accuracy และ Loss ในระหว่างที่ Train

Unfreeze Layer 752–769

นำ NASNetMobile มา Unfreeze Weight ใน Layer ตั้งแต่ 752–769 เพื่อให้โมเดลปรับจูนWeight ให้เหมาะสมกับข้อมูลในระหว่างที่ Train ได้ ซึ่งเราหวังว่าจะได้ Model ที่มีค่า Accuracy/Loss ที่ดีขึ้น ในขั้นตอนการ Train โมเดลเราดำเนินการบน Google-Colab (GPU : Tesla V100-SXM2–16GB) โดยผลจากการ Train ได้ผลลัพธ์ดีที่สุดมี Loss อยู่ที่ 0.208, Accuracy อยู่ที่ 0.950 (Atmosphere : 0.925, Food : 0.953, Menu : 0.973) และมี ROC อยู่ที่ 0.994 (Atmosphere : 0.994, Food : 0.993, Menu : 0.994)

ภาพ Accuracy และ Loss ในระหว่างที่ Train
ภาพการทำ Grad-CAM เพื่อตรวจสอบโมเดล

2. ResNet50

ResNet (Residual Network) นั้นถูกพัฒนาขึ้นมาจาก Convolutional Neural Network (CNN) โดย ResNet มีกลไกพิเศษ ที่เรียกว่า Skip Connections เป็น Trick ที่ทางผู้คิดค้น Algorithm สร้างขึ้นมาเพื่อช่วยแก้ปัญหา Vanishing/Exploding Gradient ของตัว Model ดั้งเดิม (เช่น Traditional CNN หรือ YGG Model) การ Skip Connections นั้น ทำให้ Gradient ของ Back-Propagation (การ fine-tune ค่า parameter โดยการใช้ Differentiation Rules เพื่อลด error ของ model) นั้น “ข้าม” ชั้นของ Layer ที่ปลายทาง และต้นทางได้ ResNet50 ประกอบไปด้วย 4 ขั้นตอนใหญ่ๆ ขั้นตอนที่หนึ่ง เป็นแปลงข้อมูล โดยใช้วิธีการทำ Convolution (7*7) และ MaxPooling (3*3) ขั้นตอนที่สองและสาม เป็นการทำ Convolution ในระยะต่อๆไป โดย Skip Connections นั้นจะเกิดขึ้นในทุกๆ 3 Block ตั้งแต่ Conv2.x ไปจนถึง Conv5.x โดยแต่ละ Layer Stage นั้น ตัวของ Output Size จะมีขนาดที่ลดลงครึ่งหนึ่ง จาก Layer Stage ก่อนหน้า ในขณะที่ขั้นตอนที่สี่จะใช้การ Average Pooling โดยมี Softmax Activation Function ทำหน้าที่ Classify ตัว Final Output ที่เราทำการทดลอง โดยประโยชน์ของ ResNet50 เหมาะสำหรับงาน Computer Vision เช่น Image Classification, Object Localization, Object Detection

Freeze All Layers

จากการทดลองทำ Image Classification โดยการแยกรูปทั้งหมด 600 รูป ประกอบไปด้วย อาหาร 200 รูป, เมนูอาหาร 200 รูป และ บรรยากาศร้านอาหาร 200 รูป และทำการแบ่งข้อมูลออกมาเป็น Test and Train Data โดยได้ใช้ ResNet50 มา Train กับ Training Data ( ก่อนที่จะทำการประเมินประสิทธิภาพของตัว Model ต้องนำมาทดสอบกับ Test Data โดยเราได้ทำการทดลองผ่านการใช้ Google Colab และได้ใช้การ Import ตัว ResNet50 จาก Library ของ Tensorflow ซึ่งผลลัพท์ที่ได้จากการ Train นั้น เมื่อพิจารณาจาก Classification Report ด้านล่าง จะได้ Model ที่มีค่า Accuracy อยู่ที่ 0.95 โดยมีค่า Precision, Recall and F-1 Score ตามตารางด้านล่าง

ตาราง Result of Model

สำหรับ ROC Score นั้น จะเห็นได้ว่าตัว ResNet50 ให้ความแม่นยำที่ค่อนข้างสูง วัดจาก Total ROC ที่ 0.9988 และ AUC Score ของ Atmosphere, Food และ Menu ที่ 0.9983,0.9985 และ 0.9998 ตามลำดับ

ภาพ ROC of Model
ภาพ Model Accuracy and Model Loss[50 epochs]

Unfreeze Layer: 171–174

จากการทดลองทำ Image Classifications เพื่อแยกรูปทั้งหมด 600 รูป (แบ่งออกเป็น รูปอาหาร 200 รูป, รูปเมนู 200 รูป และรูปบรรยากาศร้านอาหาร 200 รูป) ว่ารูปในกลุ่ม Test set ที่นำมาทดสอบกับ Model มีความแม่นยำมากน้อยเพียงใด โดยในส่วนของการทดลองนี้ ทางเราใช้ ResNet50 พร้อม Weight ที่ได้จากการ Train ด้วย ImageNet มาใช้เฉพาะส่วน Feature Extractor โดยได้จำนวน Layers ทั้งหมด 175 layers (0–174) และจำนวน Parameters ทั้งหมด 23,587,712 Parameters เราทำการทดลองเพิ่มเติมจากเดิม (ResNet50: Freeze all layers) โดย Unfreeze Weight ใน Layer ตั้งแต่ 171–174 เพื่อให้ Model ทำการ Tuning Weight ใหม่ให้เหมาะสมกับข้อมูลในระหว่างที่ทำการ Train ได้ เมื่อนำมารวมกับส่วน Classification Layer ทำให้มีจำนวน Layers เพิ่มขึ้นเป็นทั้งหมด 181 Layers และมีจำนวน Parameters ทั้งหมด 49,541,763 Parameters (เพิ่มขึ้น 110%) โดย Tools ที่ทางทีมได้เลือกมาใช้ทดลองครั้งนี้ คือ Google Colab (GPU: Tesla K80) ซึ่งผลลัพธ์ที่ได้จากการ Train ที่ดีที่สุดมี Loss อยู่ที่, Accuracy อยู่ที่ 0.95 (Atmosphere : 0.90, Food : 0.95, Menu : 0.97) และมี ROC อยู่ที่ 0.99 (Atmosphere : 0.99, Food : 0.99, Menu : 0.99)

ภาพ Accuracy และ Loss ในระหว่างที่ Train
ภาพการทำ Grad-CAM เพื่อตรวจสอบโมเดล

3. InceptionV3

InceptionV3 มีโครงสร้างเป็น 5 ส่วนหลักคือ Inception Module A, Grid Size of Reduction step 1, Inception Module B, Grid Size of Reduction Step2 และ Inception Module C ซึ่งแยก Output ได้ 1,000 Classes Inception V3 เป็นโมเดลที่ได้รับการพัฒนาโดย Google ซึ่งได้รับรางวัลรองชนะเลิศสำหรับ Image Classification ใน ILSVR 2015 (78.1% accuracy ใน ImageNet dataset) มีโครงสร้าง Deep Learning Network ทั้งหมด 42 Layers มีจำนวน Parameter ทั้งหมด 21 ล้าน Parameter การพัฒนา Inception V3 มีจุดมุ่งหมายเพื่อใช้ทรัพยากรในการคำนวณน้อยลง แต่ได้ประสิทธิภาพที่สูงขึ้นโดยปรับปรุงจาก Inception Architectures รุ่นก่อนหน้า ซึ่งแนวคิดในการออกแบบ Inception V3 สามารถแบ่งออกได้เป็น 4 ส่วนหลัก คือ

1. Factorization Into Smaller Convolutions ช่วยลดการคำนวณเนื่องจากจำนวน Parameter น้อยลง ด้วยการแทนที่ Convolutions อันใหญ่ด้วย Convolutions อันที่เล็กกว่า เช่น แทนที่ 5 x 5 Filter ด้วย 3 x 3 Filter สองอันจะช่วยลดจำนวน Parameter ลงไปได้ 28%

2. Spatial Factorization Into Asymmetric Convolutions ทำ Asymmetric Convolutions ด้วย n x 1 Filter เช่น แทนที่ 3 x 3 Filter ด้วย 1 x 3 Filter และ 3 x 1 Filter ตามลำดับ จะทำให้ช่วยลดจำนวน Parameter ลงไปอีก 33%

3. Utility Of Auxiliary Classifiers การใช้ Auxiliary Classifiers เพื่อปรับปรุงการ Convergence ใน Deep Neural Network และส่วนใหญ่จะใช้เพื่อแก้ปัญหา Vanishing Gradient ที่พบใน Deep Neural Network ซึ่งใน Inception V3 Auxiliary Classifiers จะถูกใช้เป็น Regularizer

4. Efficient Grid Size Reduction Grid Size Reduction จะถูกทำโดย Max Pooling และ Average Pooling เพื่อแก้ปัญหาคอขวดในการคำนวณ Inception V3 ที่ทำให้ประสิทธิภาพในการทำ Grid Size Reduction เพิ่มมากขึ้น

Freeze All Layers

ทางทีมได้นำ InceptionV3 พร้อม Weight ที่ได้จากการ Train กับข้อมูล ImageNet มาเป็นส่วน Feature Extractor ซึ่งโมเดลจะมีจำนวน Layer ทั้งหมด 311 Layers และจำนวน Parameter ทั้งหมด 21,802,784 ตัว ทั้งนี้เราจะทำการ Freeze ทุก Layer เพื่อเป็น Base Line ในกรณีที่ต้องการเปรียบเทียบประสิทธิภาพ Unfreeze บาง Layer ด้วยความคาดหวังว่า Model ที่ Unfreeze บาง Layer จะให้ผลสรุปที่ดียิ่งขึ้น เมื่อนำ Feature Extractor มารวมกับ ส่วน Classification Layer จะมีจำนวน Layer ทั้งหมด 317 layers และจำนวน Parameter ทั้งหมด 55,621,155 การทดลองนี้ได้ Train โมเดลผ่าน Google-Colab (GPU : Tesla-K80) โดยผลจากการ Train ได้ผลลัพธ์ดีที่สุดมี Loss อยู่ที่ 0.1798, Accuracy อยู่ที่ 0.958 (Atmosphere : 0.925, Food : 1.0, Menu : 0.95) และมี ROC อยู่ที่ 0.99 (Atmosphere : 0.99, Food : 1.0, Menu : 1.0)

ภาพ Accuracy และ Loss ในระหว่างที่ Train
ภาพการทำ Grad-CAM เพื่อตรวจสอบโมเดล

Unfreeze Layer 299–311

ทางทีมได้ทำการทดลองด้วยการนำ Model Inception V3 พร้อม Weight ที่ได้จากการ Train ด้วย ImageNet Dataset มาใช้เฉพาะส่วน Feature Extractor ซึ่งได้จำนวน Layers ทั้งหมด 311 Layers และจำนวน Parameter ทั้งหมด 21,802,784 Parameters จากนั้นจึงทำการ Unfreeze Layer ให้สามารถ Train ได้ตั้งแต่ Layer ที่ 299 เป็นต้นไปเพื่อให้ Model ปรับจูนค่า Weight ใหม่ให้เหมาะสมกับข้อมูลที่ทางทีมได้นำมาใช้ และเมื่อนำมารวมกับส่วน Classification Layer ที่ทางทีมกำหนดขึ้นเองจะทำให้มีจำนวน Layers เพิ่มขึ้นเป็นทั้งหมด 317 Layers และมี Parameter ที่สามารถ Train ได้ทั้งหมด 34,213,123 Parameter จากทั้งหมด 55,621,155 Parameter โดยทำการ Train Model ผ่าน Google-Colab (GPU: Tesla P100-PCIE-16GB ) ซึ่งผลลัพธ์ที่ได้จากการ Train ที่ดีที่สุดมี Loss อยู่ที่ 0.3124, Accuracy อยู่ที่ 0.9667 (Atmosphere : 0.90, Food : 1.00, Menu : 1.00) และมี ROC อยู่ที่ 0.99 (Atmosphere : 1.00, Food : 0.99, Menu : 1.00)

ภาพ Accuracy และ Loss ในระหว่างที่ Train
ภาพการทำ Grad-CAM เพื่อตรวจสอบโมเดล

Result

จากการพัฒนาโมเดลด้วยวิธีการ Transfer Learning ที่นำ Network 3 รูปแบบได้แก่ NASNetMobile, ResNet50 และ InceptionV3 มาเป็นส่่วน Feature Extractor ของตัวโมเดลจำแนกประเภทรูปภาพทั้ง 3 ประเภท 1 — บรรยากาศ(Atmosphere), 2-อาหาร(Food) และ 3-เมนู(Menu) ซึ่งโมเดลที่ได้ผลลัพธ์ดีที่สุดคือ InceptionV3 แบบ Unfreeze (Layer : 171–174) ที่ได้ Accuracy ภาพรวมอยู่ที่ 0.967 ที่มีจำนวน Parameter อยู่ที่ 21.8 ล้านตัว โดยประเภทที่โมเดลทำนายได้แย่ที่สุดคือ บรรยากาศ(Atmosphere) (acc-0.9) ในขณะที่โมเดลที่ได้ผลลัพธ์ดีรองลงมาก็ยังเป็น InceptionV3 ที่ Freeze ทุก Layer ในขณะที่ Train ได้ Accuracy ภาพรวมอยู่ที่ 0.958 ซึ่งมีค่าต่างกันเล็กน้อย ในส่วนโมเดล ResNet50 จากการทดลองทางทีมพบว่าการ Unfreeze (Layer :171–174) และ Freeze ได้ผลลัพธ์ไม่แตกต่างกัน อีกทั้งยังไม่แตกต่างกับ NASNetMobile แบบ Unfreeze (Layer : 752–769) ที่มี Accuracy ภาพรวมอยู่ที่ 0.95 ในขณะที่ NASNetMobile แบบ Freeze ได้ผลลัพธ์แย่ที่สุดโดยมี Accuracy ภาพรวมอยู่ที่ 0.942

ตาราง เปรียบเทียบผลการทดลองของ 3 Models

ทั้งนี้ผลลัพธ์ที่ทางทีมได้ทำการทดลองนั้นเป็นเพียงผลลัพธ์ที่เกิดจากทดลองกับ Small Sample Set เพียง 600 รูป โดยมีจุดประสงค์เพื่อการศึกษาแต่เพียงอย่างเดียว ซึ่งอาจมีการคลาดเคลื่อนได้ จึงไม่สามารถนำมาสรุปได้ว่า Model ทั้ง 3 Models นี้ใครดีกว่ากัน

--

--