Haar Adaboost 检测车辆

参考资料:

http://blog.csdn.net/zhuangxiaobin/article/details/25476833
【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html

浅析人脸检测之Haar分类器方法

http://blog.csdn.net/zhuangxiaobin/article/details/26075667
【机器学习】AdaBoost算法详解

?

三个步骤:

  1. 创建样本
  2. 训练分类器
  3. 利用训练好的分类器进行目标检测

?

1、什么是Haar分类器

Haar分类器属于无监督学习的一种,属于聚类,不知道数据本来的分类数目。这要区别于分类。它是属于一种聚类算法,基于统计的聚类算法。

Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost + 级联

算法要点:

  1. 使用Haar-like特征检测
  2. 使用积分图对Haar-like特征求值并进行加速
  3. 使用Adaboost算法区分人脸和非人脸的强分类器
  4. 使用筛选式级联把分类器级联到一起,提高准确率

?

Haar-like特征:

边界特征、线特征、中心特征

Boosting做的工作就是用什么样的矩形特征怎样的组合到一起区分非人脸与人脸的一种算法。

它是一种弱学习分类算法,但是它可以组合成一个高精度的强学习分类算法。但是呢,如何确定阈值。

为了解决boosting自适应的问题,出现了adaboosting算法

弱分类器是由决策树来实现的,基本的弱分类器只包含一个harr-like特征,决策树只有一层。

强分类器是在弱分类器的基础上,进行多次T次迭代,然后组合T个最优弱分类器得到。

综上,adaBoost算法其实是一个弱分类器从孵化到化蝶的过程。

?

通过弱分类器的民主投票得到一个强分类器,强分类器在经过级联得到检测正确率较高的级联分类器,它就是我们最终的目标Harr分类器。

2、利用opencv上面的人脸检测demo,编写自己的车辆检测实例,检测结果如下图所示:

检测结果如下所示:每帧耗时100ms左右。

代码如下:

  1. static CvMemStorage* storage = 0; //存储相关
  2. static CvHaarClassifierCascade* cascade = 0;//决策树
  3. void detect_and_draw(IplImage* image);
  4. ?
  5. const
    char* cascade_name = "model.xml";
  6. const
    char* input_name = "car.avi";
  7. int main()
  8. {
  9. ???CvCapture* capture = NULL;
  10. ???IplImage* frame = 0,*frame_copy = 0;
  11. ?
  12. ????cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);
  13. ???if (!cascade)
  14. ???{
  15. ??????cout << "load fail" << endl;
  16. ???}
  17. ???else
  18. ???{
  19. ??????capture = cvCreateFileCapture(input_name);
  20. ???}
  21. ???storage = cvCreateMemStorage(0);//必须初始化
  22. ???cvNamedWindow("result",1);
  23. ???int frame_num = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
  24. ?
  25. ???while(frame_num)
  26. ???{
  27. ??????DWORD tick = GetTickCount();
  28. ??????frame = cvQueryFrame(capture);
  29. ?
  30. ??????detect_and_draw(frame);
  31. ?
  32. ??????cout << "use time: " << GetTickCount() - tick << endl;
  33. ??????frame_num--;
  34. ?
  35. ???}
  36. ???cvReleaseCapture(&capture);
  37. ???cvDestroyWindow("result");
  38. ???return 0;
  39. }
  40. ?
  41. void detect_and_draw(IplImage* image)
  42. {
  43. ???int scale = 1.3;
  44. ???CvPoint pt1,pt2;
  45. ???cvClearMemStorage(storage);
  46. ???if (cascade)
  47. ???{
  48. ??????CvSeq* cars = cvHaarDetectObjects(image,cascade,storage,1.1,3,CV_HAAR_DO_CANNY_PRUNING,cvSize(20,20));
  49. ??????for (int i = 0; i < (cars ? cars->total : 0); ++i)
  50. ??????{
  51. ?????????CvRect* r = (CvRect*) cvGetSeqElem(cars,i);
  52. ?????????pt1.x = r->x*scale;
  53. ?????????pt1.y = r->y*scale;
  54. ?????????pt2.x = (r->x + r->width)*scale;
  55. ?????????pt2.y = (r->y + r->height)*scale;
  56. ?????????cvRectangle(image,pt1,pt2,CV_RGB(255,0,0),3,8,0);
  57. ??????}
  58. ???}
  59. ???cvShowImage("result",image);
  60. ???cvWaitKey(20);
  61. }

