矽速科技 · 2023年04月07日 · 广东

YOLOv8 目标检测:训练自定义数据集并部署到爱芯派(一)

想体验 2023 年最新的 YOLOv8 并训练自己的数据集吗?

回顾往期文章

MAIX-III AXera-Pi 系列文章(1):新一代 3.6T 视觉 AI Linux 板卡面世

MAIX-III AXera-Pi 系列文章(2):丰富多采的 AI 应用

MAIX-III AXera-Pi 系列文章(3):Debian 系统 & 开箱案例

MAIX-III AXera-Pi 系列文章:开箱之硬件初体验

MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【一】

MAIX-III AXera-Pi 系列文章:上手之丝滑玩转 AI 板卡【二】

前言

2023 年 YOLOv8 的出现无疑是水中惊雷,可以说是计算机视觉领域的一次重大突破,这篇文章将会告诉你如何使用 YOLOv8 训练自己的数据集,并在 M3AXPI 爱芯派(硬件)上实现 “目标检测” 以及 “钢筋检测” !!!

  • 以下视频为 YOLOv8 户外检测实拍效果

https://www.bilibili.com/vide...

仓库地址:https://github.com/prophet-mu...

什么是 YOLOv8

YOLOv8 是 Ultralytics 开发的 YOLO(You Only Look Once)物体检测和图像分割模型的最新版本,是 YOLOv5 的下一个重大更新版本。YOLOv8 建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数,可以在从 CPU 到 GPU 的各种硬件平台上运行。

更多资料:YOLOv8 深度详解!一文看懂,快速上手

本文着重在于实操与应用,更多理论关注深度学习板块:深度学习

能做什么

YOLOv8 可以用于图像分类、物体检测和实例分割任务。

1680848084520.jpg

  • 图像分类

图像分类是指将图像分为不同的类别,例如将一张猫的图片分为 “” 这个类别。图像分类是计算机视觉中最基本的任务之一,也是许多其他计算机视觉任务的基础。

更多资料详情:【技术综述】你真的了解图像分类吗?
  • 物体检测

物体检测是指在图像中检测出物体的位置和类别,例如在一张照片中检测出人、车、建筑等物体。物体检测是计算机视觉中的一个重要任务,广泛应用于智能监控、自动驾驶、智能安防等领域。

1680848241097.jpg

更多资料详情:物体检测概述
  • 实例分割

实例分割是指在图像中检测出物体的位置、类别和像素级别的分割,例如在一张照片中检测出人、车、建筑等物体,并将它们的轮廓分割出来。实例分割是计算机视觉中的一个重要任务,广泛应用于智能监控、自动驾驶、智能安防等领域。

更多资料详情:实例分割综述总结综合整理版

流程导读区

我们怎么使用 YOLOv8 训练自己的数据集,并在 爱芯派硬件 上实现 目标检测?
来让流程导读告诉我们实现的过程以及步骤!

流程图

我们将通过四大块多个小块的步骤来实现我们的目标!

1680848814960.jpg

步骤概括

数据收集和预处理:首先,我们需要收集大量相关数据,并对其进行清洗和预处理,以便用于训练模型。
模型选择和训练:接下来,我们需要选择合适的模型并使用预处理后的数据对其进行训练。
模型评估:在模型训练完成后,我们需要对其进行评估,以确保其性能符合预期。
模型部署:最后我们将训练好的模型部署到生产环境中,以便实际应用。

环境

● 系统 ubuntu20.04
● nvidia 独立显卡 GPU(可选)
● 良好的网络(重要)
● Python:3.8.10

工具

● vscode(开发工具)
● Git
● Docker
● 预训练模型:YOLOv8s (测试模型性能和效果)

体验 YOLOv8

准备工作

需要掌握的基础知识:

  1. 掌握 Ubuntu 的基本操作,参考:Linux 教程 | 菜鸟教程
  2. 掌握 git 相关知识:Git 教程 | 菜鸟教程
  3. 掌握 Python:Python 基础教程 | 菜鸟教程

