当前位置: 首页 > news >正文

YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注

YOLOv8半自动标注

目标检测半自动标注的优点包括:

1.提高标注效率:算法能够自动标注部分数据,减少了人工标注的工作量,节省时间和资源。
2.降低成本:自动标注可以减少人工标注的成本,特别是对于大规模数据集来说,人工标注成本非常昂贵。
3.提高标注的一致性和准确性:计算机算法可以提供相对准确的初始标注,人工验证和修正后,可以确保标注的一致性和准确性。
4.改善数据集的质量:通过自动标注和人工验证,可以更全面地标注数据集,提高数据集的质量和丰富性。

具体而言:

1.根据现有数据集,训练一个YOLOv8 模型;
2.使用 YOLOv8 模型对图片进行目标检测,得到目标检测的结果;
3.将目标检测的结果转换为 XML 文件格式,保存预测好的 XML 文件。

新建一个名为generateXml.py文件

import os
import cv2
import datetimeclass GenerateJpgAndXml:"""参数名含义:parentName:存放jpg和xml上一级文件夹名字,如person"""def __init__(self, parentName, labelDict):self.parentName = parentName# 存放所有文件的主文件夹路径self.parentPath = "./JpgAndXml"self.midPath = os.path.join(self.parentPath, self.parentName)# 存放jpg文件夹名字self.jpgName = "images"# 存放xml文件夹名字self.xmlName = "Annotations"# 存放标签的字典self.labelDict = labelDict# 第一次进来,需要判断下文件夹是否存在self.isExist()def isExist(self):# 存放jpg文件的文件夹self.jpgPath = os.path.join(self.midPath, self.jpgName)# 存放xml文件的文件夹self.xmlPath = os.path.join(self.midPath, self.xmlName)# 判断jpg和xml文件夹是否存在,不存在则创建for perPath in [self.jpgPath, self.xmlPath]:# 判断所在目录下是否有该文件名的文件夹if not os.path.exists(perPath):# 创建多级目录用mkdirs# print(f"创建成功,已创建文件夹{perPath}")os.makedirs(perPath)# else:# print(f"创建失败,已存在文件夹{perPath}"def generatr_xml(self, frame, result):# print('开始写xml')# 获取当前时间戳xmlPrefix = datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")# print(xmlPrefix)hwc = frame.shape# jpg名字jpgName = xmlPrefix + ".jpg"# jpg路径jpgPath = os.path.join(self.jpgPath, jpgName)# 写图片cv2.imwrite(jpgPath, frame)# xml路径xmlPath = os.path.join(self.xmlPath, xmlPrefix + ".xml")with open(xmlPath, 'w') as xml_file:xml_file.write('<annotation>\n')xml_file.write('\t<folder>' + self.parentName +'</folder>\n')xml_file.write('\t<filename>' + jpgName + '</filename>\n')xml_file.write('\t<path>' + jpgPath + '</path>\n')xml_file.write('\t<source>\n')xml_file.write('\t\t<database>' + 'Unknown' + '</database>\n')xml_file.write('\t</source>\n')xml_file.write('\t<size>\n')xml_file.write('\t\t<width>' + str(hwc[1]) + '</width>\n')xml_file.write('\t\t<height>' + str(hwc[0]) + '</height>\n')xml_file.write('\t\t<depth>'+str(hwc[2])+'</depth>\n')xml_file.write('\t</size>\n')xml_file.write('\t<segmented>0</segmented>\n')for re in result:ObjName = self.labelDict[re[0]]# [[0, 0.8, 110, 25, 150, 60], [1, 0.5, 40, 10, 50, 90]]xmin = int(re[2])ymin = int(re[3])xmax = int(re[4])ymax = int(re[5])xml_file.write('\t<object>\n')xml_file.write('\t\t<name>' + ObjName + '</name>\n')xml_file.write('\t\t<pose>Unspecified</pose>\n')xml_file.write('\t\t<truncated>0</truncated>\n')xml_file.write('\t\t<difficult>0</difficult>\n')xml_file.write('\t\t<bndbox>\n')xml_file.write('\t\t\t<xmin>' + str(xmin) + '</xmin>\n')xml_file.write('\t\t\t<ymin>' + str(ymin) + '</ymin>\n')xml_file.write('\t\t\t<xmax>' + str(xmax) + '</xmax>\n')xml_file.write('\t\t\t<ymax>' + str(ymax) + '</ymax>\n')# xml_file.write('\t\t\t<angle>' + str(4) + '</angle>\n')xml_file.write('\t\t</bndbox>\n')# xml_file.write('\t\t<extra/>\n')xml_file.write('\t</object>\n')xml_file.write('</annotation>')# customPrint(f"{jpgPath}的jpg和xml已写入")

新建名为yolov8_infer.py的文件,修改模型、标签名以及图片文件夹即可

