正常矩形计算IOU与与NMS,多边形计算IOU

一.计算IOU

def intersect(box_a, box_b):max_xy = np.minimum(box_a[:, 2:], box_b[2:])min_xy = np.maximum(box_a[:, :2], box_b[:2])inter = np.clip((max_xy - min_xy), a_min=0, a_max=np.inf)return inter[:, 0] * inter[:, 1]def jaccard_numpy(box_a, box_b):"""Compute the jaccard overlap of two sets of boxes.  The jaccard overlapis simply the intersection over union of two boxes.E.g.:Args:box_a: Multiple bounding boxes, Shape: [num_boxes,4]box_b: Single bounding box, Shape: [4]Return:jaccard overlap: Shape: [box_a.shape[0], box_a.shape[1]]"""inter = intersect(box_a, box_b)area_a = ((box_a[:, 2]-box_a[:, 0]) *(box_a[:, 3]-box_a[:, 1]))  # [A,B]area_b = ((box_b[2]-box_b[0]) *(box_b[3]-box_b[1]))  # [A,B]union = area_a + area_b - interreturn inter / union  # [A,B]

人工修正后的每一个框与算法输出的所有框去计算IOU,取出IOU大于0.9的算法输出框

def compute_IOU(algrim_bboxs,fix_bboxs):# print('algrim_bboxs:', algrim_bboxs)# print('fix_bboxs:', fix_bboxs)for i, fix_bbox in enumerate(fix_bboxs):print('fix_bbox:', fix_bbox)fix_x1, fix_y1, fix_x2, fix_y2 = fix_bboxx1, y1, x2, y2 = algrim_bboxs[:,0], algrim_bboxs[:,1], algrim_bboxs[:,-2], algrim_bboxs[:,-1]area = (y2-y1)*(x2-x1)inter = np.maximum((np.minimum(x2,fix_x2) - np.maximum(x1,fix_x1)),0)*np.maximum((np.minimum(y2,fix_y2) - np.maximum(y1, fix_y1)),0)union = area+(fix_y2-fix_y1)*(fix_x2-fix_x1)-interIOU = inter/union# print('IOU:', IOU)index = np.where(IOU > 0.9)[0]print('algrim_bboxs[index]:', algrim_bboxs[index])

 

注释:下面的代码假设了第0行是IOU最大的,那么其余做NMS计算

boxes=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
y1 = boxes[:, 0]
x1 = boxes[:, 1]
y2 = boxes[:, 2]
x2 = boxes[:, 3]
area = (y2 - y1) * (x2 - x1)
print('area=',area)
box_area=area[0]
print('box_area=',box_area)
boxes_area=area[1:]
print('boxes_area=',boxes_area)
box=boxes[0]
y1 = np.maximum(box[0], boxes[1:, 0])
y2 = np.minimum(box[2], boxes[1:, 2])
x1 = np.maximum(box[1], boxes[1:, 1])
x2 = np.minimum(box[3], boxes[1:, 3])
#注意与0判断 若不想交返回0值,即intersection为0
intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)
print('intersection=',intersection)
union = box_area + boxes_area - intersection[:]
print('union=',union)
iou = intersection / union
print('iou=',iou)

二,一般加上score,这样用

scores = np.array([0.5, 0.7, 0.3, 0.2])
ixs=scores.argsort()[::-1]
print('ixs=',ixs)
boxes=np.array([[1,2,3,4],[1.2, 0.4,2.1, 0.8],[5,6,7,8],[9,10,11,12]])
y1 = boxes[:, 0]
x1 = boxes[:, 1]
y2 = boxes[:, 2]
x2 = boxes[:, 3]
area = (y2 - y1) * (x2 - x1)
print('area=',area)
box_area=area[ixs[0]]
print('box_area=',box_area)
boxes_area=area[ixs[1:]]
print('boxes_area=',boxes_area)
box=boxes[ixs[0]]
boxes=boxes[ixs[1:]]
y1 = np.maximum(box[0], boxes[:, 0])
y2 = np.minimum(box[2], boxes[:, 2])
x1 = np.maximum(box[1], boxes[:, 1])
x2 = np.minimum(box[3], boxes[:, 3])
#注意与0判断 若不想交返回0值,即intersection为0
intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)
print('intersection=',intersection)
union = box_area + boxes_area - intersection[:]
print('union=',union)
iou = intersection / union
print('iou=',iou)

