สอนให้โมเดลตรวจจับวัตถุด้วยTensorflow Object Detection API บน Colab: P2 Dataset

Original article can be found here (source): Deep Learning on Medium

ส่วนนี้อยู่ที่เจ้าตัวแล้วครับว่าต้องการ ให้ Detect อะไร แหล่งที่มาอาจจะแตกต่างกันครับ,

ส่วนใหญ่ก็สามารถหาได้ตาม kaggle เลยครับ แต่ก็ขึ้นอยู่กับเป้าหมายของเราอยู่ดี,

รูปภาพอนิเมะก็หาง่ายๆจากใน Pixiv และ Danbooru ได้เลยครับ

  1. จงไปหารูปภาพมาให้ได้ แล้วยัดเข้า images/all
  2. ถ้าข้อมูลของแต่ละclassมันดูเหลื่อมล้ำ เช่น class 1 มี 599 รูป แต่ class 2 มี 200 รูป ก็ควรจะทำอะไรซักอย่างให้แต่ละคลาสมีจำนวนพอๆกัน ไม่ห่างกันเกินไป (คราวนี้ Data augmentation เริ่มมีบทบาทแล้วครับ)[ขอบคุณ bualabs.com อีกครั้งครับ]

Preprocessing & Annotation

Preprocessing

หลังจากได้ข้อมูลมาแล้ว ตรวจสอบชุดข้อมูลของเราครับ,

เริ่มจากดู Overview ก่อนเลย

สังเกตที่ Size
จงหารูปที่แตกต่าง

ดูรวมๆแล้ว EXTRA THICC เหลือเกิน

ปล.ถ้าเห็นรูปที่ยืดๆยาวๆตรงรูปที่ 5ของบรรทัดที่ 5 ให้ลบทิ้งไปก่อนเลย เพราะจะทำให้การ Resize เกิดการ Error ได้ ในภายภาคหน้า

ถ้าข้อมูลขนาดเล็กอยู่แล้วก็ข้ามไป Annotation เลยก็ได้นะครับ

มีแต่รูปอ้วนๆทั้งนั้นเลยครับ ( SIZE [>5MB] ) แล้วก็ บางรูปอาจจะไม่เข้ากับโมเดลของเราก็ได้ครับ, เรื่องเลือกรูป เก็บไว้ทีหลังได้ครับ

แต่เรื่องขนาดไฟล์นี่รับไม่ได้

เพราะในการ Train โมเดลไม่ว่า Architecture แบบไหน ยิ่งขนาดของข้อมูลใหญ่ ยิ่งกินMemory เยอะ แล้วใช้เวลานาน จนถึงขั้นคอมค้าง หรือ ยกเลิกการทำงาน กันเลยทีเดียว, #นี่คือสาเหตุที่ใช้ Colab

ถ้าเป็นรูปภาพแค่ขนาดของไฟล์อย่างเดียวยังไม่พอ แต่ขึ้นอยู่กับความละเอียดของรูปด้วย(Resolution),

ต้องจัดการเรื่องนี้ก่อนครับ ด้วย IMAGEMAGICK,

โดยเราจะใช้ ImageMagick ในการลด Resolution และ Quality ครับ

#ใน Terminal (Ubuntu)sudo apt install imagemagick #Installcd '/ตำแหน่งของ/โฟลเดอร์/ที่มีรูปภาพ' mogrify -resize 50% -quality 50 -path '/ตำแหน่งของ/output' *

Note: บางรูปอาจจะขนาดเล็กอยู่แล้ว หรือ ก็ไม่จำเป็นต้องลดขนาดก็ได้นะครับ แยกโฟลเดอร์เอาไว้

(Optional) แปลงไฟล์ให้อยู่ในรูป .jpg ทั้งหมด

เพื่อหลีกเลี่ยง PNG warning

mogrify -format jpg -path '/ตำแหน่งของ/output' *.png

มาดูผลลัพท์กันดีกว่า

สังเกตที่Size

ถ้า Size เริ่มเข้าที่แล้ว ก็ให้ทำการแยกให้เป็น 2 โฟลเดอร์ครับ (Train , Test)

โดยผมจะแยกเอาไว้ในอัตราส่วนจะอยู่ Train:Test = 10:3 (เปลี่ยนแปลงได้)

Annotation

ในการ Annotate ผมจะใช้ Software ที่มีชื่อว่า LabelImg ซึ่งใช้ง่ายในระดับหนึ่ง

ขั้นตอนการติดตั้ง

  1. Clone หรือ Download LabelImg
  2. ติดตั้ง pyqt5 (Ubuntu’s Terminal)[ถ้าใช้ OS อื่น, ดูใน repo ของ labelImg ได้เลยครับ]
sudo apt-get install pyqt5-dev-tools #GUI Toolkit
cd 'ตำแหน่งของ/โฟลเดอร์/labelImg'
pip install -r requirements/requirements-linux-python3.txt
make qt5py3

3.Run (or this Run?)

python labelImg.py

คลิก Open Dir แล้วเลือกโฟลเดอร์ที่มีรูปภาพของเราครับ

คลิก Change Save Dir แล้วเลือกโฟลเดอร์ที่จะ Save ไฟล์ .xml เพื่อนำไปแปลงเป็น csv และแปลงเป็น TFRecord ต่อ. (เลือกเป็นโฟลเดอร์ที่มีรูปอยู่ก็ได้ หรือจะแยกมาเดี่ยวๆก็ได้)

กดปุ่ม W แล้วใช้เมาส์ในการสร้าง Bounding Box

ในการ Annotate , ไม่จำเป็นต้องมี 1 รูปต่อ 1 Class

คราวนี้ก็ถึงเวลาเลือกแล้วครับว่า ใครจะอยู่ ใครจะไป (รูปภาพ)