YOLO V8半自动标注工具设计

前提:
对于某些边界不明确的小目标,要是目标由比较多的话,标注起来就会非常麻烦。
如何利用已有训练模型,生成框,进行预标注。再通过调节预标注框的方式,提高标注的效率。

1 通过预先训练的模型生成yolo 格式的框


image_absolute_path = "yyy_test/img/L206_20240516101319_2_20240516101319_N49_2.jpg"
# Load the YOLOv8 model#
model = YOLO('./runs/detect/train4080/26/last.pt')  # 4080
# Open the video file
image = cv.imread(image_absolute_path, 1)
results = model.predict(image_absolute_path, imgsz=640, show=True)
shape = image.shape
# float_rect[0] *= shape[1]
# float_rect[1] *= shape[0]
# float_rect[2] *= shape[1]
# float_rect[3] *= shape[0]
filename = image_absolute_path.replace('jpg', 'txt')  # 将path里的json替换成txt,生成txt里相对应的文件路径
w = shape[1]
h = shape[0]
fh = open(filename, 'w', encoding='utf-8')
all_line = ''
results[0].plot()
for result in results:for r in result.boxes.data.tolist():x1, y1, x2, y2, score, class_id = rx1, x2 = x1 / w, x2 / wy1, y2 = y1 / h, y2 / hcx = (x1 + x2) / 2cy = (y1 + y2) / 2wi = abs(x2 - x1)hi = abs(y2 - y1)line = "%s %.4f %.4f %.4f %.4f\n" % (class_id, cx, cy, wi, hi)  # 生成txt文件里每行的内容all_line += line
fh.write(all_line)

yolo .txt 格式的框
在这里插入图片描述

2 将yolo 格式 转换为labelme 格式

import cv2
import os
import json
import shutil
import numpy as np
from pathlib import Pathdic = {0: 'NVshaoxi', 1: "Nqiaoqi", 2: 'Nqiaojie',3: 'N_pianyi',4: "N_yiwu" ,\5: 'NVshaoxi', 6: "NVqiaoqi", 7: 'NVqiaojie',8: 'NV_pianyi',9: "NV_yiwu"}
def xyxy2labelme(labels, w, h, image_path, save_dir='res/'):save_dir = str(Path(save_dir)) + '/'if not os.path.exists(save_dir):os.makedirs(save_dir)label_dict = {}label_dict['version'] = '5.0.1'label_dict['flags'] = {}label_dict['imageData'] = Nonelabel_dict['imagePath'] = image_pathlabel_dict['imageHeight'] = hlabel_dict['imageWidth'] = wlabel_dict['shapes'] = []for l in labels:tmp = {}tmp['label'] = dic[int(l[0])]tmp['points'] = [[l[1], l[2]], [l[3], l[4]]]tmp['group_id'] = Nonetmp['shape_type'] = 'rectangle'tmp['flags'] = {}label_dict['shapes'].append(tmp)fn = save_dir + image_path.rsplit('.', 1)[0] + '.json'with open(fn, 'w') as f:json.dump(label_dict, f)def yolo2labelme(yolo_image_dir, yolo_label_dir, save_dir='res/'):yolo_image_dir = str(Path(yolo_image_dir)) + '/'yolo_label_dir = str(Path(yolo_label_dir)) + '/'save_dir = str(Path(save_dir)) + '/'image_files = os.listdir(yolo_image_dir)for iimgf, imgf in enumerate(image_files):print(iimgf + 1, '/', len(image_files), imgf)fn = imgf.rsplit('.', 1)[0]shutil.copy(yolo_image_dir + imgf, save_dir + imgf)image = cv2.imread(yolo_image_dir + imgf)h, w = image.shape[:2]if not os.path.exists(yolo_label_dir + fn + '.txt'):continuelabels = np.loadtxt(yolo_label_dir + fn + '.txt').reshape(-1, 5)if len(labels) < 1:continuelabels[:, 1::2] = w * labels[:, 1::2]labels[:, 2::2] = h * labels[:, 2::2]labels_xyxy = np.zeros(labels.shape)labels_xyxy[:, 0] = np.clip(labels[:, 0], 0, 20)labels_xyxy[:, 1] = np.clip(labels[:, 1] - labels[:, 3] / 2, 0, w)labels_xyxy[:, 2] = np.clip(labels[:, 2] - labels[:, 4] / 2, 0, h)labels_xyxy[:, 3] = np.clip(labels[:, 1] + labels[:, 3] / 2, 0, w)labels_xyxy[:, 4] = np.clip(labels[:, 2] + labels[:, 4] / 2, 0, h)xyxy2labelme(labels_xyxy, w, h, imgf, save_dir)print('Completed!')if __name__ == '__main__':yolo_image_dir = 'E:/pythonCode/pythonProject1/yyy_test/img/'yolo_label_dir = 'E:/pythonCode/pythonProject1/yyy_test/txt/'save_dir ='E:/pythonCode/pythonProject1/res/'yolo2labelme(yolo_image_dir, yolo_label_dir, save_dir)

