随着深度学习(DL)技术的发展,实时视频流中检测人类已成为一个解决的问题。然而,对于边缘和物联网(IoT)设备来说,这些设备往往不具备强大的计算能力,使得这一任务变得复杂。本文系列将向展示如何在树莓派上实现实时(或近实时)检测人类。本系列文章假设读者已经具备一定的背景知识...
历史上,图像中的对象检测方法,如Haar或LBP级联,以及方向梯度直方图(HOG)分类器,都是基于提取几何特征,并判断检测到的特征集是否属于指定类别的对象。当深度神经网络(DNN)出现时,它们立即被认为是非常有效的特征提取器。这激发了人工智能(AI)研究人员开发面向对象检测的DNN和高效的算法来训练它们。如今,几乎所有现代计算机视觉系统都使用DL算法进行对象检测。典型的对象检测系统运行在高性能的CPU、GPU甚至为DNN特别设计的TPU上。
要在计算能力有限的设备上进行人类检测,必须采用适合设备的AI方法。首先,让分析现有DL方法的优缺点,并选择最适合方法。由于人类检测是对象检测的一个特例,将查看通用的DL对象检测器,然后看看如何将它们适应特殊情况。
以下是最成熟的现代DL对象检测方法:Faster-RCNN、单次检测器(SSD)和You Only Look Once (YOLO)。所有这些技术都使用卷积神经网络(CNN),它们之间的差异在于内部网络结构的细节和网络训练算法。
Faster-RCNN是第一个成功用于视频流中实时对象检测的DL技术。Faster-RCNN是一个包含两个主要部分的DNN。第一部分作为特征提取器。第二部分是一个特别设计的神经网络,使用提取的特征来定位对象位置并对它们进行分类——例如,如下图所示:
# 示例代码:使用Faster-RCNN进行对象检测
import cv2
net = cv2.dnn.readNetFromTensorflow('faster_rcnn_inception_v2_coco_2018_01_28.pbtxt', 'faster_rcnn_inception_v2_coco_2018_01_28/frozen_inference_graph.pb')
blob = cv2.dnn.blobFromImage(image, 1.0, (600, 600), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()
# 处理检测结果...
单次检测器(SSD)与Faster-RCNN非常相似。它包括一个用于特征提取的卷积网络和一个用于对象定位和分类的机制。唯一的区别是上述机制允许网络在单个前向传递中定位和分类对象。这使得SSD更快,训练更简单。
YOLO也可以被认为是一种单次检测器。它将图像划分为一个单元格网格,然后预测每个单元格属于某个类别的分数。
在本系列的下一篇文章中,将回顾DL技术的优点和缺点。与此同时,让考虑如何将DL方法应用到具体目标上——在边缘设备上进行人类检测。
有两个主要目标:
使用DL方法满足上述两个要求有两种主要方式:
专业软件开发人员可能会更喜欢第一种方式。例如,为了生产一个需要人类检测的视频监控系统。这将使能够创建针对在树莓派设备上运行优化的现实生活软件。同时,从头开始设计CNN架构,获取人类数据集并训练网络需要大量的时间和努力。
第二种方式要简单得多。只需要找到一个可以在计算能力有限的设备上使用的现有DNN。它既不需要太多的努力,也不需要深入了解DL技术。目标只是展示在边缘设备上的人类检测——而不是创建世界上最好的CNN——将采取简单的方式。
然而,即使是“简单”方式也需要使用专门的计算机视觉和DL软件,以及编写定制的计算机代码。将使用Python和OpenCV作为计算机视觉系统。首先,将编写使用CNN和OpenCV的Python代码,并测试它们在图像中检测人类。
# 示例代码:使用OpenCV检测人类
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
img = cv2.imread('face.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# 绘制检测到的人类...
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)