yolo v5 中 letterbox对不规则矩形框的输入调整
在对数据或特征的处理中,为了避免输入图像或特征,经过resize等等操作,改变了目标特征的尺度信息,一般会引入一些操作,比如:
- 在特征维度,加入SPP(空间金字塔池化),这样不同大小的输入图像,经过该层的处理,输出大小都保持了一致
- 在输入图像阶段,也可以先采用pad的操作,补齐输入图像,避免变形
本文,就是借鉴yolo
系列对输入图像前处理的一个操作,对不同大小的图像,先经过长边等比例resize
后,pad
到一样大小的尺寸。
具体的操作代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import xml.etree.ElementTree as ETdef parse_xml(path):tree = ET.parse(path)root = tree.findall('object')class_list = []boxes_list = []for sub in root:xmin = float(sub.find('bndbox').find('xmin').text)xmax = float(sub.find('bndbox').find('xmax').text)ymin = float(sub.find('bndbox').find('ymin').text)ymax = float(sub.find('bndbox').find('ymax').text)boxes_list.append([xmin, ymin, xmax, ymax])class_list.append(sub.find('name').text)return class_list, np.array(boxes_list).astype(np.int32)def letterbox(img, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True, stride=32):"""用于将输入的图像进行长边resize和填充,以满足一定的约束条件。函数的输入参数包括:im:输入的图像,可以是任意尺寸和通道数的numpy数组。new_shape:目标尺寸,可以是一个整数或一个元组。如果是一个整数,则表示将图像resize成一个正方形;如果是一个元组,则表示将图像resize成指定的宽度和高度。color:填充颜色,可以是一个整数或一个元组。如果是一个整数,则表示使用灰度值为该整数的像素进行填充;如果是一个元组,则表示使用RGB颜色值进行填充。auto:是否启用自动计算填充大小。如果为True,则会根据指定的stride值计算最小的填充大小,以满足长宽比和stride倍数的约束条件;如果为False,则会根据指定的scaleFill和scaleup参数计算填充大小。scaleFill:是否启用拉伸填充。如果为True,则会拉伸图像以填满目标尺寸;如果为False,则会根据指定的scaleup参数决定是否缩放图像。scaleup:是否允许放大图像。如果为True,则允许将输入图像放大到目标尺寸;如果为False,则只能将输入图像缩小到目标尺寸。stride:stride值,用于计算最小填充大小。"""# Resize image to a 32-pixel-multiple rectangle https://github.com/ultralytics/yolov3/issues/232shape = img.shape[:2] # current shape [height, width]if isinstance(new_shape, int):new_shape = (new_shape, new_shape)# Scale ratio (new / old)r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) # 短边ratioif not scaleup: # only scale down, do not scale up (for better test mAP)r = min(r, 1.0)# Compute paddingratio = r, r # width, height ratiosnew_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh paddingif auto: # minimum rectangledw, dh = np.mod(dw, 64), np.mod(dh, 64) # wh paddingelif scaleFill: # stretchdw, dh = 0.0, 0.0new_unpad = (new_shape[1], new_shape[0])ratio = new_shape[1] / shape[1], new_shape[0] / shape[0] # width, height ratiosdw /= 2 # divide padding into 2 sidesdh /= 2if shape[::-1] != new_unpad: # resizeimg = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR)top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))left, right = int(round(dw - 0.1)), int(round(dw + 0.1))img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add borderreturn img, ratio, (dw, dh)def main(imgPath, drawBox_flag = True):xmlPath = imgPath[:-3] + 'xml'print(xmlPath, imgPath)img = cv2.imread(imgPath)labels, boxes = parse_xml(xmlPath)print(labels, boxes)img2, ratio, pad = letterbox(img.copy(), new_shape=(512, 512), auto=False, scaleup=True)sample1 = img.copy() # origin imagesample2 = img2.copy() # after letterbox imageprint(sample1.shape, sample2.shape)if drawBox_flag:new_boxes = np.zeros_like(boxes)new_boxes[:, 0] = ratio[0] * boxes[:, 0] + pad[0] # pad widthnew_boxes[:, 1] = ratio[1] * boxes[:, 1] + pad[1] # pad heightnew_boxes[:, 2] = ratio[0] * boxes[:, 2] + pad[0]new_boxes[:, 3] = ratio[1] * boxes[:, 3] + pad[1]print(new_boxes)for box in boxes:cv2.rectangle(sample1, (box[0], box[1]), (box[2], box[3]), (255, 0, 0), 1)for box_n in new_boxes:cv2.rectangle(sample2, (box_n[0], box_n[1]), (box_n[2], box_n[3]), (0, 255, 0), 1)plt.subplot(121)plt.imshow(sample1)plt.subplot(122)plt.imshow(sample2)plt.show()# cv2.imwrite(r'F:\labelImg\1.jpg', sample1)# cv2.imwrite(r'F:\labelImg\2.jpg', sample2)if __name__ == '__main__':imgPath = r'F:\labelImg\catDog.jpg'main(imgPath, drawBox_flag=True)
展示结果如下:
上面图像的尺寸比较的大,超过了512大小。而低于小于512大小的图像,是如何的呢?
scaleup:是否允许放大图像。
- 如果为True,则允许将输入图像放大到目标尺寸;
- 如果为False,则只能将输入图像缩小到目标尺寸。
当scaleup=False
时,如下,可以发现,原始图像并没有被放大,而是直接pad
操作了。这是因为为scaleup=False
时,只能将输入图像缩小到目标尺寸,无法先放大操作:
而当scaleup=True
时,如下,就发现他是先放大,然后再进行pad操作:
可以发现,
scaleup
设定为False
时候,只会对大于new shape
的图像,进行缩放pad
;- 当为
True
时,就不在only scale down, do not scale up
了,适用的范围更广。注释里面说是为了better test mAP
。
相关文章:
yolo v5 中 letterbox对不规则矩形框的输入调整
在对数据或特征的处理中,为了避免输入图像或特征,经过resize等等操作,改变了目标特征的尺度信息,一般会引入一些操作,比如: 在特征维度,加入SPP(空间金字塔池化)&#x…...
STL是什么?如何理解STL?
文章目录 1. 什么是STL2. STL的版本3. STL的六大组件4. 如何学习STL5.STL的缺陷 1. 什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2. …...
【Spring篇】Spring IoC DI
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring系列】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 目录 前言一、IoC二、…...
Python语言例题集(010)
#!/usr/bin/python3 #在链表的末端插入新的节点。 class Node(): def init(self,dataNone): self.datadata self.nextNone class LinkedList(): def init(self): self.headNone def printList(self):ptrself.headwhile ptr:print(ptr.data)ptrptr.nextdef ending(self,newd…...
redis---主从复制
主从复制是指将一台redis服务器的数据复制到其他redis服务器,也叫主节点和从节点。 一个主节点可以有多个从节点。而每个从节点只能有一个主节点。数据的复制是单向的,只能由主节点到从节点。一般来说,主节点负责写操作,从节点负…...
搜索引擎-03-搜索引擎原理
拓展阅读 搜索引擎-01-概览 搜索引擎-02-分词与全文索引 搜索引擎-03-搜索引擎原理 Crawl htmlunit 模拟浏览器动态 js 爬虫入门使用简介 Crawl jsoup 爬虫使用 jsoup 无法抓取动态 js 生成的内容 Crawl WebMagic 爬虫入门使用简介 webmagic 全网搜索引擎架构与流程如何…...
mysql语句学习
SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; (先join在on) 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算&a…...
【Apache Doris】周FAQ集锦:第 1 期
【Apache Doris】周FAQ集锦:第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...
Windows创建远程线程学习
CreateRemoteThread是一个Windows API函数,它能够创建一个在其它进程地址空间中运行的线程; 下面来简单做一下,配合procexp工具; VC代码如下,我是写到一个菜单单击处理函数中, void CCrrmthView::OnMenuitem32771() {// TODO: Add your command handler code hereHAN…...
使用c语言libexpat开源库解析XML数据
1 libexpat简介 Expat 是一个用 C 语言编写的开源 XML 解析库,以其高性能和小巧的体积著称。Expat 兼容多种操作系统平台,包括但不限于 Windows、Linux、macOS 等。由于其跨平台特性和简单易用的API,Expat 成为了许多C/C程序员解析XML文档的…...
51单片机入门_江协科技_19~20_OB记录的笔记
19. 串口通讯 19.1. 串口介绍: •串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的…...
基于k8s的高性能综合web服务器搭建
目录 基于k8s的高性能综合web服务器搭建 项目描述: 项目规划图: 项目环境: k8s, docker centos7.9 nginx prometheus grafana flask ansible Jenkins等 1.规划设计整个集群的架构,k8s单master的集群环境&…...
Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件
Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件,同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载:Folder Icons for Mac v1.8 激活版 以下是这款软件的一…...
Gitee上传私有仓库
个人记录 Gitee创建账号 以KS进销存系统为例,下载到本地电脑解压。 新建私有仓库 仓库名称:ks-vue3,选择‘私有’ 本地配置 下载安装git配置git 第一次配置可以在本地目录右键【Open Git Bash here】输入【Git 全局设置】再输入【创…...
HTMLCSSJS
HTML基本结构 <html><head><title>标题</title></head><body>页面内容</body> </html> html是一棵DOM树, html是根标签, head和body是兄弟标签, body包括内容相关, head包含对内容的编写相关, title 与标题有关.类似html这种…...
第14章 数据结构与集合源码
一 数据结构剖析 我们举一个形象的例子来理解数据结构的作用: 战场:程序运行所需的软件、硬件环境 战术和策略:数据结构 敌人:项目或模块的功能需求 指挥官:编写程序的程序员 士兵和装备:一行一行的代码 …...
分享react+three.js展示温湿度采集终端
前言 气象站将采集到的相关气象数据通过GPRS/3G/4G无线网络发送到气象站监测中心,摆脱了地理空间的限制。 前端:气象站主机将采集好的气象数据存储到本地,通过RS485等线路与GPRS/3G/4G无线设备相连。 通信:GPRS/3G/4G无线设备通…...
易宝OA ExecuteSqlForDataSet SQL注入漏洞复现
0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForDataSet接口处存在SQL注入漏洞,未经身份认证的攻击者可以通过…...
C++语言学习(二)——⭐缺省参数、函数重载、引用
1.⭐缺省参数 (1)缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…...
qt通过setProperty设置样式表笔记
在一个pushbutton里面嵌套两个label即可,左侧放置图片label,右侧放置文字label,就如上图所示; 但是这时的hover,press的伪状态是没有办法“传递”给里面的控件的,对btn的伪状态样式表的设置,是不…...
Sora文本生成视频(附免费的专属提示词)
sora-时髦女郎 bike_1 Sara-潮汐波浪 Sora是一个由OpenAI出品的文本生成视频工具,已官方发布了生成视频的样式,视频的提示词是:A时髦的女人走在充满温暖霓虹灯的东京街道上动画城市标牌。她穿着黑色皮夹克、红色长裙和黑色靴子,拎着黑色钱包。她穿着太阳镜和红色唇膏。她走…...
Flask Python:数据库多条件查询,flask中模型关联
前言 在上一篇Flask Python:模糊查询filter和filter_by,数据库多条件查询中,已经分享了几种常用的数据库操作,这次就来看看模型的关联关系是怎么定义的,先说基础的关联哈。在分享之前,先分享官方文档,点击查看 从文档…...
Spring Security 实现后台切换用户
Spring Security version 后端代码: /*** author Jerry* date 2024-03-28 17:47* spring security 切换账号*/RestController RequiredArgsConstructor RequestMapping("api/admin") public class AccountSwitchController {private final UserDetailsSe…...
《QT实用小工具·一》电池电量组件
1、概述 项目源码放在文章末尾 本项目实现了一个电池电量控件,包含如下功能: 可设置电池电量,动态切换电池电量变化。可设置电池电量警戒值。可设置电池电量正常颜色和报警颜色。可设置边框渐变颜色。可设置电量变化时每次移动的步长。可设置…...
基于springboot实现墙绘产品展示交易平台管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现墙绘产品展示交易平台管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本墙绘产品展示交易平台就是在这样的大环境下诞生&…...
主流公链文章整理
主流公链文章整理 分类文章地址🍉BTC什么是比特币🥭BTCBTC网络是如何运行的🍑BTC一文搞懂BTC私钥,公钥,地址🥕ETH什么是以太坊🌶️基础知识BTC网络 vs ETH网络🥜CosmosCosmos介绍&a…...
css3之3D转换transform
css3之3D转换 一.特点二.坐标系三.3D移动(translate3d)1.概念2.透视(perpective)(近大远小)(写在父盒子上) 四.3D旋转(rotate3d)1.概念2.左手准则3.呈现(transfrom-style)(写父级盒子…...
SpringBoot -- 外部化配置
我们如果要对普通程序的jar包更改配置,那么我们需要对jar包解压,并在其中的配置文件中更改配置参数,然后再打包并重新运行。可以看到过程比较繁琐,SpringBoot也注意到了这个问题,其可以通过外部配置文件更新配置。 我…...
优酷动漫顶梁柱!神话大乱炖的修仙番为何火爆?
优酷动漫新晋顶梁柱,实时超160万在追的修仙番长啥样? 由优酷动漫联合玄机科技打造的《师兄啊师兄》俨然成为了国漫界一颗璀璨的新星。自去年开播以来热度口碑双丰收,今年在播的第二季人气更是节节攀升,稳坐优酷动漫榜第一把交椅。…...
每日一题:C语言经典例题之判断实数相等
题目: 从键盘输入两个正实数,位数不超过200,试判断这两个实数是否完全相等。注意输入的实数整数部分可能有前导0,小数部分可能有末尾0。 输入 输入两个正实数a和b。 输出 如果两个实数相等,则输出Yes,…...
涞水住房和城乡建设厅网站/网页设计模板
Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨艺艺子来源丨TechWeb(ID:TechWeb)1月13日消息,据国外媒体报道,美国当地时间周…...
上海定制网站建设公司哪家好/产品的推广及宣传思路
描述USB 总线引出两个首要的链表!一个 USB 总线引出两个首要 的链表,一个为 USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb device driver)和 …...
网站怎么做下载内容/seo搜索引擎优化平台
周四见 公开课系列We,知数堂习惯用实力介绍自己—我们只分享干货重磅福利来袭2018年5月24日,20:30-21:30 周四见不见不散!主讲嘉宾:叶金荣 知数堂联合创始人 & 3306π社区负责人 资深MySQL专家,Oracle M…...
做高端品牌网站/高端网站建设企业
1、引言 HitTest是命中测试的意思。在使用MFC编程的时候,在列表视图中通常会涉及到需要获取鼠标当前位置所对应的元素。这种通过光标位置来获得相应元素项的操作我们称之为命中测试。 2、获取光标位置 网上有人这样处理: DWORDdwPos ::GetMessagePos(…...
重庆 机械有限公司 沙坪坝网站建设/百度信息流广告位置
宽为限 紧用功 工夫到 滞塞通 使用mybatis框架时遇到的一个错误,记录一下 org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: jav…...
丽水品牌网站建设/北京网站推广机构
网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务网络层不提供服务质量承诺虚电路服务和数据报服务对比4.IP协议配套的4个协议地址解析协议ARP逆地址解析协议RARP网际控制报文协议ICMP网际组管理协议IGMP5.四种不同的中间设备(1)物理层…...