Artikel ini adalah kelanjutan dari artikel setahun yang lalu sebelumnya tentang Tensorflow Object Detection. Di artikel sebelumnya kita fokus pada penyiapan data, kali ini kita akan membahas cara melatih dan membuat model deep learning Tensorflow Object Detection menggunakan Google Colab, hingga akhirnya siap digunakan di Android.
Pada tutorial ini kita menggunakan Tensorflow versi 2, yang sedikit berbeda dengan Tensorflow versi 1. Ini salah satu alasan artikel ini tertunda cukup lama, tahun lalu ketika artikel pertama ditulis, Tensorflow versi 2 masih belum cukup stabil untuk object detection maupun untuk diconvert ke TFLite.

Overview
Secara umum ada 3 tahapan untuk membuat model tensorflow untuk mendeteksi objek dan menjadikan model tersebut siap digunakan di Android:
- Menyiapkan dataset. Jika objek yang ingin kita bukan objek yang umum dideteksi, maka kita perlu menyiapkan dataset terlebih dahulu. Tahap ini sudah dibahas di artikel sebelumnya.
- Melatih pre-trained model. Kita akan menggunakan pre-trained model, karena untuk merangkai dan melatih model dari awal akan memakan waktu dan membutuhkan resource yang besar. Kita cukup melakukan fine-tuning model agar model memiliki performa yang baik, untuk dataset baru, dengan waktu pelatihan yang lebih singkat.
- Mengconvert model menjadi TFLite. Proses mengubah model yang sudah dilatih ke format yang dapat dipahami oleh mobile Android.
Source Code
Tutorial Tensorflow Object Detection ini tersedia di Google Colab berikut: https://colab.research.google.com/drive/1dNIIcDBMaKieGzSl1BVE5H6wu17n6cO7?usp=sharing. Untuk dataset dan script-script lain yang akan digunakan dapat diakses di repository github berikut: https://github.com/rianrajagede/object-detection.git. Tutorial ini merujuk pada link Google Colab dan repo github di atas.
1. Instalasi Tensorflow Object Detection
Ketika kita menginstall Tensorflow, kita belum menginstall Tensorflow Object Detection API. Hal ini juga berlaku di Google Colab, kita tetap perlu menginstall Tensorflow Object Detection API terlebih dahulu. Langkah instalasi resminya bisa diakses di sini. Saat artikel ini ditulis instalasi bisa dilakukan dengan:
1. Clone github Tensorflow Object Detection API di Google Colab. Penanda tanda seru (!) di awal baris menunjukkan baris tersebut sedang menjalankan perintah Command Prompt, bukan Python. Perintah ini akan membuat folder models yang berisi file-file dari repository tensorflow object detection.
!git clone https://github.com/tensorflow/models.git
2. Lalu install API menggunakan perintah di bawah. Penanda %%bash fungsinya mirip dengan tanda !, jika perintah %%bash ditulis di awal baris menunjukkan cell Google Colab tersebut sedang menjalankan perintah Command Prompt, bukan Python.
%%bash cd models/research/ protoc object_detection/protos/*.proto --python_out=. cp object_detection/packages/tf2/setup.py . python -m pip install .
3. Jalankan test untuk memastikan instalasi berhasil dengan menjalankan perintah berikut. Jika semua tertulis “OK” berarti instalasi berhasil.
!python models/research/object_detection/builders/model_builder_tf2_test.py
2. Download Dataset
Dataset yang akan kita gunakan ada di repository github yang saya share di bagian Source Code tadi, gunakan perintah di bawah untuk mengkloning repositori ke google colab. Setelah data didownload, lakukan pemrosesan data seperti yang telah dijelaskan di artikel sebelumnya (atau cek link Google Colab di atas di bagian “Menyiapkan TFrecord file”.
!git clone https://github.com/rianrajagede/object-detection.git
Dataset ini berisikan gabungan dari dua public dataset yang terdiri dari objek Rakun dan Kanguru. Setiap citra memiliki file anotasi bertipe XML dengan nama yang sama. Berikut ini contoh citra yang ada di file.

3. Training Pre-trained Model
Pre-trained model adalah model yang siap pakai dan sudah dilatih dengan dataset yang besar. Penjelasan lebih detail tentang pre-trained model dan penggunananya ada di artikel sebelumnya tentang transfer learning.
1. Download Pre-trained model yang akan digunakan. Pre-trained model yang tersedia untuk object detection dapat dilihat daftarnya di halaman ini. Sebagai contoh, kita akan menggunakan salah satu jenis pre-trained model SSD MobileNetv2 (ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz).
Berikut perintah yang digunakan untuk mendownload dan mengekstrak pre-trained model:
!wget http://download.tensorflow.org/models/object_detection/tf2/20200710/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz !tar -zxvf ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
Hasil dari proses ini adalah sebuah directory dengan nama yang sesuai dan berisikan pre-trained model.

2. Atur Pipeline.config. Sebelum proses training, kita perlu mengatur beberapa hal di file pipeline.config yang tersedia di folder pre-trained model. File ini bertanggung jawab mengatur parameter-parameter pelatihan ataupun evaliasi seperti lama pelatihan, arsitektur, dsb.
File Pipeline.config bisa dibuka dengan text editor biasa, atau jika menggunakan Google Colab bisa dengan cara double klik, nanti akan muncul jendela editor kecil.
Apa saja yang perlu diatur dari file tersebut? Sebenarnya banyak yang bisa diatur, tapi pada tutorial ini kita atur beberapa hal saja.
- Nilai pada
num_classdisesuaikan dengan jumlah class yang akan digunakan. Pada tutorial ininum_class: 2 - Temukan bagian
fine_tune_checkpoint_typelalu ubah dariclassificationmenjadidetection - Nilai
batch_sizemenentukan ukuran batch. Kita gunakan batch kecil saja ubahbatch_size: 32 - Untuk dataset yang sederhana ini, kita bisa gunakan jumlah iterasi yang kecil. Atur
num_steps: 1000 - MobilenetV2 ini secara default dilatih menggunakan learning rate yang dinamis berdasar banyak iterasi (nilai learning rate bisa berubah-ubah). Ini tampak dari bagian di bawah. Karena kita mengubah
num_stepslebih kecil, maka kita sesuaikan jugatotal_steps: 1000danwarmup_steps: 100.
learning_rate {
cosine_decay_learning_rate {
learning_rate_base: 0.07999999821186066
total_steps: 50000
warmup_learning_rate: 0.026666000485420227
warmup_steps: 1000
}
}
- Cari pada file pipeline tulisan
PATH_TO_BE_CONFIGURED. lalu sesuaikan dengan path yang dituju.- Untuk
fine_tune_checkpointarahkan ke checkpoint file dari pretrained model. Berdasarkan tutorial ini, pathnya/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0 - Untuk
input_pathpadatrain_input_readerarahkan ke tfrecord data train. Berdasarkan tutorial ini, pathnya/content/object-detection/train.record - Untuk
input_pathpadaeval_input_readerarahkan ke tfrecord data test. Berdasarkan tutorial ini, pathnya/content/object-detection/test.record - Untuk
label_map_patharahkan ke filelabel_map.pbtxt. Di tutorial ini pathnya/content/object-detection/label_map.pbtxt
- Untuk
3. Jalankan perintah berikut untuk mulai pelatihan. Pada parameter --model_dir kita beritahu di mana model output proses pelatihan ini akan disimpan. Sedangkan parameter --pipeline_config_path berisi path menuju file pipeline.config yang tadi sudah kita edit.
!python /content/models/research/object_detection/model_main_tf2.py \
--alsologtostderr \
--model_dir="/content/output/" \
--pipeline_config_path="/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config"
Proses training akan berlangsung cukup lama meskipun telah dijalankan di Google Colab dan dengan data yang tidak terlalu banyak. Untuk 1000 steps, kira-kira proses pelatihan akan memakan waktu 10-15 menit. Setelah proses pelatihan di atas selesai, model akan tersimpan di folder /output dalam format SavedModel.

4. Convert ke TFLite
Model yang dihasilkan sudah bisa digunakan, namun untuk bisa menggunakannya di mobile android, kita perlu mengubah formatnya menjadi bentuk TFLite. Proses pengubahan dari SavedModel ke TFLite dilakukan dalam dua langkah:
1. Buat SavedModel yang “ramah” untuk TFLite. Perintah berikut ini jika dijalankan akan menghasilkan sebuah folder /tflite yang berisi SavedModel juga namun lebih siap untuk dijadikan TFLite (model sementara)
!python models/research/object_detection/export_tflite_graph_tf2.py \
--trained_checkpoint_dir {'/content/output'} \
--output_directory {'/content/tflite'} \
--pipeline_config_path {'/content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/pipeline.config'}
2. Convert SavedModel tersebut menjadi TFLite. Jalan perintah berikut untuk menghasilkan model.tflite di folder /tflite. Jika diperhatikan, kode di bawah ini merupakan perintah python, untuk menjalankan tentu perlu ada package yang diimport. Cek kode di Colab untuk lebih lengkapnya.
_TFLITE_MODEL_PATH = "/content/tflite/model.tflite"
converter = tf.lite.TFLiteConverter.from_saved_model('/content/tflite/saved_model')
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_model = converter.convert()
with open(_TFLITE_MODEL_PATH, 'wb') as f:
f.write(tflite_model)
Dan selesai! kalian bisa cek model.tflite di folder tersebut, lalu menggunakannya di android.

5. Inference Model TFLite
Pada bagian ini kita akan melihat aksi model tflite yang sudah kita buat. Untuk melihat performa model TFLite yang dihasilkan, kita bisa cek menggunakan script yang ada di github repo di atas, yakni TFLite_detection_image.py.
Sebelum menjalankan upgrade terlebih dahulu Open CV di Google Colab ke versi terbaru. Saat artikel ini dibuat OpenCV di Google Colab masih versi lama sehingga bisa menyebabkan error ketika inference
!pip install -U opencv-python
Lalu jalankan script tersebut dengan format sebagai berikut. Script ini akan menguji model untuk mendeteksi objek Rakun dan Kanguru dari folder /object-detection/test_img_only.
!python /content/object-detection/scripts/TFLite_detection_image.py --imagedir "/content/object-detection/test_img_only" \
--modeldir "/content/tflite" \
--graph "/content/tflite/model.tflite" \
--labels "/content/object-detection/labelmap.txt"
Pada bagian labels path kita diarahkan ke labelmap.txt bukan label_map.pbtxt. File labelmap.txt sedikit berbeda dengan label_map.pbtxt dan digunakan untuk inference di android.
Jika dijalankan, maka script akan menghasilkan gambar yang yang telah dianotasi di home folder.

Sekian, Selamat mencoba semoga bermanfaat, jika ada yang kurang jelas bisa ditanyakan di kolom komentar 😀
Photo by Lisette Verwoerd on Unsplash
kak maaf mau tanya, apabila menggunakan pre train itu bisa cek pakek tensorboard?
Bisa, tapi lebih mudah jika dilakukan tidak menggunakan google colab. Jadi run tensorboard menggunakan command line lain untuk memantau folder saat training
baik terima kasih kak. kalau Pre-Train untuk menampilkan epoch, loss bisa atau tidak kak?
oh ya ini untuk kebutuhan object detection kan ya? bisa kalau pakai tensorboard, kalau hanya run via command line atau seperti di atas, secara default API nya hanya menampilkan loss tiap 100 steps kalau tidak salah (satuannya pakai step, bukan epoch)
untuk cara menampilkannya bagaimana ya kak? saya mencoba mengikuti tutorial di web tidak mau tampil tensrboardnya. barangkali pre train berbeda hehe
Apaah menggunakan colab? kalau menggunakan colab, saya belum pernah menggunakan tensorboard untuk mengamati secara “live”, dulu pernah coba ikuti tutorial di sini tapi seinget saya ada yang gagal, tapi mungkin bisa dicoba https://colab.research.google.com/github/tensorflow/tensorboard/blob/master/docs/tensorboard_in_notebooks.ipynb
kalau tidak menggunakan colab bisa coba tutorial ini: https://tensorflow-object-detection-api-tutorial.readthedocs.io/en/latest/training.html#monitor-training-job-progress-using-tensorboard jadi nanti kita buat terminal baru, lalu run tensorboard untuk mengamati folder model yang digunakan. Metode kedua ini kita bisa monitoring secara live saat training
baik kak terima kasih
File “/usr/local/lib/python3.7/dist-packages/object_detection/model_lib_v2.py”, line 395, in load_fine_tune_checkpoint
raise IOError(‘Checkpoint is expected to be an object-based checkpoint.’)
OSError: Checkpoint is expected to be an object-based checkpoint.
Saya temu error itu , bagaimana ya mas ?
itu ketika tahap apa ya? erornya seperti gagal saat load modelnya ya
Iya lebih tepatnya ketika mau training object mas
saya hanya pnya file tfrecord dan labaelnya apa ka bisa langsung konversi ke tflite ?
Pak, colab ini memang selalu ada bug ya untuk tensorflow 2? saya sudah install ataupun reinstall tetap selalu ada indikasi error pada library tensorflow. untuk alternatif pakai jupyter notebook bagaimana ya kira kira?