【Yolov8标注数据集】

在这里插入图片描述

1 前言

使用Yolov8自动标注自己的数据集,大致步骤:
(1)首先,先手动标注一部分数据集,进行模型训练,得到初步的检测模型
(2)然后,使用初步的检测模型实现自动数据集标注。具体而言,将需要自动标注的数据集,通过预测predict的方式,生成labels,并使用标注工具labels进行微调
接下来,将详细介绍Yolov8自动标注数据集的具体步骤。

2.1 手动标注数据集

标注工具推荐两种,分别为在线标注网站MakeSense{MakeSense具体标注教程}和离线软件labelImg{ labelImg具体标注教程}。
不过,在进行手动标注数据集之前,还需要批量将视频转为图像序列,具体代码如下:

# 导入所需要的库
import cv2
import os
import numpy as np

datasets_path = ["/home/y/Code/.../1/04_20200423_100708_5f.mp4",
                         			"/home/y/Code/.../1/04_20200423_101346_5f.mp4",
              				        "/home/y/Code/.../1/04_20200423_102826_4f.mp4"  ]
#  保存图像序列的文件夹
root_image_path = r"/home/y/Code/test/dataset/"
 
# 定义保存图片函数
# image:要保存的图片名字
# addr;图片地址与相片名字的前部分
# num: 相片,名字的后缀。int 类型
def save_image(image, addr, num):
    address = addr + str(num) + '.jpg'
    cv2.imwrite(address, image)
 
def get_video_to_img(source_video_path, target_image_path):

    # 读取视频文件 视频文件路径
    videoCapture = cv2.VideoCapture(source_video_path)
    # 通过摄像头的方式
    # videoCapture=cv2.VideoCapture(1)
    
    # 读帧
    success, frame = videoCapture.read()
    i = 0
    timeF = 120
    j = 0
    while success:
        i = i + 1
        if (i % timeF == 0):
            j = j + 1
            save_image(frame, target_image_path, j) #视频截成图片存放的位置
            print('save image:', i)
        success, frame = videoCapture.read()

def run_video_to_image():
    for source_video_path in datasets_path:
        target_image_path = root_image_path + "/" + source_video_path.split("/")[-1].split(".")[-2]+"/"
        if not os.path.exists(target_image_path):
            os.makedirs(target_image_path)
        
        get_video_to_img(source_video_path, target_image_path)


run_video_to_image()

2.2 划分数据集

import os, random, shutil
 def moveimg(fileDir, tarDir):
    pathDir = os.listdir(fileDir)  # 取图片的原始路径
    filenumber = len(pathDir)
    rate = 0.2  # 自定义抽取图片的比例,比方说100张抽10张,那就是0.1
    picknumber = int(filenumber * rate)  # 按照rate比例从文件夹中取一定数量图片
    sample = random.sample(pathDir, picknumber)  # 随机选取picknumber数量的样本图片
    print(sample)
    for name in sample:
        shutil.move(fileDir + name, tarDir + "/" + name)
    return
 
def movelabel(file_list, file_label_train, file_label_val):
    for i in file_list:
        if i.endswith('.jpg'):
            # filename = file_label_train + "\\" + i[:-4] + '.xml'  # 可以改成xml文件将’.txt‘改成'.xml'就可以了
            filename = file_label_train + "/" + i[:-4] + '.txt'  # 可以改成xml文件将’.txt‘改成'.xml'就可以了
            if os.path.exists(filename):
                shutil.move(filename, file_label_val)
                print(i + "处理成功!")
 
if __name__ == '__main__':
    fileDir = r"/home/y/Code/datasets/train/images/BulletHole4/"  # 源图片文件夹路径
    tarDir = r'/home/y/Code/datasets/val/images/BulletHole4'  # 图片移动到新的文件夹路径
    file_label_train = r"/home/y/Code/datasets/train/labels/BulletHole4/"  # 源图片标签路径
    file_label_val = r"/home/y/Code/datasets/val/labels/BulletHole4"  # 标签移动到新的文件夹路径
    # 移动图片到指定文件夹下
    moveimg(fileDir, tarDir)
    file_list = os.listdir(tarDir)    
    # 移动标签到指定文件夹下
    movelabel(file_list, file_label_train, file_label_val)

