Pelatihan Detektor Objek AI dengan Label Studio & MMDetection

Penandaan dan pelatihan membutuhkan sedikit perekatan

Konten Halaman

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.

topimage

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

  1. mendapatkan data sumber (gambar untuk deteksi objek dan klasifikasi)
  2. melabeli gambar dan menyiapkan dataset
  3. mengembangkan model baru atau menemukan model yang sudah ada yang cocok
  4. melatih model, terkadang dengan penyetelan parameter hiper
  5. 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:

topimage

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

topimage

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