三,求其NMS后的框的小trick

scores=np.array([0.8,0.4,0.7,0.2,0.5])
ixs = scores.argsort()[::-1]
print('ixs=',ixs)
#iou要比score少一个数值,因为iou的计算是由score的第一个值确定的,故下面的np.where要加1
iou=np.array([0.3,0.6,0.1,0.4])
threshold=0.3
remove_ixs = np.where(iou > threshold)[0]+1
print('remove_ixs=',remove_ixs)
# Remove indices of the picked and overlapped boxes.
ixs = np.delete(ixs, remove_ixs)
print('ixs=',ixs)
ixs = np.delete(ixs, 0)
print('ixs=',ixs)

四,加入while,就把不要的框删掉

scores = np.array([0.8, 0.4, 0.7, 0.2, 0.5])
ixs = scores.argsort()[::-1]
while len(ixs) > 0:print('================================')print('ixs=', ixs)# iou要比score少一个数值,因为iou的计算是由score的第一个值确定的,故下面的np.where要加1iou = np.array([0.3, 0.6, 0.1, 0.4])threshold = 0.3remove_ixs = np.where(iou > threshold)[0] + 1print('remove_ixs=', remove_ixs)# Remove indices of the picked and overlapped boxes.ixs = np.delete(ixs, remove_ixs)print('ixs=', ixs)ixs = np.delete(ixs, 0)print('ixs=', ixs)

五,faster rcnn NMS

def py_cpu_nms(dets, thresh):"""Pure Python NMS baseline."""x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]scores = dets[:, 4]areas = (x2 - x1 + 1) * (y2 - y1 + 1)order = scores.argsort()[::-1]print('order',order)keep = []while order.size > 0:i = order[0]keep.append(i)xx1 = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(0.0, xx2 - xx1 + 1)h = np.maximum(0.0, yy2 - yy1 + 1)inter = w * hovr = inter / (areas[i] + areas[order[1:]] - inter)print('ovr=',ovr)print('np.where(ovr <= thresh)',np.where(ovr <= thresh))inds = np.where(ovr <= thresh)[0]print('inds=',inds)print('inds + 1',inds + 1)print('order[inds + 1]',order[inds + 1])order = order[inds + 1]print('order=',order)return keep
def nms():# ###self nmsresult = [np.array([[7.9301813e+02, 6.3052429e+02, 8.9795898e+02,             7.2513965e+02,9.9307442e-01],[8.0682990e+02, 6.4606281e+02, 8.7198071e+02, 7.1328979e+02,9.5732883e-02]], dtype=np.float32)]##faster rcnn  nmskeep=py_cpu_nms(result[0],0.7)print('keep=',keep)for i in keep:print('i=',i)print(result[0][i])

此处大于0.7IOU的框就抑制, 小于0.7的就留下.

六.多边形利用polygon计算IOU

def compute_IOU_():import numpy as npimport shapelyfrom shapely.geometry import Polygon, MultiPoint  # 多边形path = './134.jpg'img = cv2.imread(path)print('img.shape:', img.shape)line1 = [728, 252, 908, 215, 934, 312, 752, 355]  # 四边形四个点坐标的一维数组表示,[x,y,x,y....]line2 = [741, 262, 907, 228, 923, 308, 758, 342]# #debug to show# line1 = np.array(line1).reshape(4, 2)# line2 = np.array(line2).reshape(4, 2)# cv2.polylines(img, [np.array(line1).reshape(-1, 1, 2)], True, (0, 255, 0), thickness=2)# cv2.polylines(img, [np.array(line2).reshape(-1, 1, 2)], True, (0, 0, 255), thickness=2)# cv2.imwrite('134_with_rect.jpg',img)line1_box = np.array(line1).reshape(4, 2)  # 四边形二维坐标表示# 凸多边形# poly1 = Polygon(line1_box).convex_hull#凸多边形与凹多边形poly1 = Polygon(line1_box)#.convex_hull  # python四边形对象,会自动计算四个点,最后四个点顺序为:左上 左下  右下 右上 左上print(Polygon(line1_box).convex_hull)line2_box = np.array(line2).reshape(4, 2)# 凸多边形# poly2 = Polygon(line2_box).convex_hull# 凸多边形与凹多边形poly2 = Polygon(line2_box)print(Polygon(line2_box).convex_hull)union_poly = np.concatenate((line1_box, line2_box))  # 合并两个box坐标,变为8*2# print(union_poly)print(MultiPoint(union_poly).convex_hull)  # 包含两四边形最小的多边形点if not poly1.intersects(poly2):  # 如果两四边形不相交iou = 0else:try:inter_area = poly1.intersection(poly2).area  # 相交面积print(inter_area)union_area = MultiPoint(union_poly).convex_hull.areaprint(union_area)if union_area == 0:iou = 0# iou = float(inter_area) / (union_area-inter_area)  #错了iou = float(inter_area) / union_areaexcept shapely.geos.TopologicalError:print('shapely.geos.TopologicalError occured, iou set to 0')iou = 0print('line1_box:', line1_box)print('iou:', iou)

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产业互联网受瞩目:互联网主战场从To C转向To B | 企鹅经济学

