چیتشیت
مقایسهی تشخیص و بخشبندی (Detection و Segmentation)
Detection and Segmentation Compared
جعبهها، ماسکهای پیکسلی، ماسکهای نمونه، نقاط کلیدی و ماسکهای پرامپت متنی. خروجیها، توابع زیان، معیارها و رفع اشکال در کنار هم.
فهرست مطالب
مقایسهی رو در رو
مقایسه| وظیفه | خروجی | معیار |
|---|---|---|
| تشخیص (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
معماریاستنتاج YOLO: پسپردازش
گامبهگام- هدیک کانولوشن 1x1 ابعاد
(N, H, W, num_anchors, 5 + C)میدهد. - باز کردن (Unpack)هر لنگر شامل
tx, ty, tw, th, objو لاجیتهای C کلاس است. - امتیازدهی
sigmoid(obj)ضربدر سیگموئید بهترین کلاس. - آستانهحذف جعبه وقتی امتیاز زیر
conf_thresholdباشد. - رمزگشاییمرکز حاصل آفست سیگموئید بهعلاوه سلول، ضربدر
stride. اندازه حاصل لنگر ضربدرnp.exp. - الگوریتم NMSاجرای
nms(boxes, scores, iou_threshold)یک جعبه به ازای هر شیء نگه میدارد. - بازگشت
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 3 | processor.set_text_prompt(inputs, "<concept>") |
پیشفرضها
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
iou_threshold | 0.45 | الگوریتم NMS برای تشخیص شیء |
conf_threshold | 0.25 | شیءبودگی ضربدر بهترین کلاس |
lambda_coord | 5.0 | وزن تابع زیان جعبه، نسبت YOLOv1 |
lambda_noobj | 0.5 | در غیر این صورت سلولهای خالی غالب میشوند |
RPN NMS IoU | 0.7 | پس از حدود 1,000 جعبهی برتر |
Mask threshold | 0.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 است؟
- معمولاً بدون تفاوت چشمگیر یا اندکی سریعتر.