ทำ Image Classification/Transferred learning ด้วย Pytorch🔥

Witchapong Daroontham
DATAWIZ
Published in
3 min readFeb 29, 2020

Neural network architecture สำหรับงาน Image classification

Credit: https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

โดยทั่วไป model สำหรับงาน image classification จะประกอบไปด้วย (i) ส่วนของ Deep Convolutional Neural Network (DCNN) หรือส่วน body ของ model ซึ่งเป็นส่วนที่สร้างขึ้นมาจาก Convolutional neural network (CNN) หลายๆ layer โดย layer ตื้นๆ จะเรียนรู้รูปทรงพื้นฐานในรูปภาพ เช่น ขอบ,หรือ โค้ง ต่างๆ ส่วน layer ลึกๆ จะเรียนรู้รูปทรงที่มีความซับซ้อน และ มีความเจาะจงกับ domain ของรูปภาพที่ใช้ train มากกว่า ส่วน body ของ model ทำหน้าที่ยุบ/ย่อ feature ของรูปภาพจากแต่ละ pixel และ color channel ซึ่งมีขนาดใหญ่มาก (ความสูงภาพ * ความกว้างภาพ * color channel r/g/b) ให้เป็น vector ที่เก็บข้อมูลของรูปภาพขนาดย่อ (พูดง่ายๆ คือ ดึง image embedding/ representation จาก input image ออกมา) (ii) ส่วนของ fully connected layer หรือ ส่วน head ของ model ทำหน้าที่รับ representation ของรูปภาพจาก ส่วน body และทำนาย probability ว่ารูปภาพที่รับมาเป็น class ไหน… เสมือนว่าเป็น model ย่อยที่ทำหน้าที่ classify รูปจาก representation อีกทีหนึ่ง

รู้จักกับ transfer learning

การทำ transfer learning คือ การถ่ายทอดความรู้จาก model ที่ train มาแล้วเรียบร้อย (ส่วนมากจะ train มาจาก dataset ใหญ่ๆเช่น ImageNet) จาก task หนึ่ง (เช่น classify image ในโดเมน A) มาให้อีก model หนึ่ง เพื่อทำอีก task หนึ่ง (เช่น classify image ในโดเมน B)โดยการนำ weight ของ model ที่ train มาแล้วมาใช้ initialize ค่า weight ของ model ที่เราจะ train ใหม่

ทำไมต้องทำ transfer learning

  1. ดีกว่า random initialise ค่า weight หรือ เรียนรู้จาก 0 -> ประหยัดเวลาในการเทรนให้ model converge
  2. สามารถเรียนรู้จากข้อมูลปริมาณไม่มากได้ เมื่อเทียบกับการเรียนรู้จาก 0 (แล้วแต่ความแตกต่างกันระหว่าง domain ของข้อมูลที่ train มา และ domain ที่ต้องการเรียนรู้)

ขั้นตอนการทำ transfer learning

credit: technique การทำ transfer learning อ้างอิงจาก course Practical Deep Learning for Coders, v3 — fastai

step 1: download/import pertained model architect และ weight จาก model zoo โดยเราจะนำเฉพาะส่วนที่เป็น Deep Convolutional Net (DCN) หรือ body มาใช้ และเราจะสร้างส่วน head ของ model เอง

step 2: freeze ส่วน body ของ model เพื่อไม่ให้มีการ update weight และ train เฉพาะส่วน head เพื่อปรับ weight ส่วนนี้ก่อน เนื่องจากเป็นส่วนที่เรา random initialise ขึ้นมาใหม่ในขั้นตอนที่ 1

step 3: unfreeze ทั้ง model เพื่อ update weight พร้อมกันทั้ง model โดยกำหนดให้ learning rate ต่ำๆ สำหรับ DCNN layer ตื้นๆ เนื่องจาก pattern พื้นฐาน เป็นอะไรที่ไม่ต้องปรับมาก และกำหนด learning rate สูงๆ สำหรับ DCNN layer ลึกๆ และส่วน head ของ model

ลองทำ image classification จากภาพใน Google โดยใช้ Pytorch 🔥

Google colab: (เลือก file>copy to drive เพื่อเซฟ)

https://colab.research.google.com/drive/1F9izxW-1ZvXiBTADh1NvAhFaEazQfru3

ใน tutorial notebook นี้ เราจะ download รูปภาพจาก Google (ผมใช้รูปข้าวซอย และ ก๋วยเตี๋ยว) มาลองทำ image classification โดยใช้ transferred learning… ผมใช้ model resnet50 ใน tutorial แต่จะลองใช้ model ใหม่ๆ อื่นก็ได้ ดูจาก https://pytorch.org/docs/stable/torchvision/models.html

เราจะใช้รูปกันประมาณ​ไม่เกิน 300 รูปกันในการเทรนเท่านั้น และ validate อีกประมาณ 50 กว่ารูป (แบ่ง 80:20)

โดยเราจะเทรน model กันรอบนึงก่อนตาม step การทำ transfer learning ที่อธิบายไว้ด้านบน และได้ accuracy ของ classifier ประมาณ 90% (ก็ถือว่าน้อยสำหรับข้อมูล 2 class)

loss & metric plot

จาก confusion matrix จะเห็นว่ามีภาพก๋วยเตี๋ยวจำนวน 17 ภาพ ที่ model ทายเป็นข้าวซอย

confusion matrix หลังจากเทรนรอบแรก

จากนั้นเราจะใช้ model ที่เราเทรนมาแล้วรอบนึง หารูปภาพที่ทำให้ model เราพังออกไป โดยหาว่าภาพไหนที่ model ให้ค่า loss สูงๆ น่าจะเป็นภาพที่ทำให้ model สับสน และอาจจะเป็นภาพที่ไม่เกี่ยวข้อง เช่น ภาพหมา ภาพป้ายร้าน ภาพไส้อั่ว และอื่นๆ

ลองมาดู confusion matrix กันอีกที จะเห็นว่า model สับสนน้อยลงกว่าเดิมแล้ว หลังจากลบรูปภาพที่ไม่เกี่ยวข้องออกไป

confusion หลังจาก clean up รูปภาพ และเทรนอีกครั้ง

--

--

Witchapong Daroontham
DATAWIZ

Data scientist at Central Technology Organization — CTO, Bangkok & life long learner