yolov5半自动打标签(opencv版本),识别目标画框并将坐标信息保存在xml中

news/2024/5/19 16:29:20/文章来源:https://blog.csdn.net/qq_42754919/article/details/130385696

文章目录

    • 1.yolov5预训练模型推理
    • 2. opencv边缘检测
      • 结果展示

yolov5训练数据集时,需要对数据进行打标签,可以通过两种方法进行半自动化打标签。

1.yolov5预训练模型推理

yolov5预训练模型:将待打标签的图片输入预训练模型中进行推理,将推理结果保存在txt文件中,然后将txt文件转化为xml文件,最后导入labelimg中进行校准和校证。

具体txt转xml流程在本人之前的博客已经展示,链接如下;
https://blog.csdn.net/qq_42754919/article/details/129436134

上述方法需要有预训练模型,有一定的局限性,若首次训练模型,则无法使用。

针对上述问题,本博客提供了第二种方法。

2. opencv边缘检测

使用opencv进行边缘检测,然后找到外接矩形框,根据返回的坐标信息写入xml文件。

缺点:只能针对目标画一个完整的框,识别相互独立的物体,无法应对复杂场景。

import cv2
import os
from concurrent.futures import ThreadPoolExecutor
import timedict = ["dark"]def process_image(img_file, xml_path, anchor_img):img = cv2.imread(img_file)img_h, img_w, img_c = img.shapeimg_name = os.path.basename(img_file)print(img_name)HSV_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)b, g, r = cv2.split(HSV_img)ret, b = cv2.threshold(b, 95, 255, cv2.THRESH_BINARY_INV)'''cv2.imshow("img", b)cv2.waitKey(0)'''# ret, mask_img = cv2.threshold(img[:, :, 0], 95, 255, cv2.THRESH_BINARY_INV)contours, hierarchy = cv2.findContours(b, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)if len(contours) > 1:xml_file = xml_path + img_name.split(".")[0] + ".xml"xml = open((xml_file), 'w')xml.write('<?xml version="1.0" encoding="utf-8"?>\n')xml.write('<annotation>\n')for i in range(len(contours)):x, y, w, h = cv2.boundingRect(contours[i])if w * h > 150:ret = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite(anchor_img + img_name, ret)xml.write('    <folder>yolov5_img</folder>\n')xml.write('    <filename>' + str(img_name) + '</filename>\n')xml.write('    <path>' + str(img_file) + '</path>\n')xml.write('    <size>\n')xml.write('        <width>' + str(img_w) + '</width>\n')xml.write('        <height>' + str(img_h) + '</height>\n')xml.write('        <depth>' + str(img_c) + '</depth>\n')xml.write('    </size>\n')xml.write('    <object>\n')xml.write('         <name>' + str(dict[0]) + '</name>\n')xml.write('         <pose>Unspecified</pose>\n')xml.write('         <truncated>0</truncated>\n')xml.write('         <difficult>0</difficult>\n')xml.write('         <bndbox>\n')xml.write('            <xmin>' + str(int(x)) + '</xmin>\n')xml.write('            <ymin>' + str(int(y)) + '</ymin>\n')xml.write('            <xmax>' + str(int(x + w)) + '</xmax>\n')xml.write('            <ymax>' + str(int(y + h)) + '</ymax>\n')xml.write('          </bndbox>\n')xml.write('    </object>\n')# xml.close()xml = open((xml_file), 'a')xml.write('</annotation>')xml.close()def find_anchor(img_path, xml_path, anchor_img):img_files = [os.path.join(img_path, name) for name in os.listdir(img_path)]with ThreadPoolExecutor() as executor:for _ in executor.map(lambda x: process_image(x, xml_path, anchor_img), img_files):passif __name__ == '__main__':img_path = "D:/test/anchor_xml/img/"xml_path = "D:/test/anchor_xml/xml1/"anchor_img = "D:/test/anchor_xml/anchor_img/"if not os.path.isdir(xml_path):os.makedirs(xml_path)if not os.path.isdir(anchor_img):os.makedirs(anchor_img)start_time = time.time()find_anchor(img_path, xml_path, anchor_img)end_time = time.time()dura_time = (end_time - start_time) * 1000print("代码运行时间为:%.2f 毫秒" % dura_time)
  • 在代码种使用dict = [“dark”]表示物体的类别,使用统一打标签,需要手动更改标签的类型。若提前分好类别,一键打标签还是非常方便的。
  • 在代码中加入了线程池,速度更快。
  • 在代码中使用了if w * h > 150 : 判断识别物体的大小,因为findContours可能会画一些小框,用户可以根据自己的需求和数据集修改面积大小。

