چیت‌شیت

مقایسه‌ی تشخیص و بخش‌بندی (Detection و Segmentation)

Detection and Segmentation Compared

جعبه‌ها، ماسک‌های پیکسلی، ماسک‌های نمونه، نقاط کلیدی و ماسک‌های پرامپت متنی. خروجی‌ها، توابع زیان، معیارها و رفع اشکال در کنار هم.

  • ۱۲ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی رو در رو
  2. چه زمانی از کدام استفاده کنیم
  3. Mask R-CNN
  4. استنتاج YOLO: پس‌پردازش
  5. فرمول‌ها
  6. حذف غیرحداکثر (NMS)
  7. توابع زیان U-Net
  8. فاین‌تیون Mask R-CNN
  9. وظایف در کد
  10. پیش‌فرض‌ها
  11. عیب‌یابی
  12. پرسش‌ها

مقایسه‌ی رو در رو

مقایسه
وظیفهخروجیمعیار
تشخیص (YOLO)(N, H, W, num_anchors, 5 + C)mAP@0.5:0.95، AP@0.5
معنایی (U-Net)(N, C, H, W)IoU به ازای هر کلاس، mIoU، Dice
نمونه (Mask R-CNN)(N, 1, H, W)Mask AP و box mAP
تخمین وضعیت بدنی (نقشه‌های حرارتی)(N, K, H, W)OKS، PCK
واژگان‌باز (SAM 3)جعبه‌ها + برچسب‌ها + امتیازها + ماسک‌ها + شناسه‌هاMask IoU

چه زمانی از کدام استفاده کنیم

مفهوم‌ها
آشکارساز سبک YOLO
جعبه‌ها و کلاس‌ها در یک گذر رو به جلو، بی‌درنگ.
معنایی U-Net
یک کلاس به ازای هر پیکسل. دو ماشین مماس تبدیل به یک لکه می‌شوند.
نمونه‌ی Mask R-CNN
یک ماسک برای هر شیء، حتی زمانی که کلاس اشیاء یکی باشد.
سراسری (Panoptic)
هر پیکسل یک کلاس می‌گیرد. هر نمونه یک شناسه یکتا می‌گیرد.
وضعیت بدنی بالا به پایین
بالاترین دقت. هزینه با تعداد افراد افزایش می‌یابد.
وضعیت بدنی پایین به بالا
جمعیت‌های متراکم. زمان ثابت برای هر اندازه‌ای از جمعیت.
مدل SAM 3
ماسک‌ها و شناسه‌های نمونه برای یک عبارت اسمی در یک گذر رو به جلو.
مدل Grounded SAM 2 یا YOLO-World
تعویض آشکارساز یا مجوز دیگر. YOLO-World برای جعبه‌ها با fps بالا.

Mask R-CNN

معماری
K پیشنهاد برتر7x714x14NMSورودیتنسور تصویربک‌بون ResNetگام‌های 4، 8، 16، 32شبکه هرمی ویژگی (FPN)بالا به پایین + جانبیRPNحدود 1000 پیشنهاد، NMS 0.7RoIAlignدوسطحی (bilinear)، بدون گرد کردنسر جعبهکلاس + پالایشسر ماسک28x28 به ازای هر کلاسخروجیجعبه‌ها + کلاس‌ها + ماسک‌ها

استنتاج YOLO: پس‌پردازش

گام‌به‌گام
  1. هدیک کانولوشن 1x1 ابعاد (N, H, W, num_anchors, 5 + C) می‌دهد.
  2. باز کردن (Unpack)هر لنگر شامل tx, ty, tw, th, obj و لاجیت‌های C کلاس است.
  3. امتیازدهیsigmoid(obj) ضربدر سیگموئید بهترین کلاس.
  4. آستانهحذف جعبه وقتی امتیاز زیر conf_threshold باشد.
  5. رمزگشاییمرکز حاصل آفست سیگموئید به‌علاوه سلول، ضربدر stride. اندازه حاصل لنگر ضربدر np.exp.
  6. الگوریتم NMSاجرای nms(boxes, scores, iou_threshold) یک جعبه به ازای هر شیء نگه می‌دارد.
  7. بازگشتboxes[keep], scores[keep], classes[keep].

