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
相关产品推荐
相关产品推荐

