CVAT的TFRecord导出不正确吗?

问题描述 投票:0回答:1

ML 新手在这里...

本学期后半段,我一直在为我大学的企业项目(比如学校赞助的企业)开发一个对象检测模型。我决定使用 TF 对象检测 API,因为它似乎抽象出了很多机器学习细节,并为我提供了交叉训练稳健模型的选项。虽然我讨厌不知道我的代码发生了什么的细节,但在给我的时间范围内深入了解机器学习和 TF 并不是完全可行的。

我使用 CVAT 的网络版本 对我所有的图像进行了注释,因为它宣传自动导出。我一直在 YouTube 上关注 Nicholas Renotte 的物体检测视频。在我尝试开始训练之前,一切都进行得相对顺利,但遇到了以下错误。

Traceback (most recent call last):
  File "/home/blake/TFOD/GM/Tensorflow/models/research/object_detection/model_main_tf2.py", line 114, in <module>
    tf.compat.v1.app.run()
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/platform/app.py", line 36, in run
    _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/absl/app.py", line 308, in run
    _run_main(main, args)
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/absl/app.py", line 254, in _run_main
    sys.exit(main(argv))
  File "/home/blake/TFOD/GM/Tensorflow/models/research/object_detection/model_main_tf2.py", line 105, in main
    model_lib_v2.train_loop(
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/object_detection/model_lib_v2.py", line 605, in train_loop
    load_fine_tune_checkpoint(
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/object_detection/model_lib_v2.py", line 401, in load_fine_tune_checkpoint
    _ensure_model_is_built(model, input_dataset, unpad_groundtruth_tensors)
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/object_detection/model_lib_v2.py", line 161, in _ensure_model_is_built
    features, labels = iter(input_dataset).next()
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/distribute/input_lib.py", line 570, in next
    return self.__next__()
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/distribute/input_lib.py", line 574, in __next__
    return self.get_next()
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/distribute/input_lib.py", line 631, in get_next
    return self._get_next_no_partial_batch_handling(name)
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/distribute/input_lib.py", line 663, in _get_next_no_partial_batch_handling
    replicas.extend(self._iterators[i].get_next_as_list(new_name))
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/distribute/input_lib.py", line 1633, in get_next_as_list
    return self._format_data_list_with_options(self._iterator.get_next())
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/data/ops/multi_device_iterator_ops.py", line 554, in get_next
    result.append(self._device_iterators[i].get_next())
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 850, in get_next
    return self._next_internal()
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/data/ops/iterator_ops.py", line 780, in _next_internal
    ret = gen_dataset_ops.iterator_get_next(
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/ops/gen_dataset_ops.py", line 3016, in iterator_get_next
    _ops.raise_from_not_ok_status(e, name)
  File "/home/blake/miniconda3/envs/tf/lib/python3.9/site-packages/tensorflow/python/framework/ops.py", line 7262, in raise_from_not_ok_status
    raise core._status_to_exception(e) from None  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: {{function_node __wrapped__IteratorGetNext_output_types_16_device_/job:localhost/replica:0/task:0/device:GPU:0}} Input is empty.
     [[{{function_node case_cond_cond_jpeg_false_220}}{{node case/cond/cond_jpeg/decode_image/DecodeImage}}]]
     [[MultiDeviceIteratorGetNextFromShard]]
     [[RemoteCall]] [Op:IteratorGetNext]

我在 WSL 2 上的 Ubuntu 22.04.1 上运行 TF 2.12.0。

根据我的理解,这个错误表明我的 TFRecords 有问题。这似乎是可能的,因为从 CVAT 导出的数据集只有 125 KB 用于我的训练数据集(约 300 张图像)和 13 KB 用于我的测试数据集(约 25 张图像,每个图像有 4 个对象)。我认为 TFRecord 包含二进制文件中的图像和注释数据供 TF 使用,所以这两个文件大小看起来小得离谱。

CVAT 的 TFRecord 导出有问题,还是我误解了导出或 TFRecord 的使用?

如果CVAT的导出有问题,是否可以导出为不同的格式并转换为TFRecord? Nicholas Renotte 的视频推荐使用 LabelImg,他提供了一个脚本来将 LabelImg 的输出转换为 TFRecord。遵循那个是更好的选择吗?当然,我不想重新注释我的图像。任何正确方向的指导或推动将不胜感激。

python tensorflow object-detection object-detection-api cvat
1个回答
0
投票

我假设 CVAT 的 TFRecord 导出已损坏。

我最终在 CVAT 上导出到 PASCAL,因为这是 LabelImg 使用的 .XML 格式。然后我创建了一个训练目录并粘贴了所有训练图像及其各自的 .XML 文件。测试目录也是如此。

我使用 this repo 从图像和 .XML 文件创建 TFRecords。唯一的修改是在第 85-91 行。 int() 转换更改为 float() 转换,因为 CVAT 创建了浮点坐标。 LabelImg 创建整数坐标。

© www.soinside.com 2019 - 2024. All rights reserved.