问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

YOLOv8深度解析:从模型结构到实战应用

创作时间:
作者:
@小白创作中心

YOLOv8深度解析:从模型结构到实战应用

引用
CSDN
1.
https://m.blog.csdn.net/bryant_meng/article/details/145567400

YOLOv8是Ultralytics公司在2023年1月开源的YOLO系列最新版本,相比YOLOv5,YOLOv8在模型结构、损失函数和训练策略等方面进行了全面升级。本文将详细介绍YOLOv8的各个方面,包括其创新点、模型结构设计、训练和推理过程等。

1、YOLOv8介绍

YOLOv8是Ultralytics公司在2023年1月10日开源的YOLOv5的下一个重大更新版本。官方开源地址为:https://github.com/ultralytics/ultralytics/tree/v8.2.103。需要注意的是,ultralytics-8.2.103是最后一个版本的v8,后续升级成了v11。

此外,YOLOv8也在OpenMMLab的MMYOLO仓库中开源,地址为:https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/

值得注意的是,Ultralytics并没有直接将开源库命名为YOLOv8,而是直接使用ultralytics这个名称。这是因为Ultralytics将这个库定位为一个算法框架,而非某一个特定算法,其主要特点是可扩展性。

2、创新点

YOLOv8的主要创新点包括:

  • 一个新的骨干网络(C2f)
  • 一个新的Anchor-Free检测头(解耦分类和回归)
  • 一个新的损失函数(TaskAlignedAssigner正负样本分配策略+Distribution Focal Loss)

3、模型结构设计

3.1、Backbone

YOLOv8的Backbone采用了更多的跨层连接,这有助于增强特征的传递和融合。

3.2、Head

YOLOv8的Head不再有之前的objectness分支,只有解耦的分类和回归分支。其中,回归分支使用了Distribution Focal Loss。

4、正负样本匹配策略

YOLOv8算法中直接引用了TOOD的TaskAlignedAssigner。根据分类与回归的分数加权的分数选择正样本。具体来说,对于每一个GT,对所有的预测框基于GT类别对应分类分数,预测框与GT的IoU的加权得到一个关联分类以及回归的对齐分数(alignment_metrics)。对于每一个GT,直接基于alignment_metrics对齐分数选取topK大的作为正样本。

5、Loss

  • 分类分支依然采用BCE Loss
  • 回归分支使用了Distribution Focal Loss,同时使用了CIoU Loss

6、Data Augmentation

数据增强方面和YOLOv5差距不大,只不过引入了YOLOX中提出的最后10个epoch关闭Mosaic的操作。

7、训练、推理

训练

YOLOv8的训练策略和YOLOv5没有本质区别,最大区别就是模型的训练总epoch数从300提升到了500。

推理

YOLOv8的推理过程和YOLOv5几乎一样,唯一差别在于前面需要对Distribution Focal Loss中的积分表示bbox形式进行解码,变成常规的4维度bbox。具体步骤如下:

  1. bbox积分形式转换为4d bbox格式
  2. 维度变换
  3. 解码还原到原图尺度
  4. 阈值过滤
  5. 还原到原图尺度和NMS

8、分割Demo

下面是一个使用YOLOv8进行图像分割的Python代码示例:

from ultralytics import YOLO
import random
import cv2
import numpy as np
from tqdm import tqdm
import os
from natsort import natsorted

"yolov8 segmentation"
if 1:
    model = YOLO("yolov8x-seg.pt")
    yolo_classes = list(model.names.values())
    # if you want all classes
    classes_ids = [yolo_classes.index(clas) for clas in yolo_classes]
    colors = [random.choices(range(256), k=3) for _ in classes_ids]
    conf = 0.5
    pth = "/home/bryant/images/"
    tgt = "/home/bryant/v8x/"
    os.makedirs(tgt, exist_ok=True)
    for image in tqdm(natsorted(os.listdir(pth))):
        if ".jpg" not in image:
            continue
        img = cv2.imread(os.path.join(pth, image))
        img_ori = img.copy()
        results = model.predict(img, conf=conf)
        # print(results)
        for result in results:
            if result:
                for mask, box in zip(result.masks.xy, result.boxes):
                    if int(box.cls[0]) != 0:  # only segment human
                        continue
                    points = np.int32([mask])
                    # cv2.polylines(img, points, True, (255, 0, 0), 1)
                    color_number = classes_ids.index(int(box.cls[0]))
                    mask = cv2.fillPoly(img, points, colors[color_number])
                    mask_img = cv2.addWeighted(img_ori, 0.15, mask, 0.85, 0)
                    # mask = cv2.fillPoly(zero, points, colors[color_number])
                    # mask_img = 0.9*mask + 0.1*img
            try:
                cv2.imwrite(os.path.join(tgt, image), mask_img)
            except:
                cv2.imwrite(os.path.join(tgt, image), img_ori)

附录——V1~V8

附录——相关应用

  1. 一种基于YOLO-v8的智能城市火灾探测改进方法(2023年09月22日)

参考

参考学习摘抄来自:

  • positive666/yolo_research
  • YOLOv8深度详解!一文看懂,快速上手(2023年01月12日)
  • 万字长文,彻底搞懂YOLOv8网络结构及代码实战!(2023年06月19日)
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号