लेबल स्टूडियो एवं मीडी डेटेक्शन के साथ ऑब्जेक्ट डेटेक्टर AI का ट्रेनिंग

लेबलिंग और ट्रेनिंग में कुछ चिपकाना आवश्यक है

Page content

जब मैं object detector AI का ट्रेन कर रहा था कुछ समय पहले - LabelImg एक बहुत सहायक टूल था, लेकिन Label Studio से COCO फॉर्मेट में एक्सपोर्ट MMDetection फ्रेमवर्क द्वारा स्वीकृत नहीं था।

इसके लिए कुछ टूलिंग और स्क्रिप्ट की आवश्यकता थी ताकि सब कुछ काम कर सके।

topimage

यहां अनुपलब्ध भागों की सूची और कुछ स्क्रिप्ट दिए गए हैं जिनमें से कुछ मैं इंटरनेट से पाया और अन्य को मैं स्वयं लिखा है।

मूल चरण

संग्रहण, ट्रेनिंग और उपयोग करने में

  1. स्रोत डेटा प्राप्त करें (ऑब्जेक्ट डेटेक्शन और क्लासिफिकेशन के लिए छवियां)
  2. छवियों के लेबलिंग और डेटासेट की तैयारी
  3. नए मॉडल के विकास या उपयुक्त विद्यमान मॉडल की खोज
  4. मॉडल की ट्रेनिंग, कभी-कभी हाइपर पैरामीटर ट्यूनिंग के साथ
  5. नए छवियों के लेबल के अनुमान लगाने के लिए मॉडल का उपयोग (इंजीनियरिंग)

यहां मैं आपको बताता हूं कि कैसे डेटा के लेबलिंग के साथ Label Studio (चरण 2) और mmdetection और torchvision के साथ ट्रेनिंग करें (चरण 4), और अनुमान (चरण 5) के बारे में बात करूं।

Label Studio

इसमें कुछ ओपन सोर्स जन्म लेबलिम के प्रोग्राम में है लेकिन अब इसे बहुत केंद्रीकृत तरीके से विकसित और बरकरार रखा जाता है। और एंटरप्राइज वर्जन भी है।

अभी भी इसे स्वयं आवास लगाने के लिए उपलब्ध है, जो बहुत अच्छा है।

एक्सेक्यूट और चलाएं

Label Studio को इसके कई तरीकों से इंस्टॉल और चलाया जा सकता है, जैसे कि pip पैकेज के उदाहरण, या docker compose कंटेनर ग्रुप। यहां मैं एकल docker कंटेनर का उपयोग कर रहा हूं।

स्रोत फोल्डर की तैयारी करें

mkdir ~/ls-data
sudo chown -R 1001:1001 ~/ls-data10

लोकल स्टोरेज कॉन्फ़िगरेशन

mkdir ~/ai-local-store
mkdir ~/ai-local-labels

# कुछ अतिरिक्त अनुमतियां सेट करें

~/ai-local-store में आप छवि फ़ाइलें रखते हैं, ~/ai-local-labels - आउटसिंच लेबल।

डॉकर कंटेनर शुरू करें

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 - क्योंकि LS वेबयूआई रीडायरेक्ट करता है। DATA_UPLOAD_MAX_NUMBER_FILES … Django अपलोड फ़ाइल संख्या को 100 तक सीमित करता है और इसका बुरा प्रभाव लेबल स्टूडियो पर था, इसलिए इस नए सीमा की आवश्यकता थी। सभी अन्य कॉन्फ़िगरेशन लेबल स्टूडियो डॉक्स में बहुत अच्छी तरह से दस्तावेज़ित किए गए हैं।

इम्पोर्ट कॉन्फ़िगरेशन। क्लाउड स्टोरेज में प्रोजेक्ट सेटिंग्स में स्रोत स्टोरेज के लिए लोकल फ़ाइल्स प्रकार के समान जैसा देखें:

topimage

अपने छवियों को सिंक करने के लिए “हर बकेट ऑब्जेक्ट को स्रोत फ़ाइल के रूप में लें” चेक करें (मुझे लगता है कि आप ऐसा कर रहे हैं), नहीं जीएन फ़ाइल। अगर आपके पास इन छवियों के लिए कुछ भी लेबल हैं तो आप इस क्लाउड स्टोरेज को कॉन्फ़िगर कर सकते हैं। नहीं करें सिंक। और फिर जीएन फ़ाइल को आयात करें।

एक्सपोर्ट के लिए एक्सपोर्ट कॉन्फ़िगरेशन करें और ai-local-labels के लिए टारगेट क्लाउड स्टोरेज भी एक्सपोर्ट करें यदि आप उन्हें सिंक करना चाहते हैं।

