Tutorial Deteksi Objek Menggunakan YOLO (You Only Look Once)
Sepertinya big data, AI, computer vision, dan sejenisnya sedang hot-hotnya ya. Bila mendengar kata-kata diatas pasti akan terpikirkan tentang koding yang bejubel dan ribet. Apakah benar begitu ? so disini saya akan memberikan tutorial deteksi objek pada sebuah citra (image) dengan metode You Only Look Once (YOLO) yang dapat dilakukan dengan mudah oleh siapa pun dan dengan background apapun. Oh, iya ini juga merupakan request dari beberapa teman, jadi terima kasih atas requestnya :D.
Di sini kita akan bermain dengan beberapa istilah dalam computer vision, machine learning, YOLO, sedikit programing dan sekitarnya tapi jangan khawatir karena saya akan menjelaskannya sesimple mungkin. Sebelumnya saya berterima kasih kepada Andrew Ng atas online course-nya , kalian bisa cek disini , kemudian siraj raval dengan video tutorial YOLOnya disini , dan Joao Cartucho yang telah membantu membuat code untuk matriks evaluasi. Saya sarankan kalian buat nonton video-video mereka. Dan juga kepada Joseph Redmon yang telah membuat YOLO menjadi sebuah algoritma object detection yang sangat keren dan open source. Oke sekarang kita mulai tutorialnya.
Untuk yang sudah terbiasa dengan machine learning dan programming (Disini saya menggunakan bahasa python) saya langsung beberkan repository apa saja yang dibutuhkan untuk melakukan deteksi objek dengan YOLO dari awal sampai akhir. Repsitory yang perlu kalian gunakan :
1. Anotasi citra gunakan LabelImg
2. Training dan prediksi gunakan darkflow
3. Evaluasi gunakan mAP
Oke sekian tutorial saya.., Haha, belum-belum
Oke sekarang tutorial untuk manusia-manusia awam seperti saya. Pertama-tama yang kita butuhkan adalah koneksi internet, sebuah perangkat komputer, kemauan, dan sedikit cemilan. Pertama kita harus menginstall anaconda disini, silahkan download yang versi 3.x. Sebenarnya tidak usah pake anaconda pun tidak apa-apa tapi menurut pengalaman saya, menggunakan anaconda akan membuat project yang anda kerjakan lebih mudah. Oke kita mulai tutorial lengkapnya.
- Dataset
Untuk memulai melakukan deteksi objek kita harus menyiapkan data citra yang berisikan objek-objek yang ingin kita deteksi. Tunggu sebentar, apa itu deteksi objek (object detection) ? Singkatnya pada object detection, kalian akan memprediksi nama objek tersebut (klasifikasi) dan lokasinya (localization) dimana dalam satu citra bisa ada lebih dari satu objek. Untuk lebih jelasnya kamu bisa baca disini . Citra yang sudah kalian kumpulkan akan dibagi menjadi tiga bagian yaitu, training set, validation set, dan test set dengan persentase masing-masing 60%, 20%, dan 20%. Sebenarnya tidak ada aturan pasti berapa besar persentase tiap data, untuk saat ini kita mulai dari persentase tersebut. Selain itu yang harus diperhatikan adalah distribusi citra. Distribusi citra antara ketiga bagian data tersebut harus merata untuk setiap kelas dan variasi yang ada, jangan sampai ada kelas yang tidak ada di validation atau test set. Untuk memahami bagaimana kita mengatur dataset, saya sarankan kalian nonton video yang keren banget oleh Andrew Ng dari deeplearning.ai disini. Kalian bisa tonton videonya secara gratis dengan klik “audit”.
2. Anotasi citra
Setelah mengatur dataset saatnya membuat label. Anotasi merupakan proses membuat label denga cara memberikan kotak batas (bounding box) beserta nama kelas pada objek disetiap citra. Lakukan anotasi citra menggunakan LabelImg tools yang bisa didownload disini, silahkan download versi terbarunya. Setelah kalian download kalian tinggal menjalankan programnya dan membuka folder tempat menyimpan citra. Kemudian kalian tinggal memberikan kotak batas dengan cara drag kursor kalian dan memberikan label sesuai dengan objek tersebut. Hasil dari anotasi tersebut adalah sebuah data yang berisikan informasi letak kotak batas beserta labelnya dalam bentuk .xml.
3. Persiapan Training
Sebelum training ada beberapa hal yang harus dipersiapkan. Yang pertama tentunya adalah download repository darkflow dari github disini. Kemudian kalian harus mendownload model yang terdiri dari kode jaringan dan bobot pra-latih dari jaringan tersebut. Kalian bisa mendapatkan keduanya disini. Disana akan ada dua file yaitu cfg dan weights. File cfg merupakan kode untuk model sedangkan weights merupakan bobot hasil pelatihan yang dapat digunakan untuk melakukan transfer learning. Saya sarankan untuk menggunakan Tiny Yolo v2 untuk permulaan. Jangan lupa untuk mendowload file cfg dan bobot pra-latih pada model yang sama yaa, jika berbeda, pelatihan tidak akan bisa dilakukan. Langkah selanjutnya adalah membuat file text yang berisi nama kelas (label). Jika kalian ingin membuat suatu deteksi kucing dan panda, maka kalian harus membuat suatu file .txt yang berisikan dua kata tersebut dengan baris yang terpisah. Dataset yang terdiri dari gambar dan label yang telah dibuat jangan lupa untuk dimasukkan dalam repository darkflow dengan file anotasi yang terpisah. Saya sarankan untuk langsung membagi data train, validation, dan test dalam folder yang berbeda. Oke, model dan bobot pra-latih sudah, label sudah, dataset sudah, oh iya, kita harus mendownload library/framework yang akan digunakan seperti tensorflow dan cython. Saya sarankan untuk menggunakan virtual environtment python di anaconda, kalian bisa baca disini. Setelah kalian buat virtual environtemen baru kalian bisa download tensorflow dan library lainnya dengan “pip”. Kalian bisa seraching sedikit di google misalnya “Install tensorflow python” nanti kalian akan temukan cara untuk mendownload library tersebut. Jangan lupa untuk membaca redme dari reporsitory darkflow itu sendiri yaa.
Bila kalian menggunakan label kalian sendiri, maka kalian harus menyesuaikan jumlah filter pada layer terakhir pada model yang kalian gunakan. Kalian bisa menggunakan rumus num*(class+5). Misalnya kalian ingin mendeteksi 5 kelas dengan num berjumlah 5 maka kalian harus mengganti filter di lapisan terakhir dengan 50. Num di sini adalah jumlah dari anchor box yang akan digunakan. Jangan lupa untuk mengganti jumlah kelasnya juga ya di bagian [region] classes=5 misalnya.
4. Training
Sebenarnya cara training sudah cukup jelas dijelaskan pada repository darkflow sendiri. Oke, karena ini tutorial untuk yang belum familiar dengan python (seperti saya ini) mari kita coba bahas cara trainingnya. Oke pertama-tama kita buka anaconda prompt, kalian bisa search di windows. Kemudian aktifkan virtual environment yang kalian buat tadi dengan cara ketik
activate name
Name disini merupakan nama virtual environment yang kalian buat. Kemudian kalian buka repository darkflow, misalnya kalian simpan repository-nya di drive D maka ketik
D:
Kemudan buka folder dengan perintah cd “nama folder” tanpa tanda petik, contoh cd darkflow. Setelah itu, install library yang dibutuhkan install dengan memasukkan perintah
python3 setup.py build_ext –inplace
Kalo sudah, coba cek apakah program dapat berjalan atau tidak dengan mengetik
python flow --h
Oh iya karena di sini (medium) tidak bisa custom font maka strip panjang ( — ) itu tandanya strip dua kali yaa. Jika kalian memasukkan perintah di atas kemudian menemukan error coba kalian cari penyelesainnya dengan mencari di halaman issues lalu search pesan error yang muncul, bila tidak ada, kalian bisa cari di google atau langsung tanya di kolom komentar. Bila kalian melihat opsi fungsi di terminal anaconda prompt kalian seperti gambar dibawah ini,
maka selamatt anda sekarang siap training. Oke, kalian bisa liat dengan jelas apa saja opsi/argumen yang ada untuk menjalankan pelatihan dengan memasukan peritah flow –h tadi. Seperti yang dituliskan di tahap perisapan diatas kita harus menyertakan directory file-file tersebut pada saat pelatihan. Hal lain yang penting adalah memahami apa itu batch size, epoch, dan learning rate. Sebenarnya agak cukup panjang pejelasannya tapi saya coba jelaskan dengan singkat. Batch size singkatnya adalah banyaknya data yang digunakan untuk setiap pelatihan, semakin besar batch size semakin baik hasilnya. Epoch gampangnya adalah banyaknya iterasi, walaupun ini agak kurang tepat, dan learning rate adalah seberapa kenceng pelatihan dilakukan. Semakin besar learning rate maka semakin cepat menuju konvergensi tapi malah bisa divergen, jadi harus dikira-kira berapa nilai yang tepat. Untuk lebih jelasnya bisa kalian baca di forum-forum seperti stackoverflow atau quora. Selain itu kita bisa memilih optimizer apa yang harus digunakan, bila kalian tidak memilih maka darkflow akan menggunakan optimezer default, saya lupa apa haha. Mungkin akan lebih enak bila kita dimulai dengan suatu contoh.
python flow --model cfg/tiny-yolo-voc-3c.cfg --load bin/tiny-yolo-voc.weights --train --annotation train/Annotations --dataset train/Images --epoch 100 --lr 0.00001 --batch 8 --labels hewan.txt
Oke saya akan sedikit jelaskan perintah diatas. Yang pertama adalah –model cfg/tiny-yolo-cov-3c.cfg, disini kalian memilih model apa yang kalian gunakan dalam folder “cfg”, jangan lupa mengganti filter di layer terakhir bila kalian mengganti jumlah kelasnya. –load bin/tiny-yolo-voc.weights nah disini kalian menggunakan bobot pra-latih yang harus sesuai dengan model dasar yang kalian gunakan, jika tidak, maka pelatihan tidak dapat dilakukan. Kemudian –train merupakan perintah untuk melakukan training. –annotation train/annotations merupakan path folder dimana kalian menyimpan file anotasi yang telah kalian buat. –dataset train/Images merupakan path folder dimana kalian menyimpan gambar yang digunakan untuk pelatihan. Oh iya nama file anotasi dan gambar harus sama ya. –epoch 100 berarti pelatihan dilakukan sebanyak 100 kali epoch atau iterasi. –lr 0.00001 menunjukan besar learning rate yang kalian gunakan disini kita menggunakan 0.00001. –batch 8 merupakan jumlah mini batch size yaitu 8. –labels hewan.txt merupakan label yang kita gunakan disini kita beri contoh nama hewan.txt.
Bila perintah kalian berhasil dan tidak ada masalah pada model, label, pre-train weight, dll maka pelatihan akan dilakukan. Kalian akan melihat nilai average loss pada setiap epochnya. Kalian bisa menghentikan pelatihan bila nilai average lossnya sudah sangat kecil, biasanya dibawah 1 dan konvergen dalam arti kata nilainya sudah cenderung tidak berubah. Kalian bisa meneruskan pelatihan dengan memberikan perintah yang sama dengan mengganti perintah pada –load menjadi –load -1. Iterasi akan dimulai dari iterasi terakhir yang kalian lakukan. Kalian bisa mengatur learning rate menjadi lebih kecil pada saat melanjutkan pelatihan.
5. Prediksi hasil
Oke, sekarang saatnya lihat hasil dari pelatihan yang kalian lakukan, caranya sama saja, kita lakukan perintah flow menggunakan argumen “–load” bobot hasil dari pelatihan. Pada saat melakukan prediksi kalian dapat memilih ambang batas yang digunakan untuk menentukan seberapa sensitif prediksi yang akan ditampilkan. Seperti contoh
python flow --imgdir sample_img/ --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights –labels hewan.txt –threshold 0.3
Mirip seperti pada training dimana imgdir merupakan lokasi disimpannya gambar yang akan diprediksi, model adalah jaringan yang digunakan, load adalah hasil dari pelatihan yang telah kalian lakukan, label merupakan label yang kalian gunakan tadi. Pada saat prediksi kalian harus menentukan ambang batas, gampangnya ambang batas ini menunjukkan nilai probabilitas objek yang akan ditampilkan. Bila nilai threshold yang kalian pilih terlalu kecil maka kemungkinan ada banyak muncul prediksi yang salah dan bila nilai threshold terlalu besar maka kemungkinan akan banyak objek yang tidak terdeteksi. Bila program telah selesai memprediksi, kalian akan mendapatkan suatu gambar baru dengan bounding box yang telah dilengkapi nama kelas dari masing-masing objeknya dan suatu file yang berisi koordinat dari bounding box tersebut.
6. Evaluasi
Hmm panjang juga ternyata tutorial ini, ayo sedikit lagi. Oke terakhir adalah evaluasi. Evaluasi disini adalah melihat seberapa baik pelatihan yang kalian lakukan yang ditujukkan dengan berapa prediksi yang tepat, prediksi tidak tepat, dan nilai dari mAP. Detail mengapa dan bagaimana suatu matriks digunakan untuk mengevaluasi permasalahan objek deteksi tidak akan saya jelaskan disini. Repository yang kita gunakan untuk evaluasi adalah mAP yang dibuat oleh Joao Cartucho. Sebelumnya saya ingin mengucapkan terima kasih banyak kepada Cartucho karena beliau sudah mau-maunya membatu saya untuk membuat program evaluasi yang cocok digunakan untuk darkflow. Kalian bisa download repositrynya disini. Setelah kalian download, seperti biasa masuk ke dalam repository dan saya yakin disini kalian sudah terbiasa menggunakan terminal anaconda prompt. Jadi kalian tinggal ikuti saja readme yang ada dalam repositry tersebut, saya rasa cukup lengkap penjelasannya. Untuk darkflow kalian bisa lihat di bagian “extra” untuk mengganti format xml dan json ke txt. Oh iya satu hal yang perlu diperhatikan adalah nama kelas yang kalian gunakan tidak boleh menggandung spasi, misalnya “kuda liar”. Nama kelas tersebut harus kalian ganti misalnya menjadi “kuda_liar” atau “KudaLiar”. Bila sudah terlanjur, jangan khawatir, mas Cartucho sudah menyelesaikan ini dengan program yang ada di folder extra kok.
9. Melihat performa sesungguhnya
Ternyata belum terakhir evaluasi tadi haha. Saya katakan sebelumnya, saat prediksi, kita bisa memilih nilai ambang batas. Untuk mendapatkan nilai ambang batas yang terbaik, kalian harus mencoba beberapa nilai ambang batas tersebut dimana masing-masing ambang batas dilihat nilai F1-scorenya. Setelah kalian mendapatkan nilai ambang batas yang terbaik maka kalian bisa melihat performa sesungguhnya dari hasil pelatihan kalian dengan cara melakukan prediksi pada test set dengan ambang batas terbaik pada data validasi tersebut. Disinilah mengapa kita harus membagi data menjadi tiga (train, val, dan test) bukan dua (train dan test).
Tambahan lain
Ada tambahan lain yang bisa kalian lakukan di repositroy darkflow, yang pertama penggunan GPU untuk komputasi sehingga pelatihan menjadi lebih cepat. Saya sangat menyarankan untuk menggunakan GPU karena perbedaan waktu yang dihasilkan sangat jauh berbeda, bahkan bisa hingga 10–20 kali lebih cepat. Untuk mengaktifkan GPU kalian harus menginstall CUDA, CuDNN, dan tensorflow yang support GPU. Untuk penggunannya kalian tinggal menambahkan argumen “–gpu” pada saat menjalankan program.
Hal lain yang bisa kalian gunakan adalah tensorboard dimana kalian bisa mendapatkan data pada saat pelatihan yaitu tingkat average loss setiap iterasinya. Untuk mengaktifkan tensorboard kalian bisa seraching di issues dari repository darkflow sendiri dengan kata kunci “tensorboard”. Nantinya kalian akan mendapatkan suatu file dalam format .csv yang dapat didownload dari browser kalian.
Oke mungkin segini saja tutorial yang saya buat. Mungkin banyak kekurangan dan malah ada lebih-lebih yang ga perlu. Dan sepertinya ada beberapa istilah atau konsep yang kurang tepat, saya mohon maaf untuk segala kesalahannya. Saya harap kalian bisa mengkoreksi tulisan ini dibagian yang kurang-kurang dan salah tadi. Jangan sungkan untuk bertanya bila ada error atau masih ada yang belum jelas. Kalian bisa tinggalkan di kolom komentar ataupun langusng hubungi saya di sosmed yang kalian punya. Sampai jumpa di artikel lainnya. Bye.