在计算机视觉领域,实时检测安全监控录像中的枪支是一项具有挑战性的任务。数据科学家Alaa Senjab,凭借其在网络安全和计算机视觉方面的背景,致力于构建一个能够在实时监控录像中识别枪支的模型。这样的工具对于监控安全录像和在适当情况下自动通知当局具有重要价值。
Alaa使用了最初由格拉纳达大学发布的包含3000个手枪和边界框的数据集。在Roboflow上,他可以访问到去重后的2973张图像。虽然拥有一个免费且标记好的数据集是有帮助的,但数据集的质量可能会引起问题。数据集是否代表了要解决的问题?标签是否可信?图像是否有问题(例如重复)?
通过使用Roboflow的计算机视觉工作流工具来验证他的图像和标签的质量,Alaa发现了一些导致模型性能下降的错误标签。Roboflow的上传界面逐个显示每个图像及其注释,提供了一个简单的界面来检查明显的错误。在Alaa的情况下,这很快暴露出对他的问题不利的图像,如卡通图像和手绘照片。
Roboflow在处理单个图像和注释时,会自动执行边界框质量检查。注释容易出错:它们可能是不合逻辑的(例如,负宽度),完全超出框架,或部分超出框架。
在Alaa的情况下,一张图像有一个难以捕捉的错误:一个边界框完全超出了框架。在这些情况下,Roboflow会丢弃该注释以自动修复问题。(如果注释部分超出框架,Roboflow会裁剪边界框的边缘,使其与图像边缘对齐。)
# 示例代码:Roboflow丢弃问题注释
if annotation_out_of_frame:
drop_annotation()
另一个常见问题,尤其是在大型图像数据集中,是重复图像。在Alaa的情况下,Roboflow自动移除了27个重复图像,这些图像如果不移除,将会使他的模型偏向于这些例子,并可能导致测试集泄露。
图像预处理和增强对于提高模型性能至关重要。一些模型架构使得在模型配置文件中传递预处理(例如TensorFlow中的image_resizer)和增强(例如FastAI中的crop)变得容易,但如果一个人在不同的框架之间进行实验或使用自定义模型,则需要在训练之前重写每个所需的步骤。此外,在训练时进行增强可能会使调试变得困难,因为重现模型在哪些类型的图像上表现良好变得更加不透明(模型是否需要更多的明亮图像?更多的高对比度?)。
因此,创建一个与训练分开的预处理管道简化了训练。提前进行增强不仅节省了宝贵的GPU计算资源,还提高了模型的可重复性。
# 示例代码:预处理和增强
preprocessed_images = preprocess_and_augment(images)
Alaa希望尝试多种模型架构,特别关注推理速度,因为他的问题需要实时处理视频流。他对比较MobileNetSSDv2和YOLOv3的性能特别感兴趣。
TensorFlow Object Detection API提供了MobileNet的现成实现,但设置模型需要仔细的文件管理,将一种注释格式转换为TensorFlow Object Detection CSV,并使用该CSV创建TFRecord文件。幸运的是,Roboflow可以在点击几下鼠标的情况下完成这些操作。(甚至有一篇使用Roboflow与TensorFlow Object Detection API的教程。)
同样,开源的YOLOv3实现需要它们自己的注释格式,并且现成的实现较少。(这也使得保持相同的预处理和增强管道变得复杂。)
Roboflow处理所有这些格式的导出。
# 示例代码:在不同框架之间进行实验
experiment_results = compare_models(MobileNetSSDv2, YOLOv3)
总的来说,Roboflow消除了数据科学家编写的用于预处理、增强和转换文件的大量一次性实用脚本——因此他们专注于评估模型性能的重要工作。