SEO基础

SEO基础

Products

当前位置:首页 > SEO基础 >

如何高效实现YOLOv5目标检测?掌握深度学习的实用指南!

96SEO 2026-02-23 14:45 12


href="https://www.cnblogs.com/ljbguanli/p/19622955"

如何高效实现YOLOv5目标检测?掌握深度学习的实用指南!

title="发布于

aria-level="2">实用指南:⭐深度学习之目标检测yolo算法Ⅲ-YOLOv5(1)

id="content_views">

前言:

经过之前几个版本的yolo学习总结,这一章我用来总结YOLOv5中理论相关的知识,逐步来深入的总结经典版本之一的YOLOv5。

yolo系列的算法发展脉络

  • YOLOv1:首次提出

    “端到端”

    目标检测,将目标检测转化为回归问题,速度极快,但小目标检测效果差、定位精度低。

  • YOLOv2:引入锚框(Anchor

    Box)、批量归一化(BN)、高分辨率预训练,提升了检测精度和稳定性。

  • YOLOv3:采用

    Darknet-53

    骨干网络、多尺度检测、分类损失使用交叉熵,大幅提升小目标检测效果。

  • YOLOv4:引入

    CSPNet、Mosaic

    损失、自注意力机制,在精度和速度上实现平衡。

  • YOLOv5:基于

    YOLOv4

    优化,采用更轻量的骨干网络、自适应锚框计算、自适应图片缩放,同时支持快速部署,生态更完善(是目前工业界应用最广泛的

    YOLO

    版本之一)。

1.YOLOv5的网络架构

我在网上对比了很多YOLOv5的网络架构,最终发现这几张能够清楚明白的展现YOLOv5的核心架构

style="color:

1)">17/20/23三个头的输出层数

⭐此处感谢(@酒酿小圆子~,@K同学啊)

style="color:

1)">(如有侵权请留言)

alt=""

src="https://i-blog.csdnimg.cn/direct/609ef2be23844492a168382e539e0f04.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/38490eca15b84608bfec4a66be746e45.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/48dd10f105ff41a4910ac026e19b619f.png"

width="693">

首先我们得清楚整个训练流程和推理流程,我们所说的网络架构其实就是前向传播中的网络架构如下图。

alt=""

src="https://i-blog.csdnimg.cn/direct/2ae74886f1b1477097a9ec7b685b8bf4.png"

width="671">

基于上述图形化的架构可以让我们对整个YOLOv5模型有更清晰的认知,接下来我将按照YOLOv5的整体网络架构剖析为以下几个部分。

style="color:

1)">训练阶段:

数据加载与预处理

[Backbone→Neck→Head](前向传播,输出预测张量)

正负样本匹配

权重文件

style="color:

1)">推理阶段:

