【保姆级教程】YOLOv8自动数据标注

一、YOLOV8环境准备

1.1 下载安装最新的YOLOv8代码

 仓库地址: https://github.com/ultralytics/ultralytics

1.2 配置环境

  pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 安装labelme标注工具

 pip install labelme

二、半自动标注

2.1 下载预训练权重yolov8n.pt

仓库:https://github.com/ultralytics/ultralytics
在YOLOv8 github上下载预训练权重:yolov8n.pt,ultralytics\ultralytics\路径下,新建weights文件夹,预训练权重放入其中。
在这里插入图片描述

2.2 下载预训练权重ViT-B SAM model

仓库:https://github.com/facebookresearch/segment-anything?tab=readme-ov-file
在SAM github上下载预训练权重:ViT-B SAM model将下载的权重重命名为sam_b.pt(包括文件后缀),放入ultralytics\ultralytics\weights文件夹,预训练权重放入其中。
在这里插入图片描述

2.3 自动标注

执行下面代码:(建议使用绝对路径)

from ultralytics.data.annotator import auto_annotate

auto_annotate(data='D:/study/cnn/yolo/ultralytics/ultralytics/assets', det_model='D:/study/cnn/yolo/ultralytics/weights/yolov8n.pt', sam_model='D:/study/cnn/yolo/ultralytics/weights/sam_b.pt')

查看ultralytics\assets_auto_annotate_labels路径下,生成的txt格式标签
在这里插入图片描述

三、标签文件可视化

3.1 txt标签转json标签

执行下面代码:(建议使用绝对路径)
在这里插入图片描述

import torch
import numpy as np
import base64, os
from PIL import Image
import io
import json

def xyn2xyxy(x):
    # Convert nx4 boxes from [x, y, w, h] to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right
    x = [ar.reshape(-1, 2) for ar in x]

    return x

def txt2points(txtfile_path):
    cls, xywh_list = [], []
    with open(txtfile_path, "r") as f:
        for line in f.readlines():
            line = line.strip('\n').split(' ')  # 去掉列表中每一个元素的换行符
            cls.append(line[0])
            xywh_list.append(line[1:])

    return cls, xywh_list


def savejson(points_list, clses_list, img_tmp, filename, save_dir, w, h):
    cur_json_dict = {
        "version": "5.1.1",
        "flags": {},
        "shapes": [
        ],
    }

    listbigoption = []
    for cls, points in zip(clses_list, points_list):
        points = np.array(points, dtype=float).reshape(-1, 2)
        points[:, 0] = points[:, 0] * w
        points[:, 1] = points[:, 1] * h

        cur_json_dict['shapes'].append(
            {"label": cls, "points": points.tolist(), "group_id": None,
             "shape_type": "polygon", "flags": {}})

    # A['imageData'] = base64encode_img(img_tmp)

    cur_json_dict["imageData"] = None
    cur_json_dict["imageHeight"] = h
    cur_json_dict["imageWidth"] = w
    
    # 图像文件的相对路径
    cur_json_dict['imagePath'] = "..//assets//" + filename

    suffix = os.path.splitext(filename)[-1]
    with open(save_dir + "/" + filename.replace(suffix, ".json"), 'w', encoding='utf-8') as f:
        f.write(json.dumps(cur_json_dict, indent=4, separators=(',', ':')))
        # json.dump(A, f, indent=2, ensure_ascii=False)


def txt2json_main():
    img_dir = r'D:/study/cnn/yolo/ultralytics/ultralytics/assets'
    txt_dir = r'D:/study/cnn/yolo/ultralytics/ultralytics/assets_auto_annotate_labels'
    save_dir = r'D:/study/cnn/yolo/ultralytics/ultralytics/assets'
    

    for imgfile in os.listdir(img_dir):
        print(imgfile)
        name, suffix = os.path.splitext(imgfile)
        txtfile = imgfile.replace(suffix, '.txt')
        txt_path = os.path.join(txt_dir, txtfile)
        if not os.path.isfile(txt_path):
            continue
        img_path = os.path.join(img_dir, imgfile)
        img = Image.open(img_path)
        w, h = img.size
        cls, xyxy = txt2points(txt_path)
        # print(cls)
        # print(xyxy)
        # print()
        savejson(xyxy, cls, img, imgfile, save_dir, w, h)
if __name__ == '__main__':
    txt2json_main()

查看生成结果
在这里插入图片描述

3.2 使用labelme工具进行可视化

在这里插入图片描述

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

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

相关文章

【操作系统】用户态和内核态

用户态和内核态指的是程序运行时处于状态,在不同时候处于的状态可能会不同。 操作系统为了保护自己而进行严格控制用户资源的访问,不需要外部资源的程序运行状态为用户态,反之需要内核操作资源时为内核态。 用户态到内核态时需要申请外部资源…

Beans模块之工厂模块BeanNameAware

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

