news 2026/4/16 18:04:12

YOLOFuse代码实例:infer_dual.py推理脚本深度解读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOFuse代码实例:infer_dual.py推理脚本深度解读

YOLOFuse代码实例:infer_dual.py推理脚本深度解读

1. 引言:YOLOFuse 多模态目标检测框架

在复杂环境下的目标检测任务中,单一模态(如可见光图像)往往受限于光照不足、烟雾遮挡等问题。为提升鲁棒性与检测精度,多模态融合技术应运而生。YOLOFuse是基于 Ultralytics YOLO 架构构建的双流多模态目标检测框架,支持RGB 图像与红外(IR)图像的融合检测,特别适用于夜间、低光或恶劣天气等场景。

该框架采用双分支网络结构,分别处理可见光和红外输入,并通过多种融合策略(决策级、早期特征级、中期特征级)实现信息互补。infer_dual.py作为核心推理脚本,承担了模型加载、双模态数据预处理、前向推断与结果可视化等关键职责。本文将对其源码进行逐层解析,帮助开发者深入理解其运行机制并快速定制化部署。

2. 推理流程总体架构

2.1 脚本功能概览

infer_dual.py的主要功能包括:

  • 加载训练好的双流融合模型权重
  • 同时读取配对的 RGB 和 IR 图像
  • 对两路输入进行独立预处理与归一化
  • 执行双流前向推理
  • 根据配置选择融合方式(early/mid/late fusion)
  • 输出融合后的边界框与类别预测
  • 生成带标注的可视化图像并保存

整个流程遵循“输入→预处理→双流推理→融合决策→输出”的标准 pipeline,具备良好的模块化设计。

2.2 程序执行入口分析

脚本通常以如下命令启动:

python infer_dual.py

默认行为是使用预置的测试图像对(位于data/imagesdata/imagesIR)进行推理,输出结果至runs/predict/exp目录。可通过命令行参数自定义输入路径、模型权重、设备类型等选项。

典型调用链如下:

main() → parse_args() # 解析命令行参数 → load_model() # 加载YOLO双流模型 → process_images() # 遍历图像对 → preprocess_pair() # 双图预处理 → model.infer() # 前向推理 → fuse_results() # 融合策略应用 → visualize_and_save() # 结果绘制与保存

3. 核心模块详解

3.1 模型加载与初始化

YOLOFuse 继承了 Ultralytics 的模型接口风格,使用DualModel类封装双流结构。模型初始化代码示例如下:

from models.dual_yolo import DualYOLO def load_model(weights='runs/fuse/weights/best.pt', device='cuda'): model = DualYOLO(config='cfg/models/dual_yolov8.yaml') model.load_state_dict(torch.load(weights, map_location=device)) model.to(device).eval() return model

其中:

  • DualYOLO定义了共享或独立的主干网络(backbone),支持 ResNet、CSPDarknet 等结构。
  • 权重文件路径默认指向训练后最优模型best.pt
  • 设备自动检测是否启用 GPU(CUDA)加速。

提示:若显存有限,可设置device='cpu'进行 CPU 推理,但速度显著下降。

3.2 双模态图像预处理

由于 RGB 与 IR 图像成像机制不同,需分别进行标准化处理。常见做法是对两路输入采用不同的均值与方差:

