You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YoloV4自定义数据集训练报错:无法打开标签文件

解决YoloV4训练时"Can't open label file"路径问题

错误信息

Can't open label file. (This can be normal only if you use MSCOCO): data/obj/13_PNG.rf.c87d3ef90086ec0d21254a8a7c97147a.txt 
Can't open label file. (This can be normal only if you use MSCOCO): data/obj/13_PNG.rf.c87d3ef90086ec0d21254a8a7c97147a.txt 
Can't open label file. (This can be normal only if you use MSCOCO): data/obj/13_PNG.rf.c87d3ef90086ec0d21254a8a7c97147a.txt 

使用的训练命令

!./darknet detector train data/obj.data cfg/custom-yolov4-detector.cfg yolov4.conv.137 -dont_show

问题排查与修复步骤

1. 确认标签文件是否存在

先检查报错的标签文件是否存在于目标目录:

ls -l data/obj/13_PNG.rf.c87d3ef90086ec0d21254a8a7c97147a.txt

若返回No such file or directory,说明该标签文件未被成功复制到data/obj/。

2. 核对图片与标签文件名一致性

Darknet要求每张图片必须对应同名标签文件(如xxx.jpg对应xxx.txt),错误提示说明存在13_PNG.rf.c87d3ef90086ec0d21254a8a7c97147a.jpg,但找不到匹配的标签文件。

3. 修复标签复制逻辑

原代码直接复制所有.txt文件,易导致标签与图片不匹配。替换为以下代码,仅复制与图片对应的标签:

import shutil
import os

# 复制训练集图片及对应标签
train_dir = f"{dataset.location}/train"
for filename in os.listdir(train_dir):
    if filename.endswith(".jpg"):
        shutil.copy(os.path.join(train_dir, filename), "data/obj/")
        # 匹配对应标签文件
        label_filename = os.path.splitext(filename)[0] + ".txt"
        label_path = os.path.join(train_dir, label_filename)
        if os.path.exists(label_path):
            shutil.copy(label_path, "data/obj/")

# 复制验证集图片及对应标签
valid_dir = f"{dataset.location}/valid"
for filename in os.listdir(valid_dir):
    if filename.endswith(".jpg"):
        shutil.copy(os.path.join(valid_dir, filename), "data/obj/")
        label_filename = os.path.splitext(filename)[0] + ".txt"
        label_path = os.path.join(valid_dir, label_filename)
        if os.path.exists(label_path):
            shutil.copy(label_path, "data/obj/")

4. 重新生成训练/验证文件列表

过滤掉无对应标签的图片,重新生成train.txt和valid.txt:

# 生成train.txt
with open("data/train.txt", "w") as out_file:
    for img_filename in os.listdir("data/obj"):
        if img_filename.endswith(".jpg"):
            label_path = os.path.join("data/obj", os.path.splitext(img_filename)[0] + ".txt")
            if os.path.exists(label_path):
                out_file.write(f"data/obj/{img_filename}\n")

# 生成valid.txt
with open("data/valid.txt", "w") as out_file:
    for img_filename in os.listdir("data/obj"):
        if img_filename.endswith(".jpg"):
            label_path = os.path.join("data/obj", os.path.splitext(img_filename)[0] + ".txt")
            if os.path.exists(label_path):
                out_file.write(f"data/obj/{img_filename}\n")

5. 验证文件匹配情况

运行以下命令检查是否还有无对应标签的图片:

for img in data/obj/*.jpg; do
  if [ ! -f "${img%.jpg}.txt" ]; then
    echo "Missing label for: $img"
  fi
done

若无输出,说明所有图片均有对应标签,可重新启动训练。

内容的提问来源于stack exchange,提问作者Jan Tuđan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:03:21