yolov3后处理,包括网络输出、阈值过滤、多类NMS

yolov3_v2(模型训练+后处理) 二、模型训练 代码链接:https://github.com/YunYang1994/tensorflow-yolov3 本章是复现以上的代码,并自己做了些其他修改,比如数据处理、后处理等,这里只贴出修改过的一些代码,其他代码可从上面链接下载。 1.convert_weight.py 下载预训练模型 wget https://github.com/YunYang1994/tensorflow-yolov3/releases/download/v1.0/yolov3_coco.tar.g.. 阅读详情
  • pytorch版本:1.7.1+cu101
from net.yolov3 import Yolo
from PIL import Image, ImageDraw
import numpy as np
import torch, copy, time

def sigmoid(x):
	temporary = 1 + torch.exp(-x)
	return 1.0 / temporary

def get_boxes(output, anchors):
	h = output.size(2)
	w = output.size(3)
	output = output.view(3, 85, h, w).permute(0,2,3,1)
	tc = torch.sigmoid(output[..., 4])    # 3*h*w
	cl = torch.sigmoid(output[..., 5:])   # 3*h*w*80
	clv, cli = torch.max(cl,-1)
	mask = tc * clv > 0.9
	# print(torch.where(mask))
	cli = cli[mask].unsqueeze(-1)
	# 3*h*w
	tx = torch.sigmoid(output[..., 0][mask])
	ty = torch.sigmoid(output[..., 1][mask])
	tw = torch.exp(output[..., 2][mask])
	th = torch.exp(output[..., 3][mask])
	# grid
	FloatTensor = torch.cuda.FloatTensor if tx.is_cuda else torch.FloatTensor
	grid_x, grid_y = torch.meshgrid(torch.linspace(0,w-1,w), torch.linspace(0,h-1,h))
	grid_x = grid_x.repeat(3,1,1)[mask].type(FloatTensor)
	grid_y = grid_y.repeat(3,1,1)[mask].type(FloatTensor)
	tx = ((tx+grid_y) / w).unsqueeze(-1)
	ty = ((ty+grid_x) / h).unsqueeze(-1)
	# anchor
	aw = torch.Tensor(anchors[0::2]).view(3,1).repeat(1,h*w).view(3,h,w)[mask].type(FloatTensor)
	ah = torch.Tensor(anchors[1::2]).view(3,1).repeat(1,h*w).view(3,h,w)[mask].type(FloatTensor)
	tw = (tw * aw).unsqueeze(-1)
	th = (th * ah).unsqueeze(-1)
	return torch.cat([tx, ty, tw, th, cli], -1)

def get_boxes(output, anchors):
	h=output.size(2)
	w=output.size(3)
	output=output.view(3,85,h,w).permute(0,2,3,1)
	# conf
	conf = torch.sigmoid(output[..., 4])
	cl = torch.sigmoid(output[..., 5:])
	clv, cli = torch.max(cl, -1)
	conf = conf * clv
	mask = conf > 0.5
	conf = conf[mask].unsqueeze(-1)
	cli = cli[mask].unsqueeze(-1)
	# grid
	FloatTensor = torch.cuda.FloatTensor if conf.is_cuda else torch.FloatTensor
	grid_h, grid_w = torch.meshgrid(torch.arange(h), torch.arange(w))
	grid_h = grid_h.repeat(3,1,1).type(FloatTensor)
	grid_w = grid_w.repeat(3,1,1).type(FloatTensor)
	tx = (torch.sigmoid(output[..., 0]) + grid_w) / w
	ty = (torch.sigmoid(output[..., 1]) + grid_h) / h
	tx = tx[mask].unsqueeze(-1)
	ty = ty[mask].unsqueeze(-1)
	# anchor
	aw = torch.Tensor(anchors[0::2]).view(3,1).repeat(1,h*w).view(3,h,w).type(FloatTensor)
	ah = torch.Tensor(anchors[1::2]).view(3,1).repeat(1,h*w).view(3,h,w).type(FloatTensor)
	tw = torch.exp(output[..., 2]) * aw
	th = torch.exp(output[..., 3]) * ah
	tw = tw[mask].unsqueeze(-1)
	th = th[mask].unsqueeze(-1)
	return torch.cat([tx, ty, tw, th, cli, conf], -1)

