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

news2024/10/7 11:23:15

文章目录

    • 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 time

dict = ["dark"]

def process_image(img_file, xml_path, anchor_img):

    img = cv2.imread(img_file)
    img_h, img_w, img_c = img.shape
    img_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):
            pass


if __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) * 1000
    print("代码运行时间为:%.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.coloradmin.cn/o/463641.html

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

相关文章

实现PXE批量网络装机及kickstrat无人值守安装(富士山终究留不住欲落的樱花)

一、PXE概述和部署PXE批量装机 1.PXE简介 PXE&#xff08;预启动执行环境&#xff0c;在操作系统之前运行&#xff09;是由Intel公司开发的网络引导技术&#xff0c;c/s架构&#xff0c;允许客户机通过网络从远程服务器下载引导镜像&#xff0c;并加载安装文件或者整个操作系统…

2023_8.0.33版windows版MySql安装_配置远程连接_修改设置初始密码---MySql工作笔记0001

MySQL :: Download MySQL Community Server https://dev.mysql.com/downloads/mysql/ 首先去下载mysql 可以看到这里下载第一个就可以了,最新版的8.0.33 这里点击仅仅下载 just start my download 然后解压到一个文件夹,然后配置一下环境变量 然后新建一个my.ini文件 然后把…

ubuntu22.04下挂载第二块硬盘

文章目录 一、查看硬盘情况二、找到nvme1n1三、挂载四、修改分区文件 一、查看硬盘情况 首先要查看一下系统识别出来的设备。也就是说&#xff0c;我希望知道&#xff0c;ubuntu到底发现了几块硬盘。用命令&#xff1a;lsblk 显示结果如下&#xff1a; 有两块硬盘&#xff1a…

Win11打开移动热点后电脑无法上网怎么办?

Win11打开移动热点后电脑无法上网怎么办&#xff1f;有用户将自己的电脑开启移动热点来使用的时候&#xff0c;发现自己的电脑出现了无法上网的情况。那么为什么开启热点之后&#xff0c;就会无法进行上网呢&#xff1f;来看看以下的解决方法分享吧。 Win11打开移动热点无法上网…

virtual kubelet 简单使用例子

virtual kubelet 简单使用例子 实现过程制作virtual kubelet节点证书下载virtual kubelet代码并编译virtual kubelet virtual kubelet 顾名思义就是虚拟的kubelet节点 效果如下&#xff1a; 实现过程 制作virtual kubelet节点证书 openssl genrsa -out client.key 2048 opens…

EPICS aSub记录使用实例

本实例描述了在数据库中如何使用aSub记录 本实验中使用了三个k型热电偶&#xff0c;一个3路k型热电偶变送器以及一个串口服务器&#xff1a; 温度变送器参数&#xff1a; 串口服务器&#xff1a; 1) 用makeBaseApp.pl构建IOC应用程序的目录结构&#xff1a; [blctrllocalhost…

OpenGL入门教程之 摄像机

引言 前面的教程中我们讨论了观察矩阵以及如何使用观察矩阵移动场景。OpenGL本身没有摄像机的概念&#xff0c;但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机&#xff0c;这样感觉就像我们在移动&#xff0c;而不是场景在移动。  本节我们将会讨论如何…

从零开始学架构——高可用存储架构

双机架构 存储高可用方案的本质都是通过将数据复制到多个存储设备&#xff0c;通过数据冗余的方式来实现高可用&#xff0c;其复杂性主要体现在如何应对复制延迟和中断导致的数据不一致问题。因此&#xff0c;对任何一个高可用存储方案&#xff0c;我们需要从以下几个方面去进…

【MySQL】一个脚本启动MySQL 8.0并初始化数据库

引 很多情况下需要在客户端发布时发布 MySQL 数据库&#xff0c;这种发布方式虽然存在文件资源较大、易出错等缺点&#xff0c;但是却可以让桌面产品的发布更加完整。 本文将阐述如何使用一个脚本启动并初始化 MySQL 8.0 的方法&#xff0c;涵盖数据库下载、脚本源码、测试及…

PFSK162 3BSE015088R1通常都要做空载全电压合闸冲击试验

​ PFSK162 3BSE015088R1通常都要做空载全电压合闸冲击试验 变压器励磁涌流影响的保护整定 摘要&#xff1a;在大型变压器空栽冲击过程中&#xff0c;由于励磁涌流和负序电压的存在&#xff0c;如果定值整定不得当&#xff0c;会导致差动保护&#xff0c;复压过流保护等误动作&…

设计模式——组件协作模式之观察者模式

文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案&#xff0c;最朴素的方式②、第二种方案&#xff0c;重构使得遵循DIP原则&#xff1a;③、进一步的小优化&#xff1a;④、修改使得支持多个观察者&#xff1a; 4、结…

028:Mapbox GL 绘制线段,实时测量长度距离值

第028个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加draw组件,绘制线段,编辑线段,实时显示长度值。这里使用turf来计算长度值,采用默认的单位千米。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代…

Elasticsearch:Standard Text Analyzer - 标准文本分析器

Elasticsearch 提供了超过很多开箱即用的分析器&#xff0c;我们可以在文本分析阶段使用它们。 这些分析器很可能足以满足基本情况&#xff0c;但如果需要创建自定义分析器&#xff0c;可以通过使用构成该模块的所需组件实例化一个新的分析器模块来实现。 下表列出了 Elasticse…

SuSE linux server 11通过SAP来安装oracle11g

这里安装通过xmanager4进行安装&#xff0c;之前文章已经说了怎么通过xmanager4来连接linux系统&#xff0c;这里说一下安装oracle11g。 我这里是通过sap来安装oracle11g&#xff0c;所以需要 export LD_LIBRARY_PATH/oracle/P90/112_64/lib/:/sapmnt/P90/exe/ 同时在orap90用…

Mac使用命令行工具解压和压缩rar文件

目前在Mac电脑里支持解压缩的格式主要有&#xff1a;zip、gz等&#xff0c;但是还不支持rar格式的文件&#xff0c;接下来带着大家学习一下如何解压缩rar格式文件。 1.下载rar工具 打开&#xff1a;https://www.rarlab.com/download.htm 根据自己电脑的芯片要求选择自己的安装…

马云的创业故事及他人生中的摆渡人-卖掉中国黄页去北漂(四)

马云上京&#xff0c;是在外经贸部一位名叫王建国的朋友牵线之下&#xff0c;受邀担任外经贸部下属的中国国际电子商务中心&#xff08;下面简称EDI&#xff09;总经理&#xff0c;负责搭建外经贸部官网和网上中国商品交易市场。 马云团队在潘家园租了房子&#xff0c;白天上班…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上&#xff0c;具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量&#xff0c;更能有效减少代码维护成本&#xff0c;促进团队协作和项目成功。因此&#xff0c;编写高质量代码对程序员来…

妙记多「我的主页」升级,日历聚合任务待办,为你打造个人时间管理系统⏰

我们应该如何处理“日程”和“待办”的关系&#xff1f; 日程和待办的区别与联系 从字面意义上来理解&#xff0c;日程是这一天的安排&#xff0c;待办是需要去完成的事情&#xff0c;日程与待办本质上是一种相互包含的关系。将所有事情都视作待办显然是不科学的&#xff0c;那…

二叉树的非递归遍历

目录 前言&#xff1a; 一&#xff1a;前序遍历 二&#xff1a;中序遍历 三&#xff1a;后序遍历 四&#xff1a;层序遍历 前言&#xff1a; 二叉树的非递归遍历需要借助栈和队列以及二叉树的一些基础接口&#xff0c;这些在之前的文章中有讲过&#xff0c;这里就不赘述&…

SSD目标检测

数据集以及锚框的处理 数据集&#xff1a; 图像&#xff1a;&#xff08;batch_size , channel , height , width&#xff09; bounding box: &#xff08;batch_size , m , 5&#xff09; m: 图像中可能出现的最多边界框的数目 5&#xff1a; 第一个数据为边界框对应的种…