获取 YOLOv8 源码

YOLOv8 使用深度卷积神经网络来学习图像中物体的特征。
在训练过程中,模型会学习如何根据输入图像预测其中各个目标的位置和类别。
具体来说当给定一张输入图像时,YOLOv8 会将其分成多个网格单元。对于每个网格单元,模型会预测其中包含目标的概率以及目标所属类别的概率分布。此外,模型还会预测每个网格单元内目标边界框的位置和大小。最后,模型会根据这些预测结果生成最终的目标检测结果。这些结果包括每个检测到的目标的位置、大小和类别信息。

第一步:先拉取仓库,后续的所有操作都基于此。

cd ~ 
git clone https://github.com/prophet-mu/YOLOv8_Train_Guide.git

第二步:进入 m3axpi_YOLOv8 目录下

cd ~/YOLOv8_Train_Guide

第三步:拉取 yolov8 源码的仓库

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

第四步:等待源码厂库下载完成后进入 yolov8 的文件夹

cd ultralytics 

1680849558733.jpg

第五步:锁定提交号

git checkout ec10002a4ade5a43abb9d5765f77eefddf98904b

1680849654060.jpg

配置 YOLOv8 环境

准备工作:进行配置 YOLOv8 环境前先是我们的准备工作。

  • 安装 pip:执行下面这个指令
sudo apt install python3-pip    # install   

换源:如果执行下面的指令时发现网络较差,Yolov8 训练环境下载不了或失败,则需要先进行换源,这里以下文清华源为例参考。

1.1. pip更换软件源方法
1.2. python pip 换国内源的办法(永久和临时两种办法)
1.3. PIP 更换国内安装源

  • 安装 anaconda

第一步:anaconda 的安装与使用,以下资料可供参考:

1.1. 【anaconda在Ubuntu环境下的安装与使用(保证看完就会用,请将声音调到最大)】
1.2. ubuntu20.04 安装 anaconda 然后在 conda 里安装 pytorch
1.3. Anaconda 在 Ubuntu 下的安装与简单使用

第二步:安装显卡驱动、CUDA、cuDNN,以下资料可供参考:

搭建舒适的Ubuntu使用环境系列——安装显卡驱动、CUDA、cuDNN及其简单介绍

第三步:在 anaconda 中创建虚拟环境并安装 pytorch,以下资料可供参考:

Ubuntu 在 Anaconda 中创建虚拟环境并安装 pytorch

第四步:anaconda 换源,以下资料可供参考:

Ubuntu anaconda 换源(最新最全亲测)
  • 安装依赖

接下来再进行配置 yolov8 环境速度就会提高

pip install -r requirements.txt  # install   

也可以用 pip 单独安装特定版本的软件包

1680853847458.jpg

pip install -e '.[dev]'  # develop   
资料参考:https://docs.ultralytics.com/...

电脑端体验 YOLOv8

预训练模型

我们先要来了解一下预训练模型,预训练模型是一种深度学习的方法,它利用大量的无标注数据来学习通用的特征或知识,然后再用少量的标注数据来微调模型,以适应特定的任务。
预训练模型可以提高模型的性能和泛化能力,尤其是在数据稀缺或领域特定的场景下。

1680854025161.jpg
1680854064928.jpg

如上图所示,v8 提供了中杯,大杯,超大杯的模型(bushi),模型的参数由小到大,同等算力下参数越小,运行的速度就越快,上面两张图清晰的讲述了各个模型大小相对的速度与精度。

  • 找到图中的猫猫

1680854121457.jpg

本文采用 YOLOv8s 进行演示
yolo task=detect mode=predict model=yolov8s.pt data=rebar.yaml batch=-1 epochs=20

1680854187018.jpg

如果你没有下载预训练模型,他会自动帮你下载。

如果已提前下载好了并确保图片路径没错,去到终端返回给你的路径下就可以找到结果,如果你没有下载或者终端找不到文件,那么终端就会自动下载模型到你指定的文件夹。

1680854288023.jpg

