3、安防场景数据集构建:数据采集规范、数据清洗与标注工具(LabelImg, CVAT),数据增强策略
做安防视觉这些年,我踩过最大的坑,不是模型选错了,而是数据出了问题。你想想看,一个模型再牛,喂进去的数据是脏的、偏的、标注错的,那出来的结果就是垃圾。说白了,安防场景的数据集构建,是整个项目的根基。根基不稳,地动山摇。
今天我们就来聊聊,怎么把这个根基打扎实。我会把我在项目中积累的一些血泪经验,毫无保留地分享出来。
3.1 数据采集规范:别让源头就歪了
数据采集,听起来简单,不就是架个摄像头拍嘛?但实际做起来,门道多得很。我记得有一次,我们给一个园区做周界入侵检测,采集的数据全是白天晴天的。结果模型一上线,遇到个阴雨天,误报率直接飙到80%。为什么会这样?因为数据采集的规范没定好。
我个人习惯,在项目启动前,先拉一个数据采集清单。这个清单要覆盖以下几个维度:
- 场景多样性:室内、室外、半室外;白天、黑夜、黄昏、黎明;晴天、雨天、雪天、雾天。每个场景至少采集1000张有效帧。
- 角度与距离:摄像头安装高度、俯仰角、水平角。同一个目标,要采集近景、中景、远景。我见过一个项目,只采集了10米内的行人,结果50米外的目标模型完全认不出来。
- 目标姿态:正面、侧面、背面、遮挡(被树挡、被人挡、被车挡)。安防场景里,遮挡是常态,不是异常。
- 光照条件:强光、逆光、弱光、无光(红外补光)。逆光场景下,人脸细节几乎全丢,这个在数据采集时一定要单独标注出来。
避坑指南:我曾经在一个项目中,为了赶进度,让实习生去采集数据。结果他图省事,只在一个固定点位、固定时间拍了三天。那批数据后来全废了,白白浪费了两周时间。所以,数据采集一定要有专人监督,每天检查采集的多样性。
另外,视频帧的提取也有讲究。不是每一帧都要。我个人建议,对于固定场景,每秒取1-2帧就够了;对于运动场景(比如人奔跑、车辆行驶),每秒取5-10帧。帧率太高,数据冗余大,训练效率低;帧率太低,会漏掉关键动作。
3.2 数据清洗:把垃圾倒出去
数据采集回来,别急着标注。先做清洗。这一步,很多人会忽略,觉得浪费时间。但我告诉你,数据清洗花的时间,会在模型训练阶段加倍还给你。
数据清洗主要做三件事:
- 去重:连续帧中,画面几乎一样的,只保留一张。我一般用感知哈希算法(pHash)做相似度计算,阈值设在0.95以上就算重复。
- 去模糊:运动模糊、对焦模糊、镜头污渍导致的模糊。用拉普拉斯算子计算图像的方差,方差低于某个阈值(比如100)的直接扔掉。
- 去异常:比如摄像头被遮挡、画面全黑、画面花屏。这些可以通过检查图像的均值和标准差来识别。
小技巧:清洗的时候,我习惯写一个简单的Python脚本,把不合格的图片自动移到“待审核”文件夹,然后人工再过一遍。完全自动化不靠谱,有些模糊的图片,人眼觉得还行,但模型就是学不好。
清洗完成后,数据量通常会减少20%-30%。别心疼,这是好事。干净的数据,比海量的脏数据有用得多。
3.3 标注工具:LabelImg vs CVAT
标注工具,我主要用两个:LabelImg 和 CVAT。它们各有千秋,我分别说说我的使用感受。
3.3.1 LabelImg:轻量级首选
LabelImg 是我最早用的工具。它基于Python和Qt,安装简单,开箱即用。适合小团队、小项目,或者个人练手。
- 优点:轻量、快速、支持Pascal VOC和YOLO格式。单机运行,不需要服务器。
- 缺点:不支持多人协作,没有自动标注功能,标注效率低。
使用LabelImg时,我一般会先预设好类别标签(比如person, car, bicycle),然后让标注员逐张框选。对于安防场景,我建议使用矩形框(Bounding Box)就够了,除非你需要做实例分割,才用多边形。
# LabelImg 生成的 XML 示例(Pascal VOC 格式)
<annotation>
<folder>images</folder>
<filename>frame_001.jpg</filename>
<size>
<width>1920</width>
<height>1080</height>
<depth>3</depth>
</size>
<object>
<name>person</name>
<bndbox>
<xmin>100</xmin>
<ymin>200</ymin>
<xmax>300</xmax>
<ymax>500</ymax>
</bndbox>
</object>
</annotation>
3.3.2 CVAT:团队协作利器
CVAT(Computer Vision Annotation Tool)是Intel开源的在线标注平台。如果你团队超过3个人,或者项目数据量超过1万张,我强烈建议你用CVAT。
- 优点:支持多人同时标注、自动标注(基于预训练模型)、支持多种标注形状(矩形、多边形、关键点、线条)。
- 缺点:部署稍复杂(需要Docker),对服务器有一定要求。
我在一个大型安防项目中,用CVAT管理了50万张图片的标注任务。10个标注员同时在线,我作为管理员,可以实时查看每个人的标注进度和质量。CVAT还支持“标注验证”功能,标注完的数据,可以分配给另一个人做二次审核。
我的建议:小项目用LabelImg,大项目用CVAT。不要为了省事,用LabelImg去标10万张图,那会累死人的。CVAT的自动标注功能,可以先用一个预训练模型跑一遍,然后人工修正,效率能提升3-5倍。
3.4 数据增强策略:让模型见多识广
数据增强,说白了就是“无中生有”。安防场景的数据,往往存在严重的类别不平衡。比如“行人”样本很多,但“骑电动车的人”样本很少。这时候,数据增强就派上用场了。
我常用的数据增强策略,分为两类:
3.4.1 几何变换
- 随机翻转:水平翻转(左右镜像)。注意,垂直翻转在安防场景中很少用,因为现实世界中没有倒着走的人。
- 随机旋转:-15° 到 +15°。旋转角度不要太大,否则目标会变形得太离谱。
- 随机裁剪:从原图中随机裁剪一块,然后缩放到原图大小。这可以模拟目标被部分遮挡的情况。
3.4.2 颜色与光照变换
- 亮度调整:模拟不同光照条件。我一般把亮度因子设置在0.6到1.4之间。
- 对比度调整:模拟雾天、逆光等场景。
- 高斯噪声:模拟摄像头传感器噪声。安防摄像头在低光照下,噪声特别明显。
实战经验:我曾经在一个项目中,用Albumentations库做数据增强。这个库比OpenCV自带的函数快很多,而且支持与PyTorch无缝集成。下面是我常用的一个增强pipeline:
import albumentations as A
transform = A.Compose([
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),
A.HorizontalFlip(p=0.5),
A.Rotate(limit=15, p=0.5),
A.GaussNoise(var_limit=(10.0, 50.0), p=0.3),
A.RandomSizedBBoxSafeCrop(height=640, width=640, erosion_rate=0.2, p=0.3),
], bbox_params=A.BboxParams(format='yolo', min_visibility=0.3))
注意,做数据增强时,一定要同步更新标注框。上面的代码中,RandomSizedBBoxSafeCrop 会自动处理框的裁剪和缩放,不会出现框和内容不匹配的情况。这一点,很多新手会忽略。
3.5 知识体系总览
下面这张图,是我自己总结的安防场景数据集构建的完整流程。你可以把它当作一个检查清单,每做完一步,就打个勾。
重要提醒:数据增强不是越多越好。过度增强会让模型学到“假特征”。比如,你把一张图片旋转了45度,在安防场景中,摄像头很少会以这个角度拍摄。所以,增强策略一定要贴合实际部署场景。我一般会把增强后的数据,单独拿出来让标注员看一眼,如果人眼都觉得“这图太假了”,那就说明增强过头了。
好了,关于安防场景数据集构建,我就讲这么多。从采集规范到清洗,再到标注工具的选择,最后是数据增强策略,每一步都有坑,但也都有解法。记住一句话:数据质量决定模型上限。把数据搞扎实了,后面的模型训练、部署上线,才能顺风顺水。