labelme 的 .json格式
在这里插入图片描述

3 用labelme 微调标注框

将刚才生成的与图片名称相同的后缀为.json 的文件和图片放在同一个目录下,然后用labelme 打开该dir。
在这里插入图片描述

4 再将labelme 格式的数据变为yolo 格式,加入训练

import json
import cv2
import numpy as np
import os
def json2yolo(path):# dic={'N_shaoxi':'0',   'N_qiaoqi':'1',   'N_qiaojie':'2',   'N_pianyi':'3',   'N_yiwu': '4', \#      'NV_shaoxi': '5', 'NV_qiaoqi': '6', 'NV_qiaojie': '7', 'NV_pianyi': '8', 'NV_yiwu': '9',\#      'R_shaoxi': '10',  'R_qiaoqi': '11',  'R_qiaojie': '12',  'R_pianyi': '13',  'R_yiwu': '14',\#      'XS_shaoxi': '15', "XS_qiaoqi": '16', 'XS_qiaojie': '17', 'XS_pianyi': '18', 'XS_yiwu': '19',#      '1': '0'}dic={'N_shaoxi':'0',   'N_qiaoqi':'1',   'N_qiaojie':'2',   'N_pianyi':'3',   'N_yiwu': '4', \'NV_shaoxi': '5', 'NV_qiaoqi': '6', 'NV_qiaojie': '7', 'NV_pianyi': '8', 'NV_yiwu': '9',\'R_shaoxi': '10',  'R_qiaoqi': '11',  'R_qiaojie': '12',  'R_pianyi': '13',  'R_yiwu': '14',\'XS_shaoxi': '15', "XS_qiaoqi": '16', 'XS_qiaojie': '17', 'XS_pianyi': '18', 'XS_yiwu': '19','XP_shaoxi': '15', "XP_qiaoqi": '16', 'XP_qiaojie': '17', 'XP_pianyi': '18', 'XP_yiwu': '19'}#dic = {'N_shaoxi': '0', 'N_shaoxi': '1','N_qiaojie': '2','N_pianyi':'3','N_yiwu:'4'}  # 类别字典if ".json" in path:data = json.load(open(path,encoding="utf-8"))#读取带有中文的文件w=data["imageWidth"]#获取jaon文件里图片的宽高h=data["imageHeight"]all_line=''for i in  data["shapes"]:#归一化坐标点。并得到cx,cy,w,h[[x1,y1],[x2,y2]]=i['points']x1,x2=x1/w,x2/wy1,y2=y1/h,y2/hcx=(x1+x2)/2cy=(y1+y2)/2wi=abs(x2-x1)hi=abs(y2-y1)#将数据组装成yolo格式line="%s %.4f %.4f %.4f %.4f\n"%(dic[i['label']],cx,cy,wi,hi)#生成txt文件里每行的内容all_line+=line# print(all_line)filename = path.replace('json','txt')#将path里的json替换成txt,生成txt里相对应的文件路径fh = open(filename,'w',encoding='utf-8')fh.write(all_line)fh.close()else:filename = path.replace('.jpg', '.txt')  # 将path里的json替换成txt,生成txt里相对应的文件路径fh = open(filename, 'w', encoding='utf-8')fh.close()path= "E:/919XP/" # /
path_list_sub = os.listdir(path)
print("path_list_sub", path_list_sub)
for path_sub in path_list_sub:json_path_list =os.listdir(path+path_sub)path_list2=[x for x in json_path_list]#获取所有json文件的路径# path_list2 = [x for x in json_path_list if ".json" in x]  # 获取所有json文件的路径print("len of path_list2 ",path_sub,len(path_list2))for p in path_list2:absolute_path= (path+path_sub+'/'+p)print("abs path",absolute_path)json2yolo(path+path_sub+'/'+p)

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

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

相关文章

一文上手SpringSecurity【七】

之前我们在测试的时候,都是使用的字符串充当用户名称和密码,本篇将其换成MySQL数据库. 一、替换为真实的MySQL 1.1 引入依赖 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</v…

Jenkins Pipeline 中通过勾选参数来控制是否构建 Docker 镜像

1.定义参数&#xff1a; 使用 booleanParam 定义一个布尔参数&#xff0c;示例如下 booleanParam(name: BUILD_DOCKER, description: 是否构建Docker镜像, defaultValue: false)2.使用参数&#xff1a; 在 stage 中&#xff0c;根据参数的值决定构建方式&#xff1a; stage(编…

python基础库

文章目录 1.研究目的2.platform库介绍3.代码4.结果展示 1.研究目的 最近项目中需要利用python获取计算机硬件的一些基本信息,查阅资料,.于是写下这篇简短的博客,有问题烦请提出,谢谢-_- 2.platform库介绍 platform 库是 Python 的一个内置库&#xff0c;可以让我们轻松地获取…

spring boot 项目中redis的使用,key=value值 如何用命令行来查询并设置值。

