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

شکل ۱: بهبود تشخیص شی پس از استفاده از تابع زیان 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 (جزئیات بیشتر را در اینجا ببینید)تورچ‌ویژن (Torchvision) محاسبه تقاطع و اتحادیه جعبه‌های محدوده را فراهم کرده است که محاسبه GIoU را بسیار آسان می‌کند.می‌توانیم با وارد کردن _box_inter_union از torchvision.ops.boxes به طور مستقیم تقاطع و اجتماع جعبه‌ها را محاسبه کنیم.برای محاسبه مساحت کوچک‌ترین جعبه‌های محصور کننده اشکال محدب، ابتدا مختصات C را پیدا می‌کنیم:شکل ۳:سپس مساحت آن را محاسبه می‌کنیم (خط ۱۷ کد زیر).زیان GIoU عبارت است از: 1- GIoU.import torchfrom torchvision.ops.boxes import _box_inter_uniondef 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 boxmin_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 - gioureturn loss.sum()تابع زیان GIoU برای تشخیص شی(مشابه باFvcore)تابع زیان سفارشی در Torchvisionچارچوب اصلی RCNN در roi_heads.py انجام می‌شود، جایی که توابع زیان FastRCNN و MaskRCNN در آن قرار دارند. بنابراین، برای استفاده از تابع زیان سفارشی خود، باید آن را از roi_heads وارد کنید و آن را با تابع زیان سفارشی خود جایگزین کنید، همانطور که در خط ۲۲ از کد زیر انجام دادم:from torchvision.models.detection.roi_heads import fastrcnn_lossimport torch.nn.functional as Ffrom torchvision.ops.boxes import _box_inter_uniondef custom_fastrcnn_loss(class_logits, box_regression, labels, regression_targets):# type: (Tensor, Tensor, List[Tensor], List[Tensor]) -> Tuple[Tensor, Tensor]"""Your Custom loss function hereArgs:class_logits (Tensor)box_regression (Tensor)labels (list[BoxList])regression_targets (Tensor)Returns:classification_loss (Tensor)box_loss (Tensor)"""return classification_loss, box_losstorchvision.models.detection.roi_heads.fastrcnn_loss = custom_fastrcnn_lossتابع زیان سفارشی برایFastRCNNخلاصهدر این مقاله کوتاه، تمام چیزی که نیاز دارید استفاده از تابع زیان GIoU برای تشخیص شی با Torchvision است.این متن با استفاده از ربات ترجمه مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.