فرمول‌ها

مفهوم‌ها
خروجی YOLO
$S \times S \times B(5 + C)$. برای VOC با S=13، B=2 و C=20 مقدار 50 برای هر سلول می‌دهد.
رمزگشایی
$c_x = (\sigma(t_x) + \mathrm{cell}_x) \cdot \mathrm{stride}$، $w = a_w e^{t_w}$
معیار IoU
مساحت اشتراک تقسیم بر مساحت اجتماع. تشخیص درست نیازمند IoU >= 0.5 است.
معیار mAP@0.5:0.95
میانگین AP در بازه‌ی IoU بین 0.5، 0.55، ...، 0.95. معیار COCO.
معیار Dice
$2 \sum p y / (\sum p + \sum y + \epsilon)$. تابع زیان برابر است با 1 - Dice.
فرمول Dice از روی IoU
$\mathrm{Dice} = 2 \cdot \mathrm{IoU} / (1 + \mathrm{IoU})$
تابع زیان Mask R-CNN
rpn_cls + rpn_box + box_cls + box_reg + mask.
هدف نقشه‌ی حرارتی
$\exp(-((x - c_x)^2 + (y - c_y)^2) / 2\sigma^2)$

حذف غیرحداکثر (NMS)

کد
python
def nms(boxes, scores, iou_threshold=0.45):
    order = np.argsort(-scores)              # ابتدا بهترین امتیاز
    keep = []
    while len(order) > 0:
        i = order[0]
        keep.append(i)
        if len(order) == 1:
            break
        rest = order[1:]
        ious = box_iou(boxes[[i]], boxes[rest])[0]
        order = rest[ious <= iou_threshold]  # حذف همپوشانی‌ها
    return np.array(keep, dtype=np.int64)

توابع زیان U-Net

کد
python
def dice_loss(logits, targets, num_classes, eps=1e-6):
    probs = F.softmax(logits, dim=1)
    targets_one_hot = F.one_hot(targets, num_classes).permute(0, 3, 1, 2).float()
    dims = (0, 2, 3)                                 # دسته، H، W
    intersection = (probs * targets_one_hot).sum(dim=dims)
    denom = probs.sum(dim=dims) + targets_one_hot.sum(dim=dims)
    dice = (2 * intersection + eps) / (denom + eps)  # مقدار eps برای کلاس‌های غایب
    return 1 - dice.mean()                           # معیار macro Dice
def combined_loss(logits, targets, num_classes, lam=1.0):
    ce = F.cross_entropy(logits, targets)            # ابعاد (N, C, H, W) و (N, H, W)
    dc = dice_loss(logits, targets, num_classes)
    return ce + lam * dc, {"ce": ce.item(), "dice": dc.item()}

فاین‌تیون Mask R-CNN

کد
python
model = maskrcnn_resnet50_fpn_v2(weights=MaskRCNN_ResNet50_FPN_V2_Weights.DEFAULT)
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)  # پس‌زمینه را حساب می‌کند
in_features_mask = model.roi_heads.mask_predictor.conv5_mask.in_channels
model.roi_heads.mask_predictor = MaskRCNNPredictor(in_features_mask, 256, num_classes)
for p in model.backbone.parameters():
    p.requires_grad = False                                                  # FPN را نیز منجمد می‌کند
loss_dict = model(images, targets)                                           # حالت train: دیکشنری توابع زیان
losses = sum(loss for loss in loss_dict.values())
binary_masks = (p['masks'] > 0.5).squeeze(1)                                 # حالت eval: ابعاد (N, H, W)

وظایف در کد

