Object Detection dengan Tensorflow dan Google Colab [1]

Jadi saya baru-baru ini dapat ajakan untuk membuat sebuah aplikasi yang menggunakan metode object detection untuk mengetahui objek apa saja yang ada pada citra dan posisinya di mana melalui tangkapan kamera Handphone. Proyek ini sangat baru bagi saya dan membuat saya jadi belajar banyak dalam pengerjaan proyek ini.

object detection illustration

Membuat model object detection bukanlah suatu yang mudah, dan menjadikannya bisa dijalankan di Handphone adalah masalah yang lain lagi. Pada artikel ini saya akan coba jelaskan bagaimana membuat sebuah model object detection menggunakan custom dataset buatan sendiri yang nantinya dapat diaplikasikan ke mobile (Android/IOS). Artikel ini fokus ke tahap pertama, yakni penyiapan data.

Tensorflow API

Kami menggunakan Tensorflow untuk menyelesaikan permasalahan ini. Salah satu keunggulan Tensorflow adalah kemudahannya dalam men-deploy model ke Handphone, yakni dengan cara mengkonversi model menjadi TFLite model. Dari TFlite model, nantinya model bisa langsung dipanggil di script Android. Selain itu Tensorflow juga menyediakan beberapa API yang memudahkan kita dalam proses pembuatan model object detection dengan custom dataset (dataset buatan kita sendiri).

Kami menggunakan Tensorflow versi 1.x karena Tensorflow versi 2 saat tulisan ini dibuat masih belum support untuk object detection dengan custom dataset.

Proses instalasi Tensorflow dan Tensorflow object detection dilakukan secara terpisah. Detailnya bisa dilihat sesuai dokumentasi resminya (bisa update setiap waktu). Instalasi Tensorflow dapat dilihat di halaman utamanya, sedangkan untuk instalasi tensorflow object detection API bisa di akses di link berikut ini.

Dataset

Format dataset untuk Object Detection tentu berbeda dengan dataset yang digunakan pada klasifikasi citra biasa. Data latih untuk kasus deteksi objek memerlukan label berupa file terpisah yang mencatat nama objek dan lokasi objek tersebut pada suatu citra atau disebut file anotasi. Terdapat dua style file anotasi yang cukup populer, yakni style COCO dataset dan PASCAL-VOC. Untuk masing-masing style, format dataset bisa berupa file JSON atau file XML. Kami menggunakan format PASCAL-VOC XML dengan tampilan seperti berikut:

<annotation>
	<folder>My Drive</folder>
	<filename>Image1.jpg</filename>
	<path>C:\My Drive\Image1.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>1280</width>
		<height>720</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>Object 1</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>925</xmin>
			<ymin>343</ymin>
			<xmax>1097</xmax>
			<ymax>464</ymax>
		</bndbox>
	</object>
</annotation>

Jadi pada contoh di atas saya punya file citra “Image1.jpg” dan file XML “Image1.xml”. Isi dari file XML nya adalah data di atas. Berisikan koordinat objek yang ingin dideteksi. Pembuatan file XML ini tidak perlu dibuat manual (diketik satu persatu), kita bisa menggunakan software anotasi. Anotasi citra diatas dibuat menggunakan software labelimg.

Selain itu, karena kita nantinya akan menggunakan fungsi-fungsi bawaan tensorflow, ada banyak penyesuaian data yang perlu dilakukan sebelum masuk ke proses model training, kira-kira alur pemrosesan datanya seperti ini:

Jadi setelah punya gambar beserta anotasi XML nya, kita perlu convert dulu ke CSV. File CSV ini merupakan 1 file yang “merangkum” semua file xml yang kita punya. Dari file CSV tersebut lalu kita convert ke TFRecord file, objek yang dapat dibaca oleh tensorflow dengan mudah. Semisal ada pembagian data train, data validation, dan data test, proses pemisahan ini dilakukan sebelum konvert ke CSV, jadi ilustrasi di atas hanya untuk salah satu set, data train misalnya.

Struktur Folder Penyimpanan