结果展示

在这里插入图片描述

  • anchor_img存放画框的图片
  • img存放原图
  • xml存放xml文件
    在这里插入图片描述xml文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<annotation><folder>yolov5_img</folder><filename>20230426094013124_0.bmp.jpg</filename><path>D:/test/anchor_xml/img/</path><source><database>Peaunt</database></source><size><width>1024</width><height>512</height><depth>3</depth></size><segmented>0</segmented><object><name>dark</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>533</xmin><ymin>137</ymin><xmax>571</xmax><ymax>175</ymax></bndbox></object><folder>yolov5_img</folder><filename>20230426094013124_0.bmp.jpg</filename><path>D:/test/anchor_xml/img/</path><source><database>Peaunt</database></source><size><width>1024</width><height>512</height><depth>3</depth></size><segmented>0</segmented><object><name>dark</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>533</xmin><ymin>10</ymin><xmax>571</xmax><ymax>49</ymax></bndbox></object>
</annotation>

labelimg打开如下所示:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入分析,Redis为什么这么快?

我们都知道Redis很快&#xff0c;它QPS可达10万&#xff08;每秒请求数&#xff09; Redis为什么这么快&#xff1f; 基于内存实现高效的数据结构合理的数据编码合理的线程模型虚拟内存机制 基于内存实现 我们都知道内存读写是比磁盘读写快很多的。Redis是基于内存存储实现的…

除了Figma,再给你介绍10款好用的协同设计软件

组织结构越来越复杂&#xff0c;团队中的每个人都有独特的技能、经验和专业知识。我们怎样才能让团队更好地合作&#xff1f;在这种情况下&#xff0c;协同设计应运而生。 UI的未来是协同设计&#xff01;如果你想把握未来的设计趋势&#xff0c;不妨从使用高效的协同设计软件…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷&#xff0c;Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具&#xff0c;设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大&#xff0c;因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…

一键免费部署你的私人 ChatGPT 网页应用

主要功能 在 1 分钟内使用 Vercel &#xff08;https://vercel.com/&#xff09;免费一键部署精心设计的 UI&#xff0c;响应式设计&#xff0c;支持深色模式极快的首屏加载速度&#xff08;~100kb&#xff09;海量的内置 prompt 列表&#xff0c;来自中文和英文自动压缩上下文…

【JavaScript】new命令精华总结

相关概念 对象是什么? 1.对象是单个实物的抽象 2.对象是一个容器&#xff0c;封装了属性和方法 属性是对象的状态&#xff0c;方法是对象的行为&#xff0c;把对象中的函数一般称为方法 构造函数 专门用来生成实例对象的函数&#xff0c;是对象的模板&#xff0c;第一个字…

C++入门基础知识[博客园长期更新......]

0.博客园链接 博客的最新内容都在博客园当中&#xff0c;所有内容均为原创(博客园、CSDN同步更新)。 C知识点集合 1.命名空间 在往后的C编程中&#xff0c;将会存在大量的变量和函数&#xff0c;因为有大量的变量和函数&#xff0c;所以C的库会非常多。那么在C语言编程中&a…

mysql数据库自动备份

前言 服务器中数据库的数据是最重要的东西,如果因为某些情况导致数据库数据错误,数据错乱或数据库崩溃,这时一定要及时的修复,但如果数据丢失或数据没法用了,这时就要回滚数据了,而这时就需要我们经常的备份数据库的数据 正文 一般别人都会推荐使用Navicat来备份和连接数据库…

常见的链表的OJ题

在本次的博客当中&#xff0c;为了巩固关于链表技能的运用&#xff0c;我们先来看一些与链表有关的OJ题。 &#x1f335;反转链表 题目详情如下&#xff1a; 第一道题目从逻辑上看不难&#xff0c;我们只需要将链表进行拆分&#xff0c;将我们下一个节点进行一个类似于头插的操…

