优化 AI 交通速度检测器





5.00/5 (4投票s)
在本文中,我们将探讨测量车辆速度的不同方法,以及可以在我们的TrafficCV程序中使用的不同深度学习目标检测模型。
引言
交通速度检测是一个大生意。世界各地的市政当局利用它来阻止超速行驶并通过超速罚单创收。但传统的测速仪,通常基于 RADAR 或 LIDAR,价格昂贵。
本系列文章将向您展示如何仅使用深度学习构建一个相当准确的交通速度检测器,并在像树莓派这样的边缘设备上运行它。
欢迎您从 TrafficCV Git 仓库 下载本系列文章的代码。我们假设您熟悉 Python,并具备 AI 和神经网络的基础知识。
在上一篇文章中,我们开发了一个小型计算机视觉框架,该框架能够以不同的参数运行各种计算机视觉和深度学习模型,并比较它们的性能。在本文中,我们将探讨测量车辆速度的不同方法,以及可以在我们的TrafficCV程序中使用的不同深度学习目标检测模型。
结合VASCAR和ENRADD
视觉平均速度计算机和记录器 (VASCAR) 是最简单且使用最广泛的车辆速度检测设备,适用于测速枪或LIDAR和雷达探测器不可行或被禁止的区域。VASCAR依靠简单的距离/时间计算,利用两个地标之间的距离和车辆通过该距离所需的时间。现代VASCAR设备可以从移动的巡逻车中计算受监控车辆的速度,还可以录制受监控车辆的视频作为附加证据。
电子非雷达检测 (ENRADD) 系统与VASCAR类似,但依靠放置在路面上的电子传感器。这些传感器发射红外线束,通过的车辆会中断光束,从而提供一种自动测量车辆通过两个地标之间距离所需时间的方法。
我们的TrafficCV程序可以看作是VASCAR和ENRADD的混合体,因为我们使用计算机视觉自动检测和估算通过感兴趣区域 (ROI) 的车辆速度。TrafficCV操作员可以设置与物理量相对应的不同参数,例如ROI的长度(以米为单位)。
系统校准
在他的OpenCV车辆速度检测文章中,Adrian Rosebrock描述了一种简单的方法来校准速度检测器参数,我们可以将其应用于TrafficCV。将摄像头放置在离道路一定距离的地方,使两个地标对应于摄像头水平视野的两个极端。将摄像头的水平分辨率除以物理距离(以米为单位),得到一个常数,称为每米像素数 (ppm)(Rosebrock使用该数量的倒数,即每像素米数,但原理相同)。在下图中,对于1280x720的视频分辨率,该数量将是1280/15,大约为86。
为了在不使用三角函数的情况下提高准确性,将ROI分成4个(如果相机分辨率足够高,则分成8个)子区域,并通过计时车辆通过该段(320像素,或8个子区域为160像素)所需的时间来计算车辆在每个区域的速度。每个子区域的平均速度可以给我们一个车辆速度的估计。我们不能在这里使用普通的计时器,因为视频以一定的FPS速率处理——所以我们使用FPS值代替。如果已处理10帧,并且FPS=18,我们可以估算经过的时间为10/18秒。
选择对象检测模型
TrafficCV可以使用不同的计算机视觉和深度学习对象检测模型,这些模型可以在CPU或Coral USB AI加速器上运行。在过去的几篇文章中,我们已经看到了在CPU上运行的Haar级联分类器。我们将从MobileNet SSD类模型开始。
单次多框检测器 (SSD) 是一种用于目标检测的深度神经网络,它从单个视频帧生成多个检测到的对象的边界框和相关的置信度分数。SSD网络中的早期网络层基于图像分类的标准架构。MobileNets 指的是一种在移动和嵌入式计算设备上高效的基础神经网络架构。MobileNet SSD神经网络在MobileNet基础网络之上使用SSD网络的后期层,可以在树莓派等嵌入式设备上进行准确高效的目标检测。
我们可以使用基于TensorFlow Lite运行时的MobileNet SSD深度神经网络实现,该运行时针对树莓派等边缘设备以及Coral USB进行了优化。ssd_mobilenet_v1_coco_tflite
模型在80个通用对象上下文(COCO)类别上进行了训练。
tcv EUREKA:0.0 --model ssd_mobilenet_v1_coco_tflite --video ../TrafficCV/demo_videos/sub-1504619634606.mp4
我们正在将该模型与我们demo_videos目录中的另一个包含多辆车的视频一起使用,以了解模型性能。该模型显示出比Haar级联分类器更高的性能,准确性相同或更好,但当跟踪多个对象时,它会显著减慢速度。
TrafficCV:Windows视频上的SSD MobileNet v1
考虑到速度检测器的部署方式,跟踪多辆车并不是我们应该考虑的唯一场景。另一种场景是摄像头放置在路边,车辆一辆接一辆地通过。我们可以使用我们demo_videos文件夹中的另一个视频来测试这个场景。
tcv --model ssd_mobilenet_v1_coco_tflite --video ..demo_videos\cars_horizontal.mp4
cars_horizontal.mp4演示视频显示了单辆车水平穿过摄像头FOV的情况
TrafficCV:Windows上的SSD MobileNet v1
使用CPU运行
我们应该首先在Windows上运行它以获得视觉反馈,因为视频分辨率为1920x1080,并且通过网络推送视频帧会大大减慢Pi的处理速度。我们可以看到检测器捕捉到了快速移动的车辆,尽管对于较小的车辆,检测器只在摄像机视野的末端捕捉到车辆。在Pi上,我们可以在运行检测器时使用--nowindow
参数。
tcv --model ssd_mobilenet_v1_coco_tflite --video ..demo_videos\cars_horizontal.mp4 --nowindow
______ ___ ___ __ ______ ___ ___
|_ _|.----.---.-.' _|.' _|__|.----.| | | |
| | | _| _ | _|| _| || __|| ---| | |
|___| |__| |___._|__| |__| |__||____||______|\_____/
v0.1
11:19:43 AM [INFO] Video window disabled. Press ENTER key to stop.
11:19:43 AM [INFO] Video resolution: 1920x1080 25fps.
11:19:43 AM [INFO] Model: SSD MobileNet v1 neural network using 80 COCO categories on TensorFlow Lite runtime on CPU.
11:19:43 AM [INFO] Using default input mean 127.5
11:19:43 AM [INFO] Using default input stddev 127.5
11:19:43 AM [INFO] ppm argument not specified. Using default value 8.8.
11:19:43 AM [INFO] fc argument not specified. Using default value 10.
11:19:43 AM [INFO] score argument not specified. Using default score threshold 0.6.
11:19:44 AM [INFO] Internal FPS: 10; CPU#1: 12.0%; CPU#2: 16.7%; CPU#3: 34.3%; CPU#4: 86.1%; Objects currently tracked: 0.
11:19:45 AM [INFO] Internal FPS: 11; CPU#1: 19.5%; CPU#2: 23.6%; CPU#3: 10.5%; CPU#4: 100.0%; Objects currently tracked: 0.
11:19:46 AM [INFO] New object detected at (1431, 575, 263, 154) with id 0 and confidence score 0.6796875.
11:19:46 AM [INFO] Internal FPS: 12; CPU#1: 13.7%; CPU#2: 27.2%; CPU#3: 15.0%; CPU#4: 100.0%; Objects currently tracked: 1.
...
11:19:54 AM [INFO] Internal FPS: 12; CPU#1: 8.1%; CPU#2: 14.9%; CPU#3: 11.8%; CPU#4: 100.0%; Objects currently tracked: 0.
11:19:54 AM [INFO] Internal FPS: 12; CPU#1: 20.0%; CPU#2: 17.6%; CPU#3: 10.7%; CPU#4: 100.0%; Objects currently tracked: 0.
11:19:55 AM [INFO] New object detected at (197, 447, 772, 215) with id 1 and confidence score 0.6328125.
11:19:55 AM [INFO] Internal FPS: 12; CPU#1: 9.0%; CPU#2: 17.9%; CPU#3: 21.2%; CPU#4: 100.0%; Objects currently tracked: 1.
11:19:56 AM [INFO] Internal FPS: 12; CPU#1: 8.7%; CPU#2: 12.3%; CPU#3: 12.1%; CPU#4: 100.0%; Objects currently tracked: 1.
在Windows和Raspberry Pi上,TrafficCV的FPS在同时跟踪一辆车时保持在12-13的常数。这正好是视频FPS 25的一半,因此可能存在某个依赖项或瓶颈,导致检测器以视频FPS的一半运行,这与神经网络的对象检测速度或硬件无关。我们将在本系列的最后一篇文章中调查这个问题。
使用Edge TPU运行
让我们看看MobileNet SSD如何在Coral USB AI加速器上使用Edge TPU运行。Coral设备也使用TensorFlow Lite运行时,因此此检测器的代码几乎与我们的TFLite检测器相同,只是这里我们使用了Edge TPU本机库委托。
EDGETPU_SHARED_LIB = {
'Linux': 'libedgetpu.so.1',
'Darwin': 'libedgetpu.1.dylib',
'Windows': 'edgetpu.dll'
}[platform.system()]
def make_interpreter(self, model_file):
"""Create TensorFlow Lite interpreter for Edge TPU."""
model_file, *device = model_file.split('@')
return tflite.Interpreter(
model_path=model_file,
experimental_delegates=[
tflite.load_delegate(EDGETPU_SHARED_LIB,
{'device': device[0]} if device else {})
])
(cv) allisterb@glitch:~/Projects/TrafficCV $ tcv --model ssd_mobilenet_v1_coco_edgetpu --video demo_videos/cars_horizontal.mp4 --nowindow
_______ ___ ___ __ ______ ___ ___
|_ _|.----.---.-.' _|.' _|__|.----.| | | |
| | | _| _ | _|| _| || __|| ---| | |
|___| |__| |___._|__| |__| |__||____||______|\_____/
v0.1
02:16:54 PM [INFO] Video window disabled. Press ENTER key to stop.
02:16:55 PM [INFO] Video resolution: 1920x1080 25fps.
02:16:55 PM [INFO] Model: SSD MobileNet v1 neural network using 80 COCO categories on TensorFlow Lite runtime on Edge TPU.
02:16:58 PM [INFO] Using default input mean 127.5
02:16:58 PM [INFO] Using default input stddev 127.5
02:16:58 PM [INFO] ppm argument not specified. Using default value 8.8.
02:16:58 PM [INFO] fc argument not specified. Using default value 10.
02:16:58 PM [INFO] score argument not specified. Using default score threshold 0.6.
02:16:59 PM [INFO] Internal FPS: 10; CPU#1: 8.3%; CPU#2: 19.9%; CPU#3: 9.1%; CPU#4: 9.8%; Objects currently tracked: 0.
02:16:59 PM [INFO] Internal FPS: 12; CPU#1: 19.1%; CPU#2: 98.6%; CPU#3: 25.0%; CPU#4: 10.0%; Objects currently tracked: 0.
02:17:00 PM [INFO] Internal FPS: 13; CPU#1: 11.6%; CPU#2: 100.0%; CPU#3: 29.4%; CPU#4: 19.4%; Objects currently tracked: 0.
02:17:07 PM [INFO] Internal FPS: 14; CPU#1: 16.4%; CPU#2: 97.1%; CPU#3: 11.4%; CPU#4: 11.6%; Objects currently tracked: 0.
02:17:08 PM [INFO] Internal FPS: 14; CPU#1: 21.7%; CPU#2: 98.6%; CPU#3: 20.6%; CPU#4: 8.7%; Objects currently tracked: 0.
02:17:08 PM [INFO] New object detected at (156, 482, 789, 180) with id 0 and confidence score 0.625.
02:17:08 PM [INFO] Internal FPS: 14; CPU#1: 27.8%; CPU#2: 98.6%; CPU#3: 10.7%; CPU#4: 11.1%; Objects currently tracked: 1.
正如预期,FPS保持在12-13左右。有趣的是,与TF Lite版本的模型相比,Edge TPU模型似乎错过了快速通过视野的第一辆小车,而TF Lite版本能够在它移出画面之前捕捉到它。Edge TPU模型是现有模型的“量化”版本,其中浮点值转换为固定的8位值。这会降低准确性以提高性能。如果我们将分数阈值检测器参数设置为0.5,我们将能够检测到第一辆车。
tcv --model ssd_mobilenet_v1_coco_edgetpu --video demo_videos/cars_horizontal.mp4 --nowindow --args score=0.5
降低分数阈值会导致误检。另一个有趣的事情是,即使目标检测推理在Edge TPU设备上运行,1个Pi CPU仍占用100%。这为我们的瓶颈问题提供了线索——我们将在下一篇文章中解决这个问题。
我们现在有了一个可以在Raspberry Pi和Windows上运行的框架,这使我们能够轻松地使用不同的视频源在CPU和AI加速器硬件上评估交通速度检测。
下一步
最后一篇文章将讨论我们可以在性能或准确性方面对软件进行的改进。我们还将把我们自制的开源系统与商用车辆速度检测系统进行比较。