from ultralytics import YOLO
from generateXml import GenerateJpgAndXml
import numpy as np
import os
import cv2# 加载yolov8模型
model = YOLO('runs/detect/train23/weights/best.pt',)
# 修改为自己的标签名
label_dict = {0: 'gray', 1: 'line', 2: 'black', 3: 'big_black'}
parent_name = label_dict[0]yolov8_xml = GenerateJpgAndXml(parent_name, label_dict)# 指定图片所在文件夹的路径
image_folder_path = 'data/images'# 获取文件夹中所有的文件名
file_names = os.listdir(image_folder_path)# 遍历每个文件
for file_name in file_names:# 判断是否是图片文件if file_name.endswith(('.jpg', '.jpeg', '.png', '.bmp', '.gif')):# 图片的完整路径image_path = os.path.join(image_folder_path, file_name)# 使用OpenCV读取图片img = cv2.imread(image_path)# Perform object detection on an image using the modelresults = model.predict(source=img,conf=0.1,max_det=300,iou=0.4,half=True,imgsz=640)# print(results)for result in results:xyxy = result.to("cpu").numpy().boxes.xyxyprint(result)# 假设 xyxy, conf 和 cls 分别是三个 NumPy 数组conf = result.to("cpu").numpy().boxes.confcls = result.to("cpu").numpy().boxes.clsconf_expanded = np.expand_dims(conf, axis=1)  # 在轴 1 上扩充cls_expanded = np.expand_dims(cls, axis=1)    # 在轴 1 上扩充xyxy = xyxy.astype(np.int32)# 使用 numpy.concatenate() 在轴 1 上拼接数组concatenated_array = np.concatenate((cls_expanded, conf_expanded, xyxy), axis=1)print(concatenated_array)yolov8_xml.generatr_xml(img, concatenated_array)print(concatenated_array)print('-'*50)

运行过程截图
在这里插入图片描述

相关文章:

YOLOv8教程系列:三、使用YOLOv8模型进行自定义数据集半自动标注

YOLOv8半自动标注 目标检测半自动标注的优点包括&#xff1a; 1.提高标注效率&#xff1a;算法能够自动标注部分数据&#xff0c;减少了人工标注的工作量&#xff0c;节省时间和资源。 2.降低成本&#xff1a;自动标注可以减少人工标注的成本&#xff0c;特别是对于大规模数据…...

AI聊天GPT三步上篮!

1、是什么&#xff1f; CHATGPT是OpenAI开发的基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构的聊天型人工智能模型。也就是你问它答&#xff0c;根据网络抓去训练 2、怎么用&#xff1f; 清晰表达自己诉求&#xff0c;因为它就是一个AI助手&#…...

如何彻底卸载VMware

目录 第一章、停止并卸载VMware程序1.1&#xff09;停止VMware有关的服务1.2&#xff09;打开任务管理器停止进程1.3&#xff09;卸载VMware程序 第二章、残留文件删除2.1&#xff09;打开注册表2.2&#xff09;删除注册表残留文件2.3&#xff09;C盘文件删除 友情提醒&#xf…...

[个人笔记] Windows配置NTP时间同步

Windows - 运维篇 第六章 Windows配置NTP时间同步 Windows - 运维篇系列文章回顾Windows配置NTP时间同步域控环境的NTP配置工作组环境的NTP配置Windows的CMD部分命令集 参考来源 系列文章回顾 第一章 迁移WinSrv系统到虚拟机 第二章 本地安全策略xcopy实现实时备份文件夹内容 …...

Jetson Docker 编译 FFmpeg 支持硬解nvmpi和cuvid

0 设备和docker信息 设备为NVIDIA Jetson Xavier NX&#xff0c;jetpack版本为 5.1.1 [L4T 35.3.1] 使用的docker镜像为nvcr.io/nvidia/l4t-ml:r35.2.1-py3,详见https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-ml 使用下列命令拉取镜像: sudo docker pull nvcr…...

某某某小说app接口抓包分析

详细说明查看原文 https://sdk.qzbonline.com/ver9/shuhuajs/sdk/ioszh_shuhuajs_conf.htmlhttps://sdk.qzbonline.com/prov8/ymqxs/sdk/ios_ymqxs_conf.htmlhttps://sdk.qzbonline.com/prov8/ymqxs/sdk/ios_ymqxs_conf2.htmlhttps://sdk.qzbonline.com/prov8/fqhyxs/sdk/iosz…...

开发一个RISC-V上的操作系统(四)—— 内存管理

目录 往期文章传送门 一、内存管理简介 二、Linker Script 链接脚本 三、动态分配内存 四、测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二…...

区块链:可验证随机函数

