【全网首发】 DIoU使用Tensorflow实现

【全网首发】 DIoU使用Tensorflow实现

  计算机视觉方向的人员都知道DIoU是啥,在此不做解释,全网DIoU所查资料全为Torch版本,博主今天将DIoU用 Tensorflow 实现,绝对全网首发!!
下面附上Torch版本实现:

def Diou(bboxes1, bboxes2):
    rows = bboxes1.shape[0]
    cols = bboxes2.shape[0]
    dious = torch.zeros((rows, cols))
    if rows * cols == 0:#
        return dious
    exchange = False
    if bboxes1.shape[0] > bboxes2.shape[0]:
        bboxes1, bboxes2 = bboxes2, bboxes1
        dious = torch.zeros((cols, rows))
        exchange = True
    # #xmin,ymin,xmax,ymax->[:,0],[:,1],[:,2],[:,3]
    w1 = bboxes1[:, 2] - bboxes1[:, 0]
    h1 = bboxes1[:, 3] - bboxes1[:, 1] 
    w2 = bboxes2[:, 2] - bboxes2[:, 0]
    h2 = bboxes2[:, 3] - bboxes2[:, 1]
    
    area1 = w1 * h1
    area2 = w2 * h2

    center_x1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2 
    center_y1 = (bboxes1[:, 3] + bboxes1[:, 1]) / 2 
    center_x2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2
    center_y2 = (bboxes2[:, 3] + bboxes2[:, 1]) / 2

    inter_max_xy = torch.min(bboxes1[:, 2:],bboxes2[:, 2:]) 
    inter_min_xy = torch.max(bboxes1[:, :2],bboxes2[:, :2]) 
    out_max_xy = torch.max(bboxes1[:, 2:],bboxes2[:, 2:]) 
    out_min_xy = torch.min(bboxes1[:, :2],bboxes2[:, :2])

    inter = torch.clamp((inter_max_xy - inter_min_xy), min=0)
    inter_area = inter[:, 0] * inter[:, 1]
    inter_diag = (center_x2 - center_x1)**2 + (center_y2 - center_y1)**2
    outer = torch.clamp((out_max_xy - out_min_xy), min=0)
    outer_diag = (outer[:, 0] ** 2) + (outer[:, 1] ** 2)
    union = area1+area2-inter_area
    dious = inter_area / union - (inter_diag) / outer_diag
    dious = torch.clamp(dious,min=-1.0,max = 1.0)
    if exchange:
        dious = dious.T
    return dious

接下来是博主用 Tensorflow 复现的代码:

def DIoU(boxes1, boxes2):
    b1 = tf.reshape(tf.tile(tf.expand_dims(boxes1, 1),
                                [1, 1, tf.shape(boxes2)[0]]), [-1, 4])

    b2 = tf.tile(boxes2, [tf.shape(boxes1)[0], 1])

    # Compute intersections
    b1_y1, b1_x1, b1_y2, b1_x2 = tf.split(b1, 4, axis=1)
    b2_y1, b2_x1, b2_y2, b2_x2 = tf.split(b2, 4, axis=1)
    y1 = tf.maximum(b1_y1, b2_y1)
    x1 = tf.maximum(b1_x1, b2_x1)
    y2 = tf.minimum(b1_y2, b2_y2)
    x2 = tf.minimum(b1_x2, b2_x2)

    out_max_xy = tf.maximum(b1[:, 2:], b2[:, 2:])
    out_min_xy = tf.minimum(b1[:, :2], b2[:, :2])

    c_h = tf.maximum(out_max_xy[:, 0] - out_min_xy[:, 0], 0)
    c_w = tf.maximum(out_max_xy[:, 1] - out_min_xy[:, 1], 0)

    # 求中心点
    center_x1 = (b1[:, 3] + b1[:, 1]) / 2
    center_y1 = (b1[:, 2] + b1[:, 0]) / 2
    center_x2 = (b2[:, 3] + b2[:, 1]) / 2
    center_y2 = (b2[:, 2] + b2[:, 0]) / 2

    # 求ρ的平方
    p2 = (center_x2 - center_x1) ** 2 + (center_y2 - center_y1) ** 2
    p2 = tf.expand_dims(p2, axis=-1)

    # 求c的平方
    c2 = c_w ** 2 + c_h ** 2
    c2 = tf.expand_dims(c2, axis=-1)

    intersection = tf.maximum(x2 - x1, 0) * tf.maximum(y2 - y1, 0)
    # Compute unions
    b1_area = (b1_y2 - b1_y1) * (b1_x2 - b1_x1)
    b2_area = (b2_y2 - b2_y1) * (b2_x2 - b2_x1)
    union = b1_area + b2_area - intersection

    # 4. Compute IoU and reshape to [boxes1, boxes2]
    diou = intersection / union - p2 / tf.cast(c2, dtype=tf.float64)
    diou = tf.reshape(diou, [tf.shape(boxes1)[0], tf.shape(boxes2)[0]])

    return diou