3、优化算法,提高检测速度

内存空间够大的话,理论上也可以提高速度。

  1. 从提高速率和准确性的角度出发,我们发现整张图探测汽车,耗时接近300ms,想着如何提高算法的实时性?

    ?

    将雷达监测到的障碍物坐标,投影到图像当中,并将其窗口做限制,窗口大小200*200,从障碍物自身投影到图像中坐标算起,使用视觉大概在60ms左右。

    再此,我们可以通过更改Haar函数里面的参数也可以提高速度。

    (注意:雷达坐标不准的原因,条件tan,调小,也就是说pitch向下比较多,这个值对纵坐标影响太大。)

检测函数如下:

?

  1. 下一步往下做的问题:

    1)我们是否可以通过车道线的限制条件来限制其检测范围只要车道线之内的图像,其他不要。

    2)假如检测到多个障碍物,我们无法确定矩形框大小,因为我们不知道障碍物是什么?如何确定长与宽?

    3)多个障碍物都用Haar的话,效率是个问题,因为检测一次耗时太长,还不如将窗口弄大一些,然后一次性检测。

?

?

  1. 一些小错误:

    libboost_thread-vc100-mt-1_47.lib(tss_pe.obj) : error LNK2038: 检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项: 值"0"

VS2010检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项,这个错误是由于

生成release文件的时候链接到debug文件当中了,我们需要在附加属性里面加上*d.lib即可。而不是用*.lib,这样可能会导致链接的错误。

  1. 德尔福ESR与图像融合设备算法思路

    图像输出行人、车辆、车道线信息(核心芯片用的mobieye的摄像头,可以直接输出车道线、行人以及车辆信息),然后雷达输出障碍物信息。

    然后在某一个ECU里面融合这些数据,起到一个相互验证的作用,而且每辆车的高度与宽度可以说是一定的。我们可以通过识别出来的人和车信息来标记宽度信息。

    ?

关于德尔福ESR与图像融合设备算法思路这块,是我们学校当时采购过一套德尔福的融合设备,根据工程师描述,此套融合设备是德尔福与mobieye合作开发的,德尔福用的是mobieye的核心芯片,可以提供车道线,行人,车辆信息。而目前我们手里的mobieye摄像头只能以下提供:

1、车道线压线的报警信号(55km/h以上有效)

2、同车道内,车辆报警信号和时距信号(30km/h 以上有效)

3、同车道内,行人报警信号(7km/h --- 50km/h 之间有效)

时间: 2024-10-12 20:32:20

Haar Adaboost 检测车辆的相关文章

Adaboost算法详解(haar人脸检测)

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值.将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器. 算法概述 1.先通过对N个训练样本的学习得到第一个弱分类器: 2.将分错的样本和其他的新数据

OpenCV中的Haar+Adaboost(七):分类器训练过程

本节文章讲解OpenCV中Haar+Adaboost的训练过程.此文章假定读者已经了解前面5章的内容,包括Haar特征,弱分类器和强分类器结构,以及GAB等内容. 在opencv_traincascade.exe程序中,有如下参数 如上输入的boostParams中的6个参数决用于决定训练过程: 1. 参数bt选择Boosting类型(默认GAB),本系列文章五中已经介绍了 2. minHitRate和maxFalseAlarmRate限定训练过程中各种阈值大小,文章六已经介绍了 3. 参数we

