TensorFlow API ตอนที่ 1: เตรียมตัวทำ Custom object detection
It’s still using TensorFlow version 1 but it’s also powerful.
รู้สึกว่าเป็นคนที่ชอบโมเดล ที่เกี่ยวข้องกับข้อมูลประเภทรูปภาพหรือวีดีโอ (Computer vision) ทำให้มีโมเดลเกี่ยวกับ Image อยู่บ่อยครั้ง ซึ่งวันนี้ก็เช่นกัน… เนื่องจาก Dataset ที่เป็นรูปไลก้า (หมาที่เลี้ยงไว้) ทำ Labelling ไว้ 400 กว่ารูป เลยอยากใช้ Dataset ที่เตรียมไว้บ่อย ๆ
ดังนั้นวันนี้เลยเอา Dataset เดิม มาสร้างเป็น Object detection อีกโมเดลนึง แต่สิ่งที่ต่างออกไปคือ วันนี้ใช้เป็น TensorFlow API ในการทำ Custom object detection ถ้าว่ากันตรง ๆ ถือว่าเป็น API ที่ปล่อยออกมานานมากแล้ว ตั้งแต่ยังเป็น TensorFlow version 1 แต่ยังคงใช้งานได้ดีอยู่
ใน Blog ตอนนี้ คงยังไม่ลงรายละเอียดเกี่ยวกับ Model มา แต่เน้นไปที่การเตรียม Materials สำหรับ Training model กันก่อน ซึ่งขอข้ามการทำ Images labeling ไป แต่สำหรับใครยังไม่ได้ทำ แนะนำให้กลับไปอ่านตอนก่อนหน้านี้
ครั้งนี้รันบน Google Colab แต่ว่าเตรียมทุกอย่างให้เสร็จที่ Local เพื่อความง่าย
Data structure
อย่างที่บอกว่ามี Labelling images อยู่ทั้งหมด 400 รูป แต่ขอใช้แค่ครึ่งเดียวคือ 200 รูป เพื่อไม่ให้ Network ใหญ่จนเกินไป
เขียนแบบเป็นโฟลเดอร์ Project ได้เป็นแบบด้านล่าง
ไม่ทำจัด Structure แบบนี้ก็ได้ แต่ต้องระวังเรื่อง Path ตอนรันอีกที
object_detection-data
-images/
--test
--train
Convert to csv file
ขั้นตอนนี้เป็นการทำไฟล์ .xml
ทั้งหมด ให้อยู่ใน Format แบบ .csv
ก่อน เพื่อความสะดวกในการทำ TensorFlow record (TF Record) มีคนทำ Code ไว้ให้แล้วสำหรับการแปลง .xml
เป็น .csv
แค่ต้องระวังเรื่อง Path ให้แก้ตาม Path ที่มีอยู่ในเครื่องให้ถูกต้อง
แล้วโหลดไฟล์ที่ชื่อว่า xml_to_csv.py
เอาไว้ที่ Project’s folder จากนั้นใช้ Editor อะไรก็ได้เปิดมันขึ้นมาเพื่อทำการแก้ไข
ส่วนที่เราต้องแก้ก็คือ Function main()
โดยที่เพิ่ม Loop เข้าไปให้อ้างอิง Directory path ได้อย่างถูกต้อง เช่น ให้อ่าน ‘images/train’
และ Save เก็บไว้ที่ ‘data/train_labels.csv’
เป็นต้น
ถ้ายังไม่มี Elementpath ให้ติดตั้งใน Environment ก่อนรันไฟล์
pip install elementpath
เมื่อแก้ไข Path แล้วสามารถรันได้เลย ถ้าทุกอย่างถูกต้อง ควรได้ไฟล์ .csv
ใหม่ 2 ไฟล์ อยู่ใน Directory ตามแบบด้านล่าง
object_detection-data/
--test_labels.csv
--train_labels.csv
-images/
--test
--train
xml_to_csv.py
Git
ก่อนที่เริ่มทำ TF Record ต้องมี TensorFlow API ก่อน ซึ่งสามารถ Clone หรือ Download ได้จาก Link ด้านล่าง
เมื่อโหลดมาแล้วให้ Unzip แล้วย้ายโฟลเดอร์ models
ไปอยู่ใน Folder project
object_detection-data/
--test_labels.csv
--train_labels.csv
-images/
--test
--train
-models/
xml_to_csv.py
Convert to TensorFlow record
ตอนนี้พร้อมสร้าง TF Record แล้ว ให้ย้ายข้อมูลทั้งหมด เข้าไปใน /models/research/object_detection
Folder data มีอยู่แล้ว ต้อง Merge เข้าด้วยกัน หรือลบข้อมูลภายในก่อนย้าย
จากนั้นให้กลับไปที่ Github เดิมที่เคยใช้ตอนสร้างไฟล์ .csv แต่หาไฟล์ที่ชื่อว่า generate_tfrecord.py
แล้วโหลดมันมาไว้ที่ Directory /models/research จากนั้นให้เปิดไฟล์ขึ้นมา แล้วทำการแก้ไขบ้างส่วน
มองหาไฟล์ที่ชื่อว่า generate_tfrecord.py แล้วโหลดมันมาไว้ที่ Directory ตามนี้นะครับ /models/research จากนั้นให้เปิดไฟล์ขึ้นมา Editor แล้วมาเริ่มแก้บางส่วนกัน
Line 17: เนื่องจากเครื่อง Local ติดตั้งเป็น TensorFlow version 2 เอาไว้ แต่ Code เขียนมาจาก Version 1 ดังนั้นให้แก้จาก import tensorflow as tf
เป็น import tensorflow.compat.v1 as tf
เพื่อให้ Syntax ต่าง ๆ ยังทำงานได้อยู่เหมือนเดิม
Line 32: เป็นบรรทัดที่ให้ Put text ลงในรูป เมื่อเจอ Object ที่ต้องการ ซึ่งขอใส่เป็นชื่อหมาว่า ‘leica’
**ถ้ามี Object มากกว่า 1 และทำ Labelling images ไว้แล้ว สามารถเพิ่มได้ตรงนี้ เช่นถ้ามี 3 Objects ให้เพิ่มชื่อใน row_label แล้วให้ retuen 1, 2, 3 ตามลำดับ
เมื่อแก้ไขเสร็จแล้ว ให้ Save แล้วเปิด Command line ให้แน่ใจว่าอยู่ที่ Directory ที่ถูกต้องคือ /models/research จากนั้นให้รันตามคำสั่งข้างล่าง
python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record --image_dir=images/trainpython generate_tfrecord.py --csv_input=data/test_labels.csv --output_path=data/test.record --image_dir=images/test
ถ้าทำถูกต้องทั้งหมด ต้องได้ไฟล์ .record
เพิ่มขึ้นมา 2 ไฟล์ ใน Folder data
object_detection-models/
--research/
---generate_tfrecord.py---object_detection/
----data
-----test_label.csv
-----train_label.csv
-----test.record
-----train.record
----images
-----test/
-----train/
xml_to_csv.py
Label mapping
ไฟล์สุดท้ายที่ต้องสร้างคือ label_map.pbtxt
จากนั้นให้ใส่
item {
id: 1
name: 'leica'
}
ซึ่งถ้ามี id
มากกว่า 1 ใส่เพิ่มได้ id
และ name
ได้ และให้ใส่ค่า name
ให้เหมือนกับลำดับใน row_label
ในไฟล์ generate_tfrecord.py
Summary
มาถึงตรงนี้… Dataset และ Materials อื่นที่ต้องใช้ก็พร้อมแล้วสำหรับ Model training ซึ่งเนื้อหาทั้งหมดอยู่ในตอนถัดไป เพราะรู้สึกว่าถ้าอัดให้จบในตอนเดียว คงเขียนยาวเกินไป ขอจบไว้ตรงนี้ สำหรับตอนต่อไป จะมีการเลือกโมเดลสำหรับทำ Custom training และเริ่ม Training process