目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247493294&idx=1&sn=d64822f1c2ca25901f7b707d78028364&chksm=ec1c0b57db6b82414c9177a13da5c1cceda8963785e22cb777b43892608c9ce71afc90c8d0c1&token=1513639846&lang=zh_CN#rd
代码
https://sourcegraph.com/github.com/Zzh-tju/DIoU-darknet/-/blob/src/box.c#L243
def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False):# Get the coordinates of bounding boxesif x1y1x2y2: # x1, y1, x2, y2 = box1b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]else: # x, y, w, h = box1b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2# Intersection areainter = (min(b1_x2, b2_x2) - max(b1_x1, b2_x1)).clamp(0) * \(min(b1_y2, b2_y2) - max(b1_y1, b2_y1)).clamp(0)# Union Areaw1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1union = (w1 * h1 + 1e-16) + w2 * h2 - interiou = inter / union # iouif GIoU or DIoU or CIoU:cw = max(b1_x2, b2_x2) - min(b1_x1, b2_x1) # convex (smallest enclosing box) widthch = max(b1_y2, b2_y2) - min(b1_y1, b2_y1) # convex heightif GIoU: # Generalized IoU https://arxiv.org/pdf/1902.09630.pdfc_area = cw * ch + 1e-16 # convex areareturn iou - (c_area - union) / c_area # GIoUif DIoU or CIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1# convex diagonal squaredc2 = cw ** 2 + ch ** 2 + 1e-16# centerpoint distance squaredrho2 = ((b2_x1 + b2_x2) - (b1_x1 + b1_x2)) ** 2 / 4 + ((b2_y1 + b2_y2) - (b1_y1 + b1_y2)) ** 2 / 4if DIoU:return iou - rho2 / c2 # DIoUelif CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * pow(atan(w2 / h2) - atan(w1 / h1), 2)with no_grad():alpha = v / (1 - iou + v)return iou - (rho2 / c2 + v * alpha) # CIoUreturn iou
