深度学习之目标检测:非极大值抑制源码解析(nms)
2024-08-28 08:41:55
目标检测: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
最新文章
- javaweb查看后台session和request所有的值
- OGNL的使用
- javascript父级鼠标移入移出事件中的子集影响父级的处理方法
- 硬连接与软连接,inode与links
- 虚拟机软件VMware Workstation Pro的安装与使用
- 安装Arch Linux(桌面环境)
- poj 1442 名次树
- Maven 创建多模块工程
- SAP 通过屏幕字段查看透明表
- jquery获取所有选中的checkbox的ID
- UVa 1605 (构造) Building for UN
- 关于alarm函数
- 避免ssh断开导致运行命令的终止:screen
- struts2笔记04-XxxAware接口
- serv-u 多域配置
- 【MyBatis】MyBatis自动生成代码查询之爬坑记
- 笔记:Maven 仓库及配置详解
- springboot之jar包部署步骤
- UVA10129-Play on Words(欧拉路径)
- [转]Qt状态栏(statusbar)的使用
热门文章
- 读取根目录src下的指定配置properties文件内容
- 【DES加密解密】 C#&;JAVA通用
- 策略模式(Strategy)---行为型
- Docker 阿里云镜像加速
- Luogu P1198 [JSOI2008]最大数 单调队列/ST表
- off(events,[selector],[fn]) 在选择元素上移除一个或多个事件的事件处理函数。
- 编译参数(-D)
- 利用状态机(FSM)进行简单的uart串口发送数据
- BZOJ1005--[HNOI2008]明明的烦恼(树的prufer编码)
- Java中jdk代理和cglib代理