Windows下Labelimg标注自己的数据集使用(Ubuntu18.04)Jetson AGX Orin进行YOLO5训练测试完整版教程

news2025/7/16 0:37:14

一、环境配置介绍

整个实现过程所涉及的文件目录,其中,自备表示自己需要准备的,生成表示无需自己准备。

 使用yolov5时出现“assertionerror:no labels found in */*/*/JPEGImages.cache can not train without labels”问题

很多朋友都会遇到的一个问题,yolo5-6.1已经不能使用之前的方法了了,是下载源码后的coco示例。

nvidia@nvidia-desktop:~/works/yolov5-6.1$ cat data/coco128.yaml
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco128  ← downloads here


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128  # dataset root dir
train: images/train2017  # train images (relative to 'path') 128 images
val: images/train2017  # val images (relative to 'path') 128 images
test:  # test images (optional)

# Classes
nc: 80  # number of classes
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
        'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
        'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
        'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
        'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
        'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
        'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
        'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
        'hair drier', 'toothbrush']  # class names


# Download script/URL (optional)
Jetson-yolo5
检测目标类型标注工具标注格式训练工具
"open"labelimgpascalVOCYOLO5

二、目录结构

整个实现过程所涉及的文件目录,其中,自备表示自己需要准备的,生成表示无需自己准备。

首先录取视频获取图片,在d盘下创建目录dataSet,然后再dataSet内分别创建目录images、和video目录,如下:

import cv2
import os.path
import random
 
 
# 检查已有图片的数量,确定本次图片抽取开始的下标
cnt = len(os.listdir('D:/dataSet/images')) + 1
# 视频存放路径
videoDir = os.listdir('D:/dataSet/video')
# 提示使用者抽取开始
print("Start!")
# 每30帧随机抽取一帧
start, ran = 0, random.randrange(0, 30)
try:
    temp = 0
    for video in videoDir:
        # 拼接视频路径
        videoPath = r'D:/dataSet/video/' + video
 
        # 打开视频流
        vc = cv2.VideoCapture(videoPath)
        # 判断是否打开成功
        if vc.isOpened():
            while True:
                # activity: 读取成功标签,frame: 读取的画面
                activity, frame = vc.read()
                # 如果读取不成功(没有下一帧),就退出
                if not activity:
                    break
                if temp == start + ran:
                    cv2.imwrite(f"D:/VOCdevkit/VOC2007/PEGImages/{cnt}.jpg", frame)#这里的路径是提前建好的
                    cnt, start, ran = cnt + 1, start + 30, random.randrange(0, 30)
                temp = temp + 1
    vc.release()
    # 提示抽取完成
    print("Finish!")
except:
    vc.release()
    # 提示抽取出现错误
    print("Error!")

内容为空 。

从视频素材中抽取画面

在cmd窗口进入d盘,输入命令:

python manage.py

 出现“Finish!”即为抽取完成,效果如下:

使用labelimg

完成前面的工作后,在控制台输入labelimg:

 最终目录架构,test的目录不是必须的,现在的版本是没用到

D:\VOCdevkit>tree
卷 DATA1 的文件夹 PATH 列表
卷序列号为 141F-A5EC
D:.
├─images
│  ├─test
│  ├─train
│  └─val
├─labels
│  ├─test
│  ├─train
│  └─val
└─VOC2007
    ├─Annotations
    ├─PEGImages
    └─YOLOLabels

三、操作步骤

 使用图如下代码即可将标注的文件.xml格式文件转为.txt格式

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
from shutil import copyfile

# 根据自己的数据标签修改
classes=["pen", "pen"]


def clear_hidden_files(path):
    dir_list = os.listdir(path)
    for i in dir_list:
        abspath = os.path.join(os.path.abspath(path), i)
        if os.path.isfile(abspath):
            if i.startswith("._"):
                os.remove(abspath)
        else:
            clear_hidden_files(abspath)

