Intersection-over-Union(IoU),目标检测中用到的一个概念,是我们测试目标检测算法时的一个重要指标,就是重叠率生成的预测框(candidatebound)和标记框(groundtruthbound)的比值,即它们的交集和并集的比值。理想情况是完全重叠,即比例为1。通常我们所说的目标检测的框是一个规则的矩形框,计算IOU也很简单。一般有两种方法:两个矩形的宽度之和减去组合矩形的宽度就是重叠矩形的宽度。重叠矩形的高度。右下角的最小值减去左上角的最大值就是重叠矩形的宽和高。上述正四边形(矩形)IOU计算方法的Python实现defcalculate_regular_iou(rec1,rec2):"""computingIoU:paramrec1:(y0,x0,y1,x1),其中体现(top,left,bottom,right):paramrec2:(y0,x0,y1,x1):return:scalavalueofIoU"""S_rec1=(rec1[2]-rec1[0])*(rec1[3]-rec1[1])S_rec2=(rec2[2]-rec2[0])*(rec2[3]-rec2[1])sum_area=S_rec1+S_rec2left_line=max(rec1[1],rec2[1])right_line=min(rec1[3],rec2[3])top_line=max(rec1[0],rec2[0])bottom_line=min(rec1[2],rec2[2])ifleft_line>=right_line或top_line>=bottom_line:return0else:intersect=(right_line-left_line)*(bottom_line-top_line)return(intersect/(sum_area-intersect))*1.0if__name__=='__main__':#(top,left,bottom,right)rect1=[551,26,657,45]rect2=[552,27,672],46]iou=calculate_regular_iou(rect1,rect2)Python实现第二种正四边形(矩形)IOU计算方法defcompute_regular_iou_other(rec1,rec2):"""computingIoU:paramrec1:(y0,x0,y1,x1),whichreflects(上、左、下、右):paramrec2:(y0,x0,y1,x1):return:scalavalueofIoU"""areas1=(rec1[3]-rec1[1])*(rec1[2]-rec1[0])areas2=(rec2[3]-rec2[1])*(rec2[2]-rec2[0])left=max(rec1[1],rec2[1])right=min(rec1[3],rec2[3])top=max(rec1[0],rec2[0])bottom=min(rec1[2],rec2[2])w=max(0,right-left)h=max(0,bottom-top)returnw*h/(areas2+areas1-w*h)if__name__=='__main__':#(top,left,bottom,right)rect1=[551,26,657,45]rect2=[552,27,672,46]iou=compute_regular_iou_other(rect1,rect2)但是,对于不规则四边形,它不能通过以上两种方法来计算,这里可以使用Python的Shapely库来实现,Python实现如下:四边形数组表示中的四个点,[x,y,x,y....]:return:quadrilateraltwo-dimensionalarray,Polygonquadrilateralobject"""#quadrilateraltwo-dimensionalarrayrepresentationquadrilateral_array=np.array(quadrilateral).reshape(4,2)#Polygon四边形对象会自动计算四个点,最后四个点的顺序为:左上、右下、右下、左上、左上quadrilateral_polygon=Polygon(quadrilateral_array).convex_hullreturnquadrilateral_array,quadrilateral_polygondefcalculate_iou(actual_quadrilateral,predict_quadrilateral):""":paramactual_quadrilateral:预测四边形四点坐标的一维数组表示,[x,y,x,y....]:parampredict_quadrilateral:expectedquadrilateral点坐标的四边形一维数组表示,[x,y,x,y....]:return:"""#预测四边形二维数组,预测四边形Polygon对象actual_quadrilateral_array,actual_quadrilateral_polygon=to_polygon(actual_quadrilateral)#期望四边形二维数组,期望四边形Polygon对象predict_quadrilateral_array,predict_quadrilateral_polygon=to_polygon(predict_quadrilateral)#合并两个框坐标,变成8*2,方便后面计算并集面积union_poly=np.concatenate((actual_quadrilateral_array,predict_quadrilateral_array))#二乘二四边形是否相交inter_status=actual_quadrilateral_polygon.intersects(predict_quadrilateral_polygon)#如果两个四边形相交,则进入iou计算ifinter_status:try:#相交面积inter_area=actual_quadrilateral_polygon.intersection(predict_quadrilateral_polygon).area#联合面积计算方法1#union_area=.area+poly2.area-inter_area#联合面积计算方法2union_area=MultiPoint(union_poly).convex_hull.area#如果并集面积等于0,则iou=0ifunion_area==0:iou=0else:#首先计算的是:包含两个四边形的最小多边形的交集部分/面积iou=float(inter_area)/union_area#第二种:交集/并集(普通矩形框IOU计算方法)#iou=float(inter_area)/(poly1.area+poly2.area-inter_area)exceptshapely.errors.TopologicalError:print('shapely.errors.TopologicalErroroccured,iousetto0')iou=0else:iou=0?returniou?if__name__=='__main__':actual_quadrilateral=[908,215,934,312,752,355,728,252]predict_quadrilateral=[923,308,758,342,741,262,907,228]iou=calculate_iou(actual_quadrilateral,predict_quadrilateral)print(iou)避坑指南运行代码抛出在Python中使用importshapely不会报WinError126错误,但是使用fromshapely.geometryimportPolygon,MultiPoint时会报错。报错的详细信息如下:这里报错的主要原因是geos_c.dll,看我在网上看了很多文章,大部分都说是因为缺少geos_c.dll报错文件。试过在网上找了几个geos_c.dll文件放到C:\Windows\System32下,还是没有解决问题。最终解决方案:通过pipuninstallShapely卸载原来安装的Shapely,然后在https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely下载对应版本的whl文件,如上图所示,并安装这个whl可以解决问题。Whl文件下载404错误从https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely下载指定版本的whl时出现404错误。如下。这时候再用chrome浏览器试试下载,就解决了。
