CVAT导出的TFRecord是否异常?训练目标检测模型遇输入为空错误
解决CVAT导出TFRecord过小及训练报错问题
一、先排查CVAT导出环节的问题
- 核对导出选项:
导出时必须选择TFRecord for TensorFlow Object Detection API格式,不要选错成其他TFRecord变种(比如语义分割专用的)。同时确认勾选了正确的任务子集,确保覆盖你标注的300张训练图和25张测试图。 - 验证TFRecord内容:
用以下代码检查导出的TFRecord里有没有有效样本:
如果输出为0,说明导出的TFRecord确实是空的,肯定是CVAT导出操作有误。import tensorflow as tf def count_samples(tfrecord_path): count = 0 for _ in tf.data.TFRecordDataset(tfrecord_path): count += 1 print(f"样本总数: {count}") count_samples("你的训练集TFRecord路径") count_samples("你的测试集TFRecord路径")
二、无需重新标注,转其他格式生成TFRecord
如果CVAT导出TFRecord确实有问题,导出其他格式再转换即可:
步骤1:导出PASCAL VOC格式
在CVAT中选择导出为PASCAL VOC 1.1,下载解压后会得到:
- Annotations文件夹:对应每张图的XML标注文件
- JPEGImages文件夹:原始图像文件
- ImageSets/Main文件夹:包含划分训练/测试集的txt文件
步骤2:用TF Object Detection API脚本转TFRecord
TF Object Detection API自带转换脚本,路径为models/research/object_detection/dataset_tools/create_pascal_tf_record.py,修改参数后运行:
- 先准备标签映射文件
label_map.pbtxt,格式示例:item { id: 1 name: '你的目标类别1' } item { id: 2 name: '你的目标类别2' } - 运行转换命令:
测试集只需要把python create_pascal_tf_record.py \ --label_map_path=./label_map.pbtxt \ --data_dir=./解压后的VOC文件夹路径 \ --year=VOC2007 \ --set=train \ --output_path=./train.tfrecord--set改成val,--output_path改成测试集路径即可。
替代方案:导出COCO格式转换
如果更习惯COCO格式,CVAT导出COCO 1.0格式后,用create_coco_tf_record.py脚本转换,参数逻辑类似,指定COCO的json文件路径和图像文件夹即可。
三、验证转换结果
转换完成后,再用之前的Python代码检查样本数,确保训练集显示300、测试集显示25,之后再启动训练即可。
内容的提问来源于stack exchange,提问作者Blake
相关产品推荐
相关产品推荐