输入图像预处理(无数据增强

自适应黑边缩放

输出检测结果

⭐⭐⭐

style="color:

0.25,过滤掉置信度低的预测框,减少无效计算;

style="color:

0.45,过滤同一目标的重复框;

IOU的使用:

  • IOU

    及其优化版本是目标检测中边界框回归的核心,既用于训练阶段的损失计算

  • 推理阶段用于推理阶段的

    NMS

    后处理。

我们按提出顺序

IOU

的痛点:

style="width:

244px">优缺点总结

src="https://i-blog.csdnimg.cn/direct/d53f31542456442bada447c6345e23bc.png"

width="316">

不考虑框的位置关系(如包含、分离)

style="width:

src="https://i-blog.csdnimg.cn/direct/4215f14669024d929049ccf9c9bde023.png"

width="537">

0」的问题,引入最小外接矩形的惩罚项

style="width:

IOU,无法区分框的位置差异

style="width:

src="https://i-blog.csdnimg.cn/direct/b927a527202440e79c1c05ecfac5c72d.png"

width="603">

的包含问题,直接关注两框中心点的距离

style="width:

未考虑框的宽高比差异

style="width:

src="https://i-blog.csdnimg.cn/direct/48f504a92c0d434fa24bad6e81e46491.png"

width="609">

基础上,增加宽高比惩罚项

style="width:

宽高比惩罚项权重固定,对不同尺度目标适应性一般

style="width:

src="https://i-blog.csdnimg.cn/direct/41812b4e0d08446b978457b677fc6cf4.png"

width="611">

132px">重构损失组成,引入角度惩罚,更贴合目标框的几何特性

style="width:

计算复杂度略高

指标
基础

IOU

GIoU
DIoU
CIoU
SIoU

2.目标检测的难题和优化方法

style="color:

遮挡密集目标检测解决方案

1.数据层面

  • 丰富数据的多样性,增加样本数量

  • 数据扩充(Mosaic

    增强,采用「CutMix

    大角度旋转」)

2.标签层面

  • 增加[遮挡程度标签]:训练时可通过损失函数加权(对重度遮挡样本赋予更高损失权重)
  • 采用「关键点标注」:针对目标的关键特征点(如人脸的眼睛、车辆的车轮)进行标注,此操作标注工作巨大,任务量巨大。

3.模型层面

  • YOLOv5s更换更大的模型(YOLOv5m/l/s),增加网络的深度和宽度,提升特征表达能力
  • 引入注意力机制(CA,ECA,CBAM)。

  • 优化损失函数,提升遮挡目标的回归精度:EIoU

    Loss,增加「边界框回归损失的权重」。

实操:在

YOLOv5

层插入注意力模块(修改models/common.py),无需大幅改动网络结构,工程落地难度低。

4.工业进阶方案(高成本)

  • 采用「多模型融合」:训练多个不同尺度的

    YOLOv5

    模型

  • 引入「实例分割」:使用

    YOLOv5

    R-CNN,通过分割掩码区分重叠目标的轮廓,再转化为边界框,大幅提升密集遮挡场景的效果

style="color:

小目标检测解决方案(工业落地优先级排序)

1.数据层面

  • 提高样本的丰富度:重点收集不同场景、不同光照、不同背景下的小目标样本。

  • 标注优化:小目标标注需

    精准化”,避免标注框过大或过小。

  • 数据扩充:优先使用「Mosaic

    增强」,采用「Copy-Paste

    增强」,禁用「大尺度裁剪、模糊增强」。

2.模型层面

  • 提升输入分辨率可以让小目标的特征信息更丰富,模型更容易捕捉,小目标像素少。

  • YOLOv5

    默认输入分辨率为

    640×640,可调整为1280×12801920×1920(训练时通过--img

    1280参数指定)。

  • 推理时可采用「多尺度推理」(如

    640×640+1280×1280)

  • 优化网络结构,加强小目标特征提取与融合,增加小目标检测分支,优化骨干网络,减少低层特征下采样次数。

  • 引入「特征金字塔

    注意力机制

  • 调整锚框(Anchor),适配小目标尺寸

3.推理和后处理

  • 采用「图像切片(Sliding

    Window)」策略

  • 调整后处理参数,降低小目标漏检率

4.

工业进阶方案(高成本,高精度,适合核心业务场景)

  • 采用「高分辨率模型

    知识蒸馏

  • 更换「小目标专用检测模型

style="color:

1)">核心总结(工业落地关键要点)

  1. 无论是遮挡密集目标还是小目标检测,数据层面的优化都是第一优先级(成本最低、效果最显著),模型层面和后处理层面的优化是补充。

  2. 工业落地中,优先选择「简单高效、可快速部署」的方案(如

    Mosaic

    NMS),再逐步尝试高阶方案(如注意力机制、图像切片)。

  3. 所有优化都需要结合实际业务场景调试(如阈值、分辨率、锚框),没有通用的

    “最优解”,只有

    “最适配场景的解”。


3.YOLOv5参数详解

1.样本训练时修改XXX.yaml文件中的配置路径,且在train.py中相应位置修改路径

argparse.ArgumentParser()

train.py训练集的参数注解

parse_opt(known=False):"""Parse

command-line

False.Returns:(argparse.Namespace):

Parsed

execution.Examples:```pythonfrom

ultralytics.yolo

parse_opt()print(opt)```Links:-

Models:

https://github.com/ultralytics/yolov5/tree/master/models-

Datasets:

https://github.com/ultralytics/yolov5/tree/master/data-

Tutorial:

https://docs.ultralytics.com/yolov5/tutorials/train_custom_data"""parser

argparse.ArgumentParser()"""argparse:专门管理参数的库default

填充具体值root

是根目录"""#初始预训练权重parser.add_argument("--weights",

type=str,

