YOLOv8-目标检测实战,训练自己的数据集(提供数据集)

YOLOv8项目跳转:ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)

个人github项目跳转:fangshuiyun/YOLOv8-ExDark: YOLOv8训练自己的数据集(提供数据集练手),视频实时检测测试。 (github.com)

个人github项目里没有存放YOLOv8源码,存放的是一些训练过程参数、验证测试结果和环境配置文件等。

一、环境配置

安装PyTorch

 默认已经安装了Anaconda!

在Anaconda里创建环境,打开Anaconda Prompt(安装Anaconda就有这个,在“开始”菜单查找或者搜索),输入:

conda create -n yolov8 python=3.9

 

注:YOLOv8源码中写了安装要求,如下所示,python>=3.8,PyTorch>=1.8 。

 激活刚刚创建好的环境:

conda activate yolov8

 安装PyTorch库

 法一:打开pytorch官网查找合适的PyTorch和CUDA版本,复制命令输入到Anaconda Prompt-yolov8环境里执行,例如:

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=10.2 -c pytorch

 conda会自动安装与python3.9匹配的1.10.0版本的PyTorch,但是这种方法比较慢,可能会安装超时。

 法二:先下载安装包,再进行安装!去安装包库挑选合适的包,下载到本地,然后安装。

conda install pytorch==1.10.0 torchvision==0.11.0 torchaudio==0.10.0 cudatoolkit=10.2 -c pytorch

 根据这条命令去找相应的包:

 

 我在服务器上进行训练的,所以我下载的是linux版本,windows就下载win版本!

先进入存放路径,再安装这三个包,安装这三个包的过程会下载其他适配的包,所以加上镜像会下载快一点:

cd moss/package/
pip install torch-1.10.0+cu102-cp39-cp39-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchaudio-0.10.0+cu102-cp39-cp39-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install torchvision-0.11.0+cu102-cp39-cp39-linux_x86_64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple

检查是否安装成功,在命令行中的python编译器中验证:

python
import torch # 如果pytorch安装成功即可导入
print(torch.cuda.is_available()) # 查看CUDA是否可用
print(torch.cuda.device_count()) # 查看可用的CUDA数量
print(torch.version.cuda) # 查看CUDA的版本号

下载YOLOv8源码

 首先切换至指定目录,执行以下命令下载Yolov8项目代码。

git clone https://github.com/ultralytics/ultralytics

 

git clone可能有点慢或者连接超时,我都是直接下载zip然后放到指定目录下。

解压放到指定目录:

 cd进入ultralytics-main,安装requirements.txt:

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

 注:更新过后的YOLOv8已经删除了requirements.txt,所以我这里直接提供了,我的github上也有,把它添加到文件夹当中,注意命名:

# Ultralytics requirements
# Usage: pip install -r requirements.txt

# Base ----------------------------------------
matplotlib>=3.2.2
numpy>=1.22.2 # pinned by Snyk to avoid a vulnerability
opencv-python>=4.6.0
pillow>=7.1.2
pyyaml>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.64.0

# Logging -------------------------------------
# tensorboard>=2.13.0
# dvclive>=2.12.0
# clearml
# comet

# Plotting ------------------------------------
pandas>=1.1.4
seaborn>=0.11.0

# Export --------------------------------------
# coremltools>=6.0,<=6.2  # CoreML export
# onnx>=1.12.0  # ONNX export
# onnxsim>=0.4.1  # ONNX simplifier
# nvidia-pyindex  # TensorRT export
# nvidia-tensorrt  # TensorRT export
# scikit-learn==0.19.2  # CoreML quantization
# tensorflow>=2.4.1  # TF exports (-cpu, -aarch64, -macos)
# tflite-support
# tensorflowjs>=3.9.0  # TF.js export
# openvino-dev>=2023.0  # OpenVINO export

# Extras --------------------------------------
psutil  # system utilization
py-cpuinfo  # display CPU info
# thop>=0.1.1  # FLOPs computation
# ipython  # interactive notebook
# albumentations>=1.0.3  # training augmentations
# pycocotools>=2.0.6  # COCO mAP
# roboflow

再安装ultralytics: 

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

matplotlib重新安装,为什么要重新安装?因为在训练结束之后,程序会用matplotlib对各种指标进行画图,如下所示。但是如果matplotlib版本过高就会导致错误:ImportError: Cannot load backend 'TkAgg' which requires the 'tk' interactive framework, as 'headless' is currently running。这个错误就会使得一些曲线图没法画出来,亲测呢!!!

卸载你的环境中matplotlib高版本,下载3.2.2版本。我是管用的。

pip uninstall matplotlib
pip install matplotlib==3.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

