目标检测 YOLOv5 - 推理时的数据增强

目标检测 YOLOv5 - 推理时的数据增强

flyfish

版本 YOLOv5 6.2

参考地址

https://github.com/ultralytics/yolov5/issues/303

在训练时可以使用数据增强,在推理阶段也可以使用数据增强
在测试使用数据增强有个名字叫做Test-Time Augmentation (TTA)

实际使用中使用了大中小三个不同分辨率,中间大小分辨率的图像进行了左右反转
大分辨率
480 * 640 宽度W 高度H 比例为1
在这里插入图片描述
中分辨率
416 * 544 宽度W 高度H 比例为0.83

在这里插入图片描述
小分辨率
352 * 448 宽度W 高度H 比例为0.67

在这里插入图片描述

命令

python detect.py --weights ./yolov5s.pt --source ./data/images/bus.jpg  --imgsz 640 --augment

--augment语法
推理时默认不使用增强

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",action="store_true")
args = parser.parse_args()
if args.verbose:print("verbosity turned on")
else:print("verbosity turned off")

假如上段代码是test.py

# python test.py
# 输出     verbosity turned off# python test.py -v
# 输出 verbosity turned on

验证图像大小是每个维度上的stride的倍数,默认是32的倍数
例如 图像大小是1111 那么就是
--img-size [1111, 1111] 更新为 [1120, 1120]

def check_img_size(imgsz, s=32, floor=0):# Verify image size is a multiple of stride s in each dimensionif isinstance(imgsz, int):  # integer i.e. img_size=640new_size = max(make_divisible(imgsz, int(s)), floor)else:  # list i.e. img_size=[640, 480]imgsz = list(imgsz)  # convert to list if tuplenew_size = [max(make_divisible(x, int(s)), floor) for x in imgsz]if new_size != imgsz:LOGGER.warning(f'WARNING: --img-size {imgsz} must be multiple of max stride {s}, updating to {new_size}')return new_size

推理增强部分

def _forward_augment(self, x):img_size = x.shape[-2:]  # height, widths = [1, 0.83, 0.67]  # scalesf = [None, 3, None]  # flips (2-ud, 3-lr)y = []  # outputsfor si, fi in zip(s, f):xi = scale_img(x.flip(fi) if fi else x, si, gs=int(self.stride.max()))print("xi.shape[2:]:",xi.shape[2:])yi = self._forward_once(xi)[0]  # forwardprint("0 yi:",yi.shape)#cv2.imwrite(f'img_{si}.jpg', 255 * xi[0].cpu().numpy().transpose((1, 2, 0))[:, :, ::-1])  # saveyi = self._descale_pred(yi, fi, si, img_size)print("1 yi.shape:",yi.shape)y.append(yi)y = self._clip_augmented(y)  # clip augmented tailsreturn torch.cat(y, 1), None  # augmented inference, traindef _descale_pred(self, p, flips, scale, img_size):# de-scale predictions following augmented inference (inverse operation)if self.inplace:p[..., :4] /= scale  # de-scaleif flips == 2:p[..., 1] = img_size[0] - p[..., 1]  # de-flip udelif flips == 3:p[..., 0] = img_size[1] - p[..., 0]  # de-flip lrelse:x, y, wh = p[..., 0:1] / scale, p[..., 1:2] / scale, p[..., 2:4] / scale  # de-scaleif flips == 2:y = img_size[0] - y  # de-flip udelif flips == 3:x = img_size[1] - x  # de-flip lrp = torch.cat((x, y, wh, p[..., 4:]), -1)return pdef _clip_augmented(self, y):# Clip YOLOv5 augmented inference tailsnl = self.model[-1].nl  # number of detection layers (P3-P5)g = sum(4 ** x for x in range(nl))  # grid pointse = 1  # exclude layer counti = (y[0].shape[1] // g) * sum(4 ** x for x in range(e))  # indicesy[0] = y[0][:, :-i]  # largei = (y[-1].shape[1] // g) * sum(4 ** (nl - 1 - x) for x in range(e))  # indicesy[-1] = y[-1][:, i:]  # smallreturn y

关于翻转看

if self.inplace:p[..., :4] /= scale  # de-scaleif flips == 2:p[..., 1] = img_size[0] - p[..., 1]  # de-flip udelif flips == 3:p[..., 0] = img_size[1] - p[..., 0]  # de-flip lr

2表示上下翻转
3表示左右翻转
s = [1, 0.83, 0.67] 是缩放比例,且能被32整除

这里的顺序是HW

xi.shape[2:]: torch.Size([640, 480])
xi.shape[2:]: torch.Size([544, 416])
xi.shape[2:]: torch.Size([448, 352])yi.shape: torch.Size([1, 18900, 85])
yi.shape: torch.Size([1, 13923, 85])
yi.shape: torch.Size([1, 9702, 85])

合并去冗余之后再进NMS

torch.Size([1, 34233, 85])

原来推理一张图像,增强后是推理3张

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Arduino驱动VL6180X光学测距传感器(OLED显示)

Arduino驱动VL6180X光学测距传感器(OLED显示) 简介原理模块参数接线图代码结果 简介 VL6108X三合一光电模块,芯片内集成了IR VSEL(vertical-cavity surface-emitting laser)红外垂直腔面发射激光器光源、接近传感器、环境光传感器&#xff0…

Java创建线程执行任务的方法(一)

目录 1.继承Thread类 2.实现Runnab类 2.1实现Runnable类 2.2使用Lambda表达式 3.实现Callable类 3.1返回Integer类型数据 3.2返回String类型数据 3.3返回Object类型数据 4.匿名内部类 创建线程的方法:继承Thread类;实现Runnab类;匿名…

