noprianto
noprianto
. 6 min read

OpenVINO – Object Detection YOLO3

Output object detection

Bismillah,
Jika pada kesempatan sebelumnya saya sudah posting mengenai objek detection pada sebuah gambar menggunakan Single Shot Detection(SSD), sekarang akan saya coba object detection dengan input berupa video menggunakan You Only Look Once(YOLO) versi 3. Peralatan yang akan digunakan adalah Raspberry Pi 3B+ dengan tertancap Neural Compute Stick 2 serta saya menggunakan Mac OSx yang sudah terinstall OpenVINO sdk. Beberapa point yang akan kita lakukan adalah sebagai berikut

Download Model YOLO3

Karena kita menggunakan model pre-trained sehingga kita tidak perlu membuat dari nol, kita cukup memanfaatkan model yang sudah tersedia. Silakan ketik perintah di bawah ini pada terminal Anda

git clone https://github.com/mystic123/tensorflow-yolo-v3.git

Perintah di atas digunakan untuk download kode menggunakan git, jika pada komputer/laptop Anda belum terinstall git silakan install terlebih dahulu atau bisa download langsung tanpa harus melakukan cloning. Pada project tersebut adalah contoh model YOLO3 tetapi masih menggunakan komputer/laptop belum Raspberry dan NCS2. Hal yang dibutuhkan selanjutnya adalah label atau nama class dari object detection, ketikkan perintah di bawah ini pada terminal Anda

wget https://raw.githubusercontent.com/pjreddie/darknet/master/data/coco.names

Hasil download file di atas adalah daftar object-object yang dapat dikenali oleh YOLO3 kelak, ada 80 object yang dapat dikenali. Isi dari file tersebut kurang lebih seperti ini

person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
...

Selanjutnya kita bisa melakukan download model YOLO3, ada 2 jenis yang dapat kita gunakan yaitu versi untuk komputer pada umumnya dan perangkat dengan spesifikasi minimal(Raspberry, Android, dll). Ketik perintah di bawah ini pada terminal Anda

wget https://pjreddie.com/media/files/yolov3.weights
wget https://pjreddie.com/media/files/yolov3-tiny.weights

File tersebut adalah hasil training dari YOLO3, yolov3.weights adalah versi yang full. Sedangkan yolov3-tiny.weights diperuntukkan untuk perangkat kecil. Yang perlu Anda lakukan selanjutnya yaitu ketik baris perintah di bawah ini

python3 ./convert_weights.py --data_format NHWC

Perintah di atas digunakan untuk melakukan generate file check point, file tersebut dibutuhkan untuk membuat file Protocol Buffer(*.pb). data_format NHWC maksudnya adalah karena nanti kita menjalankan menggunakan CPU, jika menggunakan GPU diganti dengan NCHW. Jika semuanya normal seharusnya output dari perintah di atas seperti di bawah ini

WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.
 For more information, please see:
 https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
 https://github.com/tensorflow/addons
 If you depend on functionality not listed there, please file an issue. 
 WARNING:tensorflow:From /Users/od3ng/.virtualenvs/tf-object-detection/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
 Instructions for updating:
 Colocations handled automatically by placer.

Output dari file tersebut seharusnya akan membentuk folder saved_model, silakan ketik perintah di bawah ini

python3 ./convert_weights_pb.py --data_format NHWC

Seperti yang diinfokan di atas, perintah di atas untuk membuat file Protocol Buffer(*.pb), sampai dengan langkah ini sebenarnya model dari YOLO3 sudah dapat digunakan. Output dari perintah di atas adalah sebagai berikut

WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.
 For more information, please see:
 https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md
 https://github.com/tensorflow/addons
 If you depend on functionality not listed there, please file an issue. 
 WARNING:tensorflow:From /Users/od3ng/.virtualenvs/tf-object-detection/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
 Instructions for updating:
 Colocations handled automatically by placer.
 WARNING:tensorflow:From /Users/od3ng/PycharmProjects/tensorflow-yolo-v3/utils.py:53: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.
 Instructions for updating:
 Use tf.compat.v1.graph_util.convert_variables_to_constants
 WARNING:tensorflow:From /Users/od3ng/.virtualenvs/tf-object-detection/lib/python3.6/site-packages/tensorflow/python/framework/graph_util_impl.py:245: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.
 Instructions for updating:
 Use tf.compat.v1.graph_util.extract_sub_graph
 1208 ops written to frozen_darknet_yolov3_model.pb.

Sampai dengan langkah ini model yang telah kita buat, sebenarnya sudah selesai untuk format modelnya tensorflow. Silakan ketika program di bawah ini untuk melakukan ujicoba model yang telah kita buat, kita akan menggunakan gambar berikut ini untuk dilakukan detection

Input object detection
Input object detection
python3 demo.py --input_img ~/Desktop/OpenVINO-YOLO3-input.jpeg --output_img ~/Desktop/OpenVINO-YOLO3-output.jpeg --data_format NHWC
...
File "demo.py", line 92, in main
     iou_threshold=FLAGS.iou_threshold)
   File "/Users/od3ng/PycharmProjects/tensorflow-yolo-v3/utils.py", line 191, in non_max_suppression
     image_pred = image_pred.reshape(-1, shape[-1])

Ketika mendapati error seperti di atas, silakan ganti kode program yang terdapat pada file utils.py

shape = image_pred.shape 
non_zero_idxs = np.nonzero(image_pred) 
image_pred = image_pred[non_zero_idxs] 
image_pred = image_pred.reshape(-1, shape[-1])

Ganti beberapa baris di atas menjadi seperti di bawah ini

image_pred = np.array([p for p in image_pred if p[4] > 0])

Setelah diganti kode di atas seharusnya tidak terjadi error kembali, hasilkan dari gambar input di atas kira-kira seperti di bawah ini

Output object detection
Output object detection

Convert Model YOLO3 ke dalam Model Inference

Agar file Protocol Buffer(*.pb) dapat digunakan pada OpenVINO, kita perlu mengubahnya ke dalam format inference(*.bin dan *.xml). Hal tersebut dapat dilakukan menggunakan perintah di bawah ini

cd /opt/intel/openvino/deployment_tools/model_optimizer
/mo_tf.py --input_model ~/PycharmProjects/tensorflow-yolo-v3-pi/frozen_darknet_yolov3_model.pb --tensorflow_use_custom_operations_config ../../deployment_tools/model_optimizer/extensions/front/tf/yolo_v3.json -o ~/PycharmProjects/tensorflow-yolo-v3-pi --data_type FP16 --batch 1

Jangan lupa untuk tambahan parameter --data_type FP16 karena akan dijalankan pada raspberry.

Menjalankan Demo Program

Langkah terakhir yang akan kita coba yaitu menjalankan demo program yang telah kita buat sebelumnya, silakan download kode di sini dan jalankan kode python seperti di bawah ini

python3 openvino_yolov3.py -d MYRIAD -i frozen_darknet_yolov3_model.xml

Jika ketika dijalankan mendapatai error seperti di bawahi ini, pastikan tensorflow yang Anda gunakan untuk mengkonversi model tensorflow ke dalam model inference adalah versi <= 1.12.0

t = IENetwork(model=model_xml, weights=model_bin)
   File "ie_api.pyx", line 271, in openvino.inference_engine.ie_api.IENetwork.cinit
 RuntimeError: Error reading network: in Layer detector/darknet-53/Conv_1/Conv2D: trying to connect an edge to non existing output port: 2.1

Jika semua normal, outputnya ditunjukkan pada gambar di bawah ini

Output video object detection
Output video object detection

Demikianlah tulisan saya mengenai object detection menggunakan model pre-trained yaitu YOLO3 pada OpenVINO, semoga bermanfaat dan tetap memotivasi temen-temen yang belajar OpenVINO. Kritik dan saran sangat diharapkan untuk meningkatkan kwalitas blog ini, happy coding. 🙂

Referensi

comments powered by Disqus