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

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

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

ในส่วนนี้ ผมจะอธิบายถึงวิธีการ Fine Tune หรือ Train โมเดลที่ถูกสอนมาแล้วให้ ตรวจจับ Object ที่เราต้องการได้ครับ

ถึงเวลาโยกย้ายไป Google Colaboratory แล้วครับ
โดยอย่างแรกที่ต้องทำคือ สร้างโฟลเดอร์รองรับเอาไว้ก่อน

  1. สร้างโฟลเดอร์ชื่อว่า training และ data เอาไว้ใน โฟลเดอร์ของ project เราครับ
  2. โยนไฟล์ label_map.pbtxt เข้า training(gdrive) และ ไฟล์ .record เข้า data(gdrive)

Choosing a pre-trained Model

สามารถหาโมเดลที่ถูกสอนมาแล้ว หรือ pre-trained model ได้จาก ลิงค์นี้เลยครับ
แต่ละโมเดลจะมีความเร็ว และ ความแม่นยำแตกต่างกันนะครับ ซึ่งจะขึ้นอยู่กับ Architecture ครับ,

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

มีคนเปรียบเทียบเอาไว้แล้วครับ,

ผมจะเลือกเป็นตัว Faster R-CNN Resnet101 COCO นะคับ,

เริ่มกันเลยดีกว่า

  1. เลือก Model จาก Model Zoo แล้ว Copy Link Address มาวางไว้หลัง wget ครับ (ใน Colab) แล้วก็แตกไฟล์ด้วยคำสั่
%cd '/content/drive/My Drive/gei-project'!wget http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_2018_01_28.tar.gzA!tar -xzvf '/content/drive/My Drive/gei-project/faster_rcnn_resnet101_coco_2018_01_28.tar.gz'

2. กลับมาที่ Local ,สร้างไฟล์ชื่อว่า model.config ขึ้นมา ,

แล้ว Copy .config ของ Model ที่เราจะใช้ จากลิงค์นี้ เข้าไปวางใน model.config เพื่อแก้บางส่วน
(เก็บไว้ใน Drive ของ คอมพิวเตอร์)

ส่วนที่ต้องแก้ไข

บรรทัดที่ 9 ให้แก้ตามจำนวน Class ใน Data ของเรา

ผมมี 6 ก็ใส่6

num_classes: 6

บรรทัด 106 ให้ใส่ตำแหน่งของ Pre-trained Model ของเรา (.ckpt)

fine_tune_checkpoint: "/content/drive/My Drive/gei-project/faster_rcnn_resnet101_coco_2018_01_28/model.ckpt"

บรรทัด 116, 118 จะสังเกตเห็นคำว่า PATH_TO_BE_CONFIGURED ซึ่งเราต้องแก้ไขส่วนนี้

ซึ่งในส่วนของ input_path, ให้ใส่ที่อยู่ของ train.record จากใน Google Drive ของเรา (Copy path จากใน Colab)
label_map_path ให้ใส่ที่อยู่ของ 1abel_map.pbtxt (Google Drive)

train_input_reader: {
tf_record_input_reader {
input_path: "/content/drive/My Drive/gei-project/data/train.record"
}
label_map_path: "/content/drive/My Drive/gei-project/training/label_map.pbtxt"
}

บรรทัด 122 ให้ใส่จำนวนของรูปภาพใน test ของเราไป

num_examples: 36

ส่วนบรรทัด 130, 132 ให้ทำเหมือน 116,118 แต่เปลี่ยนเป็น test

eval_input_reader: {
tf_record_input_reader {
input_path: "/content/drive/My Drive/gei-project/data/test.record"
}
label_map_path: "/content/drive/My Drive/gei-project/training/label_map.pbtxt"
shuffle: false
num_readers: 1
}

3. พอเสร็จเรียบร้อยก็ ลาก model.config เข้า training(gdrive)

ถึงเวลาที่รอคอยมาแสนนาน

ถึงเวลา Fine tune model ,

แต่,

