YOLO应用化之添加中文支持

本文详细探讨了如何为YOLO添加中文支持,通过分析代码发现,仅修改配置文件无法解决乱码问题。关键在于修改`draw_detections`函数,特别是`get_label`和`draw_label`。作者提到需要制作中文字符的PNG图片,并提供了修改`make_labels.py`脚本的方法,以及在GitHub上的代码改动链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

YOLO在检测物体后会画出ROI,并在左上角标注类别。
如YOLO官网给出的预测图:
这里写图片描述
这里的物体类别描述是从配置文件中读出并画出的。想要修改让其支持中文,乍一看好像很简单,貌似只需要修改对应的配置文件就行了。理想很丰满,现实很骨感,如果这样做了,只能得到一堆乱码。
我们一步步阅读代码,来看看为什么。

代码解析

我工作中使用YOLO主要是做物体的实时检测,所以以实时检测为入口分析代码。
执行命令

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

从darknet.c的main函数看起

else if (0 == strcmp(argv[1], "detector")){
    run_detector(argc, argv);

进入detector.c查看run_detector函数

else if(0==strcmp(argv[2], "demo")) {
    list *options = read_data_cfg(datacfg);
    int classes = option_find_int(options, "classes", 20);
    char *name_list = option_find_str(options, "names", "data/names.list");
    char **names = get_labels(name_list);
    demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh);
}

coco.data

names = data/coco.names

coco.names

person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
......

物体类别信息就是从这得来的,是不是也从这画,我们接着看。
demo.c

void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh)
{
    //skip = frame_skip;
    image **alphabet = load_alphabet();
    int delay = frame_skip;
    demo_names = names;
    demo_alphabet = alphabet;
    demo_classes = classes;
    demo_thresh = thresh;
    demo_hier_thresh = hier_thresh;
    printf("Demo\n");
    net = parse_network_cfg(cfgfile);
    ......
    while(1){
    ++count;
    if(1){
        if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed");
        if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed");
    ......

demo_alphabet在绘制ROI时起到重要作用,稍后会做分析。
fetch_thread负责从camera读图像数据,detect_thread负责从检测物体。

void *detect_in_thread(void *ptr)
{
    float nms = .4;

laye
<think>好的,我现在需要解决用户关于YOLO可视标签字体格式配置的问题。首先,用户提到了引用[1]中的内容,其中涉及到修改YOLO检测结果的标签名称,并下载Arial.Unicode.ttf字体文件。用户的问题是如何配置YOLO可视标签字体格式,所以我要从字体文件的下载、存放路径以及代码中的设置方法这几个方面来考虑。 首先,用户提供的引用[1]提到需要将字体文件放在C:\Users\loong\AppData\Roaming\Ultralytics目录下。这里需要注意,用户的用户名是loong,但实际情况下,不同用户的路径会不同,所以可能需要动态获取用户目录,或者明确指出用户需要替换自己的用户名部分。此外,下载字体文件后,必须确保文件路径正确,否则YOLO在生成标签时可能无法加载字体,导致显示错误或回退到默认字体。 其次,用户可能在使用Ultralytics的YOLO库进行目标检测,并在可视结果时遇到了标签显示问题。根据引用[1]中的代码示例,修改标签名称是通过设置results[0].names属性来实现的。这可能涉及到模型输出结果的标签映射,需要确认用户是否正确修改了这一部分,以及是否在可视过程中应用了这些更改。 接下来,关于字体配置的具体步骤,我需要回忆YOLO的相关文档。通常,在使用Ultralytics YOLO时,可视功能(如绘制边界框和标签)会依赖字体文件来正确显示文本。如果系统缺少所需的字体,可能会出现警告或错误。例如,当使用中文标签时,默认的字体可能不支持中文字符,导致显示乱码或方框。因此,用户需要指定一个支持所需字符的字体文件,比如Arial Unicode MS,这个字体包含较全的字符集。 然后,我需要考虑用户的操作系统环境。假设用户使用的是Windows系统,那么字体存放的路径是否正确?用户可能需要手动创建Ultralytics目录,如果该目录不存在的话。此外,是否需要在代码中显式指定字体路径?例如,在调用绘制函数时,传递字体文件的路径参数。这可能需要查阅Ultralytics YOLO的API文档,看看是否有相关的参数可以设置字体。 另外,引用[3]提到matplotlib的可视实践,可能涉及到如何在Python中配置字体。虽然YOLO可能使用自己的绘图函数,但了解matplotlib的字体配置也可能有帮助。例如,matplotlib需要设置字体文件路径来正确显示中文,这可能与YOLO的配置方式类似。用户可能需要类似地配置YOLO的字体路径,以确保标签正确显示。 用户的问题还可能涉及到字体格式,例如是否支持.ttf或.otf格式。根据引用[1]中的示例,使用的是Arial.Unicode.ttf,所以YOLO可能支持TrueType字体。需要确认YOLO的可视模块是否只支持特定字体格式,以及如何正确加载它们。 最后,综合以上信息,我需要给出步骤清晰的配置方法,包括下载字体、存放路径、修改标签名称,以及可能的代码调整。同时,用户可能遇到的常见问题,比如路径错误、字体未正确应用标签名称未更新等,也需要在回答中提及,并提供解决方案。</think>在YOLO目标检测可视中配置标签字体格式需要以下步骤: ### 1. 字体文件准备 - 下载支持中文的字体文件(如Arial Unicode MS) - 存放路径:`C:\Users\你的用户名\AppData\Roaming\Ultralytics` - 文件格式要求:必须使用`.ttf`格式字体文件[^1] ```python # 示例路径设置(Windows系统) import os font_path = os.path.expanduser('~/AppData/Roaming/Ultralytics/Arial.Unicode.ttf') ``` ### 2. 标签名称汉配置 在检测代码中修改标签字典: ```python results[0].names = { 0: '配戴安全帽', 1: '未配戴安全帽', 2: '未穿反光衣', 3: '人', 4: '穿反光衣' } ``` ### 3. PyQt5可视集成 使用PyQt5创建界面时,需确保字体路径传递给渲染组件: ```python # 在绘制函数中添加font参数 def draw_boxes(image, results, font_path=font_path): for box in results: label = f"{box['class_name']} {box['confidence']:.2f}" cv2.putText(image, label, (box['x1'], box['y1']-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2, cv2.LINE_AA, fontScale=1, fontFace=font_path) ``` ### 4. 常见问题解决 - **字体显示异常**:检查字体文件哈希值`md5: 8a1bb3d9`确保下载完整 - **路径错误**:使用`os.path.exists(font_path)`验证文件存在性 - **中文乱码**:确认字体文件包含CJK字符集
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值