Tensorflow Object Detection Versi 1.13 | Tutorial Praktis

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.

Tensorflow Object Detection - CUDA
Tensorflow Object Detection - Cuda

Pendahuluan

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.

Install software yang dibutuhkan

Install anaconda, 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:

Tensorflow Object Detection - Versi GPU
Tensorflow Object Detection - Versi GPU

Untuk download cuDNN, kita harus membuat account NVIDIA. Setelah download cuDNN selesai sesuai dengan versinya, lalu kita ikuti cara installasi cuDNN.

Setup Folder Tensorflow dan Anaconda virtual environment

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.

Download TensorFlow Object Detection API repo dari GitHub


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 Object Detection - Struktur file
Tensorflow Object Detection - Struktur file

Download Tensorflow model Zoo


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.

Tensorflow Object Detection - Ekstrak Zip file
Tensorflow Object Detection - Ekstrak Zip file

Karena kita akan mengunakan object detector berdasarkan yang kita inginkan, maka kita dapat menghapus file di bawah ini (folder harus tetap ada)

  • Semua file di dalam \object_detection\images\train and \object_detection\images\test
  • File “test_labels.csv” dan “train_labels.csv” di dalam  \object_detection\images
  • Semua file di dalam \object_detection\training
  • Semua file di dalam \object_detection\inference_graph

Setup Anaconda virtual environment


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

Mengkonfigurasikan variable environment pada PYTHONPATH


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%”

Compile Protobufs dan eksekusi setup.py


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

Mengumpulkan dan melabeli gambar


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.

Mengumpulkan gambar


Tensorflow membutuhkan ratusan objek gambar untuk di train agar mendapatkan hasil deteksi objek yang bagus.

Tensorflow Object Detection - Spesimen Objek Training
Tensorflow Object Detection - Spesimen Objek Training

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 Imageimport os, syspath = 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.

Labelling gambar


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.

Tensorflow Object Detection -  labeling object
Tensorflow Object Detection - labeling object

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.

Membuat Data Training

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.recordpython generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record

Membuat label map dan konfigurasi training

Hal terakhir yang dilakukan sebelum melakukan training tensorflow adalah membuat label map yang menyesuaikannya dengan konfigurasi training.

Label map


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

Konfigurasi 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:

  • Pada baris ke 9. Ubah num_classes ke jumlah object yang ingin kita deteksi. Untuk tutorial ini kita ganti dengan angka 6.
  • Pada baris 106, ubah
    fine_tune_checkpoint:
    "C:/tensorflow1/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt"
  • Baris 123 dan 125 di dalam section train_input_reader, ubah input_path dan label_map_path ke:
    input_path :
    "C:/tensorflow1/models/research/object_detection/train.record"
    label_map_path: “C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"
  • Baris 130, ubah num_examples menjadi jumlah gambar yang berada dalam folder test
  • Pada baris 135 dan 137, bagian eval_input, ubahlah input_path dan label_map_path ke:
    input_path ke :
    "C:/tensorflow1/models/research/object_detection/test.record"
    label_map_path: "C:/tensorflow1/models/research/object_detection/training/labelmap.pbtxt"

Menjalankan Training

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:

Tensorflow Object Detection - Progress training
Tensorflow Object Detection - Progress training

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:

[training tensorflow] Address Tensorboard

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.

Tensorflow Object Detection - Tampilan tensorboard
Tensorflow Object Detection - Tampilan tensorboard

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.

Export Inference Graph

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.

Menggunakan Pengklasifikasian Object Detection yang telah di training

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

Referensi:

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

Comments