Label Studio में प्रीलेबल डेटा को आयात करें

COCO json फॉर्मेट में आवेग आपको बहुत अच्छा लगता है। एक पास्कल वोस भी। लेकिन वे लेबल स्टूडियो के साथ अप्रत्यक्ष अपेक्षित नहीं हैं, इसलिए इसे लेबल स्टूडियो के प्रॉप्रिएटरी फॉर्मेट में परिवर्तित करने की आवश्यकता है।

लेकिन इससे पहले - शायद आपको डेटासेट को फ़िल्टर करना होगा। आपको यहां केवल कुछ लेबल हो सकते हैं, न कि सभी। मुझे फ़िल्टर.पाई स्क्रिप्ट से पसंद है: 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

ठीक है, अब, ट्रांसफॉर्मर को स्थापित करें। आधिकारिक वेबसाइट जैसे अनुशंसा करती है:

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 . 

COCO से ट्रांसफॉर्मर और सही फ़ोल्डर को सेट करें

label-studio-converter import coco -i your-input-file.json -o output.json

आउटपुट.जीएन को लेबल स्टूडियो में आयात करने के लिए आयात बटन के बाद क्लिक करें।

लेबलिंग

यहां बहुत सारा बहुत रचनात्मक काम किया जाता है।

एक्सपोर्ट

लेबल स्टूडियो में एक्सपोर्ट बटन के बाद कोको एक्सपोर्ट फॉर्मेट के चयन करने के बाद इस फ़ाइल के अंदर देखें और छवि नामों की खुशी अनुभव करें। ये इस तरह दिखेंगे अगर आपके पास इम्पोर्ट करने से पहले लेबल नहीं बदले थे और छवि बेस पथ को बदला नहीं गया है

  "images": [
    {
      "width": 800,
      "height": 600,
      "id": 0,
      "file_name": "\/data\/local-files\/?d=\/iteration1001\/123.jpg"
    },

या यह दिखेंगे अगर आप बाहरी क्लाउड स्टोरेज के साथ सिंक कर रहे हैं।

  "images": [
    {
      "width": 800,
      "height": 600,
      "id": 0,
      "file_name": "http:\/\/localhost:8080\/data\/local-files\/?d=iteration1001\/123.jpg"
    },

इनके बहुत अच्छे नहीं हैं। हम कुछ ऐसे चाहते हैं

  "images": [
    {
      "width": 800,
      "height": 600,
      "id": 0,
      "file_name": "iteration1001/123.jpg"
    },

फ़ाइल नामों को ठीक करने के लिए मैं बहुत अच्छे स्क्रिप्ट का उपयोग करता हूं। ये रिजल्ट.जीएन फ़ाइल को बदल देते हैं, इसलिए अगर आपको एक बैकअप की आवश्यकता है तो आपको खुद देखना होगा:

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

Label Studio डेटा और डीबी के बैकअप

अपने Label Studio docker कंटेनर को ध्यान से बंद करें और फिर कुछ ऐसा करें

cp ~/ls-data ~/all-my-backups
cp ~/ai-local-store ~/all-my-backups
cp ~/ai-local-labels ~/all-my-backups

मर्ज

कभी-कभी कई डेटासेट को एक साथ मर्ज करने की आवश्यकता होती है, विशेष रूप से अनेक इटरेशन चलाने के दौरान।

मैं COCO-merger टूल का उपयोग करता हूं। इसके इंस्टॉल करने और -h पैरामीटर के साथ चलाने के बाद:

python tools/COCO_merger/merge.py -h

COCO फ़ाइलों के मर्ज करने का उपयोग

python -m COCO_merger.merge --src Json1.json Json2.json --out OUTPUT_JSON.json

अर्ग्यूमेंट पार्सर

उपयोग: merge.py [-h] --src SRC SRC --out OUT

दो अनुमान फ़ाइलों को एक फ़ाइल में मर्ज करें

वैकल्पिक अर्ग्यूमेंट:
  -h, --help     इस मदद संदेश और बाहर जाने के लिए दिखाएं
  --src SRC SRC  मर्ज करने वाली दो अनुमान फ़ाइलों के पथ
  --out OUT      आउटपुट अनुमान फ़ाइल के पथ

हां। आपको केवल दो फ़ाइलों के मर्ज करने की आवश्यकता है। इसलिए अगर आपके पास 10 इटरेशन हैं तो आपको अतिरिक्त प्रयास करने की आवश्यकता होगी। फिर भी इसे पसंद करता हूं।

MMDetection

topimage

डेटासेट को विभाजित करें

डेटासेट को ट्रेनिंग और टेस्ट में विभाजित करने के लिए COCOSplit टूल का उपयोग किया गया।

git clone https://github.com/akarazniewicz/cocosplit.git
cd cocosplit
pip install -r requirements

इसमें बहुत कम है:

$ python cocosplit.py -h
उपयोग: cocosplit.py [-h] -s SPLIT [--having-annotations]
                    coco_annotations train test

COCO अनुमान फ़ाइल को ट्रेनिंग और टेस्ट सेट में विभाजित करें।

स्थिति विशिष्ट विवरण:
  coco_annotations      COCO अनुमान फ़ाइल के पथ।
  train                 COCO ट्रेनिंग अनुमान के लिए जगह
  test                  COCO टेस्ट अनुमान के लिए जगह

वैकल्पिक विवरण:
  -h, --help            इस मदद संदेश और बाहर जाने के लिए दिखाएं
  -s SPLIT              विभाजन के प्रतिशत; (0, 1) में एक संख्या
  --having-annotations  बिना अनुमान वाले सभी छवियों को नजरअंदाज करें। केवल इन छवियों को बरकरार रखें जिनमें कम से कम एक अनुमान हो
  --multi-class         एक बहु-क्लास डेटासेट को विभाजित करें जबकि ट्रेनिंग और टेस्ट सेट में क्लास वितरण को बरकरार रखें

COCO विभाजन करने के लिए चलाएं:

python cocosplit.py --having-annotations \
  --multi-class \
  -s 0.8 \
  source_coco_annotations.json \
  train.json \
  test.json

केवल याद रखें कि डेटासेट जीएन फ़ाइल के शुरुआत में लाइसेंस गुणवत्ता को जोड़ें, कहीं पहले “{” के बाद। इस विभाजन टूल वास्तव में इसकी आवश्यकता है।

  "licenses": [],

कॉन्फ़िगरेशन

हां, मॉडल कॉन्फ़िगरेशन कठिन है

लेकिन mask-rcnn बहुत तेज है और अच्छा डेटेक्शन दर है। अधिक जानकारी के लिए अपनी कॉन्फ़िगरेशन विवरण देखें: https://mmdetection.readthedocs.io/en/latest/user_guides/train.html#train-with-customized-datasets

# नई कॉन्फ़िगरेशन एक बेस कॉन्फ़िगरेशन को उत्तराधिकार करती है ताकि आवश्यक संशोधनों को उजागर किया जा सके
_base_ = '/home/someusername/mmdetection/configs/mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py'

# हमें भी नंबर क्लासेज़ को डेटासेट के अनुमान के साथ बदलना होगा
model = dict(
    roi_head=dict(
        bbox_head=dict(num_classes=3),
        mask_head=dict(num_classes=3)))

# डेटा संबंधित सेटिंग्स को बदलें
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

# मेट्रिक संबंधित सेटिंग्स को बदलें
val_evaluator = dict(ann_file=data_root+'test.json')
test_evaluator = val_evaluator

# हम एक प्री-ट्रेन किया गया Mask RCNN मॉडल का उपयोग करके उच्च प्रदर्शन प्राप्त कर सकते हैं
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'

# अगर आप लंबे फिल्मों को पसंद करते हैं
# यहां आपके लिए डिफ़ॉल्ट अगर मुझे याद है तो 12 है
train_cfg = dict(max_epochs=24) 

अगर मास्क के बिना आपको देखना हो तो यहां देखें: https://mmdetection.readthedocs.io/en/latest/user_guides/single_stage_as_rpn.html

ट्रेनिंग

मान लीजिए आपके मॉडल कॉन्फ़िगरेशन /home/someusername/myproject/models/configs/mask-rcnn_r50-caffe_fpn_ms-poly-1x_v1.0.py में है। ट्रेनिंग स्क्रिप्ट ममडेटेक्शन टूल के स्टैंडर्ड कॉल के रूप में है:

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

इनफरेंस

कुछ डॉक्स यहां हैं: 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')

# एकल फ़ाइल के लिए चलाएं:
# inferencer('demo/demo.jpg', out_dir='/home/someusername/myproject/test-output/1.0/', show=True)

# या पूरे फ़ोल्डर के लिए
inferencer('/home/someusername/myproject/test-images/', out_dir='/home/someusername/myproject/test-output/1.0/', no_save_pred=False)

उपयोगी लिंक

उम्मीद है कि यह आपके लिए कुछ तरह से मदद करेगा।

अन्य उपयोगी पढ़ें कृपया देखें