计算机视觉数据处理工具实践
这篇文章整理自几篇早期 CSDN 技术笔记,对应的是我在计算机视觉项目中反复遇到的一类问题:模型本身往往不是唯一难点,数据准备、批处理、标注转换和结果拼接这些环节,才是真正拖慢项目进度的地方。
这些工具单独看都不大,甚至不适合作为独立项目展示;但它们指向一个共同的方向:把视觉算法研发中高频、重复、容易出错的步骤工具化。
视频抽帧:从原始视频到可用样本
很多视觉项目的数据来源不是已经整理好的图片集,而是长时间监控视频、巡检视频或现场录像。如果直接固定间隔抽帧,容易出现两个问题:一是大量相似帧造成数据冗余,二是关键片段反而没有抽到足够样本。
我更倾向于把抽帧工具做成“分段配置”的形式:默认使用较低频率抽取全局样本,对关键时间段单独提高抽帧频率。这样既能保留场景覆盖面,也能让异常、目标密集或光照变化明显的片段得到更多样本。
这类工具的重点不在算法复杂度,而在可控性和可复现性:
- 每次抽帧都保留视频名、帧号和时间信息,方便回溯原始来源。
- 支持按时间段配置抽帧频率,避免后期手工筛选。
- 用进度条和日志记录处理过程,减少长视频批处理时的不确定感。
- 输出目录结构保持稳定,便于后续接入标注、训练和质检流程。
图像去重:减少重复样本对训练集的污染
视频抽帧之后,重复样本会非常多。完全相同的图片可以通过哈希去重解决,但在视觉数据里,更常见的是“几乎相同”的图片:目标位置略有变化,画面亮度略有变化,或者只差几帧。
我当时使用的思路是先用预训练模型提取图像特征,再通过余弦相似度判断样本是否过于接近。相比文件哈希,这种方法更适合处理近重复图片;相比人工筛选,它又能在大规模数据上保持效率。
工程上需要注意的是阈值不要过于激进。去重的目标不是追求数据集越小越好,而是减少明显重复样本,让训练集保留更多场景差异。对检测和分割任务来说,保留不同光照、不同尺度、不同遮挡程度的样本,比单纯追求图片数量更有价值。
大图裁剪与批量推理
在分割、变化检测、遥感图像和工业检测任务中,经常会遇到输入图像远大于模型训练尺寸的情况。直接缩放整张图会损失细节,直接送入模型又可能受显存限制。
比较稳妥的方案是把大图裁成固定尺寸的小块,批量送入模型推理,再把结果拼回原图坐标系。这个流程看似简单,但细节很多:
- 裁剪坐标需要和原图严格对应,避免拼接时错位。
- 边缘区域需要补齐或单独处理,避免漏掉图像边界。
- 如果目标跨越切块边界,简单无重叠裁剪容易产生断裂。
- 对重叠区域可以采用平均、最大值或权重融合,减少边界痕迹。
后来我更倾向于把这类工具设计成通用流程:裁剪、批量推理、结果还原、边界融合分别拆开,模型只需要实现单块输入的推理接口。这样同一套框架可以复用到分割、变化检测和局部增强等任务中。
标注格式转换:把低价值重复劳动工具化
旋转目标检测、普通检测和分割任务会使用不同标注格式。比如 RoLabelImg 使用类 VOC 的 XML 结构,DOTA 更常见的是四点坐标描述。格式转换本身不难,但人工处理很容易出错,尤其是角度单位、坐标顺序、类别名映射和图片尺寸这些细节。
我对这类工具的要求通常是:
- 输入输出格式明确,转换前先做字段校验。
- 类别映射单独配置,不写死在代码里。
- 对异常样本输出报告,而不是静默跳过。
- 尽量保留中间信息,方便回查转换前后的差异。
这类小工具不一定有复杂技术含量,但对项目效率很重要。视觉项目里大量时间不是花在模型结构上,而是花在数据清洗、格式对齐、批量转换和问题样本定位上。
相关实现
这些笔记里有一部分后来整理成了轻量开源仓库,更多是工具化沉淀,而不是作为重点作品单独展示:
- Image-Deduplicator:基于 ResNet50 特征和余弦相似度的大规模图像去重工具,支持 GPU 特征提取和阈值控制。
- Rotated-Annotation-Converter:支持 RoLabelImg 与 DOTA 旋转框标注格式的双向批量转换。
- PixClassify:基于 PyQt5 的图像分类标注工具,用于本地图像快速归类、断点续标和简单质检。
复盘
回头看这些工具,单个功能都不复杂,但把视觉算法研发中容易被忽视的工程环节沉淀下来之后,后续训练、评估和部署确实少了很多不确定性。
这也是我后来维护一些小型开源工具的原因:它们未必适合作为重点项目展示,但能反映项目中实际遇到的问题,以及我怎么把一次性脚本逐步整理成可复用的东西。