【YOLOv8】

news2025/2/22 7:33:47

在这里插入图片描述

文章目录

  • 1、yolov8 介绍
  • 2、创新点
  • 3、模型结构设计
    • 3.1、backbone
    • 3.2、head
  • 4、正负样本匹配策略
  • 5、Loss
  • 6、Data Augmentation
  • 7、训练、推理
  • 8、分割 Demo
  • 附录——V1~V8
  • 附录——相关应用
  • 参考

1、yolov8 介绍

YOLOv8 是 ultralytics 公司在 2023 年 1 月 10 号开源的 YOLOv5 的下一个重大更新版本

官方开源地址:

  • https://github.com/ultralytics/ultralytics/tree/v8.2.103

ultralytics-8.2.103 是最后一个版本的 v8,后续升级成了 v11

在这里插入图片描述

MMYOLO 开源地址:

  • https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/

不过 ultralytics 并没有直接将开源库命名为 YOLOv8,而是直接使用 ultralytics 这个词,原因是 ultralytics 将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。

在这里插入图片描述

vs yolov5

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

2、创新点

一个新的骨干网络(c2f)

一个新的 Ancher-Free 检测头(解耦分类和回归)

一个新的损失函数(TaskAlignedAssigner 正负样本分配策略 + Distribution Focal Loss)

3、模型结构设计

在这里插入图片描述

3.1、backbone

在这里插入图片描述

更多的跨层连接

3.2、head

在这里插入图片描述
不再有之前的 objectness 分支,只有解耦的分类和回归分支,并且其回归分支使用了 Distribution Focal Loss

4、正负样本匹配策略

YOLOv8 算法中则直接引用了 TOOD 的 TaskAlignedAssigner。

根据分类与回归的分数加权的分数选择正样本。
在这里插入图片描述

s s s 是标注类别对应的预测分值, u u u 是预测框和 g t gt gt 框的 iou

对于每一个 GT,对所有的预测框基于 GT 类别对应分类分数,预测框与 GT 的 IoU 的加权得到一个关联分类以及回归的对齐分数 alignment_metrics

对于每一个 GT,直接基于 alignment_metrics 对齐分数选取 topK 大的作为正样本

5、Loss

分类分支依然采用 BCE Loss

回归分支需要和 Distribution Focal 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,后续计算过程就和 YOLOv5 一样了。

其推理和后处理过程为:

(1) bbox 积分形式转换为 4d bbox 格式

对 Head 输出的 bbox 分支进行转换,利用 Softmax 和 Conv 计算将积分形式转换为 4 维 bbox 格式

(2) 维度变换

YOLOv8 输出特征图尺度为 80x80、40x40 和 20x20 的三个特征图。Head 部分输出分类和回归共 6 个尺度的特征图。

将 3 个不同尺度的类别预测分支、bbox 预测分支进行拼接,并进行维度变换。为了后续方便处理,会将原先的通道维度置换到最后,类别预测分支 和 bbox 预测分支 shape 分别为 (b, 80x80+40x40+20x20, 80)=(b,8400,80),(b,8400,4)。

(3) 解码还原到原图尺度

分类预测分支进行 Sigmoid 计算,而 bbox 预测分支需要进行解码,还原为真实的原图解码后 xyxy 格式。

(4) 阈值过滤

遍历 batch 中的每张图,采用 score_thr 进行阈值过滤。在这过程中还需要考虑 multi_label 和 nms_pre,确保过滤后的检测框数目不会多于 nms_pre。

(5) 还原到原图尺度和 nms

基于前处理过程,将剩下的检测框还原到网络输出前的原图尺度,然后进行 nms 即可。最终输出的检测框不能多于 max_per_img。

8、分割 Demo

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日)

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

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

相关文章

【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库

一、总体方案 目前在使用 DeepSeek 在线环境时,页面经常显示“服务器繁忙,请稍后再试”,以 DeepSeek R1 现在的火爆程度,这个状况可能还会持续一段时间,所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…

Oracle视图(基本使用)

视图 视图是通过定制的方式显示一个或者多个表的数据。 视图可以视为“虚拟表”或“存储的查询”。 视图的优点: 提供了另外一种级别的表安全性隐藏了数据的复杂性简化了用户的SQL命令隔离基表结构的改变通过重命名列,从另一个角度提供数据。 视图里…

梁文锋亲自挂名DeepSeek发布新论文

