Membuat Model Tensorflow Object Detection untuk Android

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:

  1. 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.
  2. 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.
  3. 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_class disesuaikan dengan jumlah class yang akan digunakan. Pada tutorial ini num_class: 2
  • Temukan bagian fine_tune_checkpoint_type lalu ubah dari classification menjadi detection
  • Nilai batch_size menentukan ukuran batch. Kita gunakan batch kecil saja ubah batch_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_steps lebih kecil, maka kita sesuaikan juga total_steps: 1000 dan warmup_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_checkpoint arahkan ke checkpoint file dari pretrained model. Berdasarkan tutorial ini, pathnya /content/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8/checkpoint/ckpt-0
    • Untuk input_path pada train_input_reader arahkan ke tfrecord data train. Berdasarkan tutorial ini, pathnya /content/object-detection/train.record
    • Untuk input_path pada eval_input_reader arahkan ke tfrecord data test. Berdasarkan tutorial ini, pathnya /content/object-detection/test.record
    • Untuk label_map_path arahkan ke file label_map.pbtxt. Di tutorial ini pathnya /content/object-detection/label_map.pbtxt

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

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

Leave a Reply