r"/root/wjj/yolov5/models/yolov5s.yaml""""模型配置文件,此处的default是要修改为自己配置的文件#/root/wjj/yolov5/models/yolov5s.yamlweight

cfg规则1.当weights不为空时,cfg为空则加载weights中的模型文件2.当weights为空时,cfg不为空,但此时不预训练权重3.当weights与cfg模型的结构一样时,就是给cfg赋初值weights4.当weights与cfg不一样时,取交集权重。

***能够继承大模型的初始权重******什么时候用初始权重,什么时候不用初始权重***生活场景使用工业场景:可以尝试先用,也可以不用⭐训练技巧:先训练中度模型M权重例20层,将M权重作为weights初始加进cfg中此时cfg是小的权重,因为取交集的原因会权重迁移。

从大模型中学习小模型。

"""parser.add_argument("--cfg",

type=str,

path")#⭐配置训练数据源parser.add_argument("--data",

type=str,

path")#⭐训练集参数文件地址,之前学习的超参数都在这里parser.add_argument("--hyp",

type=str,

"data/hyps/hyp.scratch-low.yaml",

100,300parser.add_argument("--epochs",

type=int,

,16,32,64parser.add_argument("--batch-size",

type=int,

autobatch")#⭐训练的输入尺寸640,输出头20,40,80。

取决于图大小一般最大也是1280parser.add_argument("--imgsz",

"--img",

(pixels)")#矩形训练,不常用parser.add_argument("--rect",

action="store_true",

上一轮的基础上继续训练1.如果训练到一般停止了想要接着训练则需要将默认参数修改且将上述的weights权重也修改,默认路径修改为为暂停时的权重路径default=Truepath_new

r"/root/wjj/yolov5/runs/train/exp3/weights/last.pt"parser.add_argument("--weights",

type=str,

path")2.如果开启了resume,此时我们修改.py中的参数是无效的,则需要取上述运行到一般的exp3文件修改参数值修改该文件下面两个其中一个,可以试试/root/wjj/yolov5/runs/train/exp3/opt.yaml/root/wjj/yolov5/runs/train/exp3/hyp.yaml'''parser.add_argument("--resume",

nargs="?",

training")parser.add_argument("--nosave",

action="store_true",

训练后有验证则关闭验证parser.add_argument("--noval",

action="store_true",

epoch")#不进行自动聚类anchorparser.add_argument("--noautoanchor",

action="store_true",

AutoAnchor")parser.add_argument("--noplots",

action="store_true",

files")parser.add_argument("--evolve",

type=int,

generations")parser.add_argument("--evolve_population",

type=str,

population")parser.add_argument("--resume_evolve",

type=str,

generation")parser.add_argument("--bucket",

type=str,

bucket")parser.add_argument("--cache",

type=str,

ram/disk")"""⭐自动对于类别不平衡时,BCE有自动平衡,自动平衡系数,小样本更聚焦1.针对数据少的给予更大的权重loss一般都是true"""parser.add_argument("--image-weights",

action="store_true",

training")#代表多块显卡0,1,2代表三块显卡parser.add_argument("--device",

default="",

cpu")"""⭐是否开启多尺度训练640标准最小320,最大9600.5

,1.5"""parser.add_argument("--multi-scale",

action="store_true",

50%%")#单类训练parser.add_argument("--single-cls",

action="store_true",

single-class")#优化器选择parser.add_argument("--optimizer",

type=str,

help="optimizer")#多卡训练才开启parser.add_argument("--sync-bn",

action="store_true",

mode")"""⭐多进程读数据,需要开启4-8之间"""parser.add_argument("--workers",

type=int,

mode)")parser.add_argument("--project",

default=ROOT

project/name")parser.add_argument("--name",

default="exp",

project/name")parser.add_argument("--exist-ok",

action="store_true",

increment")parser.add_argument("--quad",

action="store_true",

dataloader")#是都开启余弦退火parser.add_argument("--cos-lr",

action="store_true",

scheduler")#标签平滑,防止过拟合,降低gt的标准(给标签一个怀疑尺度)parser.add_argument("--label-smoothing",

type=float,

epsilon")"""⭐早停轮次,val毫无进展就早停,可修改参数"""parser.add_argument("--patience",

type=int,

improvement)")"""⭐冻结训练:0代表不冻结,10代表冻结前10层1,3,5代表冻结下标为1,3,5层两个作用:1.有针对性的训练2.微调,best.pt已经97%,再来10张漏检,整个模型训练有风险,这是就可以针对此数据集进行微调"""parser.add_argument("--freeze",

nargs="+",

2")parser.add_argument("--save-period",

type=int,

1)")parser.add_argument("--seed",

type=int,

seed")parser.add_argument("--local_rank",

type=int,

argumentsparser.add_argument("--entity",

default=None,

help="Entity")parser.add_argument("--upload_dataset",

nargs="?",

option')parser.add_argument("--bbox_interval",

type=int,

interval")parser.add_argument("--artifact_alias",

type=str,

loggingparser.add_argument("--ndjson-console",

action="store_true",

console")parser.add_argument("--ndjson-file",

action="store_true",

parser.parse_args()

detect.py训练集的参数注解

File/dir/URL/glob/screen/0(webcam).

Defaults

argparse.ArgumentParser()#自己加的path_best_pt

r"/root/wjj/yolov5/runs/train/exp3/weights/best.pt""""⭐detect.py中将自己加的训练权重赋值上去即可parser.add_argument("--weights",

nargs="+",

URL")"""parser.add_argument("--weights",

nargs="+",

URL")"""⭐图片/视频流都可以,作为资源检测"""parser.add_argument("--source",

type=str,

help="file/dir/URL/glob/screen/0(webcam)")parser.add_argument("--data",

type=str,

path")"""⭐推理尺寸:可以不等于训练尺寸"""parser.add_argument("--imgsz",

"--img",

h,w")#置信度parser.add_argument("--conf-thres",

type=float,

threshold")#nms去重置信度parser.add_argument("--iou-thres",

type=float,

threshold")#最多一张图有1000个目标parser.add_argument("--max-det",

type=int,

image")#设备parser.add_argument("--device",

default="",

cpu")parser.add_argument("--view-img",

action="store_true",

results")"""⭐⭐⭐及其重要能否将预测结果保存为yolo格式标签标签1000张训练得到ai模型将后面的2000张做预测,得到其他2000张的标签用labeling,重新打开预测的标签查看是否正确1.必须手动设置classes.txtparser.add_argument("--save-txt",

True,

*.txt")"""parser.add_argument("--save-txt",

action="store_true",

*.txt")parser.add_argument("--save-format",type=int,default=0,help="whe***r

save

Pascal-VOC",)parser.add_argument("--save-csv",

action="store_true",

format")#是否将预测框box截图截下来parser.add_argument("--save-conf",

action="store_true",

labels")parser.add_argument("--save-crop",

action="store_true",

boxes")parser.add_argument("--nosave",

action="store_true",

images/videos")parser.add_argument("--classes",

nargs="+",

3")parser.add_argument("--agnostic-nms",

action="store_true",

NMS")parser.add_argument("--augment",

action="store_true",

inference")"""⭐⭐⭐及其重要将网络层中的特征,每层随机选32个通道保存可视化,cam热力图parser.add_argument("--visualize",

True,help="visualize

features")"""parser.add_argument("--visualize",

action="store_true",

features")parser.add_argument("--update",

action="store_true",

models")parser.add_argument("--project",

default=ROOT

project/name")parser.add_argument("--name",

default="exp",

project/name")parser.add_argument("--exist-ok",

action="store_true",

increment")parser.add_argument("--line-thickness",

default=3,

(pixels)")parser.add_argument("--hide-labels",

default=False,

labels")parser.add_argument("--hide-conf",

default=False,

confidences")parser.add_argument("--half",

action="store_true",

inference")parser.add_argument("--dnn",

action="store_true",

inference")parser.add_argument("--vid-stride",

type=int,

expandprint_args(vars(opt))return

opt

val.py训练集的参数注解

False.Returns:argparse.Namespace:

Parsed

argparse.ArgumentParser()parser.add_argument("--data",

type=str,

path")parser.add_argument("--weights",

nargs="+",

path(s)")parser.add_argument("--batch-size",

type=int,

size")parser.add_argument("--imgsz",

"--img",

(pixels)")"""⭐⭐⭐重要的参数1.训练过程中的训练集的置信度评价为0.001需要看业务情况,常见为0.25"""parser.add_argument("--conf-thres",

type=float,

threshold")parser.add_argument("--iou-thres",

type=float,

threshold")parser.add_argument("--max-det",

type=int,

image")parser.add_argument("--task",

default="val",

study")parser.add_argument("--device",

default="",

cpu")parser.add_argument("--workers",

type=int,

mode)")parser.add_argument("--single-cls",

action="store_true",

dataset")parser.add_argument("--augment",

action="store_true",

inference")parser.add_argument("--verbose",

action="store_true",

class")parser.add_argument("--save-txt",

action="store_true",

*.txt")parser.add_argument("--save-hybrid",

action="store_true",

*.txt")parser.add_argument("--save-conf",

action="store_true",

labels")parser.add_argument("--save-json",

action="store_true",

file")parser.add_argument("--project",

default=ROOT

project/name")parser.add_argument("--name",

default="exp",

project/name")parser.add_argument("--exist-ok",

action="store_true",

increment")parser.add_argument("--half",

action="store_true",

inference")parser.add_argument("--dnn",

action="store_true",

opt.data.endswith("coco.yaml")opt.save_txt

opt.save_hybridprint_args(vars(opt))return

opt

hyp.XX.yaml参数注释

训练超参数文件

/root/wjj/yolov5/data/hyps/hyp.scratch-low.yaml

https://ultralytics.com/license

Hyperparameters

https://github.com/ultralytics/yolov5#tutorials

#训练超参数

#⭐yolov5中挑选正样本的方法(0.25-4之间一般也不动)

anchor_t:

loss(通过这个焦点损失函数让难分样本的损失比易分样本的损失大,迫使网络倾向学习损失大的多学一点)

#焦点损失为0则代表不开启,如果设置为1.5则代表公式中的γ为1.5/2.0,α默认为0.25

fl_gamma:

#实操⭐⭐⭐:一般精度要在90%以上时(作为初始权重)才开启此项,最佳操作在93%以上

#困难样本挖掘

#2.pt去推理所有的train和val得到pre_yolo_box->labeling去看错的专门去数据增强重新训练->将train放回数据集,val不放

#3.也是损失角度:将损失从大到小排序,sort,然后仅取(取正样本的三倍)损失比较大的进行bp(反向传播),在线困难样本挖掘

#⭐如果标签打错了以上办法无用,仅有第二种方法才能找出来。

(标签必须重要)

#⭐⭐⭐hsv数据增强

:色彩色调上的饱和度#1.工业图像关闭(一般是黑白)#2.目标颜色为主要特征时也要关闭

hsv_h:

0)">⭐源码核心微调

train中是一轮训练

一轮验证

最后拿最好的也就是best.pt文件进行验证(注意这些val中都没有设置置信度,也就是默认的0.001不合理),同时iou的阈值配置也需要调整,置信度也需要配置

alt=""

src="https://i-blog.csdnimg.cn/direct/c157b73c549d459b9fc66c7822451a08.png"

width="1743">

train.py源码中 Model

alt=""

src="https://i-blog.csdnimg.cn/direct/5d9d1565304447439be59d12443b5768.png"

width="1611">

backward()梯度裁剪

alt=""

src="https://i-blog.csdnimg.cn/direct/df1191182bf543f4a03579e67b4d6035.png"

width="1794">

train.py中验证集置信度筛选

alt=""

src="https://i-blog.csdnimg.cn/direct/9498572900fd4fd5910a0b86389968a8.png"

width="1917">

fitness()函数:挑选best.pt权重(可定制)

alt=""

src="https://i-blog.csdnimg.cn/direct/265330f930b14fc7800b4ac1aa437bc0.png"

width="1743">

断点续训,修改相应opt文件

alt=""

src="https://i-blog.csdnimg.cn/direct/da25e3fd8eb3447590ecc262f8bcda38.png"

width="1859">

基线训练时,默认关闭数据增强位置

alt=""

src="https://i-blog.csdnimg.cn/direct/8d9ce8daa4234d809c21d322f168358e.png"

width="1487">

数据的读取来自dateset->dateloader,需要注意的是如果修改了文件记得删除缓存

alt=""

src="https://i-blog.csdnimg.cn/direct/fb524835dc4d4991a98cecf87c83319d.png"

width="1274">

在线数据增强的位置和操作:

alt=""

src="https://i-blog.csdnimg.cn/direct/682dfebf43024b97a0a34e6dddf80844.png"

width="1823">

dateset源码:

1.CPU缓存

2.在dataloaders.py中实现了mosic数据增强(如果mosic则degress->平移->缩放->裁剪->再mosic->mixup->hsv->翻转)

3.如果想自己添加在线数据增强①首先先在hyp_scratch_low中添加参数。

②在dataloaders.py中的getitems中添加相应的增强。

做完数据增强则进行前向传播然后进行损失计算

style="color:

1)">参数修改对应位置

hpy.scratch-low.yaml

<->

src="https://i-blog.csdnimg.cn/direct/c88c1c176ae442328aa2695e969e59ed.png"

width="1817">

此处是置信度和分类进行focalloss,我们可以定制先对置信度进行focal

loss,再对整体做focal

loss,有利于提高检出率

alt=""

src="https://i-blog.csdnimg.cn/direct/017034c6622b42bba3a1bc7c383d1a5b.png"

style="color:

1)">LOSS.py损失中可定制的点

alt=""

src="https://i-blog.csdnimg.cn/direct/cb01c0585b8640e2bc524b8ae0d13330.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/d8522daac97540caa7b8f828e4217c77.png"

width="1804">

YOLOv5改进(七)--改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU

技术栈


4.首次运行结果可视化详解

rgba(0,

0)">1.混淆矩阵

val集中:预测自己是自己的概率,以及预测为其他类或者背景的概率。

style="color:

1)">指导漏检和误检的效用

style="color:

1)">1.目标认为是背景那就是漏检

style="color:

1)">2.目标认为是别的类称为误检

alt=""

src="https://i-blog.csdnimg.cn/direct/54bfd3e1e0664b549f94be2845598331.png"

width="900">


2.精确率和召回率

关于P和R的认知

alt=""

src="https://i-blog.csdnimg.cn/direct/ed96cc9086894f5cb3d8a77ab438cc19.png"

R(查全率)

map是什么-CSDN博客​​​​​​)

P:

Precision,精确率,也叫查准率。

预测为正类的样本中确实为正类的比例。

R:Recall,召回率,也叫查全率。

所有实际正类中,有多少正类被预测出来。

F1

Score:是精确率和召回率的调和平均数,是一种兼顾精确率和召回率的综合指标。

alt=""

src="https://i-blog.csdnimg.cn/direct/344a33008682483fbb1267b101a5dc8e.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/6fe6b0e7b3264760b0ce8f4667a28571.png"

style="color:

1)">我们正常查看和选取的是置信度和召回率形成平衡的点

alt=""

src="https://i-blog.csdnimg.cn/direct/b66eb07ce3f0487d8df7b3174c15e052.png"

width="1263">

style="color:

1)">还有一个评判标准F1

style="color:

Score:是精确率和召回率的调和平均数,是一种兼顾精确率和召回率的综合指标。

style="color:

1)">即F1值越高效果越好

alt=""

src="https://i-blog.csdnimg.cn/direct/09ca782e0e3d4e94a7d1b0bc93913d93.png"

width="1361">

3.数据分布效果

1.验证集中的分布和类别特点

alt=""

src="https://i-blog.csdnimg.cn/direct/7e7d2e7d4b1a46e4b50a898a631476fb.png"

style="color:

1)">经验:

我们可以根据其验证集的分布特点进行针对性的数据增强和网络重构

4.运行结果的关注要点

alt=""

src="https://i-blog.csdnimg.cn/direct/c962cfea54fe4103992d71821178673b.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/7b2b300a9fc84df58a8191d2531c0c5b.png"

alt=""

src="https://i-blog.csdnimg.cn/direct/fac60b5ed2a9455f97a6e55e2e0dd426.png"

width="2000">

5.模型文件大小对应关系

YOLOv5

型号

对应

宽度系数

适用场景
YOLOv5n

(Nano)

yolov5n.yaml~4.0

MB

~2.0

0.25

边缘设备、超低算力、实时性要求极高(如单片机、嵌入式传感器)
YOLOv5s

(Small)

yolov5s.yaml~14.0

MB

~7.0

APP、轻量型部署(平衡速度和精度)

YOLOv5m

(Medium)

yolov5m.yaml~42.0

MB

~21.0

0.75

边缘服务器、工控机、中等算力场景(精度优于

v5s,速度略降)

YOLOv5l

(Large)

yolov5l.yaml~95.0

MB

~47.5

1.00

桌面端、高性能服务器、高精度要求场景(速度较慢,精度较高)
YOLOv5x

(X-Large)

yolov5x.yaml~166.0

MB

~83.0

1.25

云端服务器、超算平台、极致精度要求(算力消耗大,速度最慢)

5.优化YOLO算法

核心:原理+代码

1.数据集

style="color:

1)">数据集层面的优化属于数据前处理阶段对输入的数据集进行优化。

style="color:

1)">核心思路:根据实际业务场景对数据集进行针对性的数据增强,针对性体现于产品的使用场景/条件/环境的多样性造成的影响,有针对性的数据增强。

style="color:

1)">核心目标:通过数据增强尽可能的模拟真实情况,确保训练集和验证集及测试集的数据分布特征的一致性。

style="color:

1)">造成影响:数据增强的本质就是加大学习的难度,所以可能会导致其精准率些许下降,属于正常情况,虽然下降了但模型的泛化能力增强了,效果可能更好。

style="color:

1)">预期结果:

1.提高特征的多样性。

(不同的光照/亮度/背景/大小/角度[仿射变换]/颜色等)

2.样本的平衡多样性。

2.网络结构

style="color:

1)">网络结构层面的优化在于前向传播和反向传播的优化。

style="color:

1)">核心思路与目的:

1.前向传播:增减模块/替换模块/增加头的方法/添加注意力等方式,目的是为了更好的提取特征。

2.反向传播:通过更新网络结构防止梯度消失。

3.损失函数

style="color:

1)">yolo中损失函数的优化,分为两点

style="color:

IOU系列

style="color:

Loss

style="color:

1)">⭐回归替换的原因:

style="color:

尺寸的数值误差,而非检测任务真正关心的框的重合度

例如:两框的坐标数值差异小,但可能不重叠,两框的坐标差异较大但可能大部分重叠。

style="color:

1)">2.对框的尺度和位置敏感,鲁棒性差:MSE

w

的数值变化敏感,小目标的尺寸误差会被放大,大目标的尺寸误差会被缩小。

style="color:

1)">3.缺乏旋转不变性:当框发生旋转时,坐标数值会大幅变化,MSE

损失会急剧增大,但框的实际重合度可能并未降低,这在旋转目标检测场景下完全不适用。

style="color:

损失的额外优化:YOLOv5/v8

CIoU

框的重叠面积、中心点距离、长宽比

三个因素,让回归更精准、收敛更快。

style="color:

1)">⭐分类替换的原因:本质是多个S函数

style="color:

的适配性:

  • 常规

    损失

    指的是多分类交叉熵损失。

  • YOLO

    BCE(二元交叉熵)损失。

  • YOLO

    的锚框分为两类:包含目标的正样本、不包含目标的负样本

style="color:

损失的核心优化点:

YOLO

BCEWithLogitsLoss(带

Sigmoid

“每个类别独立的二元判断”

alt=""

src="https://i-blog.csdnimg.cn/direct/6e8b982ef40647308aec2fb7971b91d0.png"

width="585">

1.适配

“多类别独立判断”

的需求:每个锚框需要判断:是否为背景如果是目标,属于哪一类

2.更好地处理正负样本不平衡:通过调节正负样本的pos_weight权重系数。

3.减少冗余:BCEWithLogitsLoss

Sigmoid

“聚焦困难样本”

核心创新:引入了动态调制系数(Modulation

alt=""

src="https://i-blog.csdnimg.cn/direct/82112507838e49cba3132f71dc86763b.png"

width="401">

理解:

  • 当样本是简单样本时:pt​

    1(模型能准确预测),此时

    到极低水平,几乎不参与模型优化;例如:γ=2,简单负样本的pt​=0.9(模型准确判断为背景),调制系数为(1−0.9)2=0.01,该样本的损失会被缩小

    100

    倍,不再干扰模型;

  • 当样本是困难样本时:pt​

    (1−pt​)

    甚至相对放大,成为模型优化的核心重点;例如:γ=2,困难正样本的pt​=0.3(模型难以判断是否为目标),调制系数为(1−0.3)2=0.49,损失几乎不受压制,模型会重点优化这类样本;

  • 当γ=0时:调制系数为

    1,Focal

    的继承性。

style="color:

Loss解决:本质通过加权重调节系数聚焦困难样本上,确保其效果更好。

1.类别不平衡问题:样本数少。

2.难觅样本:双胞胎,样本与背景有极高相似度的图。

class="link-title">1708.02002

src="https://csdnimg.cn/release/blog_editor_html/release2.4.5/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=PBP8">https://arxiv.org/pdf/1708.02002

style="color:

loss是通过调控fl_gamma参数实现,论文数值是2。

hyp.scratch-low.yaml/hyp.scratch-med.yaml/hyp.scratch-high.yaml

fl_gamma=0关闭

Focal

BCE),fl_gamma>0启用

Focal

2.0);


4.参数调整+部署

参数调整:

本质上是通过查看大量论文与做大量试验,将优秀论文中的摘抄有用的整合到自己的代码中,调整参数,并优化自己的训练策略,比方说冻结训练等操作,有针对性的调整参数,做试验去验证。

部署:

芯片+加速架构+推理代码

NPU部署:C++控制成本


6.推理代码实操(yolov5)

因为yolov5与yolov8的后处理推理过程代码大差不差,此处提供笔者自己总结时所实操的思路和相应的代码。

YOLOv5

模型加载到检测结果可视化的完整多目标检测闭环

1.模型的加载与初始化

2.图像的预处理

3.模型的前向传播

4.预测框的解码和初筛

5.NMS

非极大值抑制去重

6.结果可视化与保存

详解:

  • 模型加载与初始化加载

    YOLOv5

    预训练权重文件,提取模型结构,设置为eval()推理模式(关闭训练相关层),转为半精度(half())提升推理效率,自动适配

    CUDA/CPU

    计算设备。

  • 图像预处理读取原始

    BGR

    标准输入尺寸)→转换为模型可接受的张量(通道置换、归一化、增加批次维度、转为半精度)。

  • 模型前向推理将预处理后的图像张量输入模型,获取输出结果(25200

    个检测候选框),每个候选框包含「坐标信息

    数组方便后续数值处理。

  • 检测框解码与初筛

    • 设定置信度阈值(0.5),双重过滤低质量候选框:先过滤目标置信度(obj_conf)不达标者,再过滤综合置信度(obj_conf×类别最大得分)不达标者;
    • 将候选框的「中心坐标

      宽高」格式,解码转换为「左上角

      右下角」坐标格式;

    • 按原始图像与输入尺寸的比例,缩放坐标至原始图像尺寸,同时限制坐标在图像边界内,收集符合条件的有效检测框。

  • NMS

    非极大值抑制去重对初筛后的检测框执行一次非极大值抑制(NMS):按置信度降序排序,计算框间交并比(IoU),过滤

    IoU

    超过阈值(0.5)的重复框,保留每个目标的最优检测框,解决多目标检测中的框重叠问题。

  • 结果可视化与保存加载目标类别名称,在原始图像上绘制

    NMS

    置信度标签(红色文字),最终保存可视化结果图像,并输出「去重前

    class="language-python">#!/usr/bin/env

    python

    转换为numpy数组,保留所有字段(x1,y1,x2,y2,conf,cls)boxes

    np.array(boxes,

    提取保留的框,转换为列表,同时后续将坐标转为intreturn

    boxes[keep].tolist()

    torch.load(model_path,map_location=torch.device('cuda'

    else

    'cpu'),weights_only=False)model

    ckpt['model']model.eval()model.half()print("模型加载完成,已进入推理模式")#

    读取并预处理图片image_path

    FileNotFoundError("未找到图片")img_h,

    img_w

    torch.from_numpy(img_resized).permute(2,

    1).float()

    img_tensor.half().unsqueeze(0)#

    前向推理with

    preds.squeeze(0).cpu().numpy()print(f"预测输出形状:

    {preds.shape}")#

    conf_threshold:continuecls_scores

    p[5:]cls

    non_max_suppression(final_boxes,

    iou_threshold=0.5)print(f"去重前目标数:

    {len(final_boxes)}")print(f"NMS后目标数:

    ['person',

    核心修改:将浮点型坐标强制转换为int,conf保留浮点型,cls转换为intx1

    int(box[0])y1

    类别转为整数索引cv2.rectangle(img_result,

    (x1,

    {conf:.2f}"cv2.putText(img_result,label,(x1,

    max(y1

    0)),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,

    255),1)cv2.imwrite("detection_result.jpg",

    img_result)print("检测结果已保存:detection_result.jpg")


    0)">总结:

    本文是笔者关于yolov5架构+参数详解+运行结果的可视化图像分析+以及优化YOLO算法。

    以及最后笔者总结的推理部分代码。

class="post-meta-container">



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback