YOLOFuse代码实例:自定义类别名称显示方法
1. 引言
1.1 YOLOFuse 多模态目标检测框架
YOLOFuse 是一个基于 Ultralytics YOLO 架构构建的多模态目标检测框架,专为融合 RGB(可见光)与红外(IR)图像设计。通过双流网络结构,该框架能够在低光照、烟雾遮挡等复杂环境下显著提升目标检测的鲁棒性与精度。其核心优势在于支持多种融合策略——包括早期特征融合、中期特征融合以及决策级融合,适用于安防监控、夜间巡检、自动驾驶等多个实际应用场景。
本镜像已为您预装好所有依赖环境,基于 Ultralytics YOLO 框架构建,支持 RGB 与红外(IR)图像的双流融合检测。您无需配置复杂的 PyTorch 或 CUDA 环境,开箱即用。
在实际部署过程中,一个常见的需求是自定义类别名称显示,例如将默认的person改为更具业务语义的“行人”或“安保人员”。本文将详细介绍如何在 YOLOFuse 中实现这一功能,并结合代码示例说明修改逻辑和注意事项。
2. 类别名称显示机制解析
2.1 默认类别体系来源
YOLOFuse 继承了 Ultralytics YOLO 的类别管理方式,其默认类别标签来源于 COCO 数据集的 80 个类别,存储于ultralytics/cfg/datasets/coco.yaml文件中:
names: 0: person 1: bicycle 2: car ...这些类名在推理阶段被加载到模型输出中,并用于绘制检测框时的文本标注。
2.2 自定义类别的必要性
在特定行业应用中,原始英文类别难以满足本地化展示需求。例如:
- 安防系统需显示中文:“人”、“车辆”
- 工业质检需映射为缺陷类型:“划痕”、“气泡”
因此,实现可配置的类别名称显示是工程落地的关键一步。
3. 实现自定义类别名称的方法
3.1 方法一:修改数据集配置文件(推荐)
最规范且兼容性强的方式是通过自定义.yaml配置文件重写类别名称。
步骤 1:创建自定义数据配置文件
在项目根目录/root/YOLOFuse下新建data/custom_classes.yaml:
path: datasets/LLVIP train: images val: images test: images # 自定义类别名称(按索引顺序) names: 0: 行人 1: 自行车 2: 汽车 3: 摩托车 4: 飞机 5: 公交车 6: 火车 7: 卡车 8: 船 9: 红绿灯 # 可继续补充其余类别...注意:类别数量和索引必须与原模型输出一致,否则会导致越界错误。
步骤 2:在推理脚本中加载自定义类别
打开infer_dual.py,找到模型初始化部分,修改如下:
from ultralytics import YOLO import cv2 # 加载模型 model = YOLO('runs/fuse/train/weights/best.pt') # 替换为你的权重路径 # 手动设置自定义类别名称 custom_names = { 0: '行人', 1: '自行车', 2: '汽车', 3: '摩托车', 4: '飞机', 5: '公交车', 6: '火车', 7: '卡车', 8: '船', 9: '红绿灯' } # 替换模型内部的names属性 model.names = custom_names步骤 3:验证效果
运行推理命令:
cd /root/YOLOFuse python infer_dual.py查看/root/YOLOFuse/runs/predict/exp中生成的图片,确认检测框上的标签已更新为中文。
3.2 方法二:动态传参覆盖(灵活适配)
若需根据不同场景动态切换类别名称(如白天/夜间模式),可通过函数参数传递。
修改infer_dual.py中的可视化逻辑
查找绘图相关代码段(通常调用cv2.putText或使用内置 plot 功能),替换原始 label 获取逻辑:
results = model(source=rgb_img, imgsz=640) for r in results: # 获取原始boxes对象 boxes = r.boxes.cpu().numpy() # 使用自定义名称映射 for box in boxes: cls_id = int(box.cls[0]) conf = box.conf[0] # 定义本地化名称 localized_names = ['行人', '非机动车', '机动车', '大型车辆', '飞行器'] class_name = localized_names[cls_id] if cls_id < len(localized_names) else f'类别_{cls_id}' # 获取坐标 x1, y1, x2, y2 = map(int, box.xyxy[0]) # 绘制矩形框 cv2.rectangle(rgb_img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 添加文字(需支持中文) font = cv2.FONT_HERSHEY_SIMPLEX label = f'{class_name} {conf:.2f}' cv2.putText(rgb_img, label, (x1, y1 - 10), font, 0.5, (0, 255, 0), 2)⚠️ 提示:OpenCV 默认不支持中文字符渲染。若出现乱码,请使用 PIL 实现图文叠加。
3.3 方法三:使用 PIL 绘制中文标签(解决乱码问题)
为了正确显示中文,建议采用 Python Imaging Library (PIL) 进行图像绘制。
示例代码:集成 PIL 中文绘制
from PIL import Image, ImageDraw, ImageFont import numpy as np def draw_chinese_labels(image, boxes, names_dict, font_path='/root/YOLOFuse/fonts/simhei.ttf'): """ 使用PIL绘制支持中文的检测结果 font_path: 中文字体路径(需提前上传) """ # 将OpenCV图像转为PIL格式 pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) draw = ImageDraw.Draw(pil_image) # 加载中文字体(确保字体文件存在) try: font = ImageFont.truetype(font_path, 20) except IOError: font = ImageFont.load_default() for box in boxes: cls_id = int(box.cls[0]) conf = box.conf[0] x1, y1, x2, y2 = map(int, box.xyxy[0]) class_name = names_dict.get(cls_id, f'未知类别{cls_id}') label = f'{class_name} {conf:.2f}' # 绘制边框 draw.rectangle([x1, y1, x2, y2], outline="green", width=2) # 绘制背景矩形 text_bbox = draw.textbbox((x1, y1), label, font=font) draw.rectangle([text_bbox[0]-2, text_bbox[1]-2, text_bbox[2]+2, text_bbox[3]+2], fill="green") draw.text((x1, y1 - 20), label, fill="white", font=font) # 转回OpenCV格式 return cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)调用方式:
# 假设results来自model预测 for r in results: annotated_img = draw_chinese_labels( rgb_img, r.boxes.cpu().numpy(), names_dict={0: '行人', 1: '汽车'}, font_path='/root/YOLOFuse/fonts/simhei.ttf' ) cv2.imwrite('output_with_chinese.jpg', annotated_img)✅ 建议:将常用中文字体(如
simhei.ttf、msyh.ttc)上传至项目目录并统一管理。
4. 训练阶段的类别一致性保障
4.1 标注文件与类别对齐
尽管推理时可以更改显示名称,但训练所用的标签文件(.txt)仍应遵循原始类别索引规则。例如:
# labels/001.txt 0 0.45 0.60 0.10 0.20 # 表示类别ID=0(person),对应“行人”只要在推理时将 ID=0 映射为“行人”,即可实现前后端统一。
4.2 多语言支持建议
对于国际化部署场景,可建立语言包机制:
LANGUAGES = { 'zh': {0: '行人', 1: '汽车'}, 'en': {0: 'Person', 1: 'Car'}, 'ja': {0: '人物', 1: '自動車'} } # 根据环境变量选择语言 import os lang = os.getenv('APP_LANGUAGE', 'zh') model.names = LANGUAGES[lang]5. 总结
5.1 技术价值总结
本文围绕 YOLOFuse 框架中的自定义类别名称显示问题,系统性地介绍了三种实现方案:
- 修改配置文件法:适合固定场景,符合 Ultralytics 规范;
- 运行时覆盖法:灵活性高,便于快速调试;
- PIL 绘图法:解决 OpenCV 中文乱码问题,确保视觉呈现完整。
5.2 最佳实践建议
- 优先使用
model.names覆盖机制,保持与官方 API 兼容; - 部署前测试字体可用性,避免因缺少中文字体导致空白标签;
- 维护独立的语言配置文件,便于多地区业务扩展;
- 训练与推理类别索引保持一致,防止逻辑错位。
通过上述方法,开发者可在不修改模型结构的前提下,高效实现本地化语义表达,提升系统的用户体验与专业度。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。