# def get_boxes(output, anchors):
# 	c = output.size(1)
# 	h = output.size(2)
# 	w = output.size(3)
# 	boxes = []
# 	output = output.view(3, 85, h, w).permute(0,2,3,1)
# 	for i in range(3):
# 		for j in range(h):
# 			for k in range(w):
# 				temporary = output[i][j][k]
# 				for t in range(5,85):
# 					if(sigmoid(temporary[4]) * sigmoid(temporary[t]) < 0.9): 
# 						continue
# 					x = (sigmoid(temporary[0]) + k) / w
# 					y = (sigmoid(temporary[1]) + j) / h
# 					tw = torch.exp(temporary[2]) * anchors[i*2]
# 					th = torch.exp(temporary[3]) * anchors[i*2+1]
# 					boxes.append([x,y,tw,th,t-5])
# 					print(i,j,k)
# 	return boxes

def iou(a,b):
	A=len(a)
	B=len(b)
	area1=a[:,2]*a[:,3]
	area1=area1.unsqueeze(1).expand(A,B)
	area2=b[:,2]*b[:,3]
	area2=area2.unsqueeze(0).expand(A,B)
	ba=torch.zeros(a.shape).cuda()
	bb=torch.zeros(b.shape).cuda()
	ba[:,0:2]=a[:,0:2]-a[:,2:]/2.0
	ba[:,2:]=ba[:,0:2]+a[:,2:]
	bb[:,0:2]=b[:,0:2]-b[:,2:]/2.0
	bb[:,2:]=bb[:,0:2]+b[:,2:]
	ba=ba.unsqueeze(1).expand(A,B,4)
	bb=bb.unsqueeze(0).expand(A,B,4)
	lt=torch.max(ba[:,:,0:2], bb[:,:,0:2])
	rb=torch.min(ba[:,:,2:], bb[:,:,2:])
	inter=torch.clamp((rb-lt),min=0)
	inter=inter[:,:,0]*inter[:,:,1]
	return inter/(area1+area2-inter)

def nms(box):
	box = box[torch.argsort(box[:,-1])]
	result=[]
	while len(box) > 0:
		result.append(box[0])
		if len(box) == 1: break
		ious=iou(box[0:1, 0:4], box[1:, 0:4])
		#print(ious)
		box=box[1:][ious.squeeze(0) < 0.5]
	return torch.stack(result)

def deal(boxes):
	labels = boxes[:, -2].unique()
	result=[]
	for l in labels:
		box = boxes[boxes[:, -2]==l]
		box = nms(box)
		for b in box: 
			result.append(b)
	return torch.stack(result)

classes=[]
for line in open('/home/lwd/code/darknet/data/coco.names'):
	classes.append(line[:-1])
model_path='/home/lwd/code/dl/myTorch/yolo/model/99.pth'
net=Yolo(80)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
paras=torch.load(model_path, map_location=device)

net.load_state_dict(paras)
net = net.eval()
net = net.cuda()

with open('result/log.txt', 'w') as f:
	for line in open('/home/lwd/data/20220220.txt'):
		f.write(line[:-1].split('/')[-1]+'\n')
		print(line[:-1])
		raw = Image.open(line[:-1])
		ih, iw = np.shape(raw)[0:2]
		image = raw.resize((416, 416), Image.BICUBIC)
		image = np.array(image, dtype='float32') / 255.0
		image = np.expand_dims(np.transpose(image, (2, 0, 1)), 0)
		with torch.no_grad():
			images = torch.from_numpy(image)
			images = images.cuda()
			outputs = net(images)
		anchors=[[116,90,  156,198,  373,326],[30,61,  62,45,  59,119],[10,13,  16,30,  33,23]]
		draw = ImageDraw.Draw(raw)
		thld_boxes=[]
		for i,output in enumerate(outputs):
			ti = time.time()
			boxes = get_boxes(output, anchors[i])
			if len(boxes) == 0: continue
			boxes[:,0] = boxes[:,0] * iw
			boxes[:,1] = boxes[:,1] * ih
			boxes[:,2] = boxes[:,2] / 416.0 * iw
			boxes[:,3] = boxes[:,3] / 416.0 * ih
			for b in boxes:
				thld_boxes.append(b)
			print(output.size(2), 'time: ', time.time()-ti)
		if len(thld_boxes) == 0: continue
		boxes=deal(torch.stack(thld_boxes))
		print(len(boxes))
		for b in boxes:
				cx = b[0]
				cy = b[1]
				w = b[2]
				h = b[3]
				draw.rectangle([cx-w/2, cy-h/2, cx+w/2, cy+h/2])
				draw.text((cx-w/2, cy-h/2), classes[int(b[4])], fill="#FF0000")
				f.write(classes[int(b[4])]+'\n')
			# if(len(boxes) > 0):break
		del draw
		# raw.show()
		raw.save('result/image/'+line[:-1].split('/')[-1])

