目标检测:nms源码解析

原理:选定一个阈值,例如为0.3,然后将所有3个窗口(bounding box)按照得分由高到低排序。选中得分最高的窗口,遍历计算剩余的2窗口与该窗口的IOU,如果IOU大于阈值0.3,则窗口删除(保留得分高的窗口),再从剩余的窗口中选得分最高的,重复该过程,直到所有窗口都被计算过。

 import cv2
import numpy as np
import random
def nms(dets, thresh):
print(dets)
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
score = dets[:, 4]
# x1=3,x2=5,习惯上计算x方向长度就
# 是x=3、4、5这三个像素,即5-3+1=3,而不是5-3=2,所以需要加1
areas = (x2 - x1 + 1) * (y2 - y1 + 1) #所有box面积
order = score.argsort()[::-1] #得到score降序排列的坐标索引
print("order",order)
keep = []
while order.size > 0:
i = order[0] #最大得分box的坐标索引
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:]])
#最高得分的boax与其他box的公共部分(交集)
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1) #求高和宽,并使数值合法化
inter = w * h #其他所有box的面积
ovr = inter / (areas[i] + areas[order[1:]] - inter) #IOU:交并比
#ovr小表示两个box交集少,可能是另一个物体的框,故需要保留
inds = np.where(ovr <= thresh)[0]
order = order[inds + 1] #iou小于阈值的框
return keep img = cv2.imread("E:\jupyterProject\Pytorch\cs75.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dets=np.array([[500,250,1200,700,0.8], [400,200,1000,500,0.5],
[800,150,1300,600,0.6]], np.float)
# 设置thread为0.3
rtn_box=nms(dets, 0.3) #0.3为faster-rcnn中配置文件的默认值
cls_dets=dets[rtn_box, :]
print("nms box:", cls_dets)
img_cp1=img.copy()
for box in cls_dets.tolist():
x1,y1,x2,y2,score=int(box[0]),int(box[1]),int(box[2]),int(box[3]),box[-1]
y_text=int(random.uniform(y1, y2))
cv2.rectangle(img_cp1, (x1,y1), (x2, y2), (0, 255, 255), 2)
cv2.putText(img_cp1, "CAR:"+str(score), (x1,y1), 2,1, (255, 0, 255))
cv2.imshow("nms_img",img_cp1)
# cv2.destroyAllWindows()#消除所有显示的图框
cv2.imwrite("newcs75.jpg",img_cp1)
cv2.waitKey(0)

IOU的阈值:threshold= 0.7

IOU的阈值:threshold= 0.3

最新文章

  1. javaweb查看后台session和request所有的值
  2. OGNL的使用
  3. javascript父级鼠标移入移出事件中的子集影响父级的处理方法
  4. 硬连接与软连接,inode与links
  5. 虚拟机软件VMware Workstation Pro的安装与使用
  6. 安装Arch Linux(桌面环境)
  7. poj 1442 名次树
  8. Maven 创建多模块工程
  9. SAP 通过屏幕字段查看透明表
  10. jquery获取所有选中的checkbox的ID
  11. UVa 1605 (构造) Building for UN
  12. 关于alarm函数
  13. 避免ssh断开导致运行命令的终止:screen
  14. struts2笔记04-XxxAware接口
  15. serv-u 多域配置
  16. 【MyBatis】MyBatis自动生成代码查询之爬坑记
  17. 笔记:Maven 仓库及配置详解
  18. springboot之jar包部署步骤
  19. UVA10129-Play on Words(欧拉路径)
  20. [转]Qt状态栏(statusbar)的使用

热门文章

  1. 读取根目录src下的指定配置properties文件内容
  2. 【DES加密解密】 C#&amp;JAVA通用
  3. 策略模式(Strategy)---行为型
  4. Docker 阿里云镜像加速
  5. Luogu P1198 [JSOI2008]最大数 单调队列/ST表
  6. off(events,[selector],[fn]) 在选择元素上移除一个或多个事件的事件处理函数。
  7. 编译参数(-D)
  8. 利用状态机(FSM)进行简单的uart串口发送数据
  9. BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)
  10. Java中jdk代理和cglib代理