
【ContextGuided介绍】
摘要: 随着在移动设备上应用语义分割模型的需求迅速增长,当前的顶尖网络由于参数量巨大,不适合移动设备使用,而其他小内存模型则遵循分类网络的原则,忽略了语义分割的固有特征。为了解决这个问题,我们提出了一个轻量级且高效的语义分割网络-上下文引导网络(CGNet)。本文首次提出CG块,改模块通过学习局部特征和周围上下文的联合特征,并进一步用全局上下文改进了这一联合特征。基于CG块,本文开发了CGNet。它在网络的所有阶段捕获上下文信息,并专门为提高分割精度而设计。CGNet还精心设计了减少参数数量和保存内存占用。在参数数量相当的情况下,提出了CGNet显著优于现有分割网络。
模拟人类视觉系统依赖上下文信息来理解场景。CGBlock用于捕获局部特征,周围上下文和全局上下文,并将这些信息融合起来以提高准确性。这一模块包含以下部分:
这个过程是自适应的,因为提取的全局上下文是基于输入图像生成的。CG Block的设计允许CGNet能够有效的从底层到顶层聚合上下文信息,并在语义层面和空间层面捕获上下文信息。
(a)FCN-shape(全卷积网络形状):此模型遵循图像分类的设计原则,忽略了上下文信息。它可能使用一系列卷积和池化层来处理输入图像,生成输出,但没有显式地对各个层次的特征周围上下文进行建模
(b)FCN-CM(全卷积网络-上下文模块):此模型只在编码阶段后捕获上下文信息,通过执行一个上下文模块来从语义层次提取上下文信息
(c)CGNet(上下文引导网络):捕获所有阶段的上下文特征,从语义层次何空间层次两方面进行
是上下文引导块(CG block)的一个组成 部分,专门用于学习输入数据中的局部特征。在cgnet的设计中,这个局部特征提取器通过标准的3*3卷积层实现,其目的是从图像中的局部区域提取特征。这些局部特征随后与周围上下文特征结合,形成了网络对各个区域的全面理解,这对于语义分割尤为重要。
CGNet使用的局部特征提取器与周围上下文提取器(fsur(*))一起工作,确保模型不仅能够理解每个像素或局部区域的信息,而且还能理解这些区域在整体上下文中的关系。这种提取器能够捕捉到的细节和局部变化信息对于精确地分类图像中的每个像素至关重要,特别是在需要细粒度预测的任务重,如在复杂场景中区分不同的物体和表面。
CGNet的结构设计还包括减少参数数量,其中局部特征提取器和周围上下文提取器采用了通道卷积(channel-wise convolutions),以减少跨通道的计算成本并大幅节约内存。这种设计允许CGNet即使在资源受限的环境中(如移动设备)也能有效运行,同时保持高准确率和实时性。
在CGNet中的作用是整合由局部特征提取器和周围上下文提取器提取的特征。这些特征分别捕捉到了输入数据的细节(局部特征)和更广阔区域的信息(周围上下文)。联合特征提取器的设计目的是为了使得网络能够同时考虑局部和上下文信息,从而提高语义分割的准确性
联合特征提取器是上下文引导网络实现其高效语义分割能力的关键连接点,它允许网络在局部精细度和全局上下文间达到平衡
stage1:包含连续的3*3卷积层,这些层负责提取输入图像的初步特征
stage2:由多个CG块组成,数量用M表示,每个CG块都结合了局部特征提取器和周围上下文提取器,它们一起工作以捕获更复杂的局部和上下文信息
stage3:包含更多的CG块,数量用N表示,这一阶段进一步提炼特征,以捕捉更高层次的上下文信息
1*1conv:将特征映射到目标类别的数量,为最终的上采样和分类做准备
上采样:使用上采样或逆卷积操作将特征图尺寸扩大回输入图像的尺寸
预测:最终的预测图,每个像素被分配了一个类别标签,展示了对输入图像进行语义分割的结果
在CGNet中的作用是捕获并利用整个输入图像的全局信息,以增强联合特征提取器学习到的特征,基本原理如下:

【yolov11框架介绍】
2024 年 9 月 30 日,Ultralytics 在其活动 YOLOVision 中正式发布了 YOLOv11。YOLOv11 是 YOLO 的最新版本,由美国和西班牙的 Ultralytics 团队开发。YOLO 是一种用于基于图像的人工智能的计算机模
YOLO11 是Ultralytics YOLO 系列实时物体检测器的最新版本,以尖端的精度、速度和效率重新定义了可能性。基于先前 YOLO 版本的令人印象深刻的进步,YOLO11 在架构和训练方法方面引入了重大改进,使其成为各种计算机视觉任务的多功能选择。