yolov8分割任务的推理和后处理解析 yolov8分割任务的后处理解析 阅读详情

相关推荐

YOLOv1 技术详解:NMS(非极大值抑制)的工作原理与实现细节

本文详细解析了YOLOv1中NMS(非极大值抑制)的工作原理与实现。NMS是一种关键的后处理技术,用于消除目标检测中的冗余预测框。YOLOv1采用按类别处理的策略:首先计算每个边界框的置信度得分,然后对每个类别单独执行NMS,保留得分最高的框并删除与其IoU超过阈值的重叠框。文章完整阐述了NMS的具体步骤、伪代码实现、可视化过程以及优缺点分析,并指出YOLO后续版本对NMS的改进方向。NMS虽然简单高效,但存在密集目标漏检等局限性,这促使了后续Soft-NMS等更先进方法的发展。

guoguozgw的博客 1106

基于open CV实现YOLOv3复现_预测阶段和后处理阶段

基于open CV实现YOLOv3复现_预测阶段和后处理阶段

weixin_45454137的博客 1308

【目标检测-YOLO】YOLOv3总结

YOLOv3 的架构总结和损失函数理解以及正负样本分配

博观约取,厚积薄发 3799

经典目标检测YOLO系列(三)YOLOv3算法详解

经典目标检测YOLO系列(三)YOLOv3算法详解

qq_44665283的博客 3187

Yolov3DetectionOutput解析

通过batch, inputNum, anchorNum, inputH * inputW四重循环将input中每个框和概率的数据转换成obj_kept, loc_kept, prob_kept三个数组的表示方法,分别表示objectness,框的位置和框中内容在所有类别上的概率分布。Preprocess的多核过程由于将结果存回了SRAM或者GDRAM,然后下一个阶段的NMS过程会直接从SRAM或者GDRAM取数据,所以绝大多数处理过的框数据是不需要同步的。比较复杂的部分依旧是数据的拆分策略。

shengyin714959的博客 522

YOLOv11的DIoU-NMS损失联合优化-(将DIoU思想融入NMS后处理阶段)

本文系统介绍了目标检测后处理中的NMS算法及其演进,重点分析了DIoU-NMS的原理与优势。主要内容包括: 目标检测后处理的必要性:需解决冗余边界框消除、结果优化和置信度校准等问题,其中NMS是核心环节。 传统NMS的局限性:存在遮挡场景漏检、固定阈值不灵活、评分机制粗糙等问题,在密集目标等场景表现不佳。 DIoU-NMS的创新:引入中心点距离惩罚项,在IoU基础上增加几何信息考量,具有更快的收敛速度和更强的密集目标区分能力。 算法实现:详细阐述了DIoU的数学形式化表示和NMS集成方法,对比了其相对于Io

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1867

Pytorch机器学习(八)—— YOLOV5中NMS非极大值抑制与DIOU-NMS等改进