کار و کد
وظیفهکد
محاسبه‌ی دو به دوی IoU جعبه‌هاbox_iou(boxes_a, boxes_b)
تبدیل خروجی هد به جعبه‌هاpostprocess(pred_tensor, anchors, stride)
محاسبه‌ی IoU برای هر کلاسiou_per_class(logits, targets, num_classes)
برش جعبه از نقشه‌ی ویژگیroi_align_single(feature, box)
تبدیل نقشه‌های حرارتی به (x, y)heatmap_to_coords(heatmaps)
نقاط کلیدی زیرپیکسلیsubpixel_refine(heatmaps)
تجزیه یک جمله به مفاهیمsplit_concepts(sentence)
پرامپت متنی SAM 3processor.set_text_prompt(inputs, "<concept>")

پیش‌فرض‌ها

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
iou_threshold0.45الگوریتم NMS برای تشخیص شیء
conf_threshold0.25شیءبودگی ضربدر بهترین کلاس
lambda_coord5.0وزن تابع زیان جعبه، نسبت YOLOv1
lambda_noobj0.5در غیر این صورت سلول‌های خالی غالب می‌شوند
RPN NMS IoU0.7پس از حدود 1,000 جعبه‌ی برتر
Mask threshold0.5ماسک اعشاری به ماسک باینری
Heatmap `sigma`2.0لکه گوسی به ازای هر نقطه‌ی کلیدی
Dice weight `lam`1.0تابع زیان حاصل ce به‌علاوه lam ضربدر dice است

عیب‌یابی

عیب‌یابی
  • فقط mAP@0.5:0.95 ضعیف است

    علت
    مکان‌یابی تقریبی و نادقیق جعبه
    راه‌حل
    تابع زیان جعبه بهتر، CIoU یا DIoU
  • دقت بالا، بازخوانی پایین

    علت
    آشکارساز بیش از حد محافظه‌کار است
    راه‌حل
    کاهش آستانه‌ی اطمینان
  • یک شیء، چندین جعبه

    علت
    لنگرهای مجاور همپوشانی دارند
    راه‌حل
    اجرای NMS با آستانه 0.45
  • صحت پیکسلی 99٪، ماسک خالی

    علت
    پس‌زمینه غالب است
    راه‌حل
    افزودن Dice به آنتروپی متقاطع
  • شاخص mIoU خوب به نظر می‌رسد

    علت
    یک کلاس در سطح 15٪ پنهان شده است
    راه‌حل
    گزارش IoU به تفکیک کلاس
  • آرتیفکت‌های شطرنجی

    علت
    کانولوشن ترانهاده
    راه‌حل
    بزرگ‌نمایی دوسطحی + کانولوشن 3x3
  • شیفت برچسب‌ها به اندازه‌ی یک واحد

    علت
    مقدار num_classes بدون پس‌زمینه
    راه‌حل
    برای 4 کلاس از num_classes=5 استفاده شود
  • بیش‌برازش روی 500 تصویر

    علت
    بک‌بون و FPN آموزش می‌بینند
    راه‌حل
    منجمد کردن model.backbone

پرسش‌ها

پرسش و پاسخ
چرا RoIAlign و نه RoIPool؟
الگوریتم RoIPool مختصات را گرد می‌کند. اما RoIAlign معیار mask AP را 3 تا 4 امتیاز بالا می‌برد.
چرا نقشه‌های حرارتی و نه مختصات مستقیم (x, y)؟
نقشه‌ی کانولوشن با خروجی مکانی هم‌راستا است.
چرا لنگرها (anchors)؟
هد تغییرات کوچک (دلتاها) را نسبت به اشکال پیشین جعبه پیش‌بینی می‌کند.
چرا اتصالات پرشی (skips) در U-Net؟
انکودر جزئیات لبه را از دست می‌دهد. پرش‌ها نقشه‌های با وضوح بالا را بازمی‌گردانند.
چرا ورودی U-Net باید بر 16 بخش‌پذیر باشد؟
انکودر وضوح را چهار بار نصف می‌کند.
آیا SAM 3 سریع‌تر از Grounded SAM 2 است؟
معمولاً بدون تفاوت چشمگیر یا اندکی سریع‌تر.