二、数据集准备 

 我使用的是ExDark数据集(找很久,就这个不是很大众,有标注):ExDark_数据集-飞桨AI Studio星河社区 (baidu.com)

 ExDark数据集用于暗光下的目标检测,由马来西亚大学计算机科学与信息技术学院图像与信号处理中心发布。数据集简介:ExDark黑暗下的目标检测数据集(含下载链接) - 知乎 (zhihu.com)

ExDark数据集(左上,右下)转YOLOv8的数据集格式(中心,宽,高):

<------------------------>

recipy.py

这个代码在github上也有,主要是将ExDark的数据集标注转成YOLO格式的,并且将数据集按8:1:1的比率划分成train:test:valid,其中还对格式和颜色空间进行了统一,全都转化成jpg格式(原始数据集有jpg,png,jepg等),颜色空间为RGB。为什么要进行格式和颜色空间的统一?亲测,不统一的话,在训练过程中会出现反反复复的警告:slibpng warning: iCCP: known incorrect sRGB profile--libpng warning: iCCP: cHRM chunk does not match sRGB,非常头疼!

import os
from PIL import Image
import argparse

#标签对应的索引,如Bicycle-0, Boat-1....
labels = ['Bicycle', 'Boat', 'Bottle', 'Bus', 'Car', 'Cat', 'Chair', 'Cup', 'Dog', 'Motorbike', 'People', 'Table']

#转化成RGB格式,避免Libpng警告
def fix_image_profile(img):
    try:
        img = img.convert("RGB")
    except Exception as e:
        print(f"Error fixing color profile: {e}")
    return img

#同一数据集格式-jpg
def convert_to_jpg(img_path, output_path):
    try:
        img = Image.open(img_path)
        img = fix_image_profile(img)
        jpg_path = os.path.splitext(output_path)[0] + ".jpg"
        img.save(jpg_path)
        return jpg_path
    except Exception as e:
        print(f"Error converting {img_path} to JPG: {e}")
        return None

def ExDark2Yolo(txts_dir: str, imgs_dir: str, ratio: str, version: int, output_dir: str):
    ratios = ratio.split(':')
    ratio_train, ratio_test, ratio_val = int(ratios[0]), int(ratios[1]), int(ratios[2])
    ratio_sum = ratio_train + ratio_test + ratio_val
    dataset_perc = {'train': ratio_train / ratio_sum, 'test': ratio_test / ratio_sum, 'val': ratio_val / ratio_sum}

    for t in dataset_perc:
        os.makedirs('/'.join([output_dir, t, 'images']))
        os.makedirs('/'.join([output_dir, t, 'labels']))

    for label in labels:
        print(f'Processing {label}...')
        filenames = os.listdir('/'.join([txts_dir, label]))
        cur_idx = 0
        files_num = len(filenames)

        for filename in filenames:
            cur_idx += 1
            filename_no_ext = '.'.join(filename.split('.')[:-2])
            if cur_idx < dataset_perc.get('train') * files_num:
                set_type = 'train'
            elif cur_idx < (dataset_perc.get('train') + dataset_perc.get('test')) * files_num:
                set_type = 'test'
            else:
                set_type = 'val'
            output_label_path = '/'.join([output_dir, set_type, 'labels', filename_no_ext + '.txt'])
            yolo_output_file = open(output_label_path, 'a')

            name_split = filename.split('.')
            img_path = '/'.join([imgs_dir, label, '.'.join(filename.split('.')[:-1])])
            jpg_path = convert_to_jpg(img_path, '/'.join([output_dir, set_type, 'images', os.path.basename(img_path)]))
            if jpg_path:
                try:
                    img = Image.open(jpg_path)
                except Exception as e:
                    print(f"Error opening {jpg_path}: {e}")
                    continue

                width, height = img.size
                txt = open('/'.join([txts_dir, label, filename]), 'r')
                txt.readline()  # ignore first line
                line = txt.readline()

                while line != '':
                    datas = line.strip().split()
                    class_idx = labels.index(datas[0])
                    x0, y0, w0, h0 = int(datas[1]), int(datas[2]), int(datas[3]), int(datas[4])
                    if version == 5:
                        x = (x0 + w0/2) / width
                        y = (y0 + h0/2) / height
                    elif version == 3:
                        x = x0 / width
                        y = y0 / height
                    else:
                        print("Version of YOLO error.")
                        return
                    w = w0 / width
                    h = h0 / height

                    yolo_output_file.write(' '.join([str(class_idx),
                                                     format(x, '.6f'),
                                                     format(y, '.6f'),
                                                     format(w, '.6f'),
                                                     format(h, '.6f'),
                                                     ]) + '\n')
                    line = txt.readline()

                yolo_output_file.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--anndir', type=str, default='./ExDark/Annnotations', help="ExDark注释文件夹路径.")
    parser.add_argument('--imgdir', type=str, default='./ExDark/images', help="ExDark图像文件夹路径")
    parser.add_argument('--ratio', type=str, default='8:1:1', help="划分比率 train/test/val, default 8:1:1.")
    parser.add_argument('--version', type=int, choices=[3, 5], default=5, help="转化的YOLO版本,YOLOv3和YOLOv5,YOLOv8的数据集格式跟YOLOv5一致")
    parser.add_argument('--output-dir', type=str, default="./datasets/ExDark", help="YOLO格式数据集输出的文件夹路径")
    args = parser.parse_args()
    ExDark2Yolo(args.anndir, args.imgdir, args.ratio, args.version, args.output_dir)

