news 2026/4/18 13:56:41

YOLOFuse代码实例:自定义类别名称显示方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOFuse代码实例:自定义类别名称显示方法

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.ttfmsyh.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 最佳实践建议

  1. 优先使用model.names覆盖机制,保持与官方 API 兼容;
  2. 部署前测试字体可用性,避免因缺少中文字体导致空白标签;
  3. 维护独立的语言配置文件,便于多地区业务扩展;
  4. 训练与推理类别索引保持一致,防止逻辑错位。

通过上述方法,开发者可在不修改模型结构的前提下,高效实现本地化语义表达,提升系统的用户体验与专业度。


获取更多AI镜像

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

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

中小团队AI转型指南:YOLOv9低成本部署实战教程

中小团队AI转型指南&#xff1a;YOLOv9低成本部署实战教程 1. 背景与挑战&#xff1a;中小团队的AI落地困境 在当前人工智能技术快速演进的背景下&#xff0c;目标检测作为计算机视觉的核心任务之一&#xff0c;已广泛应用于工业质检、安防监控、智能零售等领域。然而&#x…

作者头像 李华
网站建设 2026/4/18 11:18:50

Qwen2.5-0.5B国产化适配:鲲鹏+麒麟系统部署实战

Qwen2.5-0.5B国产化适配&#xff1a;鲲鹏麒麟系统部署实战 1. 背景与目标 随着大模型技术的快速发展&#xff0c;国产软硬件生态的适配能力成为AI落地的关键挑战之一。在信创背景下&#xff0c;基于国产CPU&#xff08;如鲲鹏&#xff09;和操作系统&#xff08;如银河麒麟&a…

作者头像 李华
网站建设 2026/4/18 7:56:38

Multisim数据库服务未启动:快速理解组件依赖链

当Multisim打不开元件库&#xff1f;别急&#xff0c;先查这条服务链&#xff01;你有没有遇到过这样的场景&#xff1a;满怀期待地打开NI Multisim&#xff0c;准备画个电路图&#xff0c;结果刚启动就弹出一个红色警告——“multisim数据库无法访问”&#xff1f;元器件库一片…

作者头像 李华
网站建设 2026/4/18 6:53:26

24l01话筒与蓝牙协同工作模式对比分析

24l01话筒与蓝牙&#xff1a;谁才是实时音频传输的真正王者&#xff1f;你有没有遇到过这种情况——在一场远程会议中&#xff0c;多个无线麦克风的声音总是不同步&#xff1f;或者用蓝牙耳机对讲时&#xff0c;延迟高得让人忍不住抢话&#xff1f;更别提那些电池撑不过半天的分…

作者头像 李华
网站建设 2026/4/17 15:40:44

为什么Qwen2.5-7B成热门选择?全能型模型优势深度剖析

为什么Qwen2.5-7B成热门选择&#xff1f;全能型模型优势深度剖析 1. 引言&#xff1a;中等体量模型的崛起背景 近年来&#xff0c;大模型的发展呈现出两极分化趋势&#xff1a;一方面&#xff0c;百亿甚至千亿参数的“巨无霸”模型不断刷新性能上限&#xff1b;另一方面&…

作者头像 李华
网站建设 2026/4/18 9:18:52

Llama3-8B专利检索系统:知识产权领域实战案例

Llama3-8B专利检索系统&#xff1a;知识产权领域实战案例 1. 引言&#xff1a;AI大模型在知识产权领域的应用背景 随着全球技术创新的加速&#xff0c;专利数据量呈指数级增长。截至2024年&#xff0c;全球累计专利申请已超过1.5亿件&#xff0c;传统的人工检索与分析方式难以…

作者头像 李华