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.

object detection illustration
Pada permasalahan object detection, sistem tidak hanya mengenali itu objek apa, tetapi juga di mana objek itu berada pada gambar (salah satunya dengan memberi kotak/bounding box)

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 Object Detection API

Kami menggunakan framework Tensorflow untuk menyelesaikan permasalahan ini. Ada beberapa pertimbangan kenapa framework ini cukup cocok untuk melakukan object detection melalui handphone:

  1. Salah satu keunggulan Tensorflow adalah kemudahannya dalam mengimplementasi model ke Handphone Android, misalnya dengan mengkonversi model menjadi TFLite model. (Tensorflow dan Android sama-sama dipegang Google)
  2. Selain itu Tensorflow juga menyediakan beberapa API yang memudahkan kita dalam proses pembuatan model object detection dengan custom dataset (dataset buatan kita sendiri).

Pada artikel ini Kami akan menggunakan Tensorflow versi 2. Tensorflow dan Tensorflow object detection diinstall secara terpisah. Detailnya bisa dilihat sesuai dokumentasi resminya (bisa update setiap waktu) atau di artikel selanjutnya.

Dataset untuk Object Detection

Format dataset untuk Object Detection berbeda dengan dataset yang digunakan pada klasifikasi citra biasa. Data yang digunakan untuk kasus deteksi objek biasa memiliki label berupa file terpisah yang mencatat nama objek dan lokasi objek tersebut pada suatu citra. File label ini seringnya disebut file anotasi.

Terdapat dua style penulisan file anotasi yang cukup populer, yakni style COCO dataset dan PASCAL-VOC. Pada tutorial ini Kami menggunakan format PASCAL-VOC XML dengan contoh 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.

Penyiapan Dataset

Dataset dengan format di atas belum bisa langsung diproses oleh Tensorflow. Ada beberapa penyesuaian data yang perlu dilakukan sebelum masuk ke proses model training, kira-kira alur pemrosesan datanya akan seperti ini:

  1. Jadi setelah punya gambar beserta anotasi XML untuk setiap gambar, langkah pertama adalah kita perlu convert dulu ke CSV. File CSV ini hanya terdiri dari 1 file yang “merangkum” semua file xml yang kita punya
  2. Dari file CSV tersebut lalu kita convert ke TFRecord file, suatu objek yang dapat dibaca oleh tensorflow dengan mudah.
  3. File TFRecord ini yang nantinya akan digunakan untuk proses pelatihan.

Perlu diperhatikan, untuk memudahkan semisal perlu ada pembagian data train, data validation, dan data test, proses pemisahan ini dilakukan sebelum konvert ke CSV ya, jadi ilustrasi di atas hanya untuk salah satu set, data train misalnya.

1. Struktur Folder Penyimpanan

Sebelum mulai, kita samakan dulu struktur folder penyimpanannya. Berikut struktur folder yang biasa saya 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 script-script yang saya modifikasi dari internet. Script-script tersebut dapat diakses di https://github.com/rianrajagede/object-detection. Ada 2 cara penggunaan script tersebut:

  1. Kita run di komputer kita dengan menjalankan perintah python namascript.py di folder yang sesuai
  2. Atay jika 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.

2. Membuat file CSV

Setelah folder telah siap, proses selanjutnya adalah membuat sebuah file csv untuk setiap subfolder. Sebenarnya proses ini tidak wajib, tapi mengulik data dalam format xml yang terpisah-pisah menurut saya jauh lebih 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.

2.5 Membuat file Label Map

Sebelum membuat file TFrecord kita perlu membuat dulu file labelmap. 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 beberapa proyek, label objek pada dataset cukup banyak, maka saya sudah buatkan 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_v2.py dengan perintah di bawah (maksud dari v2 adalah script ini untuk tensorflow versi 2):

python generate_tfrecord_v2.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 sebuah file train.record yang sudah dapat digunakan untuk proses pelaithan dengan tensorflow. Untuk data yang besar, proses ini bisa memakan waktu paling lama komputasinya.

Lakukan langkah-langkah di atas ke data test dan validation dengan mengubah beberapa parameter pentingnya (nama file, path, dsb).

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

14 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

  • Pak saya mau tanya, untuk mengconvert file xml ke csv itu apakah file xml di convert satu satu menjadi file csv atau semua file dalam satu folder langsung diubah menjadi satu file csv? Oh ya apakah bapak bisa membuat tutorial secara rinci mengenai convert xml to csv ya pak? Saya dari dulu belajar masih stuck dibagian tersebut, terima kasih sebelumnya

    • File XML dalam satu folder bisa diconvert semua sekaligus menjadi satu file csv. Di post ini sudah saya lampirkan script yang dapat membantu untuk proses tersebut (link ke Github).

      • saya sudah mencoba yang bapak bilang, lalu itukan nanti menjalankan code python xml_to_csv.py –type train. akan tetapi error dan muncul tulisan begini pak
        “File “”, line 1
        cd /content/drive/My Drive/anjingtry/DATASET
        ^
        SyntaxError: invalid syntax” ?
        ini kenapa ya pak kirakira? Terima kasih sebelumnya

        • kalau menjalankannya di Google Colab, di cell nya ditambahkan pada baris pertama %%bash untuk menandakan cell yang dijalankan adalah command prompt bukan script python

      • ohhh saya sudah bisa pak, tapi muncul tulisan no module named PIL pada saat saya mencoba membuat tfrecord itu bagaimana ya pak?

  • permisi pak hehe maaf tanya lagi. Ini untuk post lanjutannya apa belum ada ya memang? Terima kasih banyak pak.

    • Iya belum, sebenarnya saya berencana untuk menulis tentang object detection dengan Tensorflow 2 + Tflite, tetapi sampai sekarang ternyata masih ada bug di Tensorflow 2. Untuk tutorial object detection dengan PyTorch sudah saya tulis artikelnya.

    • Tetap mas, proses pelabelan data kaitannya terhadap tugas apa yang diberikan ke model machine learning. Jika tugasnya adalah Supervised Learning (klasifikasi, regresi, atau deteksi suatu objek) data tetap perlu dilabeli.

Leave a Reply