转化完,将整个datasets文件夹移到ultralytics-main/ultralytics下:

三、开始训练

配置数据集的路径和标签,在ultralytics-main/ultralytics/datasets里创建ExDark.yaml并下载好预训练模型:

yolov8s.pt下载地址

yolov8n.pt下载地址

ExDark.yaml

# Datasets----注意存放的绝对路径,相对路径不行,我试了一下
train: /**/moss/github/ultralytics-main/ultralytics/datasets/ExDark/train
val: /**/moss/github/ultralytics-main/ultralytics/datasets/ExDark/valid
test: /**/moss/github/ultralytics-main/ultralytics/datasets/ExDark/test

# Classes
names:
  0: Bicycle
  1: Boat
  2: Bottle
  3: Bus
  4: Car
  5: Cat
  6: Chair
  7: Cup
  8: Dog
  9: Motorbike
  10: People
  11: Table

进入ultralytics-main/ultralytics/cfg/models/v8目录,配置yolov8.yaml的类别数nc:

开始训练 

记得先cd进入指定目录ultralytics-main/ultralytics再运行命令行程序:

训练命令:

yolo train data=datasets/ExDark.yaml model=datasets/yolov8s.pt epochs=300 imgsz=640 batch=64 workers=12

 /datasets/ExDark.yaml和/datasets/yolov8s.pt都是目录ultralytics-main/ultralytics下的相对路径,所以一定要先进入目录ultralytics-main/ultralytics,不然也可以自行更改。显存不足可以调小imgsz和batch。

训练完会在ultralytics/run/detect/train下生成权重和各种指标的曲线图。

draw.py

 draw.py是根据results.csv画图,如下所示。如果已经生成了results.png,请忽略此段代码!

模型测试 

 设置val数据集进行模型验证,目录ultralytics-main/ultralytics不变,命令如下:

yolo task=detect mode=val split=val model=runs/detect/train/weights/best.pt  data=datasets/ExDark.yaml

验证完成后,打开.\runs\detect\val文件夹,即可看到模型验证效果和指标曲线,如下图所示(展示部分)。

设置test数据集进行模型验证,目录ultralytics-main/ultralytics不变,命令如下: 

yolo task=detect mode=val split=test model=runs/detect/train/weights/best.pt  data=datasets/ExDark.yaml

 验证完成后,打开.\runs\detect\val2文件夹(因为是验证模式),即可看到模型验证效果和指标曲线,如下图所示(展示部分)。

  

 实时视频检测

目录ultralytics-main/ultralytics不变,mp4视频提供在github上demo文件夹当中,命令如下:

yolo task=detect mode=predict model=runs/detect/train/weights/best.pt source=datasets/秦淮河夜景.mp4

yolo task=detect mode=predict model=runs/detect/train/weights/best.pt source=datasets/城市夜景.mp4

完结撒花! 

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
YoLoV3是一个开源的目标检测算法,可以用来训练自己的数据集。以下是一些步骤来训练自己的数据集。 首先,需要准备自己的数据集。这些数据集应该包含您希望YoLoV3能够检测的不同目标的图像。对于每个图像,你需要标记每个目标的位置和类别,并将其保存为对应的标签文件。 接下来,下载并安装YoLoV3的源代码。您可以从GitHub上找到该项目,并按照项目的说明进行安装。 然后,需要对配置文件进行一些调整。配置文件包含了一些关键参数,例如学习率、训练次数和类别数。您需要根据您的数据集和需求来调整这些参数。 接下来,将您的数据集分为训练集和验证集。训练集用于训练模型,验证集用于评估模型的性能。确保这两个数据集中包含各种不同的目标。 然后,您可以开始训练模型。您需要运行训练脚本,并将训练集和验证集作为参数传递给该脚本。模型会在每个训练周期中根据损失函数进行调整。 训练完成后,您可以使用测试集来评估模型的性能。测试集是一个额外的数据集,不同于训练集和验证集。您可以使用预测脚本来对测试集中的图像进行目标检测,并计算模型在不同指标上的表现。 最后,您可以使用训练好的模型来进行目标检测。您可以将模型加载到您的应用程序中,并使用它来检测您感兴趣的目标。 通过上述步骤,您就可以使用YoLoV3来训练自己的数据集了。记住,训练一个强大和准确的模型可能需要一定的时间和实践经验,所以请继续学习和尝试改进您的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值