Object Detection โดยใช้ Tensorflow(gpu) บน Window 10 เบื้องต้น

champ sirichai
5 min readJul 9, 2018

--

>> LAST UPDATED JULY, 2018 <<

เป็น Third Project ที่ได้ทำเมื่อเข้ามาอยู่ใน Data Cafe Analytic Trainee ก่อนจะได้จากลากันไป เหลือเพียงความทรงจำดีๆเก็บไว้ (ดราม่าตั้งแต่เริ่ม 555+)

เข้าเรื่องกันดีกว่า

บทความนี้จะแบ่งเป็น 2 part โดยจะสอนตั้งแต่ลงโปรแกรมพื้นฐานที่จำเป็น ไปจนถึงขั้นตอนที่เราสามารถทำ Object detection เบื้องต้นได้

  1. เตรียมโปรแกรมที่จำเป็นสำหรับการใช้ tensorflow + install tensorflow(gpu)
  2. การทำ object detection

ก่อนอื่นตรวจสอบรุ่น gpu ที่สามารถใช้กับ cuda ได้ที่นี่ ไม่งั้นจะไม่สามารถใช้ tensorflow(gpu) ได้ (รุ่นที่ผมใช้ เป็น NVIDIA GeForce GTX 1060)

เอาละมาเริ่มกันเลยย !

Part2

ขั้นตอนการทำ object detection

  1. ทำการดาวน์โหลดและติดตั้ง model object detection
  2. ติดตั้ง Path สำหรับการใช้งาน
  3. ตีกรอบและแบ่งประเภทของรูปภาพ
  4. สร้างไฟล์สำหรับ training
  5. ทำการ train model
  6. ทดลองใช้ model ที่เสร็จแล้ว

1.ทำการดาวน์โหลดและติดตั้ง model object detection

1.1 ไปที่ drive C: สร้าง folder ชื่อ tensorflow1 แล้วโหลด tensorflow model ที่นี่่ กดที่ clone or download ทำการแตกไฟล์ไว้ที่ folder ที่เราสร้างไว้ C:\tensorflow1 แล้วทำการเปลี่ยนชื่อ folder จาก “models-master” เป็น “models”

1.2 ทำการโหลด model ที่จะใช้ในการ train ในครั้งนี้จะใช้ the Faster-RCNN-Inception-V2 สามารถโหลดได้ ที่นี่ ทำการแตกไฟล์ไว้ที่ folder จาก ข้อ1.1 C:\tensorflow1\models\research\object_detection โดยใช้โปรแกรมพวก winzip ช่วยในการแตกไฟล์

1.3 ทำการโหลดตัวอย่างในการใช้ object detection ที่นี่ กดที่ clone or download ทำการแตกไฟล์ไว้ที่ C:\tensorflow1\models\research\object_detection

เมื่อทำครบ 3 ขั้นตอนจะได้ออกมาแบบนี้

model ที่ให้มาจากข้อ 1.3 เป็น model detect ไพ่ สามารถลอง run ตามก่อนได้ครับ

***ถ้าต้องการที่จะสร้าง model ของตัวเองใหม่ให้ลบไฟล์ตามนี้ครับ:

ลบทุกไฟล์ใน folder

  • C:\tensorflow1\models\research\object_detection\images
  • C:\tensorflow1\models\research\object_detection\inference_graph
  • C:\tensorflow1\models\research\object_detection\training

2.ติดตั้ง Path สำหรับการใช้งาน

ทำการ check Anaconda environment ที่เราได้ลงไว้เมื่อ Part 1

เปิด anaconda prompt แล้ว activate environment ที่เราได้สร้างไว้

แล้วลง tensorflow

pip install --ignore-installed --upgrade tensorflow-gpupip install opencv-python

ลง packages เพิ่มเติม

conda install -c anaconda protobuf

ทำการ set Path

set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slimset PATH=%PATH%;PYTHONPATH
echo %PATH%
echo %PYTHONPATH%