由 DeepSeek 联合创始人梁文锋亲自挂名的研究团队,在 arXiv 上发表了一篇题为“Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention”的论文,提出了一种全新的注意力机制架构 NSA(Native Sparse Attention&…

低代码(Low Code)全解析:从概念到应用,从选择到价值

​在数字化浪潮席卷全球的当下,企业对软件开发的效率与灵活性愈发重视,低代码平台应运而生并迅速掀起技术热潮。 本文基于笔者 6 年的低代码实践经验,深入剖析低代码的诸多方面,涵盖其定义、发展历程、国内平台对比、开发流程、与…

C++--STL库-List

目录 1.list 的基本使用 1.1 创建和初始化 1.2. 插入元素 1.3. 删除元素 1.4. 访问元素 1.5 遍历 1.6 总结 list是C标准库&#xff08;STL&#xff09;中的双向链表容器&#xff0c;属于<list>头文件。 它的特点是&#xff1a; 动态大小&#xff1a;可以随时插入…

尚硅谷 java 学习Day19 抽象类与抽象方法、接口、内部类

6-5 抽象类(abstract)与抽象方法&#xff08;important&#xff09; 一、什么叫抽象类&#xff1a; 有时候将一个父类设计的非常抽象&#xff0c;以至于它没有具体的实例&#xff0c;这样的类称为抽象类 abstract关键字的使用&#xff1a; ​ 1、abstract:抽象的 ​ 2、abs…

HomeAssistant 发现MQTT设备(温度,湿度,开关)

要通过 MQTT 将温度、湿度数据以及一个灯的开关状态传输到 Home Assistant 并实现设备自动发现&#xff0c;可以按照以下步骤操作&#xff1a; 1.前期准备工作 安装MQTT服务器(EMQX)配置好(可以在HA加载项中安装,也可以在NAS上Docker安装) HA的集成中安装MQTT,并且连接上(EM…

手写数字识别的神经网络 2层神经网络的类 代码详解

源代码和图解来自鱼书 目录 2层神经网络的类 源代码&#xff1a; 详解&#xff1a; 1. 类的初始化 (__init__) 2. 前向传播 (predict) 3. 损失函数 (loss) 4. 准确率计算 (accuracy) 5. 数值梯度计算 (numerical_gradient) 6. 反向传播计算梯度 (gradient) 总结&#…

【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【项目】基于STM32F103C8T6的四足爬行机器人设计与…

使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(自动化篇)

7.5. 配图生成 目的&#xff1a;由于小红书发布文章要求图文格式&#xff0c;因此在生成文案的基础上&#xff0c;我们还需要生成图文搭配文案进行发布。 原实现思路&#xff1a; 起初我打算使用deepseek的文生图模型Janus进行本地部署生成&#xff0c;参考博客&#xff1a;De…

#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…

HTTP FTP SMTP TELNET 应用协议

1. 标准和非标准的应用协议 标准应用协议&#xff1a; 由标准化组织&#xff08;如 IETF&#xff0c;Internet Engineering Task Force&#xff09;制定和维护&#xff0c;具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准&#xff0c;不同的实现之间可以很好地进行…

百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合

不等了&#xff0c;就是现在&#xff01;百度搜索全量接入DeepSeek-R1满血版 百度搜索已正式全量接入DeepSeek-R1满血版&#xff0c;在宣布“将接入”仅过了24小时后。 就在宣布“将接入”仅24小时后&#xff0c;百度搜索 已正式全量接入 DeepSeek-R1满血版&#xff01;得益于…

nordic(nrf52832、nrf52840)如何使用SES(SEGGER Embedded Studio)编辑编译工程?

nordic官方例程中一般都会给出好几个不同的编译环境供用户选择&#xff0c;一般是 keil工程、armgcc工程、IAR工程、ses工程等。 一、segger embedded studio如何添加工程.h头文件&#xff1f; 1)首先打开options 2&#xff09;下拉选中common 3&#xff09;找到common下的Pre…

LabVIEW利用CANopen的Batch SDO写入

本示例展示了如何通过CANopen协议向设备写入Batch SDO&#xff08;批量服务数据对象&#xff09;。Batch SDO允许用户在一次操作中配置多个参数&#xff0c;适用于设备的批量配置和参数设置。此方法能够简化多个参数的写入过程&#xff0c;提高设备管理效率。 主要步骤&#xf…

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…

【弹性计算】IaaS 和 PaaS 类计算产品

《弹性计算产品》系列&#xff0c;共包含以下文章&#xff1a; 云服务器&#xff1a;实例、存储、网络、镜像、快照容器、裸金属云上运维IaaS 和 PaaS 类计算产品 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680…

视频转序列帧

视频转序列帧 介绍操作总结 介绍 这篇文章不是单独讲视频转序列帧所有的方法&#xff0c;这里是针对我后面要做序列帧动画优化的一个工具篇幅。这里我用的premiere Pro 2020下面会讲方法简称pr。 操作 打开pr点击新建项目 输入名称点击确认 将需要转换的视频导入到媒体浏览…

LLM有哪些可控超参数

LLM有哪些可控超参数 目录 LLM有哪些可控超参数生成控制类采样相关类推理优化类惩罚类其他类计算资源与批量处理类上下文与Token相关类内存相关类生成控制类 以流式返回对话响应:指模型在生成回复时,是否以逐字或逐句的流式方式返回给用户,而不是等全部生成完再返回,能提升…

算法分析—— 《归并排序》

《排序数组》 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 示例 1&#xff1a; 输入&#xff1a;nums [5,2…