为何将整图存入tfrecord文件?何不按边界框裁剪存储以缩减体积?
Great question! 我之前做目标检测项目时也纠结过这个点,踩了不少坑后才搞明白背后的技术考量,主要有这几个核心原因:
数据增强的灵活性:如果只存储裁剪后的目标区域,很多常用的数据增强操作就没法正常开展了。比如随机翻转、平移、缩放这类需要基于整图上下文的增强,或者随机裁剪原图包含目标及部分背景的区域,都依赖完整图像才能实现。要是每个目标单独存储,多目标场景下的关联增强也会变得异常繁琐。
多任务学习的复用性:很多计算机视觉项目不会只做单一的目标检测,往往会同时兼顾图像分类、语义分割或实例分割等任务。如果提前裁剪目标,这份数据就只能用于检测任务,其他任务得重新存储完整图像,反而造成了存储冗余。保留完整图像的话,一份数据集就能支撑多任务训练,复用性拉满。
标注误差的可修正性:人工标注的bounding box很难做到100%精准,可能存在框选过大、过小或者位置偏移的情况。如果直接裁剪存储,后续想调整标注边界、替换更精确的标注结果时,就没有原始图像可以复用了,只能重新处理原始数据。保留完整图像则能随时基于新标注提取目标,灵活性高很多。
场景上下文的必要性:不少目标检测任务严重依赖场景上下文来提升准确率。比如识别街景中的“行人”,周围的道路、建筑、车辆等背景信息能帮助模型更好地理解场景,减少误判。如果只存裁剪后的行人区域,模型缺失了上下文信息,泛化能力会大幅下降。
TFRecord的IO效率优化:你可能觉得裁剪后能缩减体积,但TFRecord本身支持GZIP/ZLIB压缩,存储效率已经很高。更关键的是,裁剪后会生成大量小文件,读取时的IO开销会远大于读取少量大体积的TFRecord文件——训练时批量读取数据的速度会受严重影响,反而得不偿失。
内容的提问来源于stack exchange,提问作者ahk3

