Tutorial ini di berisi mengenai tensorflow object detection dengan neural network dengan object yang sesuai dengan yang Anda inginkan menggunakan Tensorflow Framework API. Pada akhir tutorial ini kita akan dapat mengenali object dengan tanda segi empat pada gambar, video ataupun webcam.
Tutorial ini memaparkan bagaimana cara menggunakan API Tensorflow Object Detection untuk training klasifikasi object detection dari beberapa object tertentu pada windows 10. Namun, tutorial ini dapat digunakan pada OS yang lain seperti Mac ataupun Linux, hanya saja akan ada sedikit perbedaan prosedurnya pada command terminal OS yang bersangkutan. Pada tutorial ini, versi yang digunakan adalah Tensorflow-GPU v1.13.1 dan Python 3.5.
Tensorflow-GPU memiliki kemampuan lebih dalam hal kecepatan processing karena oleh VGA grafik card. Berdasarkan pengalaman, Tensorflow biasa (CPU) memiliki kecepatan 8x lebih lambat (misal jika kita menggunakan GPU membutuhkan waktu 1 jam untuk training model, pada Tensorflow CPU membutuhkan waktu 8 jam). Tensorflow CPU pada tutorial ini pun dapat digunakan, namun akan lebih lambat dalam hal processing. Jika anda ingin menggunakan Tensorflow CPU, maka, tidak perlu install CUDA dan CuDNN.
Download Anaconda, lalu install pada computer anda. Perlu diperhatikan bahwa, installer Anaconda terbaru sudah menggunakan Python versi 3.7, sedangkan pada tutorial ini kita menggunakan Python 3.5. Namun, kita tidak perlu khawatir, karena kita akan menggunakan virtual environment.
Tahap selanjutnya adalah menginstall CUDA dari situs resmi NVIDA. Perlu diperhatikan bahwa, versi CUDA dan cuDNN harus sesuai dengan versi Tensorflow yang kita gunakan. Karena kita menggunakan Tensorflow 1.13.1, sehingga versi yang dibutuhkan adalah:
Untuk download cuDNN, kita harus membuat account NVIDIA. Setelah download cuDNN selesai sesuai dengan versinya, lalu kita ikuti cara installasi cuDNN.
Tensorflow Object Detection API membutuhkan struktur folder yang spesifik sesuai dengan Github Repository nya. Selain itu, kita membutuhkan beberapa Python package tambahan dan juga variable PATH dan PYTHONPATH.
Buatlah folder baru di dalam drive C: dengan nama “tensorflow1”. Folder ini meliputi Tensorflow framework untuk object detection, termasuk objek training tensorflow, data training, klasifikasi yang telah di train, konfigurasi file dan hal lain yang dibutuhkan untuk mendeteksi suatu objek.
Download/clone Tensorflow object detection repo pada link GitHub ini untuk versi 1.13. Versi terbaru adalah 2.0, namun jika kita menggukan versi 2.0, maka, akan ada banyak perubahan pada library dan tentunya mempersulit hidup kita hingga versi yang telah stabil di rilis oleh Google.
Setelah proses cloning selesai, struktur folder akan seperti: C:\tensorflow1\models:
Tensorflow memiliki beberapa model pendeteksi objek (telah di training tensorflow menggunakan arsitektur neural network yang spesifik), pre trained model tersebut dapat ditemukan pada link ini. Model-model tersebut memiliki arsitektur yang berbeda. Ada yang sangat cepat dalam mendeteksi objek, namun memiliki akurasi yg kurang baik (seperti SSD mobilenet). Selain itu, ada yang lebih lambat mendeteksi objek dan memiliki akurasi yang lebih akurat (seperti Faster-RCNN model).
Kita dapat memilih model sesuai dengan keperluan masing-masing, jika kita ingin menggunakan smartphone atau Raspberry Pi, maka pilih lah SSD-Mobile net. Namun, jika kita memiliki komputer yang cepat, maka model RCNN dapat digunakan.
Pada tutorial ini saya menggunakan laptop ASUS ROG GL502VT yang memiliki VGA NVIDIA GTX 970M 16GB. Oleh karena itu, kita akan menggunakan model Faster-RCNN-Inception-V2 model.
Setelah proses download Zoo model yang akan kita pakai selesai, selanjutnya adalah mengekstrak file tersebut, lalu letakkan di dalam folder C:\tensorflow1\models\research\object_detection.
Selanjutnya adalah download/clone full repository dari GitHub Edje Electronics, ekstrak zip file, lalu tempatkan di dalam folder C:\tensorflow1\models\research\object_detection.
Karena kita akan mengunakan object detector berdasarkan yang kita inginkan, maka kita dapat menghapus file di bawah ini (folder harus tetap ada)
Langkah selanjutnya adalah setup Anaconda virtual environment untuk menjalankan tensorflow-gpu. Dari windows search, cari “Anaconda prompt” dan jalankan sebagai administrator.
Selanjutnya kita akan membuat environment bernama “tensorflow1” dengan cara mengeksekusi perintah:
C:\> conda create -n tensorflow1 pip python=3.5
Lalu aktivasi environment “tensorflow1” dan upgrade pip
C:\> activate tensorflow1
(tensorflow1) C:\>python -m pip install --upgrade pip
Selanjutnya install tensorflow-gpu dalam environment tersebut dengan mengeksekusi:
(tensorflow1) C:\> pip install --ignore-installed --upgrade tensorflow-gpu==1.13.1
Lalu kita harus install beberapa paket lainnya yang dibutuhkan oleh tensorflow yaitu:
(tensorflow1) C:> conda install -c anaconda protobuf
(tensorflow1) C:> pip install pillow
(tensorflow1) C:> pip install lxml
(tensorflow1) C:> pip install Cython
(tensorflow1) C:> pip install contextlib2
(tensorflow1) C:> pip install jupyter
(tensorflow1) C:> pip install matplotlib
(tensorflow1) C:> pip install pandas
(tensorflow1) C:> pip install opencv-python
Variable PYTHONPATH harus ditentukan dan mengarah kepada direktori \models, \models\research, dan \models\research\slim dengan cara mengeksekusi perintah:
(tensorflow1) C:> set PYTHONPATH=C:\tensorflow1\models;C:\tensorflow1\models\research;C:\tensorflow1\models\research\slim
Catatan: Kita harus selalu setup ulang PYTHONPATH setiap kali keluar dari virtual environment “tensorflow1”. Untuk memastikan bahwa path telah sesuai, kita dapat memeriksanya dengan perintah “echo %PYTHONPATH%”
Selanjutnya adalah mengkompilasikan file protobuf yang diperlukan untuk parameter model dan konfigurasi training pada tensorflow.
Pada Anaconda Command prompt, arahkan directory ke \models\research:
(tensorflow1) C:\> cd C:\tensorflow1\models\research
Lalu, copy dan paste perintah ini:
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 .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto
Perintah diatas akan menghasilkan python file xxx_pb2.py dari setiap xxx.proto di dalam folder \object_detection\protos
Setelah itu, eksekusi perintah dari direktori
C:\tensorflow1\models\research:
(tensorflow1) C:\tensorflow1\models\research> python setup.py build
(tensorflow1) C:\tensorflow1\models\research> python setup.py install
Kita telah menyiapkan API Tensorflow Object Detection dan kita butuh mengumpulkan banyak gambar untuk di training tensorflow. Pada tutorial ini kita akan menggunakan kemasan botol plastic dan kaleng pada minuman yang berbeda merk.
Tensorflow membutuhkan ratusan objek gambar untuk di train agar mendapatkan hasil deteksi objek yang bagus.
Objek yang akan kita kenali ada enam macam jenis spesimen, yaitu: botol plastic (Aqua, Prima dan Le Minerale) serta kemasan minuman kaleng (Sprite, Coca-cola dan Pocari Sweat).
Pastikan ukuran gambar tidak terlalu besar, oleh karena itu saya buatkan Python script untuk membuat gambar lebih kecil dan memiliki ukuran yang sama
from PIL import Image
import os, sys
path = r"C:\xxx\xxx\xxxxxx\\"
dirs = os.listdir( path )
def resize():
i = 1
for item in dirs:
if os.path.isfile(path+item):
im = Image.open(path+item)
f, e = os.path.splitext(path+item)
imResize = im.resize((720,540), Image.ANTIALIAS)
imResize.save('Image_'+str(i)+'.jpg', 'JPEG', quality=90)
i=i+1
print("done image " + str(i))
resize()
Setelah kita memiliki gambar yang diinginkan, pisahkan menjadi dua bagian. 20% masuk ke dalam folder \object_detection\images\test sisanya (80%) pindahkan ke dalam \object_detection\images\train.
Setelah semua terkumpul, sekarang saatnya untuk memberi label pada setiap gambar. Labelimg adalah software yang mudah digunakan untuk melabeli gambar, dengan instruksi yang jelas dan dapat anda lihat di dalam repository Labelimg Github.
Total semua gambar yang saya beri label adalah 225 gambar. Label gambar tersebut di simpan dalam bentuk .xml file. File xml ini akan digunakan untuk membuat TFRecords yang merupakan salah satu input TensorFlow trainer. Setelah kita memberikan label pada setiap gambar, maka, masing-masing gambar akan memiliki satu .xml file di dalam folder \test dan \train.
Setelah selesai melabeli gambar, sekarang saat nya untuk membuat training tensorflow TFRecords dengan menggunakan script xml_to_csv.py dan generate_tfrecord.py dari link github ini.
Pertama-tama, file .xml akan digunakan untuk membuat file .csv yang meliputi semua informasi gambar pada folder train dan test. Eksekusi perintah dari folder \object_detection:
(tensorflow1) C:\tensorflow1\models\research\object_detection> python xml_to_csv.py
Perintah tersebut akan menghasilkan train_labels.csv dan test_labels.csv yang berada di dalam folder \object_detection\images.
Selanjutnya buka file generate_tfrecord.py dengan menggunakan text editor, lalu ubah label map pada baris 31.
def class_text_to_int(row_label):
if row_label == 'botol plastik-Aqua':
return 1
elif row_label == 'botol plastik-Prima':
return 2
elif row_label == 'botol plastik-Le Minerale':
return 3
elif row_label == 'kaleng-CocaCola':
return 4
elif row_label == 'kaleng-Sprite':
return 5
elif row_label == 'kaleng-Pocari Sweat':
return 6
else:
None
Selanjutnya adalah membuat TFRecord dengan mengesekusi dua perintah di bawah ini dari dalam folder \object_detection:
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
Hal terakhir yang dilakukan sebelum melakukan training tensorflow adalah membuat label map yang menyesuaikannya dengan konfigurasi training.
Label map memberitahu Tensorflow trainer untuk setiap object, dengan cara mendefinisikan nama kelas ke dalam nomer ID kelas tersebut. Dengan menggunakan text editor, buatlah file dengan nama labelmap.pbtxt di dalam folder:
C:\tensorflow1\models\research\object_detection\training
Untuk menjalankan konfigurasi yang tepat, pipeline training object detection harus disesuaikan. Hal tersebut digunakan untuk mendefinisikan model dan parameter apa yang digunakan. Ini merupakan langkah terakhir sebelum kita menjalankan training.
Masuk ke dalam folder: C:\tensorflow1\models\research\object_detection\samples\configs, lalu copy file faster_rcnn_inception_v2_pets.config
ke dalam folder
C:\tensorflow1\models\research\object_detection\training dan edit sesuai dengan konfigurasi di bawah ini:
Sekarang saatnya kita menjalankan training untuk objek yang dikehendaki. Pada Anaconda Prompt navigasikan ke folder \object_detection, lalu training di mulai dengan mengeksekusi perintah:
python train.py --logtostderr --train_dir=training/ --pipeline_config_path=training/faster_rcnn_inception_v2_pets.config
Jika training ter-setup dengan benar, Tensorflow akan memulai inisiasi training tensorflow. Pada inisialisasi ini dibutuhkan waktu sekitar 30 detik sebelum training dijalankan. Proses training akan terlihat seperti pada gambar di bawah ini:
Setiap step training tensorflow akan terlihat loss yang dihasilkan. Dimulai dari angka tinggi dan terus mengecil. Direkomendasikan untuk terus melakukan training hingga loss di bawah 0.05 dengan steady.
Jumlah loss akan berbeda dari setiap model yang akan di pakai untuk training. Sebagai contoh jika menggunakan MobileNet-SSD, loss akan di mulai dari angka 20 dan terus dilakukan training hingga di bawah angka 2.
Progress dari training tensorflow dapat di lihat melalui TensorBoard. Untuk membukanya, kita harus menjalankan Anaconda Prompt pada window lain, aktivasi environment tensorflow1, lalu setup kembali PYTHONPATH seperti yang telah dijelaskan pada bagian sebelumnya.
Perintah untuk mengeksekusi training adalah:
(tensorflow1) C:\tensorflow1\models\research\object_detection>tensorboard --logdir=training
Perintah di atas akan membuka webpage pada local machine pada alamat (yang akan terlihat setelah eksekusi tensorboard) sesuai dengan nama komputer anda:
Alamat web ini dapat di buka dengan menggunakan web browser apa saja. Tensorboard memberikan informasi dalam bentuk grafik yang menunjukkan progress training tensorflow. Grafik yang perlu diperhatikan adalah Loss, grafik ini menunjukkan loss secara keseluruhan dari klassifier seiring berjalannya waktu.
Training tensorflowtersebut secara berkala akan menyimpan data checkpoint setiap sepuluh menit. Untuk mengentikan training, kita dapat melakukannya dengan menekan CTRL+C pada Anaconda Prompt. Hal yang menarik adalah kita dapat menghentikan nya, lalu menjalankan kembali proses training tanpa harus di mulai dari awal.
Setelah training selesai, langkah terakhir adalah membuat frozen inference graph (file .pb). Pada Anaconda Prompt, navigasikan ke folder \object_detection, lalu eksekusi dengan perintah:
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 adalah angka paling besar pada file “model.ckpt-XXXX” (yang paling up to date).
Perintah diatas akan menghasilkan file frozen_inference_graph.pb di dalam folder \object_detection\inference_graph. File .pb adalah hasil training klasifikasi object detection.
Object detection telah siap untuk digunakan!!! Edje Electronic telah membuat script untuk mendeteksi obyek berupa gambar, video dan live camera.
Sebelum menjalankan Python script tersebut, kita harus memodifikasi variable NUM_CLASSES sesuai dengan jumlah klasifikasi yang telah kita tentukan.
Untuk menjalankan Python Script, kita dapat mengeksekusi perintah “idle” di dalam Anaconda Prompt dengan menggunakan “tensorflow1” environment. Setelah Python idle window terbuka, lalu kita dapat membuka file untuk mendeteksi obyek, lalu di klik run. Pada contoh ini, kita akan menggunakan webcam untuk mendeteksi objek.
Sekian tutorial yang cukup panjang ini. Bila anda tertarik untuk menggunakan raspberry pi untuk mendeteksi object. Anda dapat melihatnya pada link ini.
Voila!! Selamat mencoba
https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10
https://www.tensorflow.org/install/source#tested_build_configurations
https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html
https://github.com/tensorflow/models/tree/r1.13.0
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
https://github.com/tzutalin/labelImg
https://github.com/datitran/raccoon_dataset