Tensorflow ใช้ Protobufs เพื่อตั้งค่า model และ training parameter

(โดยจะสร้างไฟล์ใหม่ชื่อเหมือนไฟล์เดิมไว้ใน C:\tensorflow1\models\research\object_detection\protos)

#(คำสั่ง protoc object_detection/protos/*.proto — python_out=. จะใช้ไม่ได้บน window) ให้ใช้ code ด้านล่าง

protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto

ติดตั้งไฟล์กันต่อที่ directoryC:\tensorflow1\models\research

cd C:\tensorflow1\models\research
python setup.py build
python setup.py install

สุดท้ายทดสอบการทำงานของ tensorflow ไปที่ directory C:\tensorflow1\models\research\object_detection เปิด jupyter notebook

cd C:\tensorflow1\models\research\object_detection
jupyter notebook object_detection_tutorial.ipynb

ทำการ run ตาม jupyter notebook ก็จะออกมาตามนี้

3.ตีกรอบและแบ่งประเภทของรูปภาพ

ก่อนอื่นเลยดาวน์โหลด โปรแปรมสำหรับใช้งาน ที่นี่

ดาวโหลดรูปที่ต้องการ train และ test ลงใน folder อัตราส่วนประมาณ 80:20

ทำการแตกไฟล์และเปิดโปรแกรม labelImg เลือก Open Dir เพิ่อเลือก folder ที่อยู่ของภาพ Open Save Dir ให้เลือกที่เดียวกันสำหรับการ save ไฟล์หลังการ label

คลิกที่ Create RectBox เพื่อทำการตีกรอบสิ่งที่เราต้องการ detect แล้วใส่ class ลงไป กด Save จะได้ไฟล์ .xml ทำให้ครบทุกภาพทั้ง train และ test

ใช้เวลาในการทำทั้งหมดพอสมควร 😫

4.สร้างไฟล์สำหรับ training

สร้างไฟล์ .csv สำหรับใช้ในการ train จากคำสั่ง

python xml_to_csv.py
จะได้ไฟล์ test และ train แล้ว

แก้ไขไฟล์ generate_tfrecord.py ให้ตรงตาม class ที่เราจะ train

# TO-DO replace this with label map
def class_text_to_int(row_label):
if row_label == 'nine':
return 1
elif row_label == 'ten':
return 2
elif row_label == 'jack':
return 3
elif row_label == 'queen':
return 4
elif row_label == 'king':
return 5
elif row_label == 'ace':
return 6
else:
None

สร้าง train.record และ test.record สำหรับการ train

python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record
จะได้ไฟล์ ออกมาแล้ว

ใช้ text editor สร้างไฟล์ labelmap.pbtxt ใส่ class ที่เราได้ทำการแบ่งไว้เข้าไป แล้วทำการ save ที่C:\tensorflow1\models\research\object_detection\training

item {
id: 1
name: 'nine'
}

item {
id: 2
name: 'ten'
}

item {
id: 3
name: 'jack'
}

item {
id: 4
name: 'queen'
}

item {
id: 5
name: 'king'
}

item {
id: 6
name: 'ace'
}

ทำการ copy model faster_rcnn_inception_v2_pets.config จาก C:\tensorflow1\models\research\object_detection\samples\configs มาไว้ที่ C:\tensorflow1\models\research\object_detection\training

เปิด faster_rcnn_inception_v2_pets.config ด้วย text editor และแก้ไขดังนี้

  • Line 9 การเปลี่ยน num classes ให้เท่ากับ class ที่เราได้แบ่งตอนตีกรอบรูป
  • Line 110 ใส่ที่อยู่ของ model faster_rcnn_inception_v2 ที่ได้แตกไฟล์ไว้ "C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"
  • Lines 126 และ 128 ทำการเปลี่ยนที่อยู่ของ train path

input_path : “C:/tensorflow1/models/research/object_detection/train.record”

label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

  • Line 132 ใส่จำนวนรูปภาพที่อยู่ใน C:\tensorflow1\models\research\object_detection\images\test