def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(image_id):
    in_file = open('D:/VOCdevkit/VOC2007/Annotations/%s.xml' % image_id, encoding='UTF-8' )
    out_file = open('D:/VOCdevkit/VOC2007/YOLOLabels/%s.txt' % image_id, 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
    in_file.close()
    out_file.close()

wd = os.getcwd()
wd = os.getcwd()
data_base_dir = os.path.join(wd, 'D:/VOCdevkit/')
if not os.path.isdir(data_base_dir):
    os.mkdir(data_base_dir)
work_sapce_dir = os.path.join(data_base_dir, 'D:/VOCdevkit/VOC2007/')
if not os.path.isdir(work_sapce_dir):
    os.mkdir(work_sapce_dir)
annotation_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/Annotations/')
if not os.path.isdir(annotation_dir):
        os.mkdir(annotation_dir)
clear_hidden_files(annotation_dir)
image_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/PEGImages/')
if not os.path.isdir(image_dir):
        os.mkdir(image_dir)
clear_hidden_files(image_dir)
yolo_labels_dir = os.path.join(work_sapce_dir, 'D:/VOCdevkit/VOC2007/YOLOLabels/')
if not os.path.isdir(yolo_labels_dir):
        os.mkdir(yolo_labels_dir)
clear_hidden_files(yolo_labels_dir)
yolov5_images_dir = os.path.join(data_base_dir, 'images/')
if not os.path.isdir(yolov5_images_dir):
        os.mkdir(yolov5_images_dir)
clear_hidden_files(yolov5_images_dir)
yolov5_labels_dir = os.path.join(data_base_dir, 'labels/')
if not os.path.isdir(yolov5_labels_dir):
        os.mkdir(yolov5_labels_dir)
clear_hidden_files(yolov5_labels_dir)


yolov5_images_train_dir = os.path.join(yolov5_images_dir, 'train/')
if not os.path.isdir(yolov5_images_train_dir):
        os.mkdir(yolov5_images_train_dir)
clear_hidden_files(yolov5_images_train_dir)
yolov5_images_test_dir = os.path.join(yolov5_images_dir, 'val/')
if not os.path.isdir(yolov5_images_test_dir):
        os.mkdir(yolov5_images_test_dir)
clear_hidden_files(yolov5_images_test_dir)
yolov5_images_val_dir = os.path.join(yolov5_images_dir, 'test/')
if not os.path.isdir(yolov5_images_val_dir):
        os.mkdir(yolov5_images_val_dir)
clear_hidden_files(yolov5_images_val_dir)
yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, 'train/')
if not os.path.isdir(yolov5_labels_train_dir):
        os.mkdir(yolov5_labels_train_dir)
clear_hidden_files(yolov5_labels_train_dir)
yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, 'val/')
if not os.path.isdir(yolov5_labels_test_dir):
        os.mkdir(yolov5_labels_test_dir)
clear_hidden_files(yolov5_labels_test_dir)
yolov5_labels_val_dir = os.path.join(yolov5_labels_dir, 'test/')
if not os.path.isdir(yolov5_labels_val_dir):
        os.mkdir(yolov5_labels_val_dir)
clear_hidden_files(yolov5_labels_val_dir)

train_file = open(os.path.join(wd, 'yolov5_train.txt'), 'w')
test_file = open(os.path.join(wd, 'yolov5_val.txt'), 'w')
val_file = open(os.path.join(wd, 'yolov5_tes.txt'), 'w')
train_file.close()
test_file.close()
val_file.close()
train_file = open(os.path.join(wd, 'yolov5_train.txt'), 'a')
test_file = open(os.path.join(wd, 'yolov5_val.txt'), 'a')
val_file = open(os.path.join(wd, 'yolov5_test.txt'), 'a')
list_imgs = os.listdir(image_dir) # list image files
probo = random.randint(1, 100)
print("Probobility: %d" % probo)
for i in range(0,len(list_imgs)):
    path = os.path.join(image_dir,list_imgs[i])
    if os.path.isfile(path):
        image_path = image_dir + list_imgs[i]
        voc_path = list_imgs[i]
        (nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))
        (voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))
        annotation_name = nameWithoutExtention + '.xml'
        annotation_path = os.path.join(annotation_dir, annotation_name)
        label_name = nameWithoutExtention + '.txt'
        label_path = os.path.join(yolo_labels_dir, label_name)
    probo = random.randint(1, 100)
    print("Probobility: %d" % probo)
    if(probo < 80): # train dataset
        if os.path.exists(annotation_path):
            train_file.write(image_path + '\n')
            convert_annotation(nameWithoutExtention) # convert label
            copyfile(image_path, yolov5_images_train_dir + voc_path)
            copyfile(label_path, yolov5_labels_train_dir + label_name)
    elif(80 <=probo < 90): # test dataset
        if os.path.exists(annotation_path):
            test_file.write(image_path + '\n')
            convert_annotation(nameWithoutExtention) # convert label
            copyfile(image_path, yolov5_images_test_dir + voc_path)
            copyfile(label_path, yolov5_labels_test_dir + label_name)
    else: # val dataset
        if os.path.exists(annotation_path):
            val_file.write(image_path + '\n')
            convert_annotation(nameWithoutExtention) # convert label
            copyfile(image_path, yolov5_images_val_dir + voc_path)
            copyfile(label_path, yolov5_labels_val_dir + label_name)