Sebelum mulai, kita samakan dulu struktur folder penyimpanannya. Berikut struktur folder yang akan kita gunakan:

  • DATASET
    • train
      • image1.jpg
      • image1.xml
      • image2.jpg
      • image2.xml
    • test
      • image102.jpg
      • image102.xml
    • validation

Jadi kita punya folder “DATASET” lalu di dalamnya ada 3 buah subfolder, train, test, dan validation. Masing-masing folder tersebut berisikan image dan file xml nya. Di sini file image bisa jadi terdiri dari beberapa kelas (seperti contoh gambar di atas artikel ini). Image dengan nama yang berbeda harus merujuk ke citra yang memang berbeda.

Source Code

Pada artikel ini saya menggunakan beberapa script yang saya modifikasi dari internet. Script-script tersebut dapat diakses di https://github.com/rianrajagede/object-detection. Kalau ingin menggunakan script-script tersebut di Google Colab, silakan upload script tersebut di drive lalu jalankan perintah-perintah di bawah nanti dengan tambahan tanda seru: !python path/ke/file.py ... di notebook Google Colab.

Membuat file CSV

Setelah folder telah siap, proses selanjutnya adalah membuat sebuah file csv untuk setiap subfolder. Tujuannya hanya agar memudahkan proses di depannya saat menggunakan tfrecord (jadi tidak wajib dijadikan CSV tapi mengulik data dalam format xml yang terpisah-pisah menurut saya sangatlah sulit).

Silakan gunakan script yang telah saya sedikit modifikasi dari internet, xml_to_csv.py. Copy script tersebut ke dalam folder DATASET. Setelah itu jalankan script tersebut 3x dengan perintah berikut:

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation

Setelah program tersebut dijalankan nanti akan didapat 3 buah file: `train_labels.csv`, `test_labels.csv`, dan `validation_labels.csv`. Masing-masing file menyimpan “ringkasan” data untuk masing-masing subfolder.

Membuat file Label Map

File labelmap berisi daftar keseluruhan label yang ada pada dataset. Untuk data dengan jumlah label yang sedikit, membuat labelmap tidak lah sulit secara manual, formatnya kira-kira seperti ini:

item{
    id: 1
    name: 'KUDA'
}
item{
    id: 2
    name: 'MOBIL'
}
...

Tapi karena di proyek yang saya kerjakan, label objek pada dataset cukup banyak (~250 label), maka saya coba buat script yang meng-generate secara otomatis, generate_labelmap.py. Copy script tersebut ke dalam folder DATASET, lalu jalankan generate_labelmap.py dengan perintah di bawah. Perlu diperhatikan, ketika perintah ini dijalankan pastikan sudah tersedia train_labels.csv dan pastikan juga semua label ada di data train.

python generate_labelmap.py

Setelah dijalankan maka akan diperoleh label_map.pbtxt yang berisikan daftar semua label yang ada di data train.

Membuat file tfrecord

Langkah terakhir yang perlu dilakukan adalah membuat file tfrecord. File ini adalah objek penyimpanan data yang didesain oleh tensorflow untuk kemudahan pengaksesan data di tensorflow. Jalankan file generate_tfrecord.py dengan perintah di bawah:

python generate_tfrecord.py --csv_input train_labels.csv --image_dir train --labelmap_dir label_map.pbtxt --output_path train.record

Perintah di atas akan mengkombinasikan train_labels.csv, label_map.pbtxt dan image pada folder train menjadi file train.record. Hasil dari proses di atas adalah sebuah file train.record yang dapat digunakan untuk proses pelaithan dengan tensorflow. Untuk data yang besar, proses ini bisa memakan waktu paling lama komputasinya. Lakukan perintah di atas ke data test dan validation dengan mengubah beberapa parameter pentingnya.

Setelah mendapatkan ketiga file .record maka langkah selanjutnya adalah proses pelatihan model! InsyaAllah akan kami bahas di artikel selanjutnya. Semoga bermanfaat!

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

2 Comments

    • Di artikel ini kita belum bahas metode yang akan digunakan, tapi rencananya di artikel selanjutnya akan coba menggunakan Tensorflow Object Detection API dengan pretrained model

Leave a Reply