本篇主要介绍可验证随机函数的定义及其在区块链上的作用。 1 可验证随机函数 1.1 定义 可验证随机函数(Verifiable Random Function&#xff0c;VRF)本质上还是一类具有验证功能的伪随机函数。对于一个特定的输入 m m m以及输入者的私钥 S K SK SK&#xff0c;VRF会输出一个随…...

Flask中flask-session

Flask中flask-session Flask-Session是一个为Flask应用程序开发的工具&#xff0c;允许您轻松处理服务器端会话。会话是存储和追踪用户特定数据的方式。例如&#xff0c;当用户登录到应用程序时&#xff0c;他们的状态&#xff08;即登录状态&#xff09;可以保存在会话中&…...

react-Native init初始化项目报错”TypeError: cli.init is not a function“

文章目录 一、问题&#xff1a;二、解决&#xff1a; 一、问题&#xff1a; 在react-native init appDemo 创建项目时&#xff0c;报错TypeError: cli.init is not a function。 二、解决&#xff1a; 产生这个问题的原因是&#xff1a;使用这种方式创建工程&#xff0c;rea…...

【gitlib】linux系统rpm安装gitlib最新版本

目录 下载gitlib安装包 安装需要的依赖 设置开机启动 安装邮件服务器并设置开机启动 rpm执行安装gitlib 修改gitlib.rb文件的属性 修改完毕后执行更新配置 查看gitlib运行 查看gitlib初始化root密码 gitlib入口访问地址 下载gitlib安装包 Index of /gitlab-ce/yum/el7/…...

iOS开发-检查版本更新与强制更新控制

iOS开发-检查版本更新与强制更新控制。 在开发中经常遇到需要检查版本&#xff0c;检查版本及请求appstoreLookUrl查看版本号与当前的版本号进行比对&#xff0c;看是否需要更新。强制更新控制&#xff0c;是将获取到当前版本号传给服务端&#xff0c;服务端判断当前的版本是否…...

自动化运维工具——Ansible

自动化运维工具——Ansible 一、Ansible概述二、ansible 环境安装部署1.管理端安装 ansible2.ansible 目录结构3.配置主机清单4.配置密钥对验证 三、ansible 命令行模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9&a…...

W2NER详解

论文&#xff1a;https://arxiv.org/pdf/2112.10070.pdf 代码&#xff1a;https://github.com/ljynlp/W2NER 文章目录 W2NER介绍模型架构解码 源码介绍数据输入格式模型代码 参考资料 W2NER 介绍 W2NER模型&#xff0c;将NER任务转化预测word-word&#xff08;备注&#xff…...

ElementUI tabs标签页样式改造美化

今天针对ElementUI的Tabs标签页进行了样式修改&#xff0c;更改为如下图所属的样子。 在线运行地址&#xff1a;JSRUN项目-ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用&#xff0c;下面我也简单的贴上代码&#xff0c;代码没有注释&#xff0c;很抱歉&#x…...

出海周报|Temu在美状告shein、ChatGPT安卓版上线、小红书回应闪退

工程机械产业“出海”成绩喜人&#xff0c;山东相关企业全国最多Temu在美状告shein&#xff0c;跨境电商战事升级TikTok将在美国推出电子商务计划&#xff0c;售卖中国商品高德即将上线国际图服务&#xff0c;初期即可覆盖全球超200个国家和地区ChatGPT安卓版正式上线&#xff…...

2023年7月26日 单例模式

单例模式 饿汉模式 package com.wz.cinema.platform.server.util;public class DataManager {/*** 单例模式&#xff1a;整个类在运行中只会有一个实例* 既然是在运行中只有一个实例&#xff0c;那么就必须* 考虑多线程环境** 单例模式分为懒汉模式和饿汉模式* 饿汉模式本身就是…...

[ 容器 ] Docker 安全及日志管理

目录 Docker 容器与虚拟机的区别Docker 存在的安全问题Docker 架构缺陷与安全机制Docker 安全基线标准容器相关的常用安全配置方法限制流量流向镜像安全避免Docker 容器中信息泄露DockerClient 端与 DockerDaemon 的通信安全 容器的安全性问题的根源在于容器和宿主机共享内核。…...

游游的排列构造

示例1 输入 5 2 输出 3 1 5 2 4 示例2 输入 5 3 输出 2 1 4 3 5 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int n,k; int main(){scanf("%d%d",&n,&k);int xn-k1;int yn-k;int f1;for(int i1;i&l…...

拯救者Y9000K无线Wi-Fi有时不稳定?该如何解决?

由于不同品牌路由器的性能差异&#xff0c;无法完美兼容最新的无线网卡技术&#xff0c;在连接网络时&#xff08;特别是网络负载较大的情况下&#xff09;&#xff0c;可能会出现Wi-Fi信号断开、无法网络无法访问、延迟突然变大的情况&#xff1b;可尝试下面方法进行调整。 1…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...