基于Yolov8与LabelImg训练自己数据的完整流程

news2024/11/24 8:45:56

基于Yolov8与LabelImg训练自己数据的完整流程

    • 1. 创建虚拟环境
    • 2. 通过git 安装 ultralytics
    • 3. 安装完成之后,通过以下代码测试下环境配置是否正确
    • 4. 安装labelImg标注软件
    • 5. 使用labelImg进行标注,图片使用上面的coco128
      • 5.1 点击“打开目录”选择存储图像的文件夹进行标注,右下角会出现图像列表
      • 5.2 选择“创建区块”,在图像上对目标进行标注,然后填入类别,每张图片皆可标记多个目标
      • 5.3 每一张图片标注完后,软件会提示进行保存,点击Yes即可;
      • 5.4 标记完后的文件如图所示;
      • 5.5 将xml文件放入vocLabels文件夹中;
    • 6. 将数据转换成yolo需要的格式
    • 7. 对数据集进行划分
    • 8.训练
      • 8.1 如果运行的时候出现如下报错,进入虚拟环境中搜索libiomp5md.dll,删掉一个即可
      • 8.2 训练时需要修改的文件如下,修改文件的路径如下:
      • 8.3 训练
    • 9. Predict 预测
    • 10. ONNX

1. 创建虚拟环境