Google colab จะ disconnect เอง ถ้าเราไม่ได้แตะต้องมันเลย ซึ่งจะทำให้ เราต้อง Train ซ้ำอีกครั้ง
เพื่อจะไม่ให้ Disconnect เราต้องคอยคลิกอยู่ตลอด แต่มีวิธีแก้ที่เราไม่ต้องคลิกเอง

  1. Ctrl + Shift + I
  2. Console และ
function ClickConnect(){
console.log("Clicked on connect button");
document.querySelector("colab-connect-button").click()
}
setInterval(ClickConnect,60000)

เพื่อที่จะคอย คลิก ปุ่ม Connect อยู่เสมอ ทุกๆ 1 นาที

(Optional) คอยดูความเคลี่อนไหว ด้วย tensorboard

  1. ติดตั้ง
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip!unzip ngrok-stable-linux-amd64.zip!npm install -g localtunnel!npm i -g npm

2. LOG_DIR ให้ใส่ตำแหน่งของ training ลงไป, พอรันเสร็จจะได้รับ URL มา ซึ่งเปิดบน plaform ไหนก็ได้

LOG_DIR = '/content/drive/My Drive/gei-project/training'get_ipython().system_raw('tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'.format(LOG_DIR))get_ipython().system_raw('./ngrok http 6006 &')!curl -s http://localhost:4040/api/tunnels | python3 -c \"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

ได้เวลา Train

การ Train โดยใช้ Tensorflow API นั้น ง่ายๆครับ แค่

%cd '/content/drive/My Drive/gei-project/models/research/object_detection/legacy'!python train.py --logtostderr --train_dir='/content/drive/My Drive/gei-project/training' --pipeline_config_path='/content/drive/My Drive/gei-project/training/model.config'
  • train_dir=ตำแหน่งที่จะเก็บ Checkpoint ซึ่งผมเก็บไว้ใน training/
  • pipeline_config_path=ตำแหน่ง config ของ Model

Colab จำกัดเวลาของ Runtime ไว้ที่ 12 ชั่วโมง นะครับ ถ้าปล่อยไว้ทั้งวันแล้วหลุดเฉย ก็ไม่ต้องห่วงนะครับ ตัว API จะคอยบันทึก Checkpoint เรื่อยๆ ในโฟลเดอร์ของ train_dir ครับ เราสามารถ Train ต่อจาก Checkpoint เดิมได้

ถ้าคิดว่า Model ที่เรา Train เริ่มเข้าที่แล้ว ก็ สามารถหยุด Cell ได้เลยครับ

NOTE!

หลังจาก Run Cell ข้างบนแล้ว อย่าเพิ่งไปนอน, #แต่ถ้าทุกอย่างปกติดีก็ตามสายเลยครับ

คอยดูอาการก่อนว่ามีอะไรผิดพลาดไหม และ สังเกตที่ RAM ถ้าใช้เยอะจนขีดเต็ม,

Cell จะหยุด Run ถ้าลองซ้ำอีก แล้วยังเหมือนเดิม ก็ลองกลับไปดู Dataset ของตัวเองครับ ว่ามัน ขนาดใหญ่เกินไปหรือเปล่า Resolution กว้าง * สูง เยอะไปไหม,

ให้แก้ไขในส่วนนี้ครับ ด้วย IMAGEMAGICK,

ลองลด Quality ดู หรือ Resize เหมือนที่เคยทำใน P2 : Dataset ครับ

NOTE: แต่หลังจากเรา Resize แล้ว Bounding Box ใน XML , CSV , TFRecord ไม่ได้ Resize ตามไปด้วย

เราสามารถแก้ไขได้ด้วย pandas , Excel , LibreOffice Calc ครับ

อย่างเช่น ลดขนาดรูปไป 50%, ให้สร้าง Column ที่ใส่สูตร หา 1/2 ของ width, height, xmin, ymin, xmax, ymax ขึ้นมา แล้วอย่าลืม ปัดเลขขึ้นด้วย

แล้วนำไปแทนที่ width, height, xmin, ymin, xmax, ymax อันเก่า

แล้วก็ ส่งต่อให้ gen_tfrecord.py สร้าง TFRecord แล้วมา Train ใหม่,

ถือเป็นอันเสร็จสิ้น ครับผม,

ต่อมา ดูผลลัพท์หลังจาก Train เสร็จเรียบร้อย