Dengan kemajuan dalam Pembelajaran Mendalam, banyak pendekatan baru untuk deteksi objek telah diperkenalkan dan model deteksi seperti YOLO(Anda Hanya Melihat Sekali) sudah tidak digunakan lagi.

Model Deteksi Objek seperti SNIPER, Retinanet dan Trident telah meninggalkan Faster-RCNNdan YOLO tertinggal jauh.

Postingan yang bagus untuk mendapatkan pemahaman dasar tentang cara kerja Retinanet dapat ditemukan di sini.

Kode

Repositori yang perlu Anda unduh adalah fizyr/keras-retinanet. Saya telah menguji kode ini di Ubuntu dan Windows.

Untuk pengguna Windows, Anda harus menginstal lingkungan Anaconda dan memerlukan Alat Microsoft Visual Basic C++.

Setelah mengunduh repositori, buka terminal Anaconda Anda di Windows atau terminal di Ubuntu dan navigasikan ke folder repositori dan ketik:

$ pip install . --user

Baris ini menginstal paket keras-retinanet secara lokal di komputer Anda.

CATATAN: Proses instalasi paket ini perlu dilakukan setiap kali ada perubahan pada file kode sebenarnya.

Anda akan memiliki akses ke perintah berikut di terminal Anda setelah menginstal paket:

retinanet-train
retinanet-evaluate
retinanet-debug
retinanet-convert-model

Anotasi

Diperlukan dua file csv. Yang pertama berisi path, kotak pembatas dan nama kelas setiap gambar. File kedua hanya boleh berisi nama kelas dan pemetaannya.

File CSV dengan anotasi harus berisi satu anotasi per baris. Gambar dengan beberapa kotak pembatas harus menggunakan satu baris per kotak pembatas. Perhatikan bahwa pengindeksan nilai piksel dimulai dari 0. Format yang diharapkan dari setiap baris adalah:

path/to/image.jpg,x1,y1,x2,y2,class_name

Beberapa gambar mungkin tidak berisi objek berlabel apa pun. Untuk menambahkan gambar ini ke kumpulan data sebagai contoh negatif, tambahkan anotasi dengan x1, y1, x2, y2, dan nama_kelas semuanya kosong:

path/to/image.jpg,,,,,

Contoh lengkapnya adalah:

/data/imgs/img_001.jpg,837,346,981,456,cow
/data/imgs/img_002.jpg,215,312,279,391,cat
/data/imgs/img_002.jpg,22,5,89,84,bird
/data/imgs/img_003.jpg,,,,,

Nama kelas untuk file pemetaan ID harus berisi satu pemetaan per baris. Setiap baris harus menggunakan format berikut:

class_name,id

Pengindeksan untuk kelas dimulai dari 0. Jangan sertakan kelas latar belakang karena bersifat implisit.

Misalnya:

cow,0
cat,1
bird,2

Saya menggunakan labelImg untuk membuat anotasi terlebih dahulu dalam format pascal voc xml dan kemudian saya mengonversinya menjadi txt menggunakan skrip ini. Cukup ganti nama .txt menjadi .csv untuk mengubahnya menjadi format csv.

Men-debug

Sebelum memulai pelatihan, Anda perlu memeriksa apakah anotasi yang Anda buat sudah benar atau belum. Anda dapat melakukan ini dengan mengetikkan perintah berikut di terminal:

$ retinanet-debug csv path/to/annotation.csv path/to/classes.csv

Anotasi diberi warna hijau jika jangkar tersedia dan berwarna merah jika jangkar tidak tersedia. Jika anotasi tidak memiliki jangkar, itu berarti anotasi tidak akan berkontribusi pada pelatihan. Wajar jika sejumlah kecil anotasi muncul dalam warna merah, namun jika sebagian besar atau seluruh anotasi berwarna merah, hal ini perlu dikhawatirkan. Masalah yang paling umum terjadi adalah anotasi terlalu kecil atau bentuknya terlalu aneh (melar).