1680854307047.jpg

训练自己的 YOLOv8 模型

在进入正式制作数据集前,我们先来看看训练模型的步骤。

流程导图

第一步:【认识数据集】以目标检测任务为例,数据集是用来训练模型的。数据集通常包含大量带有标注信息的图像,这些标注信息指示了图像中各个目标的位置和类别。
第二步:【制作数据集】在准备数据集时,我们需要收集大量相关图像,并对其进行标注。这一步非常重要,因为模型的性能很大程度上取决于数据集的质量。
第三步:【训练模型】有了准备好的数据集后,我们就可以使用它来训练我们自己的目标检测模型了,而在训练过程中模型会学习如何根据输入图像预测其中各个目标的位置和类别。

什么是数据集

YOLO 数据集格式是一种简单的文本格式:每张图片对应一个 txt 文件,文件中每行表示一个目标,包含类别和坐标信息。YOLO 数据集格式的优点是方便读取和处理,不需要额外的解析库。
在训练 YOLO 时需要将 COCO 或者 VOC 数据集转换成 YOLO 数据集的格式,因为 YOLO 的模型和损失函数都是基于这种格式设计的。

参考资料说明:

【数据集】深度学习从“数据集”开始
数据集的基础、原理和应用

处理数据集时:需要把 VOC 数据集或者是 COCO 数据集转换成 yolo 数据集,COCO 数据集和 VOC 数据集都是用于目标检测和分割的数据集。但是也有区别 COCO 数据集和 VOC 数据集的标注文件格式不同,COCO 是将所有图片的信息写在一个 json 文件中,而 VOC 是每张图片对应一个 xml 文件。

VOC 和 COCO 两者的文件夹结构也不同,VOC 数据集通常包含以下几个文件夹:

  • Annotations:存放 xml 标注文件
  • ImageSets:存放图片集合的 txt 文件
  • JPEGImages:存放图片文件
  • SegmentationClass:存放分割类别的 png 文件
  • SegmentationObject:存放分割对象的 png 文件
    COCO 数据集通常包含以下几个文件夹:
  • annotations:存放 json 标注文件
  • images:存放图片文件,分为 train2017、val2017、test2017 等子文件夹
  • labels:存放 YOLO 格式的 txt 标注文件(可选)

参考资料:
【VOC 数据集简介与制作】
【YOLOv5、YOLOv7、YOLOv8训练】——VOC数据集划分和YOLO格式转换

制作自己的数据集

本教程采用自己建立的钢筋数据集进行,如果你的数据集是标准数据集,或者是文题给出的垃圾分类数据集,可以跳过这一步,进入转换环节。

  • 准备图片

你可以直接获取图片、还可以是图片形式、也可以是视频形式,但最终要转化成图片的形式进行数据集的制作。这是示例的 voc 数据集的文件格式:images 是图片、Annotations 是标签文件,如果没有标注信息的话可直接把图标打包成压缩包即可。

1681113100402.jpg

推荐处理数据集可以到百度的 easydata 上处理,它能够多人标注,导入导出,还拥有智能标注的功能。首先进入百度 AI 平台:【https://ai.baidu.com/easydl/】右上角点击立即使用,选择物体检测。

1681113307716.jpg

  • 创建数据集

第一步:先点击数据总览,再点击创建数据集。

1681113347278.jpg

第二步:创建数据集:填写好数据集名称,再点击完成即可。

1681113428674.jpg

第三步:点击导入把自己的数据导入进去,没标注的和标注的都可以。

1681113480089.jpg

【这里需要注意压缩包的格式,压缩包仅支持 zip、tar、gz 格式】

1681113501140.jpg

第四步:上传完成后我们可以看到当前标注数据为0,点击查看与标注可以开始进行标注。

1681113538595.jpg

  • 标注数据集

第一步:添加自己的标签,点击标注图片即可开始标注。

1681113614062.jpg

第二步:当标注完一张图片后,点击左右箭头即可自动保存,我们需要先自行手动标注四五张图片,为后面智能标注做准备。