Apipost一键压测参数化功能详解

最近更新中Apipost对UI页面进行了一些调整,另外一键压测功能支持参数化!本篇文章将详细介绍这些改动! API调试页面的细节改动 在请求区填入请求参数或脚本时会有相应的标识 如在Query中填入多个参数时上方会展示数量 在预、后执行脚本中写…

基于Java车间工时管理系统(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

海外社媒营销避坑指南:盘点最容易被人忽视的7大坑!

在全球数字化浪潮的推动下,海外社媒营销成为企业推广品牌、产品和服务的重要途径。然而,与其诱人的前景相对应的是众多的坑,需要企业精心规划和巧妙应对。本文Nox聚星将和大家盘一盘企业在海外社媒营销之路上最容易忽视的7个大坑,…

一面“短刀”出鞘,一面撤回IPO,蜂巢能源决定求稳

刚刚在12月12日的第四届电池日上全球首发蜂速超快充磷酸铁锂短刀电池,10天之后便主动撤回已经过上交所两次问询的IPO申请,终止了自己奔赴科创板的上市之旅。动力电池新贵蜂巢能源这套动作,让市场颇为遗憾——虽然当前国内资本市场环境确实不同…

AI赋能金融创新:技术驱动的未来金融革命

人工智能(AI)作为一种技术手段,正逐渐改变金融行业的方方面面。从风险管理到客户体验,从交易执行到反欺诈,AI带来了许多创新和机遇。本文将探讨AI在金融领域的应用和其赋能的金融创新。 金融领域一直以来都面临着复杂的…

计算机网络【DHCP动态主机配置协议】

DHCP 出现 电脑或手机需要 IP 地址才能上网。大刘有两台电脑和两台手机,小美有一台笔记本电脑、一台平板电脑和两台手机,老王、阿丽、敏敏也有几台终端设备。如果为每台设备手动配置 IP 地址,那会非常繁琐,一点儿也不方便。特别是…

潜力股的印度市场,为啥被风险投资人看空了?

KlipC报道:自2021年第四季度,印度超过英国,稳居世界第五大经济体之后,“印度市场”的潜力被不断提及。 KlipC的分析师Allen表示:“但对于风险投资行业来说,从2023年的数据看,似乎像是遭遇了一场…

鸿鹄电子招投标系统:源码级别解析电子招投标的精髓

招投标管理系统是一个集门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理于一体的综合性应用平台。它适用于招标代理、政府采购、企业采购和工程交易等业务的企业,旨在提高项目管理的效率和质量。该系…

SpireCV项目实战——电诈园区人员及房屋情况识别

项目介绍前言 随着科技的进步和大数据时代的到来,计算机视觉技术逐渐渗透到各个行业领域,为人们的生活和工作带来了诸多便利。近年来,电信诈骗案件频发,给社会带来了巨大的经济损失和心理负担。电诈园区作为电信诈骗的高发区域&a…

【PyQt5】QComboBox文字居中

你永远也无法预料到,Qt到底埋了多少坑(我的是PyQt5), 一个破文本居中都要搞那么麻烦 一堆样式这里不生效那里不生效的真的是离谱 代码运行结果: import sys from PyQt5.QtWidgets import QApplication,QComboBox from PyQt5.QtWidgets impor…

Threejs 标签添加(单标签/多标签)

前言:网上写这个太少了,还写的乱,我就简单的整理下大家看下就会,有问题可以关注公众号: 技术链 1、创建工程vue 这个可以直接用命令创建 2、引入安装Threejs 依赖 3、编写标签引入依赖,可以使用 CSS2DRenderer,CSS3D…

堪比Postman!这款IDEA插件真好用!

Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:Apipost Helper,写完代码就可以调试接口并一键生成接口文档!而且还…

【计算机毕业设计】SSM游戏点评网站

项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录,管理员管理,网站用户管理,游戏资讯管理,游戏类型管理,城市信息管理,竞技场管理,游戏信息管理,游戏评价信息管理等功能。…

【Spark精讲】一文讲透SparkSQL物理执行计划

SparkSQL整体计划生成流程 大体分三步: (1)由 SparkSqlParser 中的 AstBuilder执行节点访问,将语法树的各种Context节点转换成对应的 LogicalPlan 节点,从而成为一棵未解析的逻辑算子树(Unresolved LogicalPlan),此时的逻辑算子树…

基于CNN和双向gru的心跳分类系统

CNN and Bidirectional GRU-Based Heartbeat Sound Classification Architecture for Elderly People是发布在2023 MDPI Mathematics上的论文,提出了基于卷积神经网络和双向门控循环单元(CNN BiGRU)注意力的心跳声分类,论文不仅显示了模型还构建了完整的…

c语言-位操作符练习题

文章目录 前言一、n&(n-1)的运用场景(n为整数)二、&1 和 >>的应用场景总结 前言 本篇文章介绍利用c语言的位操作符解决一些练习题,目的是掌握各个位操作符的使用和应用场景。 表1.1为c语言中的位操作符 操作符含义&按位与|按位或^按位异或~按位…

电脑报错缺失vcomp140.dll无法执行代码怎么解决?快速的修复vcomp140.dll方案

vcomp140.dll无法执行代码怎么解决?vcomp140.dll是常见的系统文件,许多用户遇到它缺失导致程序无法运行的问题。本文旨在提供彻底解决此问题的方法,并对vcomp140.dll文件本身进行了简要说明。 以下是几种修复缺失的vcomp140.dll文件的方法 第…