来源&#xff1a;科技日报摘要&#xff1a;最近&#xff0c;要论在互联网圈最火的词&#xff0c;非“产业互联网”莫属。如今&#xff0c;言必提产业互联网&#xff0c;已成为互联网圈的一种风潮。互联网的“上半场”已接近尾声&#xff0c;“下半场”的序幕正被拉开&#xff0…

json的用法

json格式 JSON格式&#xff1a;http://www.json.org/ python和JSON的关系请参考&#xff1a;http://docs.python.org/library/json.html JSON建构有两种结构&#xff1a; 1. “名称/值”对的集合&#xff08;A collection of name/value pairs&#xff09;。不同的语言中&#…

数据库设计方法

一、延续训练题 假设你是一个小的录影带出租店的老板。你的出租店里面有3000部电影。每部电影都有DVD或VHS录像带号码。对于每部电影&#xff0c;需要知道它的标题和类别&#xff08;如&#xff0c;喜剧&#xff0c;悬疑&#xff0c;剧情&#xff0c;动作&#xff0c;战争&…

谷歌首席科学家:搞研究的痛苦,搞工程的人不懂

来源&#xff1a;量子位作者&#xff1a;Vincent Vanhoucke谷歌首席科学家、谷歌大脑技术负责人Vincent Vanhoucke&#xff08;万努克&#xff09;最近发出的一篇“劝退文”&#xff0c;引发海外科研学者的热议。在这博客中&#xff0c;万努克直言以研究为业&#xff0c;固然令…

L1/L2/smooth_l1_loss/center_loss+Dice Loss+focal loss+各种IOU loss+kl散度

一&#xff0e;L1/L2/smooth_l1_loss/center_loss公式与代码 1.公式 L2公式&#xff1a; smooth_L1公式: 2.三种函数numpy代码实现 import numpy as np import matplotlib.pyplot as plt#y |x| def L1():x np.arange(-2, 2, 0.01)y abs(x)plt.figure()plt.plot(x, y, …

虚拟机中Linux安装Tools

1. 插入光盘后将文件拷贝到常用放置软件的目录 2. 解压文件 3. 然后进入解压后的文件夹里找到安装文件进行安装&#xff08;注意使用root权限安装&#xff09; 4. 安装时也是一个交互的过程 5. 完成安装 转载于:https://www.cnblogs.com/ywj2013/p/3578931.html

世界创新竞争力发展报告:中美日创新产出竞争力居前三

来源&#xff1a;皮书说11月21日&#xff0c;由福建师范大学、中国科学技术交流中心联合攻关&#xff0c;具体由全国经济综合竞争力研究中心福建师范大学分中心组织研究的《世界创新竞争力黄皮书&#xff1a;世界创新竞争力发展报告&#xff08;2011&#xff5e;2017&#xff0…

二分法查找+树

一&#xff0c;查找存在的一个数&#xff0c;该数在列表中唯一 二分法查找是针对有序数据的查找方法&#xff0c;时间复杂度是O(logn)。。 其中 n/2^k1 时&#xff0c;k 的值就是总共缩小的次数。而每一次缩小操作只涉及两个数据的大小比较&#xff0c;所以&#xff0c; 经过了…

Oracle 软件的安装

1、在oracle主页上注册登录 2、下载64位&#xff0c;将我接受许可协议&#xff0c;下载1of2和2of2,并解压到同一个文件夹 3、安装oracle软件 双击database文件夹里面的setup.exe&#xff0c;启动OUI去掉&#xff1a;我希望通过....只安装软件&#xff0c;不创建数据库选择语言…

