Ini adalah versi pengembangan kode untuk makalah berikut:
Bugra Tekin, Sudipta N. Sinha dan Pascal Fua, "Prediksi Pose Objek 6D Single Shot Seamless Single Shot", CVPR 2018.
Repositori asli basis kode untuk makalah di atas dapat ditemukan di tautan berikut.
Kami mengusulkan pendekatan single-shot untuk mendeteksi objek dalam gambar RGB secara bersamaan dan memprediksi pose 6D-nya tanpa memerlukan banyak tahapan atau harus memeriksa banyak hipotesis. Komponen utama dari metode kami adalah arsitektur CNN baru yang terinspirasi oleh desain jaringan YOLO yang secara langsung memprediksi lokasi gambar 2D dari proyeksi simpul kotak pembatas 3D objek. Pose 6D objek kemudian diperkirakan menggunakan algoritma PnP. Kertas, arXiv
Jika Anda menggunakan kode ini, harap kutip yang berikut ini
@inproceedings{tekin18,
TITLE = {{Prediksi Pose Objek 6D Bidikan Tunggal Mulus Secara Real-Time}}, AUTHOR = {Tekin, Bugra dan Sinha, Sudipta N. dan Fua, Pascal},
JUDUL BUKU = {CVPR},
TAHUN = {2018}
}
SingleShotPose dirilis di bawah Lisensi MIT (lihat file LISENSI untuk detailnya).
Kode diuji pada Windows dengan CUDA v8 dan cudNN v5.1. Implementasinya didasarkan pada PyTorch 0.4.1 dan diuji pada Python3.6 . Kode ini memerlukan dependensi berikut yang dapat diinstal dengan conda atau pip: numpy, scipy, PIL, opencv-python. Untuk versi sebelumnya yang kompatibel dengan PyTorch 0.3.1 dan diuji pada Python2.7, silakan lihat folder py2
.
Di dalam direktori kode utama, jalankan perintah berikut untuk mengunduh dan mengekstrak (1) kumpulan data LINEMOD yang telah diproses sebelumnya, (2) model terlatih untuk kumpulan data LINEMOD, (3) model terlatih untuk kumpulan data OCCLUSION, (4) gambar latar belakang dari VOC2012 kumpulan data masing-masing.
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
Alternatifnya, Anda dapat langsung membuka tautan di atas dan mengunduh serta mengekstrak file secara manual di direktori terkait. Seluruh proses pengunduhan mungkin memakan waktu lama (~60 menit). Perlu diketahui juga bahwa akses ke OneDrive di beberapa negara mungkin dibatasi.
Untuk melatih model yang dijalankan,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
misalnya
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
jika Anda ingin memulai dari bobot yang diinisialisasi ImageNet, atau
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
jika Anda ingin memulai dengan model yang sudah dilatih sebelumnya di LINEMOD, untuk konvergensi yang lebih cepat.
[datacfg] berisi informasi tentang pemisahan pelatihan/pengujian, model objek 3D, dan parameter kamera
[modelcfg] berisi informasi tentang struktur jaringan
[initweightfile] berisi bobot inisialisasi. <
Di awal pelatihan Anda akan melihat keluaran seperti ini:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
Ini mendefinisikan struktur jaringan. Selama pelatihan, model jaringan terbaik disimpan ke dalam file "model.weights". Untuk melatih jaringan objek lain, cukup ubah nama objek sambil memanggil fungsi kereta, misalnya, " python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". Jika Anda menemukan kesalahan memori GPU saat berlatih, Anda dapat mencoba menurunkan ukuran batch, misalnya menjadi 16 atau 8, agar sesuai dengan memori. Versi kode sumber terbuka telah mengalami pemfaktoran ulang yang kuat dan terlebih lagi beberapa model harus dilatih ulang. Model pelatihan ulang yang kami berikan tidak banyak berubah dari hasil awal yang kami berikan (terkadang sedikit lebih buruk dan terkadang sedikit lebih baik).
Untuk menguji model yang dijalankan
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
misalnya
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
Anda juga dapat menggunakan valid.ipynb untuk menguji model dan memvisualisasikan hasilnya.
Di dalam folder multi_obj_pose_estimation/
Pengujian:
python valid_multi.py cfgfile weightfile
misalnya
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
Pelatihan:
python train_multi.py datafile cfgfile weightfile
misalnya,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
File label kami terdiri dari 21 nilai kebenaran dasar. Kami memperkirakan 9 titik yang sesuai dengan pusat massa dan sudut model objek 3D. Selain itu kami memprediksi kelas di setiap sel. Jadi 9x2+1 = 19 poin. Dalam pelatihan multi-objek, selama pelatihan, kami menetapkan kotak jangkar mana pun yang memiliki ukuran paling mirip dengan objek saat ini sebagai kotak yang bertanggung jawab untuk memprediksi koordinat 2D untuk objek tersebut. Untuk mengkodekan ukuran objek, kami memiliki tambahan 2 angka untuk rentang dimensi x dan y. Jadi, kita mempunyai 9x2+1+2 = 21 bilangan.
Masing-masing, 21 angka sesuai dengan yang berikut: Nomor 1: label kelas, Nomor 2: x0 (koordinat x dari pusat massa), Nomor ke-3: y0 (koordinat y dari pusat massa), Nomor ke-4: x1 (koordinat x dari pusat massa) tikungan pertama), angka ke-5: y1 (koordinat y tikungan pertama), ..., angka ke-18: x8 (koordinat x dari tikungan kedelapan), angka ke-19: y8 (koordinat y sudut kedelapan), angka ke-20: rentang x, angka ke-21: rentang y.
Koordinat dinormalisasi dengan lebar dan tinggi gambar: x / image_width
dan y / image_height
. Hal ini berguna untuk memiliki rentang keluaran yang serupa untuk tugas regresi koordinat dan klasifikasi objek.
Kami melatih dan menguji model kami pada kumpulan data LINEMOD menggunakan pemisahan pelatihan/pengujian yang sama dengan metode BB8 untuk memvalidasi pendekatan kami. Jika Anda ingin melatih model pada kumpulan data Anda sendiri, Anda dapat membuat struktur folder yang sama dengan kumpulan data LINEMOD yang disediakan dan menyesuaikan jalur di cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt dan File [DATASET]/[OBJEK]/test.txt. Folder untuk setiap objek harus berisi yang berikut ini:
(1) folder yang berisi file gambar,
(2) folder yang berisi file label (Silakan merujuk ke tautan ini untuk penjelasan mendetail tentang cara membuat label. Anda juga dapat menemukan kotak alat ObjectDatasetTools pihak ketiga yang berguna untuk membuat label kebenaran dasar untuk estimasi pose objek 6D),
(3) file teks yang berisi nama file untuk gambar pelatihan ( train.txt
),
(4) file teks yang berisi nama file untuk gambar uji ( test.txt
),
(5) file .ply yang berisi model objek 3D (Satuan model objek diberikan dalam meter),
(6) opsional, folder yang berisi topeng segmentasi (Jika Anda ingin mengubah latar belakang gambar pelatihan Anda menjadi lebih kuat ke latar belakang yang beragam, ini penting untuk kemampuan generalisasi yang lebih baik),
Harap pastikan juga untuk menyesuaikan nilai berikut dalam file konfigurasi data dan model sesuai dengan kebutuhan Anda:
diam
" di file konfigurasi data dengan diameter model objek yang ada.yolo-pose.cfg
) dan beberapa parameter augmentasi data (jitter, hue, saturation, parameter eksposur di dataset.py
) mungkin juga perlu disesuaikan untuk konvergensi yang lebih baik pada kumpulan data Anda.yolo-pose-multi.cfg
). Harap pastikan juga untuk menggunakan jumlah kelas yang benar dan tentukan di yolo-pose-multi.cfg
.fx
, fy
, u0
, v0
, width
, height
) di file konfigurasi data dengan yang khusus untuk kumpulan data Anda. Saat membuat kumpulan data pelatihan, pengambilan sampel sejumlah besar sudut pandang/jarak dan memodelkan variabilitas besar pengaturan pencahayaan/oklusi/latar belakang akan menjadi penting dalam meningkatkan kemampuan generalisasi pendekatan pada kumpulan data Anda. Jika Anda ingin menyesuaikan beberapa parameter model & kerugian (misalnya faktor bobot untuk istilah kerugian yang berbeda) untuk tujuan Anda sendiri, Anda dapat melakukannya di file konfigurasi model ( yolo-pose.cfg
).
Kode ini ditulis oleh Bugra Tekin dan dibuat berdasarkan implementasi YOLOv2 dari pengguna github @marvis
Untuk pertanyaan atau laporan bug apa pun, silakan hubungi Bugra Tekin