```python
conda create -n yolos python=3.11
# 激活yolos 环境,后续的安装都在里面进行
conda activate yolos

2. 通过git 安装 ultralytics

# 没有git的话要安装git
conda install git

# D:  进入D盘
D:
mkdir yolos
cd yolos

# Clone the ultralytics repository
git clone https://github.com/ultralytics/ultralytics

# Navigate to the cloned directory
cd ultralytics

# Install the package in editable mode for development
pip install -e .    //最后的“.”不可省略

# 通过该命令安装的torch 是cpu版本,如果需要安装gpu,需要先卸载掉,然后安装
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117  //这一步骤比较慢

# torch 安装完成后,可以执行如下命令,进行快速安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

# 后面有些代码需要pytest,也要安装一下
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest

# 如果需要安装onnx,也可以安装一下
conda install onnx

3. 安装完成之后,通过以下代码测试下环境配置是否正确

# DemoTest.py
# yolo predict model=yolov8n-seg.pt source='https://youtu.be/Zgi9g1ksQHc' imgsz=320   通过该命令可自动下载不同模型
from multiprocessing import freeze_support
from ultralytics import YOLO

def main():
    # Load a model    
    model = YOLO("yolov8n.yaml")  # build a new model from scratch    
    model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)   
     # Use the model    
     model.train(data="coco128.yaml", epochs=3)  # train the model   
      metrics = model.val()  # evaluate model performance on the validation set    
      results = model("https://ultralytics.com/images/bus.jpg")  # predict on an image    
      # path = model.export(format="onnx")  # export the model to ONNX format
      
if __name__ == '__main__':
    freeze_support()
    main()

运行过程中,会提示下载coco128.zip,和yolov8n.pt,模型与py文件放在同一目录下,如果网速快的话,自己下载就好,下载慢的话,下面是网盘地址:

yolov8 检测预训练模型百度网盘:链接:https://pan.baidu.com/s/1L5q1sdtBmq0FcuX6t1SvIg  提取码:ix9e
coco128.zip  百度网盘: 链接:https://pan.baidu.com/s/1UMdrWcY49jfCVvGvTMm8xg 提取码:rqd0

测试结果路径:ultralytics\runs\detect\val,里面存储了运行的结果,这样环境就算是配置好了。

结果如下:
在这里插入图片描述

4. 安装labelImg标注软件

# 下载源代码
git clone https://github.com/HumanSignal/labelImg.git
# 创建labelImg虚拟环境,lebelImg 需要低版本的python,我这里安装3.7
conda create -n labelImg37 python=3.7
# 激活环境
conda activate labelImg37
# 安装依赖库
conda install pyqt=5
conda install -c anaconda lxml
# 将qrc转换成可调用的py
pyrcc5 -o libs/resources.py resources.qrc  
# 直接运行会报错 'pyrcc5' 不是内部或外部命令,也不是可运行的程序;因为从anaconda 中安装的pyqt不包含pyrcc5
# 需要从cmd直接安装
pip install pyqt5_tools -i https://pypi.tuna.tsinghua.edu.cn/simple
# 然后再执行下一句
pyrcc5 -o libs/resources.py resources.qrc  
#然后执行下一句弹出窗口
python labelImg.py
# python labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]

# 也可以直接通过pip安装
pip3 install labelImg
# 启动
labelImg

在这里插入图片描述

5. 使用labelImg进行标注,图片使用上面的coco128

首先创建一个文件夹:cocoImages, 里面分别创建2个文件夹,images用来放置标注图片, vocLabels 用来放置标注文件

5.1 点击“打开目录”选择存储图像的文件夹进行标注,右下角会出现图像列表

在这里插入图片描述

5.2 选择“创建区块”,在图像上对目标进行标注,然后填入类别,每张图片皆可标记多个目标

在这里插入图片描述

5.3 每一张图片标注完后,软件会提示进行保存,点击Yes即可;

5.4 标记完后的文件如图所示;

在这里插入图片描述

5.5 将xml文件放入vocLabels文件夹中;

6. 将数据转换成yolo需要的格式

首先将11行中的classes改为自己标注的类别,然后执行下代码生成相应的文件夹,接着将图像copy到JPEGImages下,labels copy到Annotations下面,再次执行一次该代码即可。

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

# classes=["aeroplane", 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog',
#            'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']  # class names

classes = ["person", 'cup', 'umbrella']


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, voc_labels, yolo_labels):
    in_file = open(os.path.join(voc_labels + '%s.xml') % image_id)
    out_file = open(os.path.join(yolo_labels + '%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)
        xml_box = obj.find('bndbox')
        b = (float(xml_box.find('xmin').text), float(xml_box.find('xmax').text), float(xml_box.find('ymin').text),
             float(xml_box.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()


if __name__ == '__main__':
    # 获取当前路径
    wd = os.getcwd()
    # 创建相应VOC模式文件夹
    voc_path = os.path.join(wd, "voc_dataset")
    if not os.path.isdir(voc_path):
        os.mkdir(voc_path)

    annotation_dir = os.path.join(voc_path, "Annotations/")
    if not os.path.isdir(annotation_dir):
        os.mkdir(annotation_dir)
    clear_hidden_files(annotation_dir)

    image_dir = os.path.join(voc_path, "JPEGImages/")
    if not os.path.isdir(image_dir):
        os.mkdir(image_dir)
    clear_hidden_files(image_dir)

    voc_file_dir = os.path.join(voc_path, "ImageSets/")
    if not os.path.isdir(voc_file_dir):
        os.mkdir(voc_file_dir)

    voc_file_dir = os.path.join(voc_file_dir, "Main/")
    if not os.path.isdir(voc_file_dir):
        os.mkdir(voc_file_dir)

    VOC_train_file = open(os.path.join(voc_path, "ImageSets/Main/train.txt"), 'w')
    VOC_test_file = open(os.path.join(voc_path, "ImageSets/Main/test.txt"), 'w')
    VOC_train_file.close()
    VOC_test_file.close()

    if not os.path.exists(os.path.join(voc_path, 'Labels/')):
        os.makedirs(os.path.join(voc_path, 'Labels'))

    train_file = open(os.path.join(voc_path, "2007_train.txt"), 'a')
    test_file = open(os.path.join(voc_path, "2007_test.txt"), 'a')
    VOC_train_file = open(os.path.join(voc_path, "ImageSets/Main/train.txt"), 'a')
    VOC_test_file = open(os.path.join(voc_path, "ImageSets/Main/test.txt"), 'a')

    image_list = os.listdir(image_dir)  # list image files
    probo = random.randint(1, 100)
    print("Probobility: %d" % probo)
    for i in range(0, len(image_list)):
        path = os.path.join(image_dir, image_list[i])
        if os.path.isfile(path):
            image_path = image_dir + image_list[i]
            image_name = image_list[i]
            (name_without_extent, extent) = os.path.splitext(os.path.basename(image_path))
            voc_name_without_extent, voc_extent = os.path.splitext(os.path.basename(image_name))
            annotation_name = name_without_extent + '.xml'
            annotation_path = os.path.join(annotation_dir, annotation_name)
        probo = random.randint(1, 100)
        print("Probobility: %d" % probo)
        if (probo < 75):
            if os.path.exists(annotation_path):
                train_file.write(image_path + '\n')
                VOC_train_file.write(voc_name_without_extent + '\n')
                yolo_labels_dir = os.path.join(voc_path, 'Labels/')
                convert_annotation(name_without_extent, annotation_dir, yolo_labels_dir)
        else:
            if os.path.exists(annotation_path):
                test_file.write(image_path + '\n')
                VOC_test_file.write(voc_name_without_extent + '\n')
                yolo_labels_dir =os.path.join(voc_path, 'Labels/')
                convert_annotation(name_without_extent, annotation_dir, yolo_labels_dir)

    train_file.close()
    test_file.close()
    VOC_train_file.close()
    VOC_test_file.close()

7. 对数据集进行划分

import os
import shutil
import random
ratio=0.1
img_dir='./voc_dataset/JPEGImages' #图片路径
label_dir='./voc_dataset/Labels'#生成的yolo格式的数据存放路径
train_img_dir='./voc_dataset/images/train2017'#训练集图片的存放路径
val_img_dir='./voc_dataset/images/val2017'
train_label_dir='./voc_dataset/labels/train2017'#训练集yolo格式数据的存放路径
val_label_dir='./voc_dataset/labels/val2017'
if not os.path.exists(train_img_dir):
    os.makedirs(train_img_dir)
if not os.path.exists(val_img_dir):
    os.makedirs(val_img_dir)
if not os.path.exists(train_label_dir):
    os.makedirs(train_label_dir)
if not os.path.exists(val_label_dir):
    os.makedirs(val_label_dir)
names=os.listdir(img_dir)
val_names=random.sample(names,int(len(names)*ratio))

cnt_1=0
cnt_2=0
for name in names:
    if name in val_names:
        #cnt_1+=1
        #if cnt_1>100:
            #break
        shutil.copy(os.path.join(img_dir,name),os.path.join(val_img_dir,name))
        shutil.copy(os.path.join(label_dir, name[:-4]+'.txt'), os.path.join(val_label_dir, name[:-4]+'.txt'))
    else:
        #cnt_2+=1
        #if cnt_2>1000:
            #break
        shutil.copy(os.path.join(img_dir, name), os.path.join(train_img_dir, name))
        shutil.copy(os.path.join(label_dir, name[:-4] + '.txt'), os.path.join(train_label_dir, name[:-4] + '.txt'))

执行完第七个步骤后,数据集的文件分布如下所示,其中,images,Labels中的文件即yolov8训练时所需要的:
在这里插入图片描述

8.训练

8.1 如果运行的时候出现如下报错,进入虚拟环境中搜索libiomp5md.dll,删掉一个即可

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized

8.2 训练时需要修改的文件如下,修改文件的路径如下:

D:\yolos\ultralytics\ultralytics\cfg\datasets\myVOC.yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license# PASCAL VOC dataset http://host.robots.ox.ac.uk/pascal/VOC by University of Oxford# Example usage: yolo train data=VOC.yaml# parent# ├── ultralytics# └── datasets#     └── VOC  ← downloads here (2.8 GB)# 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: ../voc_dataset/
train: # train images (relative to 'path')  16551 images  - images/train2017
val: # val images (relative to 'path')  4952 images  - images/train2017
test: # test images (optional)  - images/train2017

# Classesnames:
  0: person
  1: cup
  2: umbrella

网络配置参数:

‪D:\yolos\ultralytics\ultralytics\cfg\models\v8\yolov8.yaml

在这里插入图片描述
下面的文件是网络训练时的参数,可以进行修改,如果训练的次数少,没有结果,可以修改该配置里面的conf

D:\yolos\ultralytics\ultralytics\cfg\default.yaml

8.3 训练

修改完成后,训练完整代码如下:

from multiprocessing import freeze_support

import cv2

from ultralytics import YOLO

def main():
    # Load a model
    model = YOLO("yolov8n.yaml")  # build a new model from scratch
    model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)

    # Use the model
    model.train(data="myVOC.yaml", epochs=100)  # train the model
    metrics = model.val()  # evaluate model performance on the validation set

if __name__ == '__main__':
    freeze_support()
    main()

在这里插入图片描述
训练结果,
训练的结果和模型,在文件夹runs中:
在这里插入图片描述

9. Predict 预测

预测完整代码如下:
代码如下,运行的时候需要注意修改模型的路径

from multiprocessing import freeze_support

import cv2

from ultralytics import YOLO

def main():
    # Load a model
    model = YOLO("yolov8n.yaml")  # build a new model from scratch
    model = YOLO("runs/detect/train18/weights/best.pt")  # load a pretrained model (recommended for training)
    results = model("000000000036.jpg")  # predict on an image
    path = model.export(format="onnx")  # export the model to ONNX format
    # Process results list

    for res in results:
        boxes = res.boxes  # Boxes object for bbox outputs
        masks = res.masks  # Masks object for segmentation masks outputs
        keypoints = res.keypoints  # Keypoints object for pose outputs
        probs = res.probs  # Probs object for classification outputs
        res_plotted = res.plot()
        cv2.namedWindow("yolov8_result", cv2.WINDOW_NORMAL)
        cv2.imshow("yolov8_result", res_plotted)
        cv2.waitKey(0)

if __name__ == '__main__':
    freeze_support()
    main()

最终输出结果如下:
在这里插入图片描述

10. ONNX

path = model.export(format="onnx")  # export the model to ONNX format    

这句代码输出onnx格式的模型,可以通过提示查看网络结果:
运行完成后,terminal中会出现以下提示,可以点击网址,然后从网址中打开路径中的best.onnx,即可查看网络模型。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

如何看待40岁还在做程序员?

1&#xff0c;40岁还在做程序员是好还是坏&#xff1f; 2&#xff0c;40岁从零开始学习软件开发&#xff0c;四年后我成了首席研发 40岁了还在做程序员&#xff0c;是一个好还是坏的选择&#xff0c;这是一个很复杂的问题&#xff0c;因为每个人的情况都是不同的。在这里提供一…

38 | 浦发银行股票分析案例

本文将通过一个浦发银行股票分析案例,探讨如何从多个维度对股票进行分析,包括基本面、技术面和市场环境等因素。我们将深入挖掘浦发银行的财务数据、业务模式以及市场定位,以了解其内在价值和潜在风险。同时,我们还将考察技术面的指标,如价格走势、均线形态等,以揭示市场…

centos7使用yum安装gcc8

1 概述 cenots7自带的gcc版本为4.8.5&#xff0c;不方便编译一些软件&#xff0c;需要将gcc升级。升级gcc可以通过源码编译安装&#xff0c;也可以通过yum等软件管理工具来进行安装&#xff0c;本文介绍通过yum软件来安装gcc。 2 安装过程 2.1 安装scl源 yum install -y c…

解开谜团:为什么红黑树胜过AVL树?

为什么红黑树胜过AVL树 博主简介一、引言1.1、红黑树和AVL树简介1.2、红黑树在某些方面优于AVL树 二、红黑树和AVL树的基本原理2.1、红黑树的定义和性质2.2、AVL树的定义和性质2.3、对比两种树结构的特点 三、插入和删除操作的复杂性比较3.1、红黑树的插入操作和平衡性维护3.2、…

预测算法系列5—核极限学习机KELM及其实现(Matlab)

回归&#xff1a; 分类&#xff1a; 在上一篇文章中我介绍了极限学习机ELM的实现和优化&#xff0c;极限学习机虽然具有训练速度快、复杂度低、克服了传统梯度算法的局部极小、过拟合和学习率的选择不合适等优点&#xff0c;但在比较复杂的分类、回归等非线性模式识别任务往往…

python3实践-- 实用代码片段总结-1

针对python使用过程中&#xff0c;经常使用的代码片段进行总结&#xff0c;梳理 python3学习–实用代码片段-1 文章目录 property 装饰器查看参数类型序列化反转序列列表全展开&#xff08;生成器版&#xff09;在jupyter lab使用echarts画图正则匹配常用元字符常用通用字符使…

两天入门Linux、搭建Spring环境 第一天

一、Linux简介 1.什么是Linux 一个操作系统&#xff0c;未来公司里面会用到、接触的新操作系统。 2.为什么学Linux (1)个人职务需要&#xff0c;肯定会接触到Linux (2)职业发展&#xff0c;以后的发展肯定需要掌握Linux的许多使用方法 3.学哪些内容 (1)Linux基本介绍 (2)…

记录--Loading 用户体验 - 加载时避免闪烁

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 在切换详情页中有这么一个场景&#xff0c;点击上一条&#xff0c;会显示上一条的详情页&#xff0c;同理&#xff0c;点击下一条&#xff0c;会显示下一条的详情页。 伪代码如下所示&#xff1a; 我们…

JavaWeb-Servlet服务连接器(三)

目录 Response响应对象 1.基本功能 2.重定向 3.路径 4.服务器输出数据到浏览器 Response响应对象 1.基本功能 设置响应行&#xff1a;格式为 HTTP/1.1 200 OK&#xff0c;可以使用 setStatus(int sc) 方法设置状态码为 200 表示成功。 方法名称描述setStatus(int sc)设…

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 &#xff08;1&#xff09;手动添加LVS转发1&#xff…

python selenium如何保存网站的cookie用于下次自动登录

## 一、python selenium如何保存网站的cookie 使用Selenium保存网站的Cookie非常简单。下面是一个示例&#xff0c;展示了如何使用Selenium打开网站&#xff0c;然后保存获取到的Cookie&#xff1a; from selenium import webdriver# 初始化浏览器 browser webdriver.Chrome…

基于nodejs+vue+elementui文学创作的社交论坛新闻文章管理系统

课题主要采用vue技术和MySQL数据库技术以及vue框架进行开发。系统主要包括个人中心、用户管理、文章类型管理、文章信息管理、文章举报管理、警告信息管理、系统管理等功能&#xff0c;从而实现智能化的社交论坛管理方式&#xff0c;提高社交论坛管理的效率。 通过对基于文学创…

9月30日生效:微软官方服务协议更新,防止人工智能进行逆向工程

微软最近更新了其官方服务协议&#xff0c;新规则将于9月30日生效&#xff0c;包括多个新增和变化&#xff0c;具体细节请参考最新的微软服务协议。 微软最新更新涉及使用Bing Chat聊天机器人、Windows Copilot和Microsoft 365 Copilot服务&#xff0c;引起了广泛关注。这次更新…

如何实现Vue路由的二级菜单

目录 Vue路由&#xff08;一、二级路由&#xff09; 一级路由配置 二级路由配置 Vue中展示二级路由的默认模块/二级路由默认显示 Vue路由&#xff0c;二级路由及跳转 如何用vue实现二级菜单栏 ◼️ 相关参考资料 当朋友们看到这个文章时想必是想要了解vue路由二级菜单相…

LeetCode150道面试经典题-- 有效的字母异位词(简单)

1.题目 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 2.示例 s"adasd" t"daads" 返回true s"addad" t &q…

森海塞尔集团专注专业音频业务的首个财年圆满收官

2022年&#xff0c;这家家族企业通过其专业音频解决方案实现4.677亿欧元销售额 韦德马克&#xff0c;2023年6月27日——2022财年&#xff0c;森海塞尔集团进一步扩展其作为专业音频解决方案提供商的强大地位&#xff0c;并依靠自身取得可持续增长。专业音频解决方案的销售额增…

在Ubuntu20.04以Docker方式安装Mysql详细教程(支持外部连接,数据映射到物理磁盘,备份数据,导出数据,恢复数据)...

最近&#xff0c;从阿里云迁移到天翼云&#xff0c;为了保证WordPress查库速度&#xff0c;数据库也要一并迁移&#xff0c;但数据库是很贵的&#xff0c;为了降低个人WordPress网站的成本&#xff0c;我决定自己建数据库。本文是使用Docker镜像建立数据库的方法&#xff0c;数…

SAP MM学习笔记19- SAP中的库存类型,以及 保留在库的利用场景

SAP中有3种库存类型。 1&#xff0c;利用可能在库&#xff08;非限制使用库存&#xff09; 2&#xff0c;品质检查中在库&#xff08;质检库存&#xff09; 3&#xff0c;保留在库&#xff08;已冻结库存&#xff09; 这3种库存类型在库存移动的时候&#xff0c;是可以互相转…

4. 软件开发的环境搭建

目录 1. 搭建环境 1.1 检查 JDK 1.2 检查 MySQL 数据库 1.3 检查 Maven 1.4 检查 GITEEGIT 1.5 安装插件 1.5.1 安装 Spring Boot Helper 1.5.2 安装 lombok 1.6 创建仓库 1.6.1 登录 GITEE 创建仓库并复制仓库地址 1.6.2 克隆到本地 1.7 创建工程 1.7.1 设置编码…

Unity 框架学习--1

由浅入深&#xff0c;慢慢演化实现框架 两个类的实现代码完全一样&#xff0c;就只有类名或类型不一样的时候&#xff0c;而且还需要不断扩展&#xff08;未来会增加各种事件&#xff09;的时候&#xff0c;这时候就用 泛型 继承 来提取&#xff0c;继承解决扩展的问题&#…