最终生成的数据集结构如下:
在这里插入图片描述

2.3 Yolov8环境配置

2.3.1 Yolov8下载

下载命令:
第一种(推荐,方便项目管理):

git clone https://github.com/ultralytics/ultralytics
cd ultralytics
pip install -e .

第二种:

pip install ultralytics
或者
python -m pip install ultralytics

注:
Yolov8下载地址:https://github.com/ultralytics/ultralytics/tree/main
模型下载地址:https://docs.ultralytics.com/tasks/detect/

Modelsize
(pixels)
mAPval
50-95
Speed
CPU ONNX
(ms)
Speed
A100 TensorRT
(ms)
params
(M)
FLOPs
(B)
YOLOv8n64037.380.40.993.28.7
YOLOv8s64044.9128.41.2011.228.6
YOLOv8m64050.2234.71.8325.978.9
YOLOv8l64052.9375.22.3943.7165.2
YOLOv8x64053.9479.13.5368.2257.8

tensorRT的下载链接:https://developer.nvidia.com/login

2.3.2 Yolov8环境配置

conda create -n yolo_tracking python=3.8
conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=10.2 -c pytorch
conda install loguru
python -m pip install opencv-python
python -m pip install gdown
conda install scipy
python -m pip install --upgrade charset-normalizer
conda install -c conda-forge lap
python -m pip install psutil
python -m pip install pandas
python -m pip install seaborn
python -m pip install tqdm
python -m pip install requests
python -m pip install PyYAML
python -m pip install Pillow

# onnxruntime下载
pip install onnxruntime  -i https://pypi.douban.com/simple/

注:在配置环境过程中,如遇到 pip安装问题,可查看pip安装问题常见解决办法

2.4 Yolov8模型训练,得到初步的检测模型

2.4.1 训练方式

yolo task=detect mode=train model=/home/y/Code/yolo_tracking/weights/yolov8x.pt data=datasets/my_dataset.yaml epochs=300 batch=4 device='0,1'
或者
yolo task=detect mode=train model=yolov8x.yaml data=datasets/my_dataset.yaml epochs=300 batch=4 device='0,1'

2.4.2 训练过程中遇到的问题

(1) wandb登录问题
在这里插入图片描述
可直接将wandb删除,执行命令如下:

python -m pip uninstall wandb

在这里插入图片描述

3 使用初步的检测模型实现自动数据集标注

3.1 使用初步的检测模型生成labels

3.1.1 修改default.yaml的参数配置,以保存由模型预测得到的labels的.txt文件

在使用初步的检测模型生成labels之前,需要修改default.yaml文件,使得预测的结果能够以.txt的形式保存。
在终端输入 yolo cfg找到default.yaml的位置,并将save_txt的false改为true
具体命令如下:

# 找到default.yaml的位置 
yolo cfg

# 打开 default.yaml文件
sudo gedit /home/y/anaconda3/envs/yolo_tracking/lib/python3.8/site-packages/ultralytics/cfg/default.yaml
# 将save_txt的值修改为True

案例:
找到default.yaml的位置 ,我的default.yaml文件的路径为:
‘/home/y/anaconda3/envs/yolo_tracking/lib/python3.8/site-packages/ultralytics/cfg/default.yaml’
在这里插入图片描述打开default.yaml文件,将save_txt的值修改为True,并ctrl+s进行保存
在这里插入图片描述
在这里插入图片描述

3.1.2 预测待自动标注的数据集

yolo predict model=runs/detect/train8/weights/best.pt source=/home/y/Code/test/test_dataset

3.2 微调labels

最后使用标注工具进行微调,这里我们使用的是labelImg,加载images和labels进行微调。
labelImg的具体安装步骤和使用方法,已在labelImg具体标注教程介绍,此处不再赘述。

在这里插入图片描述在这里插入图片描述