YOLOFuse开源贡献:PR提交规范与代码风格要求
1. 引言
1.1 YOLOFuse 多模态目标检测框架
YOLOFuse 是一个基于 Ultralytics YOLO 架构构建的开源多模态目标检测框架,专注于融合可见光(RGB)与红外(IR)图像信息,提升复杂环境下的检测鲁棒性。该框架支持多种融合策略,包括早期、中期特征融合以及决策级融合,在低光照、烟雾遮挡等挑战场景中表现出显著优于单模态模型的性能。
本项目不仅面向研究者提供可复现的基准实现,也致力于为工业界开发者打造高效、易用的双流检测工具链。随着社区参与度不断提升,维护代码质量与协作效率成为关键。因此,本文档旨在明确 YOLOFuse 的 Pull Request(PR)提交规范与代码风格要求,帮助贡献者快速融入开发流程,确保代码库的长期可维护性。
1.2 镜像环境说明
本镜像已为您预装好所有依赖环境,基于 Ultralytics YOLO 框架构建,支持 RGB 与红外(IR)图像的双流融合检测。您无需配置复杂的 PyTorch 或 CUDA 环境,开箱即用。项目代码位于/root/YOLOFuse,包含训练脚本train_dual.py和推理脚本infer_dual.py,结果分别保存在runs/fuse与runs/predict/exp目录下,便于快速验证和迭代。
2. PR 提交规范
2.1 提交前准备
在发起 Pull Request 之前,请务必完成以下准备工作:
Fork 仓库并创建本地分支:
bash git clone https://github.com/your-username/YOLOFuse.git cd YOLOFuse git checkout -b feature/your-feature-name同步主仓库更新: 定期从上游同步最新变更,避免冲突。
bash git remote add upstream https://github.com/WangQvQ/YOLOFuse.git git fetch upstream git rebase upstream/main确保功能完整且通过测试:新增功能或修复 Bug 必须附带验证逻辑,建议提供最小可运行示例。
2.2 PR 内容要求
每一条 PR 应满足以下标准:
- 单一职责原则:每个 PR 只解决一个问题或实现一个功能点,禁止“大杂烩”式提交。
- 清晰的标题命名:使用动词开头,描述具体行为,例如:
- ✅
fix: resolve image size mismatch in dual inference - ✅
feat: add early fusion module with cross-attention ❌
update some files详细的描述说明: PR 描述应包含以下内容:
- 背景动机:为什么需要这项修改?
- 改动范围:涉及哪些文件或模块?
- 影响评估:是否影响现有 API 或训练流程?
测试方式:如何验证本次更改的有效性?
关联 Issue(如有):若 PR 对应某个 Issue,请在描述中添加
Closes #123自动关闭。
2.3 分支管理与合并策略
- 所有功能开发应在
feature/*分支进行,Bug 修复使用fix/*,文档更新使用docs/*。 - 主分支保护机制启用,不允许直接推送,必须通过审查后合并。
- 合并前需满足:
- 至少一名核心成员批准
- CI 流水线全部通过
- 无冲突文件
3. 代码风格要求
3.1 Python 编码规范
YOLOFuse 遵循 PEP 8 标准,并结合 Google Python Style Guide 进行扩展。以下是关键规则摘要:
命名约定
| 类型 | 规范 | 示例 |
|---|---|---|
| 变量名 | 小写 + 下划线 | input_image,fusion_weight |
| 函数名 | 小写 + 下划线 | load_dual_data(),fuse_features() |
| 类名 | PascalCase | EarlyFusionBlock,DualInferenceEngine |
| 常量 | 全大写 + 下划线 | DEFAULT_IMAGE_SIZE = 640 |
| 私有成员 | 单下划线前缀 | _build_backbone() |
代码格式化工具
项目集成black和isort实现自动化格式化:
# 安装格式化工具有 pip install black isort # 格式化指定文件 black train_dual.py isort infer_dual.py建议在编辑器中配置保存时自动格式化,如 VS Code 推荐插件: - Python (Microsoft) - Black Formatter - Isort
行长度与缩进
- 最大行宽:88 字符(black 默认值)
- 缩进:4 个空格,禁止使用 Tab
- 多行参数对齐示例:
model = DualYOLO( backbone="resnet18", fusion_strategy="mid-level", pretrained=True, img_size=640 )3.2 文档字符串与注释规范
函数 docstring 使用 Google 风格
def fuse_features(self, feat_rgb, feat_ir): """融合 RGB 与红外特征张量。 支持早期、中期两种融合模式,通过配置项动态选择。 Args: feat_rgb (torch.Tensor): RGB 分支提取的特征,shape [B, C, H, W] feat_ir (torch.Tensor): 红外分支提取的特征,shape [B, C, H, W] Returns: torch.Tensor: 融合后的特征图,shape [B, 2*C, H, W](拼接方式) Raises: ValueError: 当输入特征维度不一致时抛出。 """ if feat_rgb.shape != feat_ir.shape: raise ValueError("Feature maps must have the same shape.") return torch.cat([feat_rgb, feat_ir], dim=1)注释原则
- 解释“为什么”,而非“做什么”```python # 错误:重复代码语义 x = x * 0.9 # 将x乘以0.9
# 正确:说明设计意图 x = x * 0.9 # 加入衰减因子防止梯度爆炸,经验调参所得 ```
- 复杂算法处应添加公式或引用来源:
Note: 融合权重计算采用 Softmax 归一化注意力机制: $$ w_{rgb} = \frac{\exp(s_{rgb})}{\exp(s_{rgb}) + \exp(s_{ir})} $$
3.3 模块结构与组织建议
为保持项目清晰可维护,新增模块应遵循如下目录结构:
YOLOFuse/ ├── models/ │ ├── __init__.py │ ├── dual_yolo.py # 主干网络定义 │ └── fusion/ │ ├── early_fusion.py │ ├── mid_fusion.py │ └── decision_fusion.py ├── data/ │ ├── datasets.py # 数据加载器 │ └── augment.py # 增强策略 ├── utils/ │ ├── logger.py │ └── visualization.py ├── cfg/ │ └── default.yaml # 默认配置 ├── train_dual.py └── infer_dual.py新增组件应放入对应子模块,避免集中在根目录。
4. 测试与验证要求
4.1 单元测试覆盖
所有核心功能模块必须配备单元测试,存放于tests/目录下。例如:
tests/ ├── test_fusion.py ├── test_dataset.py └── test_inference.py使用pytest框架编写测试用例:
# tests/test_fusion.py import pytest import torch from models.fusion.mid_fusion import MidLevelFusion def test_mid_fusion_output_shape(): block = MidLevelFusion(channels=256) rgb_feat = torch.randn(2, 256, 40, 40) ir_feat = torch.randn(2, 256, 40, 40) output = block(rgb_feat, ir_feat) assert output.shape == (2, 512, 40, 40), "Output shape mismatch"运行测试命令:
pytest tests/ -v --cov=models.fusion4.2 回归测试与性能监控
- 修改主干逻辑(如损失函数、推理流程)时,需在相同数据集上对比 mAP@50 变化。
- 若引入新融合模块,应在 LLVIP 数据集上报告参数量(Params)与推理速度(FPS)。
- 推荐使用
hydra或omegaconf管理实验配置,便于复现实验。
5. 文档更新与示例补充
5.1 README 更新
若新增功能影响用户使用流程,必须同步更新README.md,包含:
- 新增 CLI 参数说明
- 配置文件字段解释
- 示例命令行调用
5.2 添加使用示例
鼓励贡献者在examples/目录中添加简短的使用案例,例如:
# examples/custom_inference.py from infer_dual import DualInferencer inferencer = DualInferencer( weights="runs/fuse/best.pt", config="cfg/default.yaml" ) result = inferencer.predict("test_rgb.jpg", "test_ir.jpg") result.show()6. 总结
本文系统梳理了 YOLOFuse 开源项目的 PR 提交规范与代码风格要求,涵盖分支管理、提交格式、编码标准、测试验证及文档配套等多个维度。遵守这些规范不仅能提升代码质量,还能显著降低协作成本,加速功能合并与版本迭代。
作为贡献者,您只需做到: 1.小步提交:每次 PR 聚焦单一问题; 2.格式统一:使用 black/isort 自动化处理; 3.充分测试:确保新增代码可通过基本验证; 4.文档同步:让用户第一时间了解您的改进。
我们欢迎每一位开发者参与 YOLOFuse 的共建,共同推动多模态目标检测技术的发展。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。