train_file.close()
test_file.close()
val_file.close()

然后将整个文档上传到Jetson下的yolo5同级路径下的文件夹内。 

 在yolov5-6.1/data/.yaml中先复制一份,改名为ljx.yaml(意义为自己的参数配置)ljx.yaml文件需要修改的参数是nc与names以及你的训练测试路径。nc是标签名个数,names就是标签的名字。

训练集测试集验证集关系如下s

yolov5-6.1/models先复制一份yolov5s.yaml至ljxs.yaml,更名ljxs.yaml(意为模型),只将如下的nc修改为训练集种类即可 

四、开始训练

python3 train.py --img 640 --batch 8 --epochs 300 --data ../../yolov5-6.1/data/ljx.yaml --cfg ../../yolov5-6.1/models/ljxs.yaml --weights weights/yolov5s.pt --device '0'

 

如果出现无法wandb可视化毕业设计记录-yolov5的wandb报错,原因和解决方法(非屏蔽wandb)_芃芃です的博客-CSDN博客 

Weights & Biases

 GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

五、开始测试

测试pen

估计使用的数据量太小导致精度太低,小白一个刚开始学习没几天欢迎大佬提点一二

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

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

相关文章

SpringBoot+Vue项目医疗管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

待办事项是什么意思,怎么用?

待办事项是什么意思&#xff0c;为什么要用&#xff1f;待办事项工具怎么设置&#xff1f;这里一文给你讲清&#xff01; 废话不多说&#xff0c;下面直接教你&#xff1a;梳理待办事项清单的方法&#xff0c;以及待办工具的操作实操步骤。想要快速提升工作效率的小伙伴&#…

第三十七篇 Vue中封装Swiper组件

在上一篇内容的结尾讲到了将swiper初始化从mounted生命周期转移到updated中来能够让swiper动起来&#xff0c;但同时是否会造其他的一个问题&#xff1f;什么问题呢&#xff1f;在每次data中的状态发什么改变&#xff0c;updated中的内容会又重新执行&#xff0c;这样会导致swi…

二维数组与二级指针是好朋友吗?

抛出问题 有一个二维数组&#xff0c;我想把它传给一个函数。于是我把函数接口定义出来了&#xff0c;如下&#xff1a; int array[2][3] {1,2,3,4,5,6}; void fun(int **array) {array[0][0] 5; } 当我试图直接把数组名传给函数时候&#xff0c;fun(array)编译会报错&…

C++ 中explicit的作用及用法

目录 Cexplicit&#xff08;官网的说法&#xff09; Cexplicit 清楚的说法&#xff08;建议英文不好的从这里开始食用哦&#xff09; Cexplicit使用的例子&#xff08;建议喜欢自己敲代码实验的从这里开始食用哦&#xff09; 总结 Cexplicit&#xff08;官网的说法&#xff…

神经网络和深度学习-梯度下降Gradient Descent(下)

梯度下降gradient descent 我们接着用数学公式来看一下梯度下降 首先是梯度 ∂cos⁡t∂ω\frac{\partial \cos t}{\partial \omega} ∂ω∂cost​ 然后我们对权重进行更新 ωω−α∂cos⁡t∂ω\omega\omega-\alpha \frac{\partial \cos t}{\partial \omega} ωω−α∂ω∂c…

python基础之容器类型公共方法

文章目录一、简介1.高级数据类型的公共方法&#xff1a;2.python的内置函数&#xff1a;3.python包含的内置函数&#xff1a;二、遍历字典的列表一、简介 1.高级数据类型的公共方法&#xff1a; 列表元组字典或者字符串都能够共同使用的方法&#xff1b; 2.python的内置函数…

【kafka】七、kafka数据可靠性保证

数据可靠性保证 为保证producer发送的数据&#xff0c;能可靠的发送到指定的topic&#xff0c;topic的每个partition收到producer发送的数据后&#xff0c;都需要向producer发送ack&#xff08;acknowledgement确认收到&#xff09;&#xff0c;如果producer收到ack&#xff0c…

基于AntBlazor的学生在线练习系统实现过程的简单总结