【剑指offr--C/C++】JZ23 链表中环的入口结点 与哈希表

一、哈希表(unordered_set)知识点 unordered_set是一种无序的数据集合容器,元素和键同时存在,元素没有按任何特定的顺序排序,而是根据它们的散列(hash)值组织成桶,以允许直接通过值…

QT作业day3

1、使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是…

基于Springboot的狱内罪犯危险性评估系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的狱内罪犯危险性评估系统的设计与实现(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller&#…

外包干了10天,技术倒退明显

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近6年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

金融投贷通--接口测试分析、设计与实现

金融投贷通--接口测试分析、设计与实现 接⼝相关理论ui功能测试和接⼝测试那个先执⾏ui功能测试与接⼝测试的区别ui功能测试和接⼝测试那个更⾼效 投资业务接⼝接口测试流程如何测试分析api文档项目难点 测试点提取注册图⽚验证码、注册验证码注册登录测试点开通登录测试点开通…

C++ 动态规划

文章目录 一、简介二、举个栗子2.1斐波那契数列2.2最短路径(DFS) 参考资料 一、简介 感觉动态规划非常的实用,因此这里整理一下相关资料。动态规划(Dynamic Programming):简称 DP,是一种优化算法…

RHCE:请给openlab搭建web

1.关闭所有安全软件已经防火墙 2.安装所需软件 3.在Windows 文件中进行DNS映射 C:\Windows\System32\drivers\etc\hosts 文件进 行DNS 映射 4.创建www.openlab.com网站 5.创建教学资料子网站 6.创建学生信息子网站 进行验证 7.创建缴费子网站

【LLM多模态】Cogvlm图生文模型结构和训练流程

note Cogvlm的亮点: 当前主流的浅层对齐方法不佳在于视觉和语言信息之间缺乏深度融合,而cogvlm在attention和FFN layers引入一个可训练的视觉专家模块,将图像特征与文本特征分别处理,并在每一层中使用新的QKV矩阵和MLP层。通过引…

直接选择排序(六大排序)

1. 选择排序基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。 选择排序包含:1.直接选择排序 2.堆排序 2 直接选择排序: ●在元素…

如何快速下载GEO数据并获取其表达矩阵与临床信息 | 附完整代码 + 注释

GEO数据库可以说是大家使用频率贼高的数据库啦!那它里面的数据怎么下载大家知道嘛!今天给大家展示一种快速获取它的表达矩阵和临床信息的方法! 话不多说!咱们直接开始! GEO编号获取 在GEO数据库中,你找到…

基于springboot善筹网(众筹)前后台实现设计(带源码)

信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的…

36.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-数据解码器的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:35.登录成功数据…

Oracle 19cADG集群补丁升级

Oracle 19cADG集群补丁升级 文章目录 Oracle 19cADG集群补丁升级1.备库备份2.备库升级Opatch3.备库应用补丁4.主库备份 oracle_home目录5.主库升级Opatch6.注册补丁7.编译无效对象8.检查主库的补丁注册情况9.备库切换主库完成补丁注册 1.备库备份 su - oracle cd $ORACLE_HOME…

3、创建项目,什么是路由

一、创建项目 第一次全局安装脚手架 npm install -g vue/clivue create 项目名 二、什么是路由? 路由就是一组 key-value 的对应关系多个路由,需要经过路由器的管理 1、后端路由: 每个url地址都对应着不同的静态资源对于普通的网站。所有…

【Godot4自学手册】第二十九节使用Shader来实现敌人受伤的闪白效果

在Godot 4中,Shader是用来为材质提供自定义渲染效果的程序。材质可以应用于MeshInstance、CanvasItem和ParticleEmitter等节点。Shader可以影响顶点的变换、片段(像素)的颜色,以及光照与物体的交互。 在Godot中,Shader…

ROS 2边学边练(1)-- 安装Iron Irwini

其实是从去年的一个机缘巧合才开始了解到ROS,但也仅限于此了(看了古月居的入门21讲),今年买了几本关于ROS相关的书籍,比如《精通ROS机器人编程 Lentin Joseph&Jonathan Cacace》、《ROS 2机器人编程实战-基于现代C…

AI入侵游戏业:是颠覆者还是创新助手?揭秘未来游戏新趋势!

在科技日新月异的今天,人工智能(AI)已经成为各行各业的关注焦点。而在娱乐产业中,AI技术的引入也让人们对电子游戏的未来发展产生了无限遐想。那么,AI究竟会给电子游戏行业带来怎样的变革?它会成为行业的颠…

【消息队列开发】 实现BrokerServer类——本体服务器

文章目录 🍃前言🎋创建 BrokerServer 类🎍启动与停止服务器🍀实现处理连接🎄实现 readRequest 与 writeResponse🌴实现处理请求🌲实现 clearClosedSession⭕总结 🍃前言 本次开发任…