Ultralytics YOLO11 与其前身相比引入了多项重大进步。主要改进包括:
【测试环境】
windows10 x64
ultralytics==8.3.0
torch==2.3.1
【改进流程】
from .ContextGuided import *
修改tasks.py文件
创建模型配置文件
yolo11-ContextGuided.yaml内容如下:
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
# [depth, width, max_channels]
n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs
# YOLO11n backbone
backbone:
# [from, repeats, module, args]
- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
- [-1, 1, ContextGuidedBlock_Down, [128]] # 1-P2/4
- [-1, 2, C3k2, [256, False, 0.25]]
- [-1, 1, ContextGuidedBlock_Down, [256]] # 3-P3/8
- [-1, 2, C3k2, [512, False, 0.25]]
- [-1, 1, ContextGuidedBlock_Down, [512]] # 5-P4/16
- [-1, 2, C3k2, [512, True]]
- [-1, 1, ContextGuidedBlock_Down, [1024]] # 7-P5/32
- [-1, 2, C3k2, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 2, C2PSA, [1024]] # 10
# YOLO11n head
head:
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 6], 1, Concat, [1]] # cat backbone P4
- [-1, 2, C3k2, [512, False]] # 13
- [-1, 1, nn.Upsample, [None, 2, "nearest"]]
- [[-1, 4], 1, Concat, [1]] # cat backbone P3
- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
- [-1, 1, ContextGuidedBlock_Down, [256]]
- [[-1, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, ContextGuidedBlock_Down, [512]]
- [[-1, 10], 1, Concat, [1]] # cat head P5
- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)
- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)git搜futureflsl/yolo-improve获取源码,然后使用新建的yaml配置文件启动训练任务:
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('yolo11-ContextGuided.yaml') # build from YAML and transfer weights
# Train the model
results = model.train(data='coco128.yaml',epochs=100, imgsz=640, batch=8, device=0, workers=1, save=True,resume=False)成功集成后,训练日志中将显示ContextGuided模块的初始化信息,表明已正确加载到模型中。

【训练说明】
第一步:首先安装好yolov11必要模块,可以参考yolov11框架安装流程,然后卸载官方版本pip uninstall ultralytics,最后安装改进的源码pip install . 第二步:将自己数据集按照dataset文件夹摆放,要求文件夹名字都不要改变 第三步:分别打开train.py,coco128.yaml和模型参数yaml文件修改必要的参数,最后执行python train.py即可训练
【提供文件】
├── [官方源码]ultralytics-8.3.0.zip
├── train/
│ ├── coco128.yaml
│ ├── dataset/
│ │ ├── train/
│ │ │ ├── images/
│ │ │ │ ├── firc_pic_1.jpg
│ │ │ │ ├── firc_pic_10.jpg
│ │ │ │ ├── firc_pic_11.jpg
│ │ │ │ ├── firc_pic_12.jpg
│ │ │ │ ├── firc_pic_13.jpg
│ │ │ ├── labels/
│ │ │ │ ├── classes.txt
│ │ │ │ ├── firc_pic_1.txt
│ │ │ │ ├── firc_pic_10.txt
│ │ │ │ ├── firc_pic_11.txt
│ │ │ │ ├── firc_pic_12.txt
│ │ │ │ ├── firc_pic_13.txt
│ │ └── val/
│ │ ├── images/
│ │ │ ├── firc_pic_100.jpg
│ │ │ ├── firc_pic_81.jpg
│ │ │ ├── firc_pic_82.jpg
│ │ │ ├── firc_pic_83.jpg
│ │ │ ├── firc_pic_84.jpg
│ │ ├── labels/
│ │ │ ├── firc_pic_100.txt
│ │ │ ├── firc_pic_81.txt
│ │ │ ├── firc_pic_82.txt
│ │ │ ├── firc_pic_83.txt
│ │ │ ├── firc_pic_84.txt
│ ├── train.py
│ ├── yolo11-ContextGuided.yaml
│ └── 训练说明.txt
├── [改进源码]ultralytics-8.3.0.zip
├── 改进原理.docx
└── 改进流程.docx【常见问题汇总】 问:为什么我训练的模型epoch显示的map都是0或者map精度很低? 回答:由于源码改进过,因此不能直接从官方模型微调,而是从头训练,这样学习特征能力会很弱,需要训练很多epoch才能出现效果。此外由于改进的源码框架并不一定能够保证会超过官方精度,而且也有可能会存在远远不如官方效果,甚至精度会很低。这说明改进的框架并不能取得很好效果。所以说对于框架改进只是提供一种可行方案,至于改进后能不能取得很好map还需要结合实际训练情况确认,当然也不排除数据集存在问题,比如数据集比较单一,样本分布不均衡,泛化场景少,标注框不太贴合标注质量差,检测目标很小等等原因 【重要说明】 我们只提供改进框架一种方案,并不保证能够取得很好训练精度,甚至超过官方模型精度。因为改进框架,实际是一种比较复杂流程,包括框架原理可行性,训练数据集是否合适,训练需要反正验证以及同类框架训练结果参数比较,这个是十分复杂且漫长的过程。