درّب نماذج على الحجوم وسحب النقاط والفيديو
درّب U-Net ثلاثي الأبعاد على أقنعة CT المرسومة، وشغّل كاشف OpenPCDet الخاص بك على متوازيات المستطيلات في بيانات الليدار، وادرّب متتبّعاً للفيديو، مع تقييم كل منها على العناصر المحجوزة.
جديد في v2.14.0
يدرّب هذا الدرس ثلاثة نماذج على بيانات ثلاثية الأبعاد ومتحركة انطلاقاً من التعليقات التوضيحية الخاصة بدراسة في Potato. يدرّب volume-unet شبكة U-Net ثلاثية الأبعاد تقسّم حجوم CT وMR، ويشغّل external-3d كاشف ليدار تبنيه وتشغّله بنفسك، ويدرّب video-track متتبّعاً لكائنات الفيديو. الصفحة موجّهة إلى الفرق التي تعلّق الحجوم أو سحب النقاط أو الفيديو في Potato أصلاً، وتريد نموذجاً يضع تصنيفات مسبقة على الباقي. تغطي الصفحة لكل مُدرِّب المخطط الذي ينتج بيانات التدريب، وتهيئة تجتاز potato validate، وما تفعله التشغيلة، ودرجة العناصر المحجوزة، وكيف تصل التنبؤات إلى المعلّقين. يشرح درس النموذج الأول صفحة التدريب بمصنِّف نصوص لا يحتاج إلى GPU، ويفترض هذا الدرس أنك قرأته.
ملخص المُدرِّبات
تدرّب المُدرِّبات الثلاثة كلها على مخطط واحد في كل تشغيلة، وتقيّم النموذج على عناصر val وtest المحجوزة للتشغيلة، وتكتب التنبؤات راجعةً تصنيفاتٍ مسبقة يعدّلها المعلّقون. يحتاج volume-unet والكواشف التي يستند إليها external-3d إلى GPU عملياً، ولذلك ترسل تهيئتا هذين المُدرِّبين التشغيلات إلى خادم GPU عبر ssh، كما يضبطه درس التدريب عن بُعد.
| المُدرِّب | المخطط | العناصر | التثبيت على جهاز التدريب | الدرجة الرئيسية |
|---|---|---|---|---|
volume-unet | volume_annotation (أقنعة مرسومة) | حجوم NIfTI وسلاسل DICOM | pip install "potato-annotation[train-vision,volumes]"؛ مع GPU عملياً | mean_dice |
external-3d | spatial_annotation (متوازيات مستطيلات) | سحب نقاط | كاشفك الخاص (OpenPCDet وMMDetection3D) | map_3d_50 |
video-track | video_annotation بنمط tracking أو combined | فيديو | pip install "potato-annotation[train-vision]" opencv-python | idf1 |
يقرأ كل مُدرِّب الوسائط من ملفات على القرص. يجب أن يشير مسار الوسائط إلى موضع داخل مجلد المهمة أو media_directory، وتُستبعد من التدريب والتنبؤ العناصر التي وسائطها عنوان URL من نوع http(s).
قسّم حجوم CT وMR باستخدام volume-unet
يتعلّم volume-unet الأقنعة التي يرسمها المعلّقون في مخطط volume_annotation، ويرسم أقنعة على الحجوم التي لم يقسّمها أحد بعد. يعرض المخطط ملف NIfTI أو سلسلة DICOM في ثلاثة مناظير مترابطة (محوري وإكليلي وسهمي)، ويرسم المعلّقون كل تصنيف بالفرشاة أو بإغلاق مضلّع. يحمل حقل العنصر الذي يسمّيه source_field ملف .nii أو .nii.gz، أو مجلداً يضم سلسلة DICOM واحدة، بالنسبة إلى media_directory. والمربع المرسوم على شريحة ليس قناعاً، فلا تكون الإجابة التي فيها مربعات فقط هدف تدريب. Potato برنامج بحثي لا يحمل أي اعتماد سريري أو تنظيمي، والنموذج المدرَّب هنا يقترح أقنعة ليصحّحها المعلّقون.
تقسّم التهيئة أدناه الطحال والكبد، وتدرّب على خادم GPU، وتضع تصنيفات مسبقة على كل حجم خارج قسم train:
annotation_task_name: "Spleen segmentation"
task_dir: .
media_directory: media
data_files:
- data/scans.jsonl
item_properties:
id_key: id
text_key: volume
output_annotation_dir: annotation_output
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: volume_annotation
name: organs
description: "Paint the spleen and the liver on every slice where each organ appears."
source_field: volume
labels:
- {name: Spleen, color: "#e6553a", key_value: "1"}
- {name: Liver, color: "#3a8ee6", key_value: "2"}
tools: [brush, eraser, polygon]
default_window: Soft tissue
model_training:
enabled: true
backend: gpu-server
backends:
gpu-server:
type: ssh
host: gpu.example.edu
python: /opt/conda/bin/python3
gpus: auto
min_free_gpu_mb: 8000
trainer_params:
volume-unet:
patch: 96
writeback:
schemas: [organs]
min_confidence: 0.6
include_unlabeled: trueيسمّي كل سطر بيانات حجماً واحداً:
{"id": "case_001", "volume": "case_001.nii.gz"}
{"id": "case_002", "volume": "case_002_ct"}تحدّد قيمة patch ضلع الرقعة المكعبة التي تتدرّب عليها الشبكة، ويجب أن تكون من مضاعفات 4 عند المستويات الثلاثة الافتراضية (2 مرفوعة إلى levels ناقص 1). تعطي الرقعة ذات 96 فوكسل الشبكةَ سياقاً أوسع حول كل فوكسل مقارنة بالافتراضي 64، وتحتاج إلى ذاكرة GPU أكبر. ومع min_free_gpu_mb: 8000 لا يبدأ Potato تشغيلة إلا على GPU فيه 8000 ميغابايت حرة على الأقل. يأخذ Potato متوسط احتمال النموذج داخل قناع كل تصنيف مرسوم، ويبلّغ عن أدنى هذه المتوسطات بوصفه ثقة الحجم. ومع min_confidence: 0.6 لا يحصل الحجم الذي رُسم فيه أي عضو بمتوسط احتمال أقل من 0.6 على تصنيف مسبق.
خطوات التدريب في تشغيلة volume-unet
تقرأ التشغيلة كل حجم معلَّق بترتيب الفوكسلات الذي يرسم به عنصر الواجهة، وتحوّل الأقنعة إلى تصنيف واحد لكل فوكسل. وحيث يتداخل تصنيفان يفوز التصنيف الأحدث في ترتيب تصنيفات الحزمة، كما يفعل تصدير NIfTI. وتُقتطع الشدّات عند المئين 0.5 والمئين 99.5 لكل حجم ثم تُوحَّد معيارياً. الشبكة U-Net ثلاثية الأبعاد بـ torch الصرف (ثلاثة مستويات، وتطبيع على مستوى المثيل)، وتتدرّب بالإنتروبيا المتقاطعة مع Dice الناعم على 100 رقعة عشوائية في كل حقبة. يتمركز نصف الرقع على فوكسل مرسوم، فتظهر البنى الصغيرة في التدريب. وبعد كل حقبة تقيّم التشغيلة متوسط Dice على حجوم val وتحتفظ بأفضل حقبة، وتتوقف بعد 10 حقب دون درجة أفضل. ويمرّر التنبؤ الرقعة على الحجم كله بتداخل نصف رقعة، ويحسب متوسط الاحتمالات.
يحتاج قسم train إلى ثلاثة حجوم معلَّقة على الأقل (min_instances). ويُستبعد الحجم الذي يختلف شكله المرسوم عن شكل الملف مع تحذير في سجل التشغيلة، وكذلك الحجم الذي ملفه مفقود. وحين يقرأ عدة قرّاء الحجم نفسه تتدرّب التشغيلة على أقنعة القارئ الواحد الذي يحسمه aggregation، لأن المُجمِّعات تقارن الإجابات كاملة. يتناول قسّم حجوم CT بعدة قرّاء وSTAPLE اتفاق القرّاء وقناع إجماع يُبنى خارج Potato.
درجة العناصر المحجوزة للحجوم
يحسب Potato معامل Dice لكل تصنيف على كل حجم محجوز (dice_<label>)، ويبلّغ عن المتوسط على كل الحجوم والتصنيفات بوصفه mean_dice. التصنيف الذي أغفله النموذج في حجم يحتوي عليه يحصل على 0. ويختار المُدرِّب أفضل حقبة على val، ولذلك يأخذ جدول التشغيلات الدرجة الرئيسية من test (test_mean_dice). والقائمة الكاملة للدرجات لكل تصنيف في صفحة التشغيلة.
التصنيفات المسبقة للأقنعة على مناظير الشرائح
تعود الأقنعة المتنبَّأ بها بشكل عنصر الواجهة نفسه، لكل تصنيف ولكل شريحة محورية، مع الوسم prefilled_from: model، وتظهر على مناظير الشرائح حين يفتح المعلّق الحجم. يصحّح المعلّق الأقنعة بالفرشاة والممحاة، وتُحفظ الأقنعة المصحَّحة إجابةً لذلك المعلّق. لا تحصل عناصر قسم train في التشغيلة على تصنيف مسبق أبداً. وبدون include_unlabeled تتنبأ التشغيلة بحجوم val وtest للتشغيلة فقط.
اكشف متوازيات المستطيلات ثلاثية الأبعاد باستخدام external-3d
يسلّم external-3d المسوح المعلَّقة إلى كاشف ثلاثي الأبعاد تثبّته على مضيف التدريب، ويشغّل أمرَي التدريب والتنبؤ اللذين تحدّدهما، ويقرأ الصناديق المتنبَّأ بها متوازياتِ مستطيلات. لا يضم Potato كاشف سحب نقاط. أما الكاشفان اللذان بُني المُدرِّب لهما، OpenPCDet وMMDetection3D، فيحتاجان إلى عوامل CUDA مجمَّعة على مضيف GPU. ومن جهة Potato لا يحتاج المُدرِّب إلا إلى numpy.
تأتي بيانات التدريب من مخطط spatial_annotation بأداة cuboid_3d. يضع المعلّقون صناديق موجَّهة على مسوح PCD أو PLY أو LAS أو KITTI .bin، مخزَّنة بالأمتار في إطار المسح نفسه (راجع سحب النقاط ثلاثية الأبعاد ومتوازيات المستطيلات). متوازيات المستطيلات هي الأهداف الوحيدة، فتُتجاهل النقاط والخطوط المتعددة ومقاطع النقاط في المخطط نفسه. كل عنصر مسح واحد، وليست سلسلة الإطارات ذات معرّفات المسارات هدف تدريب.
مجلد مجموعة البيانات المكتوب للكاشف
قبل تشغيل أمر التدريب يكتب Potato المسوح في {dataset}، وهو مجلد باسم dataset داخل مجلد التشغيلة، بـتخطيط مجموعة البيانات المخصصة في OpenPCDet:
points/<id>.npyيحمل مسحاً واحداً صفوفَ float32 بالشكلx y z intensity، مع شدة 0 حين لا يحمل الملف شدة.labels/<id>.txtيحمل سطراً لكل متوازي مستطيلات لمسوحtrainوval، بالشكلx y z dx dy dz heading label. الاتجاه هو الدوران حول المحور +z بالراديان، ولا يُحفظ الميلان الطولي ولا الجانبي. ويتحول الفراغ في اسم التصنيف إلى شرطة سفلية.ImageSets/train.txtوval.txtوpredict.txtتسرد معرّفات المسوح. ويسردpredict.txtمسوحvalوtest، مع المسوح غير المصنّفة حين يكونwriteback.include_unlabeledمفعّلاً.
كل <id> هو أول 16 رمزاً سداسياً عشرياً من SHA-1 لمعرّف العنصر، لأن معرّفات العناصر قد تحوي رموزاً لا يقبلها اسم ملف. ولا تُكتب تصنيفات مسوح test في المجلد أبداً. ويكتب Potato المسح المرجعي جغرافياً نسبةً إلى أصل المسح، لأن الإحداثيات المرجعية جغرافياً أكبر من أن تتسع في float32، ويزيح الصناديق المتنبَّأ بها بالإزاحة نفسها.
ملفات التنبؤ المقروءة من الكاشف
يكتب أمر التنبؤ ملفاً لكل مسح في {predictions}/<id>.txt، بصندوق في كل سطر، بالشكل x y z dx dy dz heading label score. الدرجة اختيارية. ويستبعد Potato السطر الذي لا يُحلَّل، أو يحوي nan أو inf، أو يسمّي تصنيفاً ليس في المخطط، أو يصف صندوقاً بلا حجم، ويعدّ سجل التشغيلة الأسطر المستبعدة. وتعود الصناديق المتبقية كائنات cuboid_3d موسومة بـsource: model، وتصبح درجة كل صندوق ثقة ذلك الصندوق. ويضع Potato ثقة المسح عند أدنى درجة صندوق فيه، وينطبق min_confidence على هذه القيمة.
أمرا التدريب والتنبؤ
يُضبط الأمران معاً بوصفهما معاملات للمُدرِّب. يقسّم Potato كل أمر إلى كلمات كما يفعل الصدفة، ويستبدل {dataset} و{workdir} (مجلد التشغيلة) و{predictions} بالمسارات المقابلة، ويشغّل الأمر في مجلد التشغيلة دون صدفة. وتُترك الأقواس المعقوفة الأخرى في الأمر كما كُتبت. تصل الأنابيب و&& و$VARIABLES إلى البرنامج كلمات حرفية، فالعمل متعدد الخطوات مكانه سكربت. أضف هذه الكتلة إلى تهيئة دراسة سحب النقاط:
model_training:
enabled: true
backend: gpu-server
backends:
gpu-server:
type: ssh
host: gpu.example.edu
python: /opt/conda/envs/pcdet/bin/python
gpus: auto
trainer_params:
external-3d:
train_command: "/opt/pcdet-jobs/train.sh {dataset} {workdir}"
predict_command: "/opt/conda/envs/pcdet/bin/python /opt/pcdet-jobs/predict.py {dataset} {workdir} {predictions}"
timeout_s: 43200
writeback:
schemas: [objects]
min_confidence: 0.3
include_unlabeled: trueالمسارات على مضيف التدريب، حيث يوجد مجلد التشغيلة أيضاً. يحدّ timeout_s كل أمر، وتحل 12 ساعة هنا محل الافتراضي 24. والأمر الذي يخرج برمز غير صفري يُفشل التشغيلة، ويعرض خطأ التشغيلة آخر أسطر مخرجات الأمر.
train.sh سكربتك أنت. في OpenPCDet يوجّه السكربت تهيئة مجموعة البيانات المخصصة في OpenPCDet إلى {dataset}، ويبني ملفات المعلومات بـpython -m pcdet.datasets.custom.custom_dataset create_custom_infos <dataset config>، ويشغّل سكربت التدريب في OpenPCDet، ويحفظ نقطة الحفظ تحت {workdir}. ويجب أن تطابق أسماء الفئات في تهيئة الكاشف أسماء التصنيفات كما كُتبت في labels/. ويقرأ دليل المجموعات المخصصة في MMDetection3D سحب النقاط من ملفات .bin فقط، ولذلك يكتب السكربت مع MMDetection3D كل points/<id>.npy أولاً ملفَّ .bin. اترك train_command فارغاً لتخطي التدريب، فيشغّل predict_command حينئذ نموذجاً درّبته في مكان آخر.
يقرأ predict.py المعرّفات في predict.txt، ويشغّل الكاشف على كل مسح، ويكتب الصناديق. الدالتان load_model وdetect شيفرتك أنت حول الكاشف الذي درّبته:
"""predict.py DATASET WORKDIR PREDICTIONS: one line per box, one file per scan."""
import os
import sys
import numpy as np
from my_detector import load_model, detect # your code around OpenPCDet or MMDetection3D
dataset, workdir, out = sys.argv[1:4]
model = load_model(os.path.join(workdir, "output")) # where train.sh saved the checkpoint
os.makedirs(out, exist_ok=True)
with open(os.path.join(dataset, "ImageSets", "predict.txt")) as fh:
scan_ids = fh.read().split()
for scan_id in scan_ids:
points = np.load(os.path.join(dataset, "points", scan_id + ".npy")) # float32, (N, 4)
with open(os.path.join(out, scan_id + ".txt"), "w") as fh:
for x, y, z, dx, dy, dz, heading, label, score in detect(model, points):
fh.write(f"{x} {y} {z} {dx} {dy} {dz} {heading} {label} {score}\n")بدون train_command يكون أمر التنبؤ هو التشغيلة كلها، ويُفشل أمر التنبؤ الذي يخرج برمز غير صفري التشغيلة. ويُعدّ أمر التنبؤ الذي يخرج برمز 0 ولا يكتب ملف <id>.txt لأي مسح، أو لا يكتب إلا أسطراً يستبعدها Potato، فاشلاً كذلك، لأن تشغيلة تُقيَّم على مخرجات كهذه ستبدو نموذجاً لم يجد شيئاً. والملف الفارغ مسح بلا كائنات. وبعد أمر التدريب لا يُفشل أمر التنبؤ الفاشل التشغيلة. تنتهي التشغيلة بتحذير "Prediction pass failed after 0 prediction(s)" وآخر أسطر مخرجات الأمر، ولا يكون للتشغيلة تنبؤات ولا درجة عناصر محجوزة. راجع سجل التشغيلة بحثاً عن هذا التحذير حين تعرض تشغيلة منتهية "not scored".
درجة العناصر المحجوزة لمتوازيات المستطيلات
يحسب Potato متوسط الدقة ثلاثي الأبعاد لكل تصنيف عند IoU حجمي 0.5 (ap_3d_50_<label>). وIoU دقيق لمتوازيات المستطيلات الموجَّهة بأي دوران. ويبلّغ Potato أيضاً عن المتوسط على التصنيفات عند IoU 0.25 و0.5، وعن الدقة والاستدعاء وF1 عند 0.5. والدرجة الرئيسية هي map_3d_50. ومع train_command يأخذ جدول التشغيلات الدرجة الرئيسية من test أولاً، لأن أمر التدريب يتسلّم تصنيفات val في {dataset} وقد يختار نقطة حفظ بناءً عليها. وبدون train_command لا يرى النموذج عناصر val في الدراسة أبداً، وتأتي الدرجة الرئيسية من val.
التصنيفات المسبقة لمتوازيات المستطيلات في عارض سحب النقاط
تظهر متوازيات المستطيلات المتنبَّأ بها في عارض سحب النقاط صناديقَ قابلة للتعديل، ويُحفظ الصندوق المعدَّل إجابةً للمعلّق. يفحص Potato كل كائن متنبَّأ به قبل أن يرسمه العارض، ويستبعد الكائن الذي لا تُحلَّل هندسته، ومتوازي المستطيلات بلا حجم، والتصنيف الذي ليس في المخطط. يتناول كيف تعلّق سحب النقاط ثلاثية الأبعاد جانب التعليق والاتفاق على الصناديق ثلاثية الأبعاد.
تتبّع الكائنات في الفيديو باستخدام video-track
يتعلّم video-track من المسارات التي يرسمها المعلّقون في مخطط video_annotation بنمط tracking أو combined، ويتنبأ بمسارات على الفيديوهات التي لم يتتبّعها أحد. المسار تصنيف وصندوق عند كل إطار مفتاحي، ويستكمل عنصر الواجهة الصندوق بين الإطارات المفتاحية. ويخزّن مخطط video_annotation بنمط آخر مقاطع لا مسارات، ولا يُعرض video-track لذلك المخطط.
annotation_task_name: "Pedestrian tracking"
task_dir: .
media_directory: media
data_files:
- data/clips.jsonl
item_properties:
id_key: id
text_key: video
output_annotation_dir: annotation_output
user_config:
allow_all_users: true
annotation_schemes:
- annotation_type: video_annotation
name: tracks
description: "Track every pedestrian and cyclist with a box at each keyframe."
source_field: video
mode: tracking
video_fps: 25
labels:
- {name: pedestrian, color: "#FF6B6B"}
- {name: cyclist, color: "#45B7D1"}
tracking_options:
interpolation: linear
auto_advance_frames: 5
frame_stepping: true
model_training:
enabled: true
trainer_params:
video-track:
frame_fps: 2
predict_fps: 5
max_age: 4
writeback:
schemas: [tracks]
include_unlabeled: trueيسمّي كل سطر بيانات مقطعاً تحت media_directory:
{"id": "clip_001", "video": "/media/clip_001.mp4"}
{"id": "clip_002", "video": "/media/clip_002.mp4"}اضبط video_fps على معدل إطارات المقاطع الحقيقي. تُرقَّم الإطارات المفتاحية بالإطار، ويرقّم المُدرِّب الإطارات المفتاحية المتنبَّأ بها عند video_fps الخاص بالمخطط (30 إن لم يُضبط). ويقرأ المُدرِّب الصندوق على إطار مُعيَّن بحسب إعداد interpolation لكل مسار (خطي، أو Catmull-Rom التكعيبي، أو ثابت). وهكذا تتبع الصناديق التي يتعلّم منها النموذج المسار الذي رآه المعلّقون. وكما في الأداة، يُثبَّت المسار ذو الإطار المفتاحي الواحد عند كل إطار، ويمتد المسار الذي أعطته الأداة startFrame وendFrame بين هذين الإطارين. ويظل الإطار المفتاحي الواقع خارج هذين الإطارين ظاهراً على إطاره الخاص. ويكشف predict_fps: 5 على خمسة إطارات في الثانية بدل اثنين. تعطي خمسة إطارات في الثانية الكائنَ السريع إطارات مفتاحية أكثر وتكلّف تمريرات كشف أكثر. وينتهي المسار بعد أكثر من max_age إطاراً مُعيَّناً بلا كشف مطابق، فيتيح max_age: 4 عند 5 إطارات في الثانية بقاء المسار 0.8 ثانية من إخفاقات الكشف. والمشاة الذي يمرّ خلف عمود يحتفظ بمسار واحد حين يجده الكاشف من جديد خلال 0.8 ثانية. وتتدرّب التهيئة على الجهاز الذي يشغّل Potato (الخلفية local)، وتصلح الخلفية gpu-server من تهيئة الحجوم لـvideo-track أيضاً.
التدريب وربط المسارات في تشغيلة video-track
تأخذ التشغيلة عيّنات من كل فيديو معلَّق بمعدل frame_fps إطاراً في الثانية، من البداية حتى آخر إطار مفتاحي، وتقرأ كل إطار معيَّن بـOpenCV. تعتمد بكسلات اللوحة على شاشة المعلّق، ولذلك يقرأ المُدرِّب صندوق كل مسار على ذلك الإطار كنسبة من الصورة. ويبقى الإطار المعيَّن الذي لا مسار عليه في التدريب مثالاً لمشهد فارغ. وتضبط التشغيلة Faster R-CNN من torchvision ضبطاً دقيقاً على هذه الإطارات، بمعاملات torchvision-detect وقيمه الافتراضية. ويبدأ الكاشف من أوزان COCO في torchvision. وبعد كل حقبة تقيّم التشغيلة mAP الصناديق عند IoU 0.5 على إطارات val (frame_map_50) وتحتفظ بأفضل حقبة.
يأخذ التنبؤ عيّنات من كل فيديو عند predict_fps، ويكشف على كل إطار معيَّن، ويربط الكشوف في مسارات. تُطابَق كشوف كل إطار واحداً بواحد مع المسارات الحيّة التي تحمل التصنيف نفسه، بحسب التداخل مع آخر صندوق لكل مسار، ويحتاج التطابق إلى IoU لا يقل عن match_iou (0.3). والكشف غير المطابق الذي درجته لا تقل عن new_track_score (0.5) يبدأ مساراً جديداً. ويُسقط المُدرِّب المسار المتنبَّأ به الذي يقل عدد كشوفه عن min_track_keyframes (2 افتراضياً) قبل الكتابة والتقييم. وكانت الأداة ستثبّت مساراً من كشف واحد على كل إطار. ويصبح كل كشف إطاراً مفتاحياً، فيستكمل عنصر الواجهة بين الإطارات المفتاحية للنموذج كما يستكمل بين إطارات المعلّق.
يحتاج قسم train إلى فيديوهين معلَّقين على الأقل (min_instances). ويُستبعد الفيديو الذي لا يستطيع OpenCV فك ترميزه مع تحذير يسمّي العنصر، وتتابع التشغيلة بالباقي.
درجة العناصر المحجوزة للمسارات
يقارن Potato المسارات المتنبَّأ بها بالمسارات المعلَّقة على إطارات مأخوذة بمعدل 2 في الثانية عبر كل فيديو محجوز، إضافةً إلى كل إطار مفتاحي معلَّق. والدرجات هي MOTA وIDF1 وتبديلات المعرّفات والإغفالات والإيجابيات الكاذبة، ويُعدّ الصندوق مكتشَفاً عند IoU 0.5. يحاسب MOTA الإغفالات والإيجابيات الكاذبة وتبديلات الهوية على عدد الصناديق المعلَّقة. وIDF1 هو درجة F1 للصناديق المطابَقة للهوية الصحيحة على امتداد الفيديو كله، وهو الدرجة الرئيسية (idf1). ويختار المُدرِّب أفضل حقبة على val، ولذلك يأخذ جدول التشغيلات الدرجة الرئيسية من test.
التصنيفات المسبقة للمسارات في عنصر واجهة الفيديو
تملأ المسارات المتنبَّأ بها عنصر واجهة الفيديو مساراتٍ بإطارات مفتاحية موسومة بأنها مخرجات الذكاء الاصطناعي وتحمل درجة الكاشف. يحوّل عنصر الواجهة الصناديق إلى بكسلات لوحته هو عند رسم المسارات، ويصحّح المعلّق المسارات كأي مسار آخر. وثقة الفيديو هي متوسط درجات الإطارات المفتاحية للنموذج. وفي النمط combined يحمل التصنيف المسبق مسارات فقط، ويضيف المعلّق المقاطع. يتناول كيف تعلّق تتبّع الكائنات في الفيديو جانب التعليق والحجب والاتفاق الزمني.
ابدأ تشغيلة وافحص النتيجة
أعد تشغيل الخادم بعد إضافة model_training، وافتح /admin/training، واختر المخطط والمُدرِّب، وانقر Train now. تعرض الصفحة المُدرِّبات التي تناسب كل مخطط فقط، وتسرد المُدرِّب غير المثبّت بعبارة "not installed" مع أمر التثبيت. ولفحص خادم GPU قبل التشغيلة الأولى، شغّل:
potato training check gpu-server config.yamlيعرض الفحص إصدار Python البعيد، وكل GPU مع ذاكرته الحرة، والـGPU الذي ستناله التشغيلة، وحِزم التدريب التي ينقصها المفسّر البعيد. ويمكن أيضاً بدء التشغيلة من API، مع معاملات لكل تشغيلة تتجاوز trainer_params:
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
http://localhost:8000/admin/training/api/runs \
-d '{"trainer": "video-track", "schemas": ["tracks"], "params": {"predict_fps": 10}}'حين تنتهي التشغيلة يسرد جدول التشغيلات درجة العناصر المحجوزة، مع القسم والمقياس في تلميح. التصنيفات المسبقة تثبّت إجابات المعلّقين على ما يعرضه النموذج، ولذلك فعّل include_unlabeled في دراسة جديدة بعد أن تسوّغ درجة العناصر المحجوزة عرض إجابات النموذج. يتناول درس النموذج في الحلقة تقديم التصنيفات المسبقة الأقل ثقة أولاً وإعادة التدريب على التصحيحات، ويسرد تهيئة تدريب النماذج ومساراته كل مفتاح والخلفيات وفحوص الكتابة الراجعة.
قراءات إضافية
- تدريب النماذج على تعليقاتك التوضيحية
- مُدرِّبات النماذج في Potato بحسب المهمة
- درس نماذج الرؤية، للكشف والتقسيم ثنائيي الأبعاد
- تتبّع الفيديو وانتشار الأقنعة
- تعليق الفيديو
- التعليق التوضيحي للتصوير الطبي
- إجماع الأقنعة بـ STAPLE
- المرجع الأصلي لـ
volume-unetوexternal-3dوvideo-track
المراجع
- Bernardin, K., and Stiefelhagen, R. (2008). Evaluating Multiple Object Tracking Performance: The CLEAR MOT Metrics. EURASIP Journal on Image and Video Processing. https://doi.org/10.1155/2008/246309
- Çiçek, Ö., Abdulkadir, A., Lienkamp, S. S., Brox, T., and Ronneberger, O. (2016). 3D U-Net: Learning Dense Volumetric Segmentation from Sparse Annotation. MICCAI 2016. https://arxiv.org/abs/1606.06650
- Ristani, E., Solera, F., Zou, R. S., Cucchiara, R., and Tomasi, C. (2016). Performance Measures and a Data Set for Multi-Target, Multi-Camera Tracking. ECCV 2016 Workshop on Benchmarking Multi-Target Tracking. https://arxiv.org/abs/1609.01775