transform_rgb = T.Compose([ T.ToTensor(), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) transform_ir = T.Compose([ T.ToTensor(), T.Normalize(mean=[0.5], std=[0.5]) # 单通道红外图 ])

预处理函数会同步加载同名图像对(如001.jpg001.jpg分别来自images/imagesIR/),确保时空一致性。

3.3 双流前向推理机制

双流推理的核心在于保持两个分支的独立性直至融合点。根据融合阶段的不同,可分为三类模式:

融合类型特点实现位置
早期融合(Early Fusion)输入层拼接通道(如 RGB+IR → 4通道)Backbone 输入前
中期融合(Mid Fusion)在 Neck 层合并特征图(如 PAN-FPN 中间层)Feature Aggregation 阶段
决策级融合(Late Fusion)分别输出检测结果后融合(NMS 合并)Head 输出后

以中期融合为例,其前向逻辑如下:

def forward(self, rgb_img, ir_img): # 分支独立提取特征 f_rgb = self.backbone_rgb(rgb_img) f_ir = self.backbone_ir(ir_img) # 在Neck层进行特征拼接与融合 fused_features = [] for i in range(len(f_rgb)): cat_feat = torch.cat([f_rgb[i], f_ir[i]], dim=1) fused_feat = self.fusion_blocks[i](cat_feat) fused_features.append(fused_feat) # 共享Head输出检测结果 return self.head(fused_features)

这种设计既保留了模态特异性,又实现了高层语义融合。

3.4 融合策略对比与选择建议

不同融合策略在精度、速度与参数量之间存在权衡:

策略mAP@50推理延迟 (ms)显存占用 (MB)适用场景
早期融合93.8%421800输入维度允许扩展
中期融合94.7%381650✅ 推荐:平衡性能与效率
决策级融合95.5%511700多模型集成需求
DE-YOLO95.2%582100学术研究导向

工程实践建议

  • 若追求轻量化部署,优先选用中期融合
  • 若已有两个独立训练的单模态模型,可尝试决策级融合 + 加权NMS
  • 早期融合需修改输入通道数,适配性较差,不推荐新手使用

4. 关键代码片段解析

以下是从infer_dual.py提取的核心代码段及其详细注释:

# infer_dual.py 核心推理逻辑节选 import torch from utils.general import non_max_suppression, scale_boxes from models.dual_yolo import DualYOLO def run_inference(): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = DualYOLO('cfg/dual_yolov8m.yaml').to(device) model.load_state_dict(torch.load('runs/fuse/weights/best.pt')) model.eval() # 加载图像对 rgb_img = cv2.imread('data/images/001.jpg') # BGR format ir_img = cv2.imread('data/imagesIR/001.jpg', cv2.IMREAD_GRAYSCALE) # 预处理:调整大小、归一化、张量转换 rgb_tensor = preprocess_image(rgb_img, is_rgb=True).to(device) ir_tensor = preprocess_image(ir_img, is_rgb=False).to(device) # 前向推理 with torch.no_grad(): outputs = model(rgb_tensor, ir_tensor) # [batch, num_boxes, 6] # 后处理:NMS去重 predictions = non_max_suppression(outputs, conf_thres=0.25, iou_thres=0.45) # 可视化结果 for det in predictions: if len(det): det[:, :4] = scale_boxes(rgb_tensor.shape[2:], det[:, :4], rgb_img.shape).round() for *xyxy, conf, cls in det: label = f'{model.names[int(cls)]} {conf:.2f}' plot_one_box(xyxy, rgb_img, label=label, color=(0,255,0)) cv2.imwrite('runs/predict/exp/result_fused.jpg', rgb_img) print("✅ 推理完成,结果已保存至 runs/predict/exp/")
代码要点说明:
  • non_max_suppression:去除重叠框,支持跨模态合并
  • scale_boxes:将归一化坐标映射回原始图像尺寸
  • plot_one_box:绘制边界框与标签,便于直观评估效果
  • 输出路径遵循 Ultralytics 默认规则,便于与其他工具链对接

5. 自定义推理与扩展建议

5.1 修改输入源

除了本地文件,还可接入摄像头或视频流:

cap_rgb = cv2.VideoCapture(0) # RGB摄像头 cap_ir = cv2.VideoCapture(1) # 红外摄像头(需硬件支持) while True: ret_rgb, frame_rgb = cap_rgb.read() ret_ir, frame_ir = cap_ir.read() if not (ret_rgb and ret_ir): break # 直接传入帧数据进行推理 result = infer_once(model, frame_rgb, frame_ir) cv2.imshow('Fused Detection', result) if cv2.waitKey(1) == ord('q'): break

注意:需保证两路视频流时间同步,否则会影响融合效果。

5.2 添加置信度加权融合

对于决策级融合,可引入模态置信度权重提升稳定性:

def weighted_nms(dets_rgb, dets_ir, w_rgb=0.6, w_ir=0.4): # 按加权得分重新排序 scores = w_rgb * dets_rgb[:, 4] + w_ir * dets_ir[:, 4] dets_rgb[:, 4] = scores return non_max_suppression(dets_rgb, ...)

此方法在白天场景增强 RGB 权重,在夜间提高 IR 权重,实现动态适应。

5.3 日志与性能监控

建议添加推理耗时统计:

import time start = time.time() outputs = model(rgb_tensor, ir_tensor) print(f"⏱️ 推理耗时: {(time.time()-start)*1000:.2f} ms")

可用于评估不同融合策略的实际性能差异。

6. 总结

infer_dual.py作为 YOLOFuse 框架的核心推理脚本,完整实现了多模态目标检测的全流程闭环。通过对双流结构的设计、多阶段融合机制的支持以及与 Ultralytics 生态的无缝集成,极大降低了开发者在复杂环境下部署高性能检测系统的门槛。

本文从整体架构、核心模块到关键代码进行了系统性解读,并提供了实用的优化建议与扩展方向。结合预装镜像提供的开箱即用环境,用户可在无需繁琐配置的情况下快速验证算法效果,进而开展个性化训练与部署。

未来可进一步探索自适应融合权重、跨模态注意力机制等前沿方向,持续提升多模态检测的智能化水平。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:04:32

电商配图神器!用Z-Image-Turbo快速生成宣传海报

电商配图神器!用Z-Image-Turbo快速生成宣传海报 1. 背景与痛点:电商视觉内容的效率革命 在电商平台竞争日益激烈的今天,高质量、高频率的视觉素材已成为提升转化率的核心要素。无论是商品主图、活动海报还是社交媒体配图,都需要…

作者头像 李华
网站建设 2026/4/16 12:27:10

阿里Qwen3-4B监控告警:异常检测与自动恢复

阿里Qwen3-4B监控告警:异常检测与自动恢复 1. 背景与应用场景 随着大模型在生产环境中的广泛应用,如何保障其稳定运行成为工程落地的关键挑战。阿里开源的 Qwen3-4B-Instruct-2507 作为一款高性能文本生成模型,在指令遵循、逻辑推理、多语言…

作者头像 李华
网站建设 2026/4/16 12:23:58

Day 66:【99天精通Python】Python 操作 Kubernetes (K8s) - 驾驭集群的舵手

Day 66:【99天精通Python】Python 操作 Kubernetes (K8s) - 驾驭集群的舵手 前言 欢迎来到第66天! 在昨天的课程中,我们学会了用 Python 操作 Docker,管理单机上的容器。但当我们的业务规模扩大,有几百个容器分布在…

作者头像 李华
网站建设 2026/4/15 18:20:21

Day 67:【99天精通Python】设计模式 (Design Patterns) 上篇 - 单例与工厂

Day 67:【99天精通Python】设计模式 (Design Patterns) 上篇 - 单例与工厂 前言 欢迎来到第67天! 写代码就像盖房子。初学者只要能把砖头砌起来,房子不塌就行。但资深工程师追求的是结构优雅、易于维护、可扩展。 设计模式 (Design Patterns)…

作者头像 李华
网站建设 2026/4/16 9:34:24

3小时精通pywinauto:Windows自动化测试实战速成指南

3小时精通pywinauto:Windows自动化测试实战速成指南 【免费下载链接】pywinauto pywinauto/pywinauto: 一个 Python 库,用于自动化 Windows 应用程序。特点是提供了丰富的函数和类库,可以用于控制鼠标、键盘和菜单等元素,实现自动…

作者头像 李华
网站建设 2026/4/16 10:42:46

Supertonic极速秘籍:ONNX Runtime+云端GPU性能翻倍

Supertonic极速秘籍:ONNX Runtime云端GPU性能翻倍 你是不是也遇到过这种情况:本地跑Supertonic语音合成模型,明明代码写得没问题,但一到生成语音就卡顿、延迟高,尤其是处理长文本时,等得人都快睡着了&…

作者头像 李华