无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...

职场套路多&#xff0c;一不小心就会掉坑&#xff0c;一位网友讲述了自己的遭遇&#xff1a; 今天被领导催促离职了&#xff0c;当时就是这个领导把他从别的公司挖过来。这家公司催得太急&#xff0c;为了投奔这里&#xff0c;他和上家的HR都闹翻了&#xff0c;上家总监挽留他&…

【信息安全案例】——身份与访问安全(学习笔记)

&#x1f4d6; 前言&#xff1a;一位用户对计算机信息资源的访问活动中&#xff0c;首先必须拥有身份标识&#xff0c;通过该标识鉴别该用户的身份&#xff0c;进一步地&#xff0c;用户还应当具有执行所请求动作的必要权限&#xff0c;系统会验证并控制其能否执行对资源试图完…

31-基于GA遗传算法的车辆充电调度系统优化matlab程序

资源地址&#xff1a; 主要内容&#xff1a; 研究多辆电动汽车的充电调度问题&#xff0c;考虑某时段区域范围内有M 辆电动汽车发出充电请求时&#xff0c;周围有N 个充电桩可以提供充电位的调度情况。把当前调度时段电动汽车和充电桩的基本数据加载到调度中心&#xff0c;调度…

华为OD机试真题(Java),旋转数组的最小数字(100%通过+复盘思路)

一、题目描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了[3,4,5,1,2]&#xff0c;或者[4,5,1,2,3]这样的。请问&#xf…

Linux系列讲解 —— SSH登录

讲解一下ssh远程登陆的基础知识。 目录 0. 基本原理1. 安装ssh程序&#xff1a;1.1 windows平台(Win10)1.2 Linux平台(Ubuntu18.04) 2. 密码方式远程登录3. 密钥方式远程登录3.1 生成私钥公钥对3.2 将公钥复制到远程机器3.3 尝试ssh远程登录 4. 常见问题4.1 sun192.168.1.21: P…

51单片机(四)静态数码管和动态数码管显示

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

HOG+SVM分类器实践

文章目录 HOGSVM分类器实践制作SVM分类器导入所需的库提取HOG特征读取正样本和负样本训练分类器定义主函数小结 测试SVM分类器相关疑问1. 提取HOG特征为什么不能彩色图像呢&#xff1f;2. 出现如下错误3. 测试代码中&#xff0c;当我传入100*100的图片时候&#xff0c;为什么im…

测试开发实战项目 | 搭建Pytest接口自动化框架

一、预研背景 目前系统研发多为前后端分离&#xff0c;当后端接口研发完成后&#xff0c;可以不依赖前端界面通过接口测试提前发现问题并解决。同时由于软件迭代周期不断缩短&#xff0c;开发新功能后又担心影响原有功能&#xff0c;可以通过接口自动化进行原有功能快速回归测…

git版本本地远程分支管理测试

只为搞清楚一些基本的git的本地提交、分支&#xff0c;远程分支的概念。 创建git库。 在本地首次建立一个001文件&#xff0c;首次提交到本地master&#xff0c;不提交&#xff08;push&#xff09;到远程master&#xff08;gitee&#xff09;。 add 增加001文件到库。 Git-co…

传统协议大比拼之IP协议

文章目录 一、引言二、IP协议的基本特点2.1 IP协议的作用和基本功能2.2 地址管理手动分配IP动态主机配置协议(DHCP)网络地址转换(NAT)IPv6 2.2 路由选择RIP(距离向量型的协议)OSPF(链路状态类型协议)BGP(边界网关协议) 2.3 IP协议的特点&#xff1a; 三、IP地址的组成3.1 IP地址…

三菱GX Works2梯形图程序分段显示设置的具体方法示例

三菱GX Works2梯形图程序分段显示设置的具体方法示例 大家平时在使用GX Works2进行梯形图程序编辑时,默认是一整段在一起,程序步数较多时查看起来不是那么方便,下面就和大家分享如何通过声明编辑来实现程序分段显示。 具体方法可参考以下内容: 如下图所示,打开GX Works2编…

知网导入EndNote

首先进入知网&#xff0c;搜索你想要找的期刊论文。 选择EndNote 点击导出 浏览器自动下载以txt为后缀的文件 导入到EndNote中