OpenCV中的Haar+Adaboost(六):minHitRate与maxFalseAlarm

在之前的文章中,分别讲解了Haar特征,强弱分类器组合形式,以及GAB.那么在了解这些内容的基础上,本节开始正式讲解OpenCV Adaboost训练过程.需要再次说明的是,本系列文章讲解的是OpenCV中的opencv_traincascade.exe程序的实现方法,并不代表仅只有此一种实现方法. ------------------------------------------- 在了解训练过程之前,还需要分析一些和训练相关的原理. (一)precision与recall 对于所有的监督学

OpenCV Haar AdaBoost源码改进

这几天研究了OpenCV源码 Haar AdaBoost算法,作了一下改进 1.去掉了所有动态分配内存的操作,对潜入式系统有一定的速度提升 2.注释覆盖了大量关键代码 3.减少了代码一半的体积,并且减少了部分健壮性的代码,速度比OpenCV源码提升6% 4.修改了大量数据结构,不依赖CV源码直接编译 注:使用时请注意,现仅支持单分支的Stages和单结点的Classifier训练好的结果集 Haar.h #ifndef _HAAR_H_ #define _HAAR_H_ #include "Ta

6-9 Haar+adaboost人脸识别

我们重点分析了Haar特征的概念以及如何计算Haar特征,并介绍了Haar+Adaboost分类器它们的组合以及Adaboost分类器如何使用和训练.这节课我们将通过代码来实现一下Haar+Adaboost分类器实现的人脸识别. 计算jpg图片的haar特征,不过这一步opencv已经帮我们做了,所以我们不需要.我们只需要对这个图片进行一个灰度处理,因为所有的haar特征必须要是基于灰度图片来进行计算的.第四步,我们进行检测.所以我们要检测出来当前的haar特征的人脸以及人脸上的眼睛.总共有两个

OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB

之前的文章主要讲解了OpenCV中与检测相关的内容,包括Haar特征.积分图和检测分类器结构:之后的文章将逐步开始介绍训练相关的内容.而本节主要介绍AdaBoost的理论,以及AdaBoost中的DAB与GAB算法,为后续讲解奠定基础. (一) AdaBoost背景介绍 在了解AdaBoost之前,先介绍弱学习和强学习的概念: 1. 弱学习:识别错误率小于1/2,即准确率仅比随机猜测略高的学习算法 2. 强学习:识别准确率很高并能在多项式时间内完成的学习算法 显然,无论对于任何分类问题,弱学习都

OpenCV Haar AdaBoost源码改进据说是比EMCV快6倍

<pre name="code" class="cpp">#include "Haar.h" #include "loadCascade.h" #include "Util.h" #include "stdio.h" #include "string.h" #include <math.h> #include <stdint.h>

OpenCV原理解读之HAAR+Adaboost

由于在做人脸检测的项目,用到了OpenCV的训练结果中的老分类器,因此将旧分类器的检测方法进行了总结,加上了一些自己的理解,并转载了一些较好的文章记录下来. 文章http://www.61ic.com/Article/DaVinci/TMS320DM646x/201310/50733.html解决了以下函数移植到DSP上的一些问题 下面为HAAR特征检测的具体流程:http://blog.csdn.net/nongfu_spring/article/details/38977555 一.在计算每

AdaBoost 人脸检测介绍(2) : 矩形特征和积分图

本系列文章总共有七篇,目录索引如下: AdaBoost 人脸检测介绍(1) : AdaBoost身世之谜 AdaBoost 人脸检测介绍(2) : 矩形特征和积分图 AdaBoost 人脸检测介绍(3) : AdaBoost算法流程 AdaBoost 人脸检测介绍(4) : AdaBoost算法举例 AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限 AdaBoost 人脸检测介绍(6) : 使用OpenCV自带的 AdaBoost程序训练并检测目标 AdaBoost 人脸