Cara menggunakan PYTYPE pada Python

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.

Cara menggunakan PYTYPE pada Python
Cara menggunakan PYTYPE pada Python
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:

Cara menggunakan PYTYPE pada Python
Cara menggunakan PYTYPE pada Python
  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

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
0. 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,

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
1. Copy script tersebut ke dalam folder DATASET, lalu jalankan
python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
1 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

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
4 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

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
5 dengan perintah di bawah (maksud dari
python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
6 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,

python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
4 dan image pada folder train menjadi sebuah file
python xml_to_csv.py --type train
python xml_to_csv.py --type test
python xml_to_csv.py --type validation
9 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!