1681113654517.jpg

接下来利用百度 AI 平台的功能特点,让平台帮我们进行智能标注,则不需要手动标注节省了大量的时间。
第三步:选择智能标注,选择你刚刚建立的数据集并点击提交。

注意:未标注图片数量需大于 10,且每个标签的标注框数需大于并等于 10 才能启动智能标注!

1681113705285.jpg

第四步:点击提交之后,耐心等待即可。

1681113740201.jpg

第五步:我们需要对一些 “难例标注” 进行手动修改以提高标注的准确度。

1681113778829.jpg

第六步:修改完成后点击一键保存所有标注,如果当前标注的准确度与期望的精度相差甚远,则可以进行新一轮的难例筛选;如果标注的准确度达到要求,选择自动标注未标注的图片。

1681113807029.jpg

  • 导出数据集

第一步:当全部照片标注完成后,回到数据总览这里,前往 EasyData 平台导出刚才完成标注的数据集。

1681113870384.jpg

第二步:点击立即使用,找到刚才的数据集并点击导出。

1681114179344.jpg
1681114212686.jpg

第三步:导出到本地并选择 voc 格式,开始进行导出。

1681114362693.jpg

第四步:点击导出记录并进行下载。

1681114398976.jpg

  • 转换数据集

第一步:把刚刚导出的数据集拷贝到工作空间下并进行解压。
第二步:修改 xml_to_txt.py 文件,把对应的路径修改为自己的路径,运行它将 xml 文件转换为 txt 文件。

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


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


def convert_format(xml_files_path, save_txt_files_path, classes):
    xml_files = os.listdir(xml_files_path)
    print(xml_files)
    for xml_name in xml_files:
        print(xml_name)
        xml_file = os.path.join(xml_files_path, xml_name)
        out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')
        out_txt_f = open(out_txt_path, 'w')
        tree = ET.parse(xml_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))
            # b=(xmin, xmax, ymin, ymax)
            print(w, h, b)
            bb = convert((w, h), b)
            out_txt_f.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


if __name__ == "__main__":
    # 需要转换的类别,需要一一对应
    classes = ['rebar']
    # 2、voc格式的xml标签文件路径
    xml_files = r'/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/Annotations/'
    # 3、转化为yolo格式的txt标签文件存储路径
    save_txt_files = r'/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/label'

    convert_format(xml_files, save_txt_files, classes)
  • 数据集划分为训练,验证,测试
训练集是用来训练模型的,验证集是用来调整模型的超参数,测试集是用来评估模型的泛化能力。
划分数据集的目的是为了避免模型过拟合,即模型在训练集上表现很好,但在测试集上表现很差。如果没有测试集,我们就无法知道模型的泛化能力如何。如果没有验证集,我们就无法知道模型的超参数设置是否合理。

第一步:修改 split.py 文件,修改对应的路径为自己的路径后并运行。

# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
# 数据集路径
image_original_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/images/'
label_original_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/labels/'
# 训练集路径
train_image_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/train/images/'
train_label_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/train/labels/'
# 验证集路径
val_image_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/val/images/'
val_label_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/val/labels/'
# 测试集路径
test_image_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/test/images/'
test_label_path = '/home/prophetmu/m3axpi_model/ultralytics/ultralytics/datasets/rebar/test/labels/'

# 数据集划分比例,训练集75%,验证集15%,测试集15%,按需修改
train_percent = 0.7
val_percent = 0.15
test_percent = 0.1


# 检查文件夹是否存在
def mkdir():
    if not os.path.exists(train_image_path):
        os.makedirs(train_image_path)
    if not os.path.exists(train_label_path):
        os.makedirs(train_label_path)

    if not os.path.exists(val_image_path):
        os.makedirs(val_image_path)
    if not os.path.exists(val_label_path):
        os.makedirs(val_label_path)

    if not os.path.exists(test_image_path):
        os.makedirs(test_image_path)
    if not os.path.exists(test_label_path):
        os.makedirs(test_label_path)