前言 疫情当前&#xff0c;作为一名教师&#xff0c;如何能让学生进行有效练习成了一个难题。如果使用 “问卷星”等线上调查问卷式的网站来做练习测试&#xff0c;是无法及时有效的进行&#xff0c;更谈不上对学生练习情况进行跟踪。鉴于以上现实情况和问题&#xff…

神经网络和深度学习-用pytorch实现线性回归

用pytorch实现线性回归 用pytorch的工具包来实现线性模型的训练过程 准备数据集 设计模型 构造损失函数和优化器&#xff08;使用pytorch API&#xff09; 训练过程&#xff1a;前馈、反馈、更新 准备数据 在PyTorch中&#xff0c;计算图是小批处理的&#xff0c;所以X和…

MATLAB | 世界杯来用MATLAB画个足球玩叭~

世界杯教你用MATLAB画个超逼真的足球&#xff0c; 需要准备Partial Differential Equation Toolbox工具箱&#xff0c;同时因为用到了polyshape类所以至少需要R2017b版本。 绘制讲解 数据来源及说明 我是真的不想写注释了太麻烦了&#xff0c;给大家讲一下我的思路希望能够看…

判断一个时间段是否经过了另一个时间段

场景&#xff1a; IOT设备存在离线与恢复时间记录&#xff0c;每一次离线和恢复记为一个周期即一条数据, 现在需要统计出在某个时段存在离线记录的数据,如果目前未恢复,没有恢复时间&#xff0c;恢复时间置为9999-01-01 00:00:00 原始数据如下(t_offline_record)&#xff1a;…

OPengl学习——初识opengl

文章目录1、网站罗列2、一些词语解析1.入门概念2.Opengl Vs DirectX3、QOpenGLWidget4、引用**OpenGL&#xff08;Open Graphics Library&#xff09;*是一个跨编程语言、跨平台的编程图形程序接口&#xff0c;它将计算机的资源抽象称为一个个OpenGL的对象&#xff0c;对这些资…

3.5、点对点协议 PPP

3.5、点对点协议 PPP 3.5.1、基本介绍 点对点协议 PPP(Point-to-Point Protocol) 是目前使用最广泛的点对点数据链路层协议。 用户计算机只有获取到 ISP 所分配的合法 IP 地址后&#xff0c;才能成为因特网上的主机 用户计算机与 ISP 进行通信时&#xff0c;所使用的数据链路…

【学习笔记21】JavaScript数组的基本方法

笔记首发 一、push&#xff1a;末位新增 语法: 数组.push(数据)作用: 向数组末尾添加数据返回值: 追加数据后, 数组最新的长度 var arr [10, 20, 30, 40];console.log(原始数组: , arr); ​var num arr.push(500);console.log(push新增后数组: , arr);console.log(push的返回…

进程的初识

目录预备知识 -> 操作系统操作系统的定义操作系统的定位进程进程的概念进程调度的过程进程的管理描述组织PCB描述进程的特征进程调度的相关属性进程的状态优先级上下文记账信息预备知识 -> 操作系统 操作系统的定义 操作系统是一个搞管理的软件 对上&#xff0c;要对硬…

为什么一定要申请专利呢

问题一&#xff1a;如何避免被判为非正常专利&#xff1f; 原本有个发明创造&#xff0c;想申请专利&#xff0c;却被列入非正常申请&#xff0c;甚至违法。以下五种情况一定要注意&#xff0c;千万不能碰。 1、同一单位或个人申请多件明显抄袭现有技术的专利&#xff1b; 2…

如何通过 Java 合并和取消合并 Excel 单元格

在整理 Excel 中的数据时&#xff0c;我们不可避免地需要合并和取消合并单元格。同时&#xff0c;如果需要创建跨列或行的标题&#xff0c;我们可以合并 Excel 单元格以在电子表格中轻松完成此操作。 合并单元格是指将两个或多个单元格合并为一个单元格&#xff0c;而取消合并单…

4.4——数据库和前后端身份认证

目录数据库与身份认证数据库的基本概念什么是数据库常见的数据库及分类传统型数据库的数据组织结构安装并配置 MySQL使用 MySQL Workbench 管理数据库连接数据库了解主界面的组成部分创建数据库创建数据表向表中写入数据使用 SQL 管理数据库在项目中操作 MySQL安装与配置 mysql…

华为机试 - 数大雁

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 一群大雁往南飞&#xff0c;给定一个字符串记录地面上的游客听到的大雁叫声&#xff0c;请给出叫声最少由几只大雁发出。 具体的: 1.大雁发出的完整叫声为”quack“&#xff0c;因为有多只大雁同一时…