Object Detection โดยใช้ Tensorflow(gpu) บน Window 10 เบื้องต้น
เป็น Third Project ที่ได้ทำเมื่อเข้ามาอยู่ใน Data Cafe Analytic Trainee ก่อนจะได้จากลากันไป เหลือเพียงความทรงจำดีๆเก็บไว้ (ดราม่าตั้งแต่เริ่ม 555+)
เข้าเรื่องกันดีกว่า
บทความนี้จะแบ่งเป็น 2 part โดยจะสอนตั้งแต่ลงโปรแกรมพื้นฐานที่จำเป็น ไปจนถึงขั้นตอนที่เราสามารถทำ Object detection เบื้องต้นได้
- เตรียมโปรแกรมที่จำเป็นสำหรับการใช้ tensorflow + install tensorflow(gpu)
- การทำ object detection
ก่อนอื่นตรวจสอบรุ่น gpu ที่สามารถใช้กับ cuda ได้ที่นี่ ไม่งั้นจะไม่สามารถใช้ tensorflow(gpu) ได้ (รุ่นที่ผมใช้ เป็น NVIDIA GeForce GTX 1060)
เอาละมาเริ่มกันเลยย !
Part2
ขั้นตอนการทำ object detection
- ทำการดาวน์โหลดและติดตั้ง model object detection
- ติดตั้ง Path สำหรับการใช้งาน
- ตีกรอบและแบ่งประเภทของรูปภาพ
- สร้างไฟล์สำหรับ training
- ทำการ train model
- ทดลองใช้ 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
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
แก้ไขไฟล์ 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
- 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
ปล่อยโมเดล run จนถึง loss ลดลงขั้นที่เราพอใจ ก็กด Ctrl+C เพื่อหยุดการทำงาน model จะมีการ save การทำงานทุก 10 นาที
สร้าง 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-XXXX
→ model.ckpt-19921
#Common Errors
- เมื่อเกิด
ValueError: First step cannot be zero.
ให้เราไป edit file model ของเรา faster_rcnn_inception_v2_pets ที่อยู่ใน folderC:\tensorflow1\models\research\object_detection\training
เมื่อเข้ามาแล้วให้ไปลบ schedule step 0 ออก แล้วกด save
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 ของเรา
ไปดูกันในส่วนของ video บ้าง
ไฟล์ที่ใช้ในการ test จะชื่อ test สำหรับ video และ test1 สำหรับรูปภาพ ลองไปเปลี่ยนเล่นกันได้ครับ
จบแล้วครับสำหรับการทำ object dection เบื้องต้น
หวังว่าจะมีประโยชน์กับเพื่อนๆครับ
References
บ่นก่อนจาก
ก่อนจะจากกันไป พี่ๆ ก็ยังมีอะไรมาให้ surprise ด้วยการให้ deploy ขึ้นเว็บ แม้ project จะ fail ที่ไม่สามารถนำขึ้นเว็บ แล้วนำมาให้ลองเล่นกันได้ ก็ขอโชว์ผลงานใน server ของเครื่องไปพลางๆ
ประสบการณ์ฝึกงาน 2 เดือน
เริ่มเรียนรู้สิ่งใหม่ๆ
นั่งงม code และ debug งงแล้วงงอีก ง ง ง ง ง ง +++ แต่ก็ทำออกมาได้
เห็นมุมมองใหม่ๆ จากเพื่อนๆ พี่ๆ น้อง ในการทำงาน
ขอบคุณทุกคนที่ทำให้ทุกงานออกมาได้
จบจริงๆ…