大家有什么疑问欢迎交流,最后转载本博客请注明出处。同时也希望大家积极复现GIoU以及CIoU。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Yolov5使用DIoU NMS的方法如下: 1. 在yolov5/models/yolo.py文件中,找到nms函数的定义。 2. 修改nms函数的参数,将iou函数替换为diou函数。 3. 在yolov5/utils/general.py文件中,找到diou函数的定义。 4. 将diou函数的代码复制到yolov5/models/yolo.py文件中,作为nms函数的一部分。 5. 在yolov5/models/yolo.py文件中,找到postprocess函数的定义。 6. 修改postprocess函数的参数,将nms函数替换为修改后的nms函数。 7. 重新运行yolov5模型,即可使用DIoU NMS。 需要注意的是,DIoU NMS需要计算更多的距离信息,因此会比传统的NMS算法更耗时。在实际应用中,需要根据具体情况进行权衡和优化。 ### 回答2: YOLOv5是由Ultralytics公司开源的一种深度学习目标检测算法,已经成为了目前较为流行的检测算法之一。YOLOv5在检测过程中采用了Non-Maximum Suppression(NMS)来消除多余的框,从而提高检测效果和速度。而在YOLOv5中,采用了Improved DIoU算法来进一步优化NMS的效果,达到更好的检测结果。 DIoU指的是Distance-IoU相似度度量算法,它是IoU(Intersection over Union)的一种改进方式。DIoU不仅考虑了两个框之间的相交度,还考虑了两个框的中心点距离、框的的长宽比差距等因素,从而可以更全面地评估两个框的相似程度。在YOLOv5中,使用DIoU代替IoU作为NMS的相似度度量算法,可以有效消除物体的重叠部分,提高检测精度。 在YOLOv5中,DIoU NMS的使用非常简单。在进行NMS操作时,传入的参数中加入iou_type='diou'即可使用DIoU作为相似度度量。示例代码如下: ``` from utils.general import non_max_suppression nms_conf = 0.5 # NMS阈值 pred = [...] # 网络输出的预测结果 # 使用DIoU NMS处理预测结果 pred = non_max_suppression(pred, conf_thres=0.25, iou_thres=nms_conf, classes=None, agnostic=False, iou_type='diou') ``` 总之,DIoU NMS作为YOLOv5的一项优化算法,在处理重叠物体的时候具有很好的效果,能够更加准确地识别目标并提高检测速度。 ### 回答3: YOLOv5是一个轻量级目标检测算法,提供了多个NMS(非最大值抑制)方法,其中包括DIoU NMS。DIoU NMS是一种改进的NMS算法,可以通过使用跟踪框与真实框之间的距离来更好地保留物体边缘信息。 在YOLOv5中使用DIoU NMS,首先需要下载YOLOv5代码,并且安装相关Python库。接下来,在运行YOLOv5之前,需要确定修改检测器的配置以启用DIoU NMS。在YOLOv5的配置文件中,可以找到DIoU NMS的相关参数和设置。这些参数包括阈值等。 在使用YOLOv5+DIoU NMS检测物体时,YOLOv5会按照其预设的配置对待检测物体框进行筛选,并自动应用DIoU NMS算法。DIoU NMS算法会根据物体框之间的距离,对重叠度较高的物体框进行筛选,确保最终检测结果的准确性和稳定性。 虽然DIoU NMS是一种高效的NMS算法,但使用时也需要注意一些问题。比如,由于DIoU NMS算法需要大量计算,因此可能会导致算法运行速度变慢,同时也需要在保证精度的前提下进行参数调整等方面的优化。 总之,DIoU NMS算法在YOLOv5目标检测中具有重要的作用,可以提高检测准确性,并保留物体边缘信息,进一步提高检测效果和应用价值。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值