行人检测原理及代码(一)【机器学习应用】

过去的一年我都在忙着实现我的本科毕业设计课题项目:行人检测系统。 我们团队的目标是实时检测现场CCTV摄像机视频流中出现的行人。本文 是对此项目的简要总结,同时对我们在开发这个行人检测系统中用到的一些 开源项目和库进行简单的评价。

行人检测是目标检测的一个分支。目标检测的任务是从图像中识别出预定义 类型目标的存在。目标检测任务包括识别目标并给出每个目标的矩形包围框。 一个用来检测行人的目标检测系统,就称为行人检测系统。

要快速掌握机器学习应用的开发,推荐汇智网的 机器学习系列教程

我将从行人检测的早期实现方法开始介绍。这些方法源于21世纪早期,虽然 称为早期,但实际上这些方法还在行业内使用。在下一篇文章中,我将 介绍基于深度学习的技术。

1、测试基准

本文中提到的结果都是由附带的代码在笔记本上运行获得的,笔记本的规格如下:

  • CPU:Intel Core i7 7700 HQ (up-to 3.8 GHz)
  • 内存:16 GB
  • GPU:nVidia Geforce GTX 1060 6GB VGA
  • 软件栈:Ubuntu 16.04 and Open CV 3.4.

虽然有GPU,但是测试中没有记录其使用情况,因为整个算法基本都是靠CPU在跑。

所有的测试都是基于牛津大学提供的TownCenter视频,该视频取自项目: Coarse Gaze Estimation in Visual Surveillance Project

2、行人检测的早期实现思路

2.1 基于Haar特征的级联分类器

基于Haar特征的目标检测算法是Paul Viola 和Michael Jones在2001年发表的论文 “Rapid Object Detection using a Boosted Cascade of Simple Features” 中提出的。 这个方法在人脸检测中得到了广泛的应用。

OpenCV包含了内置的Haar级联检测器实现,同时也提供了用于全人体检测、上半身检测 和下半身检测的预训练模型,可以在这里下载。 这个Python代码使用Open CV 3.4的Haar级联 检测器进行行人检测。在我的测试中处理一帧的用时大约是90~100毫秒。

2.2 基于方向梯度直方图特征(HOG)的检测

HOG行人检测算法是N. Dalal和B. Triggs在2005年的论文“Histograms of oriented gradients for human detection” 中提出的。

OpenCv也包含了的基于HOG特征的检测功能,以及一个用于人体检测的预训练模型。 这个Python代码使用OpenCV 3.4的HOG行人检测器处理视频,在我的测试中处理一帧 大约需要150~170ms。

3、早期行人检测实现思路的缺点

下面列出的都是我在使用harr级联检测器和HOG检测器时发现的一些常见问题。这些 现象都是基于Open CV提供的预训练模型。

3.1 漏检

这两种方法都不是很擅长检测多姿态的行人,除非同时使用处理不同姿态的多个模型。 Open CV可用的预训练模型用来识别行人的站立姿态,因此当从正面和背面检测时效果 很好,但是从侧面检测的效果就比较差了。

3.2 误报与重复检测

这些早期的方法还存在将非人体目标识别为人的问题。可以通过调节阈值参数来 折中处理漏检和误报的情况。

有些误报可以通过定义最小检测盒尺寸来避免:

也可能会发生下图右方的重复检测。非极大值抑制算法(Non Max Suppression)可以用来 处理这种情况。

3.3 包围框定位不准

Haar级联检测器和HOG检测器得到的检测边界框都不能紧密地贴合被检测到的人体,事实上 包围框的边界在不同的检测中并不是固定的。这就给提取人体的位置(例如脚的位置)造成了困难。

3.4 检测闪烁

常常会观察到的一个现象是,在前一帧里检测到的行人,在下一帧里又没了,或者反之。 这就造成了检测结果闪烁的问题:

4、早期检测方法的优势

虽然存在上面提到的这些问题,早期的检测方法依然还在业界使用。因为这些算法 需要的算力要少于现代的深度学习方法,不需要GPU就可以实时处理视频。在OpenCV之类 的计算机视觉开发库中也包含了这些算法的实现,因此成为实现行人检测的有吸引力 的首选。

早期行人检测算法碰到的大部分问题,在新的基于深度学习的方法中都被解决掉了。我 将在下一篇文章中分析现代的方法是如何解决这些问题的。


原文链接:Real-time Human Detection in Computer Vision — Part 1

汇智网翻译整理,转载请标明出处