1、有一个老项目&#xff0c;用到了网易云信&#xff0c;然后这里面有一个AppKey&#xff0c;然后调用的时候要在header中加入这些标识&#xff0c;进行与服务器进行交互。 2、开发将其存在了redis中&#xff0c;一开始的时候&#xff0c;我们测试用的老的key&#xff0c;然后提…

ValueError: Out of range float values are not JSON compliant

可能原因一 可能原因二 数据里面有NaN

低代码革命:重塑工业互联网的未来版图

在数字化转型的浪潮中&#xff0c;低代码应用正以前所未有的速度席卷各行各业&#xff0c;尤其是在工业互联网领域&#xff0c;它正悄然改变着企业的技术架构和业务模式。本文将深入探讨低代码应用如何成为工业互联网的技术趋势&#xff0c;并展望其未来的辉煌前景&#xff0c;…

算法: 滑动窗口题目练习

文章目录 滑动窗口长度最小的子数组无重复字符的最长子串最大连续1个个数 III将x减到0的最小操作数水果成篮找到字符串中所有字母异位词串联所有单词的子串最小覆盖子串 总结 滑动窗口 长度最小的子数组 做这道题时,脑子里大概有个印象,知道要用滑动窗口,但是对于滑动窗口为什…

2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序

2016年国赛高教杯数学建模 D题风电场运行状况分析及优化 风能是一种最具活力的可再生能源&#xff0c;风力发电是风能最主要的应用形式。我国某风电场已先后进行了一、二期建设&#xff0c;现有风机124台&#xff0c;总装机容量约20万千瓦。请建立数学模型&#xff0c;解决以下…

探索私有化聊天软件:即时通讯与音视频技术的结合

在数字化转型的浪潮中&#xff0c;企业对于高效、安全、定制化的通讯解决方案的需求日益迫切。鲸信&#xff0c;作为音视频通信技术的佼佼者&#xff0c;凭借其强大的即时通讯与音视频SDK&#xff08;软件开发工具包&#xff09;结合能力&#xff0c;为企业量身打造了私有化聊天…

MySQL Mail服务器集成:如何配置发送邮件?

MySQL Mail插件使用指南&#xff1f;怎么优化 MySQL发邮件性能&#xff1f; MySQL Mail服务器的集成&#xff0c;使得数据库可以直接触发邮件发送&#xff0c;极大地简化了应用架构。AokSend将详细介绍如何配置MySQL Mail服务器&#xff0c;以实现邮件发送功能。 MySQL Mail&…

极狐GitLab 17.4 重点功能解读【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …

bash使用注意事项

注意事项 在 Bash 脚本中&#xff0c;变量的取值、赋值和定义有一些注意事项&#xff0c;下面列出了一些关键点&#xff1a; 1. 变量赋值 没有空格&#xff1a;在赋值时&#xff0c;等号 前后不能有空格。例如&#xff1a; my_varvalue # 正确 my_var value # 错误字符限…

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…

Kuebernetes 群集基于 Docker 部署

Kuebernetes 群集基于 Docker 部署 实验报告资源列表基础环境一、准备 Docker1、安装 Docker 二、安装 Kubeadm 工具1、配置 yum 源2、安装 Kubeadm 工具 三、初始化 Master 节点1、配置 Master 节点2、常见故障 四、Node 节点加入集群五、部署网络插件&#xff08;CNI&#xf…

java网络编程知识点,以及面试常被问的知识点

Java网络编程详解 Java网络编程是Java编程语言中用于实现网络通信的功能&#xff0c;它允许Java应用程序之间以及Java应用程序与其他类型的网络应用程序&#xff08;如Web服务器、数据库服务器等&#xff09;之间进行数据交换。以下是Java网络编程的详细讲解&#xff0c;包括常…

K8S服务发布

一 、服务发布方式对比 二者主要区别在于&#xff1a; 1、部署复杂性&#xff1a;传统的服务发布方式通常涉及手动配置 和管理服务器、网络设置、负载均衡等&#xff0c;过程相对复 杂且容易出错。相比之下&#xff0c;Kubernetes服务发布方式 通过使用容器编排和自动化部署工…

请用rust+Diesel+actix-web+javascript+html5写一个问题记录的页面

要创建一个使用Rust、Diesel、JavaScript和HTML5的问题记录小系统&#xff0c;我们可以按照以下步骤进行&#xff1a; 设置后端服务器和数据库 使用Rust和Diesel来设置后端服务器和数据库。首先&#xff0c;安装Rust和相关的依赖包&#xff0c;然后创建一个新的Rust项目&…

安卓简易权限调用

EasyPermission 简易权限调用 功能&特性 1、自动判断权限所在的请求周期&#xff0c;自动回调 从未请求&#xff0c;调用ActivityCompat.requestPermissions。仅被拒绝&#xff0c;请求权限任意次&#xff0c;但每次都拒绝&#xff0c;调用ActivityCompat.requestPermis…

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…