def main():
    mkdir()

    total_txt = os.listdir(label_original_path)
    num_txt = len(total_txt)
    list_all_txt = range(num_txt)  # 范围 range(0, num)

    num_train = int(num_txt * train_percent)
    num_val = int(num_txt * val_percent)
    num_test = num_txt - num_train - num_val

    train = random.sample(list_all_txt, num_train)
    # 在全部数据集中取出train
    val_test = [i for i in list_all_txt if not i in train]
    # 再从val_test取出num_val个元素,val_test剩下的元素就是test
    val = random.sample(val_test, num_val)

    print("训练集数目:{}, 验证集数目:{},测试集数目:{}".format(len(train), len(val), len(val_test) - len(val)))
    for i in list_all_txt:
        name = total_txt[i][:-4]

        srcImage = image_original_path + name + '.jpg'
        srcLabel = label_original_path + name + '.txt'

        if i in train:
            dst_train_Image = train_image_path + name + '.jpg'
            dst_train_Label = train_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_train_Image)
            shutil.copyfile(srcLabel, dst_train_Label)
        elif i in val:
            dst_val_Image = val_image_path + name + '.jpg'
            dst_val_Label = val_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_val_Image)
            shutil.copyfile(srcLabel, dst_val_Label)
        else:
            dst_test_Image = test_image_path + name + '.jpg'
            dst_test_Label = test_label_path + name + '.txt'
            shutil.copyfile(srcImage, dst_test_Image)
            shutil.copyfile(srcLabel, dst_test_Label)

if __name__ == '__main__':
        main()

第二步:我们需要进入 ultralytics 的工作目录,复制一份 voc.yaml 并重命名为 rebar.yaml(这里需根据自己的地址复制 voc.yaml 文件,本文提供的地址不一定对应你的文件)也可以直接修改我们提供的 rebar.yaml

cp ultralytics/yolo/data/datasets/voc.yaml ultralytics/yolo/data/datasets/rebar.yaml

根据图片修改分类数据集的路径和类别名字(以 Windows10 为例)

1681114700538.jpg

如果你有多个标签可像下图这样,依次增加你的标签就好了。

1683617663167.jpg

训练自定义的数据集到这里结束!下一步我们将开始训练 YOLOv8 模型。

章节小结

通过上文我们对【YOLOv8】是什么以及能做什么有了基础的概念,并且还体验了使用 【YOLOv8】对猫猫图进行目标检测推理,还学会了如何训练自定义【耶!属于自己】的数据集!
而在下一章我们将学习如何训练自己的 YOLOv8 模型并部署到爱芯派上,下次见!

还想了解更多内容?

内容链接
AXera-Pi 产品介绍https://mp.weixin.qq.com/s/JIvVprWlQPvE7bTxozAG_Q
AXera-Pi 产品资料wiki.sipeed.com/m3axpi
海外购买渠道https://fr.aliexpress.com/item/1005005016931077.html
国内购买渠道https://item.taobao.com/item.htm?id=682169792430
AI 开发工具链https://pulsar-docs.readthedocs.io/
AI 示例仓库https://github.com/AXERA-TECH/ax-samples
Python APIhttps://github.com/junhuanchen/ax-pipeline-api
系统 BSP SDKhttps://github.com/sipeed/axpi_bsp_sdk
基础 C++ SDKhttps://github.com/sipeed/libmaix
进阶 C++ SDKhttps://github.com/AXERA-TECH/ax-pipeline
AXERA 技术交流群专供 AI ISP 技术交流:139953715
荔枝 MaixPy3 AI 交流群产品开箱小白答疑:756313869
AI 训练平台http://maixhub.com
在线文档http://wiki.sipeed.com
交流社区http://bbs.sipeed.com
开源组织http://github.com/sipeed
官方推特https://twitter.com/SipeedIO
商业邮箱support@sipeed.com
推荐阅读
关注数
7435
内容数
92
人工智能边缘计算软硬件解决方案,提供高性能、低成本、低功耗、易使用的硬件选型方案.
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息