Pytorch机器学习(八)—— YOLOV5中NMS非极大值抑制与DIOU-NMS等改进 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 在目标检测的预测阶段时,会输出许多候选的anchor box,其中有很多是明显重叠的预测边界框都围绕着同一个目标,这时候我就可以使用NMS来合并同一目标的类似边界框,或者说是保留这些边界框中最好的一个。 如果对IOU等知识不了解的可以看我上篇博客Pytorch机器学习(五

lzzzzzzm的博客 4万+

YOLOv5改进系列(14)——更换NMS(非极大抑制)之 DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-NMS

手把手教你改进YOLOv5系列更换NMS(非极大抑制)之 DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-NMS超级详细!

路人贾的博客 7003

YOLOV3非极大抑制(NMS)和Threshold实践

关于NMS的理论分析介绍请参考文章: 非极大值抑制(Non-Maximum Suppression,NMS)_tugouxp的专栏-优快云博客结束https://blog.youkuaiyun.com/tugouxp/article/details/121725807这里主要针对YOLOV3后处理的实践,结合一份白嫖来的YOLOV3后处理代码,来感性的了解NMS是做什么的,怎么用。 首先看一下这份代码,在后处理参数的初始化过程中,可以看到有对NMS参数的初始化,NMS一般设置在0.3-0.5之间,他是对IOU的.

tugouxp的专栏 5224

YOLOv5改进系列(八) 更换NMS非极大抑制DIoU-NMS、CIoU-NMS、EIoU-NMS、GIoU-NMS 、SIoU-NMS、Soft-NMS

即非极大抑制,顾名思义就是抑制不是极大值的元素,搜索局部的极大值。在最近几年常见的物体检测算法(包括RCNN、SPPNet、Fast-RCNN、Faster-RCNN等)中,最终都会从一张图片中找出很多个可能是物体的矩形框,然后为每个矩形框为做类别分类概率。筛选出一定区域内属于同一种类别得分最大的框。如下图,网络模型可以给每个检测框一个score,score越大,说明检测框越接近真实值。《老友记》yyds!然后非最大值抑制的目的是删除score小的框,只剩下sore最大作为最终的预测结果。

专注于人工智能学习,总结 2930

安信可TB蓝牙模组系列 实战Ble Mesh智能照明系统搭建

本文详细介绍了如何使用安信可TB蓝牙模组系列搭建Ble Mesh智能照明系统。从硬件准备、固件烧录到手机APP组网全流程,提供了实战步骤和优化建议,特别适合智能家居开发者入门。Ble Mesh的自组网能力解决了蓝牙传输距离限制,实现全屋灯光智能控制。

weixin_30856725的博客 352

【YOLOv3 NMS】YOLOv3中的非极大值抑制

文章目录1 NMS问题由来2 NMS操作流程2.1 进行NMS前要先有什么2.2 NMS流程3 NMS代码解读感谢链接 1 NMS问题由来 利用YOLOv3网络结构提取到out0、out1、out2之后,不同尺度下每个网格点上均有先验框,网络训练过程会对先验框的参数进行调整,继而得到预测框,从不同尺度下预测框还原到原图输入图像上,同时包括该框内目标预测的结果情况(预测框位置、类别概率、置信度分数)。 问题: 每个网格节点上都有3个框,每个框对应到不同类别上也都有概率,然而最终输出不可能把这些框都输出了,怎么

计算机视觉方面的点点滴滴,欢迎一起讨论 2465

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 700

YOLOv11预测结果后处理:NMS优化部署技巧详解

本文介绍了基于星图GPU平台自动化部署YOLO11镜像的完整流程,结合Jupyter与SSH实现高效开发。该环境支持模型训练、推理及NMS后处理优化,适用于目标检测场景下的AI应用开发,尤其在交通识别、安防监控等实际任务中表现优异,助力开发者快速落地高性能视觉系统。

weixin_42230607的博客 297

USC EE450 CSCI455 CSCI571 Midterm 总结

EE450 Compter Network                1.历年Midterm考题。(更新至2017年spring,如果大家有新的资源欢迎编辑)                 google drive:https://drive.google.com/drive/folders/0B_LCDxpiiXZ1cUNReFpZZHo4NG8?usp=sharing

Small_hour 7112

Jitsi中的Prosody(谐音:破扫敌)介绍

凭借其灵活的插件系统、强大的安全性和出色的性能,Prosody 成为许多企业和开发者构建定制化通信解决方案的首选。在 Jitsi 的多方视频会议场景中,Prosody 不仅处理基本的信令任务,还需要与其他组件(如 Jitsi Videobridge)协作,确保视频流的正确分发和控制。Prosody 提供了丰富的插件系统,允许开发者通过模块扩展其功能。Prosody 就是一个实现 XMPP 协议的服务器,它支持 XMPP 协议的标准功能,如消息传递、群组聊天、传送状态信息等,并提供了高效、可扩展的服务。

江左散人的专栏 1165

目标检测后处理与 NMS 优化:从暴力搜索到高效推理

目标检测后处理从"暴力搜索"到"高效推理"的演进,体现了工程优化的核心思路——理解瓶颈、针对性优化、必要时重新设计。减少候选框数量:通过置信度预过滤和 Top-K 截断,将参与 NMS 的候选框从数千个压缩到数百个,显著降低 O(N²) 的计算量。选择合适的 NMS 变体:稀疏场景使用标准 NMS + CUDA 加速;密集场景使用 Soft-NMS(高斯衰减);对精度要求极高时考虑 Cluster-NMS。调优 IoU 阈值。

weixin_43272162的博客 4564

MIKE21桥墩模拟实战:抠网格与构筑物法对比与选型指南

本文详细对比了MIKE21软件中抠网格法与构筑物法在桥墩模拟中的应用,包括操作步骤、适用场景及优缺点分析。通过实际案例数据展示两种方法的精度与效率差异,并提供选型决策树和常见问题解决方案,帮助工程师根据项目需求选择最优模拟方法。

weixin_42656416的博客 322

[YOLOv7/YOLOv5系列算法改进NO.19]非极大值抑制NMS算法改进DIoU NMS

​前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。解决问题:YOLOv5默认采用NMS算法,主要是通过IoU来筛选出候选框。...

m0_70388905的博客 7087

手把手讲解RTX5操作系统在GD32F407上的移植

然后将GD32F4xx_Demo_Suites_V2.6.4\GD32407V_START_Demo_Suites\Projects\01_GPIO_Running_LED下面的main函数复制到我们的项目文件夹中;打开对应GD32407V_START_Demo_Suites的文件夹下面的Utilities,复制gd32f407v_start.c和gd32f407v_start.h文件到一开始项目保存的文件夹下面;为了验证我们的操作系统是否被正确添加,是否能够正确运行,我们需要添加示例文件;

Praguejing的博客 1859

【WRF工具】WRF 模型输出可视化工具 RIP4

【WRF工具】WRF 模型输出可视化工具 RIP4

WW、forever的博客 1594

YOLOv3详解

YOLOv3详解1. 什么是YOLO2. 一个全卷积神经网络——Darknet-533. 输出4. 锚框和预测中心坐标5.边界框维度6. 物体分数和类置信度7. 不同尺度的预测8. 输出处理(在类分数上阈值处理)附录参考 1. 什么是YOLO ​  YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对.

wq_0708的博客 3万+

Sigrity OptimizePI Best Capacitor Location Estimation模式如何评估电容最佳位置操作指导

Sigrity OptimizePI Best Capacitor Location Estimation模式用于前仿真分析,评估电容的最佳位置以获得最小回路电感,如何分析,以下图为例进行说明。IC devices,输入U*, A*, B*, Q*, P*,将所有这些字母开头的器件都识别为IC。Min设置为1(最少电容个数为1),max设置为28(最多电容个数为28)Capacitors 输入C*,将所有C开头的器件都识别为电容。Grid X设置为8,Grid Y也设置为8。

weixin_54787054的博客 382

YOLOv5图像分割中的NMS处理

在上一篇文章有讲到图像经过YOLOv5网络后得到的输出形式,主要是调用了BaseModel类下的forward得到的输出,输出的shape为【batch,25200,117】,这里的25200相当于总的anchors数量【以640*640的输入为例,共有anchors=80*80*3+40*40*3+20*20*3】,117为5[x,y,w,h,conf]+80个类+32【mask的数量】。那么得到上面这张图的输出后又呢?又是的呢?本篇文章就是来刨析这个问题。

z240626191s的博客 5380

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

YOLOv3 中的 NMS 非极大值抑制详解:论文 + Darknet 双视角

特点说明✅ 按类别执行 NMS不同类别的框不会相互干扰✅ 使用 confidence × class_prob 排序更合理的排序方式✅ 支持 Soft-NMS可通过配置启用(非论文原生)✅ 多尺度预测适配对小目标更鲁棒✅ Anchor Boxes 支持anchor 是通过 K-Means 聚类获得的预设框模块内容✅ NMS 作用去除重复预测框,提高检测结果质量✅ YOLOv3 NMS 实现按类别执行,使用 confidence × class_prob 排序。

guoguozgw的博客 1226

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Github 项目 - YOLOV3 的 TensorFlow 复现

原文:Github 项目 - YOLOV3 的 TensorFlow 复现 - AIUAI Github 项目 - tensorflow-yolov3 作者:YunYang1994 论文:yolov3 最近 YunYang1994开源的基于 TensorFlow(TF-Slim) 复现的 YOLOv3 复现,并支持自定义数据集的训练. 该开源项目组成: YOLO v3 网络结构 权重转换We...

长风破浪会有时,直挂云帆济沧海 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: C++多线程加速for循环
下一篇: k个一组反转链表
刀么克瑟拉莫
博客等级 码龄14年 68粉丝 268原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刀么克瑟拉莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值