目标识别iou,目标检测iou和置信度
在上一期中,我们解释了目标检测中的三种数据增强方法。本期我们就来谈谈IOU和CIOU的原理应用和代码实现,这两种算法在目标检测中用于评估物体检测算法。
交并比IOU
交并比IOU(Interp over union)
在目标检测任务中,我们使用帧来定位物体,比如下图中的汽车。假设实际帧是图中的红色帧,你的算法预测的是紫色帧。如何判断你的算法预测的这一帧的效果?
这使用了我们的交比函数IOU,计算公式如下:
把我们图片车的实际红框标为A,算法的预测框标为B,交比就是数学上A和BAB的交与A和BAB的并的面积比,非常好理解。IOU实际上测量两个边界框之间重叠的相对大小。预测框和真实框重叠越大,你的算法预测效果越好,IOU是一个评价指标。
那么回到刚刚的问题: 如何利用IOU进行判断算法的预测效果好坏呢?也就是这个预测框是否可以当做正确的定位到我们的目标汽车呢?
在计算机检测任务中,如果我们算法的预测框与实际框的交比是0.10-59000,那么你算法的预测结果是可以接受的,所以预测框是正确的。这个阈值是0.5,你可以设置的更高。包围盒越精确,0.10-59000。
IOU0.5
先借助Opencv和numpy框画两个框,然后计算IOU进行显示,如下图。
在YOLOv3中正是用到这个IOU来对我们的先验框进行了一个筛选,以及计算测试集的模型效果mAP时也用到了IOU进行阈值判断
计算盒子左上角(x1,y1)和右下角(x2,y2)之间的IOU。
导入cv2import numpy为npdef CountIOU(RecA,RecB): xA=max(RecA[0],RecB[0]) yA=max(RecA[1],RecB[1]) xB=min(RecA[2],Rec [2]) Yb=min (Reca [3],Recb [3]) #计算相交面积interArea=max(0,xB-xA 1) * max(0,YB-yA 1) #计算预测值和真实值的面积, RecA _ area=(RecA[2]-RecA[0]1)*(RecA[3]-RecA[1]1)RecB _ area=(RecB[2]-RecB[0]1)*(RecB[1)# calculate IOU=interarea/float(RecA _ area RecB _ area-interarea)返回IOU if _ _ name _= _ _ main _ :img=NP . zeros((512,512,3),np.uint8) img.fill(255 FONT _ HERSHEY _ SIMPLEX cv2 . puttext(img, IOU=%.2f % IOU,(130,190),FONT,0.8,(0,0,0),2) cv2.imshow(image ,img)cv2 . waitkey()cv2 . destroyallwindows()效果图
IOU实现代码
IoU是比值的概念,对目标对象的大小比例不敏感。有很多方法可以优化box BBox的回归损失函数。比如CIoU之前有GIoU和欧弟,CIOU解决了一般IOU无法直接优化两个盒子不重叠部分的问题。
IoU在GIOU和欧弟之后最终发展成CIOU。CIOU考虑了目标与帧锚的距离、重叠率、尺度和惩罚项,使得目标帧的回归更加稳定,不会像IOU和GIoU一样在训练过程中出现发散等问题,而惩罚因子考虑了预测帧的长宽比与目标帧的长宽比,CIOU(Complete-IOU)。
CIOU(Complete-IOU)
它们分别表示预测框和真实框的中心点之间的欧几里德距离,即图中的D。在最新发布的yolov4中anchor的回归就是用的CIOU方式表示可以包含预测框和实际框的最小闭合区域的对角线距离。
CIOU回归中的损失计算:
CIOU计算公式
先借助Opencv和numpy框画两个框,然后根据公式计算CIOU进行显示,如下图。
代码实现:
将火炬港numpy导入为NP import cv2 import mathdef box _ ciou(B1,b2): 输入为:- b1:张量,shape=(batch,feat_w,feat_h,anchor_num,4),xywh b2:张量,shape=(batch,feat_w,feat_h,anchor_num,4),xywh返回为:- ciou: tensor,shape=(batch,feat_w,feat_h,anchor_num,1) #求出预测框左上角右下角b1_xy=b1[.2] b1_wh=b1[.2:4] b1_wh_half=b1_wh/2 .B1 _ mins=B1 _ xy-B1 _ wh _ half B1 _ maxes=B1 _ xy B1 _ wh _ half #求出真实框左上角右下角b2_xy=b2[.2] b2_wh=b2[.2:4] b2_wh_half=b2_wh/2 .B2 _明斯=B2 _ xy-B2 _ wh _ half B2 _ maxes=B2 _ xy B2 _ wh _ half #求真实框和预测框所有的iou intersect _ mins=torch。max(B1分钟,B2分钟)intersect _ maxes=torch。min(B1 _ maxes,B2 _ maxes)intersect _ wh=torch。max(intersect _ maxes-intersect _ mins,torch。zeros _ like(intersect _ maxes))intersect _ area=intersect _ wh[.0] * intersect_wh[.1] b1_area=b1_wh[.0] * b1_wh[.1] b2_area=b2_wh[.0] * b2_wh[.1]union _ area=B1 _ area B2 _ area-intersect _ area iou=intersect _ area/(union _ area 1e-6)#计算中心的差距中心距离=火炬。sum(火炬。功率((B1 _ xy-B2 _ xy),2),轴=-1) #找到包裹两个框的最小框的左上角和右下角enclose_mins=torch.min(b1_mins,B2 _ mins)enclose _ maxes=torch。max(B1 _ maxes,B2 _ maxes)enclose _ wh=torch。max(enclose _ maxes-enclose _ mins,torch。zeros _ like(intersect _ maxes))#计算对角线距离enclose _ diagonal=火炬。sum(火炬。pow(enclose _ wh,2),axis=-1)ciou=iou-1.0 *(center _ distance)/(enclose _ diagonal 1e-7)v=(4/(math。pi * * 2))*火炬。pow((火炬。atan(B1 _ wh[.0]/b1_wh[.1]) - torch.atan(b2_wh[.0]/b2_wh[.1])),2)alpha=v/(1.0-iou v)CIOU=CIOU-alpha * v return CIO uif _ _ name _ _= _ _ main _ _ :img=NP。zeros((512,512,3),np.uint8) img.fill(255) RecA=[1,90,90,150,150,200]a=torch . tensor font _ HERSHEY _ SIMPLEX cv2。puttext(img, CIOU=%.2f % CIOU,(130,190),FONT,0.8,(0,0,0),2) cv2.imshow(image ,img)cv2。waitkey()cv2。destroyallwindows()所有实现代码,在后台回复关键字:c,即可下载使用。
效果图
目标检测中的数据增强方法(附代码讲解)
目标检测中的数据增强方法(附代码讲解)
制作自己的训练数据集之图像标注工具标签和拉贝梅
关注微信公众号:码农的后花园,后台回复关键字:IOU,即可获取,查看计算机编程语言学习系列教程即可快速安装,更有计算机编程语言系列学习。
精彩推荐
Python工具 微信号:码农的后花园
长按识别关注哦
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。