زیان تعمیم‌یافته IoU برای تشخیص شی با استفاده از Torchvision

شکل ۱: بهبود تشخیص شی پس از استفاده از تابع زیان GIoU (منبع)
شکل ۱: بهبود تشخیص شی پس از استفاده از تابع زیان GIoU (منبع)
منتشر‌شده در towardsdatascience به تاریخ ۶ سپتامبر ۲۰۲۱
لینک منبع: Generalized IoU loss for Object Detection with Torchvision

در کار تشخیص شی، متداول‌ترین معیار ارزیابی، IoU است، که به ما انگیزه می‌دهد تا چنین معیارهایی را در آموزش به حداقل برسانیم و ببینیم که آیا ما پیشرفت خواهیم کرد یا خیر. حمیدرضا توفیقی و همکارانش نشان دادند که استفاده از تابع تلفات IoU Generalized (GIoU) بر دیگر روش‌‌های تشخیص شی با سایر توابع استاندارد اتلاف پیشی می‌گیرد.

من نمی‌خواهم وقت شما را برای توضیح این که IoU و GIoU چه هستند هدر دهم. اگر شما اینجا هستید، احتمالا با این وظایف آشنا هستید. شما می‌توانید توضیحات کامل را در مقالات دیگر پیدا کنید.

در مدل تشخیص شی Torchvision، تابع زیان پیش‌فرض در خانواده RCNN تابع زیان هموار L1 است. (Smooth L1 loss function) در این مدل‌ها هیچ گزینه‌ای برای تغییر تابع زیان وجود ندارد، اما تعریف زیان سفارشی و جایگزین کردن آن با زیان Smooth-L1 در صورتی که علاقه‌ای به استفاده از آن ندارید، ساده است.

تابع زیان GIoU

ما قصد داریم GIoU زیر را محاسبه کنیم:

شکل ۲: IoU وGIoU  (جزئیات بیشتر را در اینجا ببینید)
شکل ۲: IoU وGIoU (جزئیات بیشتر را در اینجا ببینید)

تورچ‌ویژن (Torchvision) محاسبه تقاطع و اتحادیه جعبه‌های محدوده را فراهم کرده است که محاسبه GIoU را بسیار آسان می‌کند.

می‌توانیم با وارد کردن _box_inter_union از torchvision.ops.boxes به طور مستقیم تقاطع و اجتماع جعبه‌ها را محاسبه کنیم.

برای محاسبه مساحت کوچک‌ترین جعبه‌های محصور کننده اشکال محدب، ابتدا مختصات C را پیدا می‌کنیم:

شکل ۳:
شکل ۳:

سپس مساحت آن را محاسبه می‌کنیم (خط ۱۷ کد زیر).

زیان GIoU عبارت است از: 1- GIoU.

import torch

from torchvision.ops.boxes import _box_inter_union

def giou_loss(input_boxes, target_boxes, eps=1e-7):

"""

Args:

input_boxes: Tensor of shape (N, 4) or (4,).

target_boxes: Tensor of shape (N, 4) or (4,).

eps (float): small number to prevent division by zero

"""

inter, union = _box_inter_union(input_boxes, target_boxes)

iou = inter / union

# area of the smallest enclosing box

min_box = torch.min(input_boxes, target_boxes)

max_box = torch.max(input_boxes, target_boxes)

area_c = (max_box[:, 2] - min_box[:, 0]) * (max_box[:, 3] - min_box[:, 1])

giou = iou - ((area_c - union) / (area_c + eps))

loss = 1 - giou

return loss.sum()

تابع زیان GIoU برای تشخیص شی(مشابه باFvcore)

تابع زیان سفارشی در Torchvision

چارچوب اصلی RCNN در roi_heads.py انجام می‌شود، جایی که توابع زیان FastRCNN و MaskRCNN در آن قرار دارند. بنابراین، برای استفاده از تابع زیان سفارشی خود، باید آن را از roi_heads وارد کنید و آن را با تابع زیان سفارشی خود جایگزین کنید، همانطور که در خط ۲۲ از کد زیر انجام دادم:

from torchvision.models.detection.roi_heads import fastrcnn_loss

import torch.nn.functional as F

from torchvision.ops.boxes import _box_inter_union

def custom_fastrcnn_loss(class_logits, box_regression, labels, regression_targets):

# type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]

"""

Your Custom loss function here

Args:

class_logits (Tensor)

box_regression (Tensor)

labels (list[BoxList])

regression_targets (Tensor)

Returns:

classification_loss (Tensor)

box_loss (Tensor)

"""

return classification_loss, box_loss

torchvision.models.detection.roi_heads.fastrcnn_loss = custom_fastrcnn_loss

تابع زیان سفارشی برایFastRCNN

خلاصه

در این مقاله کوتاه، تمام چیزی که نیاز دارید استفاده از تابع زیان GIoU برای تشخیص شی با Torchvision است.

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