Pelatihan Detektor Objek AI dengan Label Studio & MMDetection
Penandaan dan pelatihan membutuhkan sedikit perekatan
Ketika saya melatih detektor objek AI beberapa waktu lalu - LabelImg adalah alat yang sangat membantu, namun ekspor dari Label Studio ke format COCO tidak diterima oleh framework MMDetection..
Ini membutuhkan beberapa alat dan skrip untuk membuat semuanya berjalan.
Daftar di sini bagian yang hilang dan beberapa skrip beberapa di antaranya saya temukan di internet dan yang lain saya tulis sendiri.
Langkah-langkah dasar
Menyiapkan, melatih, dan menggunakan AI melibatkan
- mendapatkan data sumber (gambar untuk deteksi objek dan klasifikasi)
- melabeli gambar dan menyiapkan dataset
- mengembangkan model baru atau menemukan model yang sudah ada yang cocok
- melatih model, terkadang dengan penyetelan parameter hiper
- menggunakan model untuk memprediksi label untuk gambar baru (ingerring)
Di sini saya memberikan langkah-langkah tepat bagaimana cara melabeli data dengan Label Studio (langkah 2) dan melatih dengan mmdetection dan torchvision (langkah 4), serta menyentuh inferensi (langkah 5)
Label Studio
Ia memiliki akar sumber terbuka dari program LabelImg namun sekarang dikembangkan dan dipelihara secara sangat terpusat. Dan tentu saja memiliki versi perusahaan.
Masih tersedia untuk self-hosting, yang sangat bagus.
Mengonfigurasi dan menjalankan
Bisa menginstal dan menjalankan Label Studio dengan beberapa cara, seperti paket pip misalnya, atau grup kontainer docker compose. Di sini saya menggunakan satu kontainer docker.
Persiapkan folder sumber
mkdir ~/ls-data
sudo chown -R 1001:1001 ~/ls-data10
Konfigurasi penyimpanan lokal
mkdir ~/ai-local-store
mkdir ~/ai-local-labels
# atur beberapa izin tambahan
Di ~/ai-local-store Anda menyimpan file gambar, ~/ai-local-labels - label yang disinkronkan.
Mulai kontainer docker
docker run -it -p 8080:8080 \
-e LABEL_STUDIO_HOST=http://your_ip_address:8080/ \
-e LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true \
-e LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/ai-local-store \
-e DATA_UPLOAD_MAX_NUMBER_FILES=10000000 \
-v /home/somename/ls-data:/label-studio/data \
-v /home/somename/ai-local-store:/ai-local-store \
-v /home/somename/ai-local-labels:/ai-local-labels \
heartexlabs/label-studio:latest \
label-studio \
--log-level DEBUG
LABEL_STUDIO_HOST - karena redirect dari antarmuka web LS. DATA_UPLOAD_MAX_NUMBER_FILES … Django membatasi jumlah file yang diunggah menjadi 100 dan ini memiliki efek buruk pada label studio, jadi diperlukan untuk memberikan batas baru ini. Semua konfigurasi lain sangat baik didokumentasikan di Label Studio docs.
Impor konfigurasi. Dalam pengaturan proyek di Cloud Storage tambahkan Sumber Penyimpanan jenis Local Files seperti:
Jangan lupa untuk menandai “Treat every bucket object as a source file” jika Anda berencana menyinkronkan gambar (saya yakin iya), bukan jsonnya. Jika Anda sudah memiliki beberapa label untuk gambar-gambar ini dalam file json terpisah - Anda hanya perlu mengonfigurasi penyimpanan awan ini. Jangan menekan Sync. Dan kemudian mengimpor file json.
Konfigurasikan hal yang sama untuk Penyimpanan Awan Target dan ai-local-labels - jika Anda ingin menyinkronkannya keluar.
Mengimpor data yang sudah dilabeli ke Label Studio
Saya suka format JSON COCO. Juga Pascal VOC. Namun mereka tidak kompatibel langsung dengan Label Studio, jadi perlu dikonversi ke format eksklusif LS terlebih dahulu.
Namun sebelumnya - kemungkinan besar akan perlu menyaring dataset. Anda mungkin hanya membutuhkan beberapa label di sana, bukan semua. Saya suka skrip filter.py dari coco-manager: https://github.com/immersive-limit/coco-manager/blob/master/filter.py
python filter.py --input_json instances_train2017.json --output_json filtered.json --categories person dog cat
Baik, sekarang, instal konverter. Seperti yang disarankan situs resmi konverter:
python -m venv env
source env/bin/activate
git clone https://github.com/heartexlabs/label-studio-converter.git
cd label-studio-converter
pip install -e .
Konversi dari coco dan mengatur folder yang benar
label-studio-converter import coco -i your-input-file.json -o output.json
Impor file output.json dengan menekan tombol Impor di Label Studio.
Melabeli
Banyak pekerjaan kreatif yang sangat ekstrem dilakukan di sini.
Ekspor
Setelah menekan tombol Ekspor di Label Studio dan memilih format ekspor COC - lihatlah dalam file ini dan hargai nama gambar. Mereka akan terlihat seperti ini jika Anda mengimpor label sebelumnya tanpa mengganti jalur dasar gambar
"images": [
{
"width": 800,
"height": 600,
"id": 0,
"file_name": "\/data\/local-files\/?d=\/iteration1001\/123.jpg"
},
Atau akan terlihat seperti ini jika Anda menyinkronkan penyimpanan awan eksternal.
"images": [
{
"width": 800,
"height": 600,
"id": 0,
"file_name": "http:\/\/localhost:8080\/data\/local-files\/?d=iteration1001\/123.jpg"
},
Ini tidak terlalu bagus. Kita ingin sesuatu seperti
"images": [
{
"width": 800,
"height": 600,
"id": 0,
"file_name": "iteration1001/123.jpg"
},
Untuk memperbaiki nama file saya menggunakan skrip yang indah. Mereka mengganti file result.json, jadi jika Anda membutuhkan cadangan sebelumnya - pastikan untuk mengurusnya sendiri:
sed -i -e 's/\\\/data\\\/local-files\\\/?d=\\\///g' ~/tmp/result.json
sed -i "s%http:\\\/\\\/localhost:8080\\\/data\\\/local-files\\\/?d=%%" ~/tmp/result.json
sed -i "s%http:\\\/\\\/your_ip_address:8080\\\/data\\\/local-files\\\/?d=%%" ~/tmp/result.json
Cadangan data dan db Label Studio
Berhentilah dengan hati-hati kontainer docker Label Studio Anda dan kemudian jalankan sesuatu seperti
cp ~/ls-data ~/all-my-backups
cp ~/ai-local-store ~/all-my-backups
cp ~/ai-local-labels ~/all-my-backups
Menggabungkan
Terkadang perlu menggabungkan beberapa dataset menjadi satu, terutama jika menjalankan beberapa iterasi.
Saya menggunakan alat COCO-merger. Setelah menginstal dan menjalankan dengan parameter -h:
python tools/COCO_merger/merge.py -h
COCO Files Merge Usage
python -m COCO_merger.merge --src Json1.json Json2.json --out OUTPUT_JSON.json
Parser argumen
penggunaan: merge.py [-h] --src SRC SRC --out OUT
Gabungkan dua file anotasi menjadi satu file
argumen opsional:
-h, --help tampilkan bantuan ini dan keluar
--src SRC SRC Jalur dari dua file anotasi yang akan digabungkan
--out OUT Jalur dari file anotasi output
Ya. bisa menggabungkan hanya dua file. Jadi jika Anda memiliki 10 iterasi - perlu membuat usaha tambahan. Masih suka padanya.
MMDetection
Memecah dataset
Untuk memecah dataset menjadi pelatihan dan pengujian saya menggunakan alat COCOSplit.
git clone https://github.com/akarazniewicz/cocosplit.git
cd cocosplit
pip install -r requirements
Tidak terlalu banyak yang harus dilakukan:
$ python cocosplit.py -h
penggunaan: cocosplit.py [-h] -s SPLIT [--having-annotations]
coco_annotations train test
Memecah file anotasi COCO menjadi himpunan pelatihan dan pengujian.
argumen posisi:
coco_annotations Jalur ke file anotasi COCO.
train Di mana menyimpan anotasi pelatihan COCO
test Di mana menyimpan anotasi pengujian COCO
argumen opsional:
-h, --help tampilkan bantuan ini dan keluar
-s SPLIT Persentase pemecahan; angka dalam (0, 1)
--having-annotations Abaikan semua gambar tanpa anotasi. Hanya simpan yang memiliki setidaknya satu anotasi
--multi-class Memecah dataset multi-kelas sambil mempertahankan distribusi kelas dalam himpunan pelatihan dan pengujian
Untuk menjalankan pemecahan COCO:
python cocosplit.py --having-annotations \
--multi-class \
-s 0.8 \
source_coco_annotations.json \
train.json \
test.json
Hanya ingat untuk menambahkan properti lisensi di awal dataset json, beberapa saat setelah “{”. Alat pemecah ini benar-benar menginginkannya.
"licenses": [],
Konfigurasi
Ya, konfigurasi model rumit.
Namun mask-rcnn cukup cepat dan memiliki tingkat deteksi yang wajar. Lihat di sini untuk detail konfigurasi: https://mmdetection.readthedocs.io/en/latest/user_guides/train.html#train-with-customized-datasets
# Konfigurasi baru mewarisi konfigurasi dasar untuk menonjolkan modifikasi yang diperlukan
_base_ = '/home/someusername/mmdetection/configs/mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py'
# Kita juga perlu mengubah num_classes dalam kepala untuk cocok dengan anotasi dataset
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=3),
mask_head=dict(num_classes=3)))
# Modifikasi pengaturan terkait dataset
data_root = '/home/someusername/'
metainfo = {
'classes': ('MyClass1', 'AnotherClass2', 'AndTheLastOne3'),
'palette': [
(220, 20, 60),
(20, 60, 220),
(60, 220, 20),
]
}
train_dataloader = dict(
batch_size=1,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='train.json',
data_prefix=dict(img='')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='test.json',
data_prefix=dict(img='')))
test_dataloader = val_dataloader
# Modifikasi pengaturan terkait metrik
val_evaluator = dict(ann_file=data_root+'test.json')
test_evaluator = val_evaluator
# Kita dapat menggunakan model Mask RCNN yang telah dilatih sebelumnya untuk mendapatkan kinerja yang lebih tinggi
load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'
# jika Anda menyukai film panjang
# default di sini jika saya ingat benar adalah 12
train_cfg = dict(max_epochs=24)
Beberapa hal untuk dilihat jika mask tidak diperlukan: https://mmdetection.readthedocs.io/en/latest/user_guides/single_stage_as_rpn.html
Pelatihan
Anggaplah Anda memiliki konfigurasi model di /home/someusername/myproject/models/configs/mask-rcnn_r50-caffe_fpn_ms-poly-1x_v1.0.py . Skrip pelatihan adalah panggilan standar ke alat mmdetection:
cd ~/mmdetection
python tools/train.py \
/home/someusername/myproject/models/configs/mask-rcnn_r50-caffe_fpn_ms-poly-1x_v1.0.py \
--work-dir /home/someusername/myproject/work-dirs/my-object-detector-v1.0-mask-rcnn_r50-caffe_fpn_ms-poly-1x
Inferensi
Beberapa dokumen ada di sini: https://mmdetection.readthedocs.io/en/latest/user_guides/inference.html
from mmdet.apis import DetInferencer
inferencer = DetInferencer(
model='/home/someusername/myproject/models/configs/mask-rcnn_r50-caffe_fpn_ms-poly-1x_v1.0.py',
weights='/home/someusername/myproject/work-dirs/my-object-detector-v1.0-mask-rcnn_r50-caffe_fpn_ms-poly-1x/epoch_12.pth')
# jalankan untuk satu file:
# inferencer('demo/demo.jpg', out_dir='/home/someusername/myproject/test-output/1.0/', show=True)
# atau untuk seluruh folder
inferencer('/home/someusername/myproject/test-images/', out_dir='/home/someusername/myproject/test-output/1.0/', no_save_pred=False)
Tautan berguna
Semoga ini membantu Anda dalam beberapa cara.
Bacaan berguna lainnya silakan lihat di
- Situs Label Studio: https://labelstud.io/
- Dokumentasi MMDetection: https://mmdetection.readthedocs.io/en/latest/get_started.html
- Bash Cheat Sheet
- Mendeteksi Reo Bar Caps Beton dengan tensorflow
- Python Cheatsheet
- Conda Cheatsheet
- Flux teks ke gambar
- Ollama Cheatsheet
- Docker Cheatsheet
- Lambda Berlapis dengan AWS SAM dan Python
- Menghasilkan PDF dalam Python - Perpustakaan dan contoh"