YOLO V8半自动标注工具设计

news2024/11/6 9:45:00

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

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 = r
        x1, x2 = x1 / w, x2 / w
        y1, y2 = y1 / h, y2 / h
        cx = (x1 + x2) / 2
        cy = (y1 + y2) / 2
        wi = 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 Path

dic = {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'] = None
    label_dict['imagePath'] = image_path
    label_dict['imageHeight'] = h
    label_dict['imageWidth'] = w
    label_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'] = None
        tmp['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'):
            continue
        labels = np.loadtxt(yolo_label_dir + fn + '.txt').reshape(-1, 5)
        if len(labels) < 1:
            continue
        labels[:, 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/w
            y1,y2=y1/h,y2/h
            cx=(x1+x2)/2
            cy=(y1+y2)/2
            wi=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.coloradmin.cn/o/2180538.html

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

相关文章

12.C++程序中的自定义函数

11.C程序中的常用函数-CSDN博客https://blog.csdn.net/fly_binbin/article/details/142643406上面说的是C程序中内置的一些函数&#xff0c;这些函数是由编译器提供的&#xff0c;可以方便大家的使用&#xff0c;但是很多时候&#xff0c;单纯的内置函数无法满足人们的需求&…

排序题目:重新排列后的最大子矩阵

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;重新排列后的最大子矩阵 出处&#xff1a;1727. 重新排列后的最大子矩阵 难度 7 级 题目描述 要求 给定一个大小为 m n \texttt{m} \times \tex…

第三方供应商不提供API接口?教你四步破解集成难题

API开放需求 在企业数字化转型过程中&#xff0c;异构系统之间的连接是信息化阶段不可或缺的一环。通过应用API&#xff0c;企业能够实现不同系统、平台和应用之间的数据交换与功能调用&#xff0c;从而形成端到端的业务流程协同。然而&#xff0c;很多企业在集成第三方供应商…

web应用合规(一)双因子认证2FA解决方案

文章目录 背景知识什么是2FA认证因子分类知识因素持有因素 解决方案密码 OTP密码 TOTP方案对比 参考文档后记 最近做海外项目&#xff0c;对合规方面的要求比较高&#xff0c;写一篇流水账来记录下 登录时的双因子认证过程&#xff0c;于是开启了2FA&#xff08;2 factor au…

CTF网络安全大赛_网安战队简历

CTF网络安全大赛 CTF比赛介绍 CTF&#xff08;Capture The Flag&#xff0c;中文&#xff1a;夺旗赛&#xff09;是网络安全领域中一种信息安全竞赛形式&#xff0c;起源于1996年。DEFCON全球黑客大会&#xff0c;代替了之前黑客们通过互相发起真实攻击进行技术比拼的方式。参…

Shopee虾皮店铺难出爆品?你可能忘了测款!

大部分Shopee虾皮卖家可能都经历过店铺销量一直平平无奇、较长时间出不了爆品的情况&#xff0c;明明做足了功课&#xff0c;为什么还会出现这种现象&#xff1f;那有可能是店铺运营没有明确的重点&#xff0c;太“雨露均沾”反而难以显著提升销量&#xff0c;应该对一个或部分…

西语中关于拆盲盒的表达是什么?柯桥西语口语培训

拆盲盒常常要靠运气。那么西语中有哪些相关的表达呢&#xff1f; 好运 buena suerte - tener &#xff08;buena&#xff09;suerte 最常用的形容“好运”的表达。可以说tener suerte de hacer algo&#xff0c;运气好而做成某事。 - ¡Vaya potra! / ¡Qu potra! 用…

兴业周报|十一黄金周即将到来~楼市利好政策重磅来袭

黄金地段&#xff1a;社区位于东三环核心位置&#xff0c;定位于CBD商务圈旁的纯居住区&#xff0c;容积率不足2.8&#xff0c;绿化率达到50%以上&#xff0c;树种超过80余种&#xff0c;实现“每个楼座都在园林中”的效果。 配套成熟&#xff1a;周边配套齐全&#xff0c;富力…

Error和Exception

1.异常体系结构 &#xff08;1&#xff09;Java把异常当作对象处理&#xff0c;定义一个基类java.lang.Throwable作为所有异常的超类。 &#xff08;2&#xff09;Java API中定义了许多异常类&#xff0c;这些异常类分为两大类&#xff0c;错误Error和异常Exception 2.什么是…

湿气缠身不用愁,拔罐疗法助你轻松“祛湿”!

在这个快节奏的时代&#xff0c;我们常常忽略了身体发出的微妙信号&#xff0c;其中&#xff0c;“湿气重”便是许多现代人面临的隐形健康挑战。湿气&#xff0c;中医理论中的一个重要概念&#xff0c;它像无形的枷锁&#xff0c;悄悄影响着我们的体态、精神状态乃至生活质量。…

react-问卷星项目(3)

项目实战 React Hooks 缓存&#xff0c;性能优化&#xff0c;提升时间效率&#xff0c;但是不要为了技术而优化&#xff0c;应该是为了业务而进行优化 内置Hooks保证基础功能&#xff0c;灵活配合实现业务功能&#xff0c;抽离公共部分&#xff0c;自定义Hooks或者第三方&am…

鸿蒙开发(NEXT/API 12)【穿戴设备信息查询】手机侧应用开发

// 在使用Wear Engine服务前&#xff0c;请导入WearEngine与相关模块 import { wearEngine } from kit.WearEngine; import { BusinessError } from kit.BasicServicesKit;查询穿戴设备是否支持某种WearEngine能力集 注意 该接口的调用需要在开发者联盟申请设备基础信息权限。…

Java 异常处理机制

目录 1.异常处理的五个关键字 测试一&#xff1a;理解try catch finally 的作用 测试二&#xff1a;设置想要捕获的异常类型 测试三&#xff1a;可以写多个catch。 2.异常快捷键 3.在方法体中抛出异常用throw&#xff1b;在方法参数后面抛出异常用throws &#xff08;1&…

Ubuntu 手动安装 ollama

官方linux安装ollama命令: curl -fsSL https://ollama.com/install.sh | sh 运行结果&#xff1a; 由于官方提供的ollama安装命令老是安装中断&#xff0c;所以我选择手动安装。 手动安装步骤&#xff1a; 官网链接&#xff1a;ollama/docs/linux.md at main ollama/ollama…

盛事启幕 | 第三届OpenHarmony技术大会重磅官宣,邀您共绘智联未来

未来已来&#xff0c;科技何向&#xff1f; ——10月12日-13日众多大咖齐聚上海 聚焦OpenHarmony生态前沿 与您一同解码技术的下一片蓝海

【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 timer驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "timer.h"int main(void) {H…

seata服务端部署

1.下载seata 官网下载地址&#xff1a;http://seata.io/zh-cn/blog/download.html 或者下载 作者已经下载的压缩包1.4.0 注意&#xff01;&#xff01;&#xff01; 要参考对应的版本&#xff0c;否则可能出现无法正常启动的情况。 参考文档 下载完毕后解压压缩文件 2.修改配…

6个Android ANR面试题和优化方案

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 面试题 1、 解释什么是ANR以及它在Android中是如何产生的&#xff1f; ANR是指应用程序未响应&#xff0c;通常是因为主线程被阻塞导致无法及…

【性能测试】jmeter工具核心组件说明手册

前言 Apache JMeter 是一个用于压力测试和性能测量的开源工具&#xff0c;它被设计用来测试静态和动态资源&#xff08;例如静态文件、CGI接口、Java 对象、数据库和 FTP 服务器&#xff09;&#xff0c;以及分析整体系统性能。JMeter提供了丰富的组件集&#xff0c;使得用户可…

国内邮件推送防拦截秘籍与内容优化技巧详解

企业需优化邮件内容、选择优质服务商、配置域名验证&#xff0c;避免垃圾邮件特征&#xff0c;控制发送频率和策略&#xff0c;以提高邮件送达率和用户互动率。ZohoCampaigns等平台提供多项功能助力邮件营销。 一、了解邮件拦截的常见原因 在讨论如何避免邮件被拦截之前&#…