训练数据tfrecords产生的问题:
INFO:tensorflow:Error reported to Coordinator: <class 'tensorflow.python.framework.errors_impl.InvalidArgumentError'>, All bounding box coordinates must be in [0.0, 1.0]: 1.002
提供两条解决思路:
- 写脚本,判断出有哪些图片标记出错了。然后,删除这些标记不规范的图片,重新制作数据集。
- 修改
tfrecords
制作过程。
首先,第一个方法是可行的,就是比较麻烦,要找到原来的图片,删除,重新制作成tfrecord
格式。我写了一个简单的脚本,检查之后发现,我使用的数据集(1W张图片)中有200+图片标记有问题,都是xmax
或ymax
超出了边界几个像素。
一些原因(嗯嗯嗯,主要是懒,2333),我不想再制作一遍数据集。决定找个相对优雅的方法解决这个问题。于是就有了第二个方案:
bboxes.append(float(ymin) / shape[0], float(xmin) / shape[1], float(ymax) / shape[0], float(xmax) / shape[1],))
追踪tf_convert_data.py
,发现主要使用datasets/pascalvoc_to_tfrecords.py
执行数据格式转化工作。找到114-119行:
bboxes.append((max(float(ymin) / shape[0], 0.0), max(float(xmin) / shape[1], 0.0), min(float(ymax) / shape[0], 1.0), min(float(xmax) / shape[1], 1.0)))
修改为:
然后使用命令,重新将数据集制作成tfrecords
格式,问题便解决了。
这样做是合理的,理由如下:
标记员将坐标标记错误,跳出了图像范围,这时候识别目标应该就在图像边缘,所以选取图像边界作为目标的边界是合理的。