算法笔试题

一&#xff0c;搜索连通域 M, N list(map(int, input().split(,))) print(M,N) book [] for i in range(M):line list(map(int, input().split(,)))book.append(line) print(book) # MN3 # book[[1, 0, 0], [0, 1, 0], [0, 1, 1]] print(book,book) class Solution:def __i…

Linux之vim编辑器

目录 vim编辑器 vim编辑器指令 命令模式指令 光标相关 移动光标相关 文本操作 底行模式指令 插入模式 vim配置 面试官&#xff1a;小伙子&#xff0c;你是用什么环境编写代码的&#xff1f; 小明&#xff1a;vs2019 面试官&#xff1a;小伙子&#xff0c;你是用什么环…

Verilog HDL设计实现m序列+选择器

设计m序列发生器&#xff0c;其特征方程为&#xff0c;输出数字序列信号m_sequence码速率为10Mbps&#xff1b;设计串行转并行电路&#xff0c;每4位m序列并行输出&#xff0c;先输入的串行数据位于并行输出数据的高位。设计测试程序&#xff0c;进行功能仿真&#xff0c;将Ver…

深度分享:世界顶级神经科学家王小勤教授CCL 2018主旨报告(PPT全文,经报告人同意发布)...

报告人&#xff1a;王小勤 清华大学脑与智能实验室主任来源&#xff1a;TsinghuaNLP公众号人类的语言处理系统起始于听觉系统&#xff0c;大脑通过听觉系统来感知自然界多姿多彩的声学环境。在我们日常听见的众多声音中&#xff0c;语音和音乐是我们人类相互交流最为重要的两类…

贪心算法+回溯算法+动态规划

一.贪心算法 1.分饼干问题 #思路:排序加贪心 先让胃口小的孩子满足 class Solution:def findContentChildren(self, g, s):print(g:, g)print(s:, s)g sorted(g)#孩子s sorted(s)#饼干res 0for j in range(len(s)):#遍历饼干 先给胃口小的分配if res<len(g):if g[res]&…

小谈@override

override是jdk1.5增加的注解&#xff0c;主要是用来声明子类的某方法覆盖了父类的某方法。非常简单的注解&#xff0c;但是有个小问题&#xff1a; 项目最开始使用的是jdk1.6&#xff0c;mvc模式&#xff1a;接口 ----> 实现类。后来项目改成了jdk1.5&#xff0c;结果所有实…

单片机期末复习代码

1、左右来回循环的流水灯的电路连接见图4-6&#xff0c;显示规律如图4-7。实现本任务要求&#xff0c;可以有多种软件实现方法。下面列出了3种&#xff0c;具体如下 数组的字节操作实现 #include <reg51.h> #define uchar unsigned char uch…

中国AI专利数稳居第一!世界各国AI专利深度盘点

来源&#xff1a;智东西摘要&#xff1a;深入分析AI技术在世界范围内的专利申请数据&#xff0c;从专利申请的角度发现AI领域发展活跃的技术。最近两年&#xff0c;随着人工智能技术在国内的蓬勃发展&#xff0c;一些研究机构对国内外的技术现状进行了不同角度的分析&#xff0…

将多个csv文件合成一个csv

1.python的writer做法 import csv import pandas as pd import os from statistics import mean #对dev测试生成的多个csv进行融合 def merge_different_csv():CSV_C0_NAME file_nameCSV_C1_NAME real_lengthCSV_C2_NAME dev_lengthCSV_C3_NAME dev_length_abs_errorCSV_C4…

微信接口开发-初级体验

目录&#xff1a; 1. 微信接口的注册 2. 申请成为开发者 3. 申请测试账号 4. 获取access_token值 5. 调用接口 6. 自己编写程序 7. 总结 1. 微信接口的注册 进入到微信开发的官网&#xff08;https://mp.weixin.qq.com/&#xff09;进行注册。不过注册时需要一张手持身份证的照…

德国汽车产业研究:立足本土,迈向世界

来源&#xff1a;国泰君安德国汽车市场目前已进入成熟阶段&#xff0c;成熟阶段的标志是国内销量增速下降&#xff0c;自主品牌份额远高于其他品牌。国内市场趋于饱和&#xff0c;而出口量快速增长&#xff0c;并且在豪华车市场拥有高市场份额。德国汽车产业链的特点是&#xf…