【红外小目标检测实战 五】轻量化模型结构及去除DFL以加速边缘推理

接前篇,常规卷积在CUDA上回进行内存重排,使之变为连续的,然后放到CUDA核或者Tensor核上进行一系列高性能的乘加操作。但是风车卷积不是常规的卷积,虽说参数量也小,但是在jetson上无对应的高性能算子,导致访存不连续,进而拉慢了推理性能。本篇去掉了风车型卷积,改回SPDConv,同时去掉了边缘设备上不友好的DFL结构,并将激活函数从SiLU改为ReLU重新训练,以提高边缘设备推理性能。

一、模型信息

模型结构图

YAML文件

python 复制代码
nc: 1  # 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.5, 0.50, 1024]
  # s: [1.0, 1.00, 1024]
  # m: [1.00, 2.00, 512]

backbone:
  # [from, repeats, module, args]
  - [-1, 1, SPDConv, [32]]           
  - [-1, 1, SPDConv, [64]]           
  - [-1, 2, C3k2, [64, True, 0.25]] # 2  P2
  - [-1, 1, Conv, [64, 3, 2]]
  - [-1, 2, C3k2, [128, True, 0.25]] # 4  P3
  - [-1, 1, Conv, [128, 3, 2]]
  - [-1, 2, C3k2, [256, False]]  # 6  P4
  - [-1, 1, SPPF, [256, 5]]
  - [-1, 2, C2PSA, [256]]  # 8

head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [128, False]]  # 11

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 2], 1, Concat, [1]] # cat backbone P2
  - [-1, 2, C3k2, [64, False]]  # 14

  - [-1, 1, Conv, [64, 3, 2]] 
  - [[-1, 11], 1, Concat, [1]]
  - [-1, 2, C3k2, [128, False]] # 17

  # 向上分支,融合原始特征
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 2], 1, Concat, [1]] # cat backbone P2
  - [-1, 2, MicroC3, [64]] # 20
  - [-1, 1, HDC, [64]]
  - [-1, 1, ART, [64]]  # 22

  - [17, 1, Conv, [128, 3, 2]]
  - [[-1, 8], 1, Concat, [1]] # 24
  - [-1, 2, C3k2, [256, True]] # 

  - [[22, 17, 25], 1, Detect, [nc]]  # Detect(P2, P3, P4)
  # - [[21, 17, 24], 1, Detect, [nc]] # 减少一个concat

模型参数量分析

n-model总体FLOPs很小,只有4.78G,参数量500多K。

s-modelFLOPs也只有21.554G

二、详细改动

1.关闭DFL

ultralytics/nn/modules/head.py

python 复制代码
class Detect(nn.Module):
  ...
  def __init__(self, nc: int = 80, ch: tuple = ()):
        """
        Initialize the YOLO detection layer with specified number of classes and channels.

        Args:
            nc (int): Number of classes.
            ch (tuple): Tuple of channel sizes from backbone feature maps.
        """
        super().__init__()
        self.nc = nc  # number of classes
        self.nl = len(ch)  # number of detection layers
        # self.reg_max = 16  # DFL channels (ch[0] // 16 to scale 4/8/12/16/20 for n/s/m/l/x)
        self.reg_max = 1  # !!!注释掉上面一句,修改为这个

2.修改模块激活函数

ultralytics/nn/modules/conv.py

python 复制代码
class Conv(nn.Module):
    """
    Standard convolution module with batch normalization and activation.

    Attributes:
        conv (nn.Conv2d): Convolutional layer.
        bn (nn.BatchNorm2d): Batch normalization layer.
        act (nn.Module): Activation function layer.
        default_act (nn.Module): Default activation function (SiLU).
    """

    # default_act = nn.SiLU()  # default activation
    default_act = nn.ReLU()  # !!!修改在此处

其余使用到的模块,也需要检查激活函数是否为ReLU.

三、实验结果

测试集上混淆矩阵

网络在自制测试集上的召回率和准确率都很高。

推理性能

n-model在jetson nx板子上,可以达到90FPS!

四、后续

  • 推理代码分享
相关推荐
B博士26 分钟前
科研进展 | JAG: 大光斑高光谱激光雷达遥感辐射传输模型从垂直视角解锁森林叶绿素分布密码
人工智能·jag·高光谱激光雷达·森林分层叶绿素诊断
Yao.Li1 小时前
PVN3D ORT CUDA Custom Ops 实现与联调记录
人工智能·3d·具身智能
诺伦1 小时前
LocalClaw 在智能制造的新机会:6部门AI+电商政策下的工厂AI升级方案
人工智能·制造
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬8 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志8 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114248 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠8 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光8 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好8 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型