ในนี้ folder ผมมี 89 ภาพ
  • Lines 140 and 142 ทำการเปลี่ยนที่อยู่ของ test path

input_path : “C:/tensorflow1/models/research/object_detection/test.record”

label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt”

เสร็จแล้วอย่าลืม save !!!

5.ทำการ train model

ในที่สุดก็ถึงขั้นตอนที่ทุกคนรอคอย ? เริ่มการ train model ใส่ code ตามนี้เลย

python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
เมื่อเริ่มทำการ train model

ปล่อยโมเดล run จนถึง loss ลดลงขั้นที่เราพอใจ ก็กด Ctrl+C เพื่อหยุดการทำงาน model จะมีการ save การทำงานทุก 10 นาที

จะได้ไฟล์ที่ train ออกมาประมาณนี้

สร้าง file ที่จะใช้ด้วย model ที่ train แล้วของเราจากคำสั่งนี้

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_pets.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph

โดยให้แก้ xxxx เป็น train step สุดท้ายที่เราได้ run มา

model.ckpt-XXXXmodel.ckpt-19921

#Common Errors

  1. เมื่อเกิด ValueError: First step cannot be zero. ให้เราไป edit file model ของเรา faster_rcnn_inception_v2_pets ที่อยู่ใน folder C:\tensorflow1\models\research\object_detection\training เมื่อเข้ามาแล้วให้ไปลบ schedule step 0 ออก แล้วกด save
ลบส่วนที่ highlight

2. เมื่อเกิด ValueError: Tried to convert ‘t’ to a tensor and failed. Error: Argument must be a dense tensor: range(0, 3) — got shape [3], but wanted[] ให้เราไป edit file learning_schedules.py ที่อยู่ใน folder C:\tensorflow1\models\research\object_detection\utils เมื่อเข้ามาแล้วให้เลื่อนมาด้านล่างสุดแล้วใส่ list หน้า range ดังภาพ

6.ทดลองใช้ model ที่เสร็จแล้ว

ขั้นตอนสุดท้าย ผลผลิตที่งดงามมาหลังจากความพยายามที่ผ่านไป 555+

เรียก python shell ของเราขึ้นมาจากคำสั่ง

idle

เปิดไปยังไฟล์ที่เราต้องการจะ test

model ที่ให้มาจะมี รูป วีดีโอและwebcam

เราเริ่มจากรูปกันก่อนเลย เมื่อเปิด object_detection_image แล้วกด run

จะได้ผลลัพพ์ออกมาจาก model ของเรา

ถูกบ้างผิดบ้าง ปนกันไปครับ 555+ (train ไป 5 class)

ไปดูกันในส่วนของ video บ้าง

ไฟล์ที่ใช้ในการ test จะชื่อ test สำหรับ video และ test1 สำหรับรูปภาพ ลองไปเปลี่ยนเล่นกันได้ครับ

จบแล้วครับสำหรับการทำ object dection เบื้องต้น

หวังว่าจะมีประโยชน์กับเพื่อนๆครับ

References

  1. TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10

บ่นก่อนจาก

ก่อนจะจากกันไป พี่ๆ ก็ยังมีอะไรมาให้ surprise ด้วยการให้ deploy ขึ้นเว็บ แม้ project จะ fail ที่ไม่สามารถนำขึ้นเว็บ แล้วนำมาให้ลองเล่นกันได้ ก็ขอโชว์ผลงานใน server ของเครื่องไปพลางๆ

ประสบการณ์ฝึกงาน 2 เดือน

เริ่มเรียนรู้สิ่งใหม่ๆ

นั่งงม code และ debug งงแล้วงงอีก ง ง ง ง ง ง +++ แต่ก็ทำออกมาได้

เห็นมุมมองใหม่ๆ จากเพื่อนๆ พี่ๆ น้อง ในการทำงาน

ขอบคุณทุกคนที่ทำให้ทุกงานออกมาได้

จบจริงๆ…

--

--