Pelatihan

Setelah tugas yang besar dan sulit untuk memberi label dan men-debug data Anda. Anda sekarang akhirnya dapat memulai pelatihan. Sebelum memulai, Anda perlu mengetahui bahwa Anda memiliki opsi tertentu yang tersedia namun tidak terbatas pada:

  1. Arsitektur tulang punggung (Secara default ini diatur ke resnet50 tetapi Anda juga dapat menggunakan resnet101, resnet152. Anda dapat menemukan semua opsi yang Anda miliki di direktori keras-retinanet/models di repositori)
  2. Bobot (Secara default, bobot imagenet akan diunduh untuk pelatihan jika tidak ditentukan)
  3. Epochs (Secara default ini diatur ke 50)
  4. Direktori penyimpanan untuk bobot dan log tensorboard disetel ke direktori home secara default, tetapi Anda juga dapat mengubahnya

Perintah untuk hal-hal penting ini diberikan di bawah ini:

--backbone
--weights
--epochs
--snapshot-path
--tensorboard-dir

Untuk detail lebih lanjut tentang cara kerja perintah ini dan opsi apa lagi yang Anda miliki, Anda dapat merujuk ke file keras-retinanet/bin/train.py di repositori.

Contoh dasar bagaimana Anda menggunakannya dengan perintah retinanet-train adalah:

retinanet-train --backbone resnet101 --weights path/to/weights.h5 --epochs 100 --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv

Sepertinya itu terlihat sangat rumit….

Untuk percobaan pertama Anda, biarkan semuanya berjalan seperti default. Cukup gunakan ini:

retinanet-train csv path/to/annotations.csv path/to/classes.csv

Anda mungkin ingin mengubah direktori penyimpanan untuk bobot dan papan tensor. Untuk ini gunakan saja

retinanet-train --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv

CATATAN: Tidak ada panggilan balik yang ditambahkan untuk penghentian awal atau csvlogger. Anda perlu menambahkannya sendiri di file train.py.

Ini pertama-tama akan mengunduh bobot imagnet untuk resnet50 dan kemudian memulai pelatihan Anda.

Untuk hasil yang lebih baik, disarankan agar Anda menggunakan beban terlatih pada data COCO dengan tulang punggung resnet50 yang tersedia di tautan ini.

Kesimpulan

Prosedur pelatihan keras-retinanet bekerja dengan model pelatihan. Ini adalah versi yang disederhanakan dibandingkan dengan model inferensi dan hanya berisi lapisan yang diperlukan untuk pelatihan (nilai regresi dan klasifikasi). Jika Anda ingin melakukan inferensi pada suatu model (melakukan deteksi objek pada gambar), Anda perlu mengonversi model yang dilatih menjadi model inferensi. Ini dilakukan sebagai berikut:

retinanet-convert-model /path/to/training/model.h5 /path/to/save/inference/model.h5

Setelah mengonversi model. Navigasikan ke folder contoh di repositori dan buka buku catatan.

Ganti model_path dengan jalur ke model yang dikonversi. Jika Anda belum pernah menggunakan resnet50 sebagai backbone maka pastikan untuk mengganti backbonenya juga.

model_path = os.path.join('..', 'snapshots', 'resnet50_coco_best_v2.1.0.h5')

# load retinanet model
model = models.load_model(model_path, backbone_name='resnet50')

Ada juga variabel labels_to_names yang merupakan kamus tempat kelas dipetakan.

labels_to_names = { 0: ‘person’, 1: 'bat'}

Ubahlah sesuai dengan jumlah kelas yang Anda miliki.

Setelah ini, yang tersisa hanyalah memberikan jalur ke gambar pengujian Anda di bagian Jalankan deteksi pada contoh di buku catatan.

Referensi

  1. Kehilangan Fokus untuk Deteksi Objek Padat
  2. Keras-retinanet