主题
类别名称表说明 - NamesLabel
加载 YOLO 模型时,可通过 namesLabel(磁盘/内联)或 labelData + labelSize(内存)传入类别名称表。名称用于:
- 推理结果 JSON 中的
ClassName/TopClassName显示; - Detect 等任务的
classes参数按类名过滤(如dog|bus); - YoloGetModelInfo 返回的
ClassNames数组。
不是 NCNN 的
.param结构文件;NCNN 结构请传ncnnParamPath/ncnnParamData。
一、支持的传入方式
| 方式 | 适用接口 | 说明 |
|---|---|---|
| labels 文件路径 | YoloLoadModelEx、YoloEncryptModel | 传 UTF-8 路径,如 labels/coco.names |
| 内联文本 | YoloLoadModelEx、YoloEncryptModel | 直接传字符串,无需落盘 |
| 内存字节 | YoloLoadModelMemoryEx、YoloEncryptModelEx | labelData + labelSize 为原始文件字节 |
传 空字符串 或 labelSize = 0 表示不加载 names;此时结果 JSON 仅有 ClassId,classes 过滤须用数字 id。
二、文本格式(三种等价写法)
插件在解析前会将内容统一归一化为 UTF-8,再按下列规则拆分类别:
1. 多行:一行一类(最常见)
text
person
car
bus换行支持 \n、\r\n、\r(Windows / Unix / 旧 Mac 均可)。
2. 竖线分隔:一行多类
text
person|car|bus等价于上面三行。中文示例:
text
人|车|狗|猫3. 混合格式
文件内可混合使用,例如:
text
person|car
bus
人|狗每行若含 |,则按 | 拆分;否则整行作为一个类名。
可选:索引:名称 行(兼容部分工具导出格式)
源码 parse_label_line(yolo_label_utils.hpp)对含 : 的行处理如下:
| 输入行 | 解析得到的类名 | 是否加入列表 |
|---|---|---|
0:person | person | ✅ |
1:car | car | ✅ |
:person(冒号前无索引) | person | ✅ |
0:(冒号后无名称) | — | ❌ 跳过 |
person(无冒号) | person | ✅ |
重要:冒号前的数字不参与 ClassId 映射。 类别 id 仍按行序(或 \| 分割后的 token 顺序)从 0 递增,与 0:、1: 前缀无关。
示例:文件内容为
text
1:car
0:person则 ClassId=0 对应 car,ClassId=1 对应 person(不是按前缀数字排序)。
若类名本身需包含冒号(如 a:b),当前实现会误拆为取 b 作为类名,请避免在类名中使用 :。
三、支持的文件编码
文件内容与内存字节均会自动识别并转为内部 UTF-8(无需调用方手动转码):
| 编码 | 典型来源 | 支持 |
|---|---|---|
| ASCII | 英文类名 | ✅ |
| UTF-8(无 BOM) | VS Code、Linux、Python encoding=utf-8 | ✅ 推荐 |
| UTF-8 with BOM | Windows 记事本「UTF-8」保存 | ✅ 自动去 BOM |
| GBK / CP936 | Windows 记事本「ANSI」保存的中文 | ✅ 中文常用 |
| UTF-16 LE/BE(含 BOM) | 部分 Windows 工具 | ✅ |
暂不支持或易出问题:
| 情况 | 说明 |
|---|---|
| UTF-16 无 BOM | 无法可靠识别,可能乱码 |
| Big5、Shift-JIS 等 | 会误按 GBK 处理,类名可能错误 |
类名本身含 | 且单行传入 | 会被拆成多个类(极少见) |
API 字符串参数(如 YoloLoadModelEx 的 namesLabel 内联文本)须为 UTF-8(与 COM/SDK 约定一致)。
四、各接口用法示例
文件路径(多行 UTF-8)
csharp
long h = ola.YoloLoadModelEx(
@"D:\models\yolo11n.onnx", "",
@"D:\labels\coco.names",
1, 0, -1);内联竖线分隔(中文)
csharp
long h = ola.YoloLoadModelEx(
@"D:\models\yolo11n.onnx", "",
"人|车|狗|猫",
1, 0, -1);内存加载(读文件原始字节)
csharp
byte[] modelBytes = File.ReadAllBytes(@"D:\models\yolo11n.onnx");
byte[] labelBytes = File.ReadAllBytes(@"D:\labels\labels.txt"); // UTF-8 或 GBK 均可
long h = ola.YoloLoadModelMemoryEx(
modelBytes, modelBytes.Length,
0, 0,
labelBytes, labelBytes.Length,
1, 0, -1);
labelSize为精确字节数,不要用strlen + 1,避免把末尾\0传入。
加密打包(内联 names)
csharp
ola.YoloEncryptModel(
@"D:\models\yolo11n.onnx", "",
"person|car|bus",
"your_password", 1, 0,
@"D:\out\game.omd");加密包内 names 会归一化为 UTF-8 存储;YoloLoadModel 解密后自动解析。
五、与推理过滤 classes 的关系
加载 names 后,Detect 等接口的 classes 参数可使用类名(竖线分隔),须与名称表完全一致(含中文):
csharp
// names 为 "人|车|狗"
string json = ola.YoloDetectFromFile(h, @"D:\test.jpg", "人|狗", 0.25, 0.45);未加载 names 时,classes 只能使用 class_id 数字(如 0|2)。
详见 推理输入参数说明 中 classes 一节。
六、常见问题
Q:必须用 labels 文件吗?
A:否。可直接传 "A|B|C" 或内存字节,效果与文件多行相同。
Q:中文 labels 用记事本保存可以吗?
A:可以。选「ANSI」(GBK)或「UTF-8」均可;插件会自动识别。
Q:类名顺序重要吗?
A:是。第 0 行(或 | 分割后第 1 个)对应 ClassId = 0,须与训练/export 时的类别顺序一致。
Q:与加密包的关系?
A:YoloEncryptModel 可把 names 一并打入包内;YoloLoadModel 只需密码,无需再传 labels 路径。
相关文档
- 加载明文模型 - YoloLoadModelEx
- 从内存加载明文模型 - YoloLoadModelMemoryEx
- 加密模型包到文件 - YoloEncryptModel
- 推理输入参数说明(
classes过滤) - 推理结果 JSON 说明(
ClassName字段)
