zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

基于haarlike特征提取和Adaboost 的红绿灯/人行道检测识别matlab仿真

识别MATLAB 基于 检测 仿真 特征提取 AdaBoost
2023-09-11 14:15:36 时间

目录

一、理论基础

二、核心程序

三、仿真测试结果


一、理论基础

         目前常用的 Haar-like 特征主要包含四类:边缘特征、线性特征、中心特征以及对角线特征(也称特定方向特征),特征模板则由上述四类特征组合而成,如图所示:


       特征模板实质上就是一个矩形,该矩形被划分为 2-3 个区域,每个区域使用黑色或白色填充。每个模板对应一个特征值,该值是由两种颜色覆盖区域内各自像素值总和做差得到的。通过该特征值的计算方式不难发现,Haar-like 特征其实可以被看做是图像灰度变化在数值上的一种表示。
        特征模板的大小、位置、方向的变化以及伸缩变化可以衍生出大量的新特征,这些新的特征称为“矩形特征”。不难想象,模板类别、大小和位置等因素的变化会造成很小的检测窗口内含有大量矩形特征。如 24*24 像素大小的检测窗口内矩形特征数量可达16 万之多。那么这就带来一个问题:如何快速计算这么多的特征。于是研究者提出了“积分图”的概念。
         积分图算法就是保证在对图像的一次遍历过程中实现全部特征计算的方法。积分图的计算方法采用了动态规划的思想,其总体思路是将输入图像从起点(通常为左上角点)开始到任一点所构成的矩形区域内的像素和保存在数组中,而当需要计算任意矩形范围的像素和时,直接从数组中以 O(1)的时间读取所需数据,通过简单的加减法计算而得到。
 

       AdaBoost是Adaptive Boosting(自适应增强)的缩写,它的自适应在于:被前一个基本分类器误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或预先指定的最大迭代次数再确定最后的强分类器。

       该算法其实是一个简单的弱分类算法提升过程,这个过程通过不断的训练,可以提高对数据的分类能力。整个过程如下所示:
1、先通过对N个训练样本的学习得到第一个弱分类器;
2、 将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器 ;
3、 将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器;
4、最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定。
       由Adaboost算法的描述过程可知,该算法在实现过程中根据训练集的大小初始化样本权值,使其满足均匀分布,在后续操作中通过公式来改变和规范化算法迭代后样本的权值。样本被错误分类导致权值增大,反之权值相应减小,这表示被错分的训练样本集包括一个更高的权重。这就会使在下轮时训练样本集更注重于难以识别的样本,针对被错分样本的进一步学习来得到下一个弱分类器,直到样本被正确分类。在达到规定的迭代次数或者预期的误差率时,则强分类器构建完成。

Adaboost算法可以简述为三个步骤:
(1)首先,是初始化训练数据的权值分布D1。假设有N个训练样本数据,则每一个训练样本最开始时,都被赋予相同的权值:w1=1/N。
(2)然后,训练弱分类器hi。具体训练过程中是:如果某个训练样本点,被弱分类器hi准确地分类,那么在构造下一个训练集中,它对应的权值要减小;相反,如果某个训练样本点被错误分类,那么它的权值就应该增大。权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
(3)最后,将各个训练得到的弱分类器组合成一个强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。
换而言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。


 

二、核心程序

 

clc;
clear;
close all;
warning off;
pack;
addpath 'func\vedio_process\'
addpath 'func\feature_catch\'
addpath 'func\Adaboost\'


%STEP_sel = 1;选择1进行读取图像
%STEP_sel = 2;选择2进行样本的训练
%STEP_sel = 3;选择3进行实际视频测试
STEP_sel  = 1;

%每次窗口移动的像素
PStep     = 4;
%设置监测区域
%设置监测区域的横坐标,0点在左,
rr1       = 50;
rr2       = 150;
%设置监测区域的纵坐标,0点在上,
cc1       = 30;
cc2       = 180;
%导入视频阶段
%导入视频阶段
FileName_AVI       =     'Vedio\4.avi'; 
POSer              = dir('Vedio\POS\*.png');
FileName1          =     'Vedio\POS\';
NEGer              = dir('Vedio\NEG\*.jpg');
FileName2          =     'Vedio\NEG\';

if STEP_sel == 1
   [pixel_gray,pixel_original,frameNum_Original] = func_vedio_process(FileName_AVI);
   save temps\vedio_tmp.mat pixel_gray pixel_original frameNum_Original
   clear pixel_gray pixel_original
end



%样本训练阶段
%样本训练阶段
if STEP_sel == 2

   [Feature1,Labels1] = func_haar_like(POSer,FileName1,1);
   [Feature2,Labels2] = func_haar_like(NEGer,FileName2,-1); 
   
   %最后得到的训练输入和训练目标
   Train_Feature           = [Feature1,Feature2];
   Train_Labels            = [Labels1,Labels2];
%    %第二:人员目标的跟踪通过模板匹配的方法,训练的时候使用SVM进行完整训练
%    %mapminmax为matlab自带的映射函数
%    [Train_Feature,pstrain] = mapminmax(Train_Feature');
%    %将映射函数的范围参数分别置为0和1
%    pstrain.ymin            = 0;
%    pstrain.ymax            = 1;
%    %对训练集进行[0,1]归一化
%    [Train_Feature,pstrain] = mapminmax(Train_Feature,pstrain);
   
   %AdaBoost
   weak_learner = tree_node_w(10);
   GLearners    = [];
   GWeights     = [];
   [GLearners,GWeights] = func_AdaBoost(weak_learner, Train_Feature, Train_Labels, 100, GWeights, GLearners);
   save models.mat GLearners GWeights weak_learner 
end



%样本测试阶段
%样本测试阶段
if STEP_sel == 3
    load models.mat; 
    load temps\vedio_tmp.mat; 
    figure(1);
    WPostion_save = [];
    cnt           = 0;
    for i=1:frameNum_Original
        i
        %初始检测窗口的大小
        R0          = 48;
        C0          = 20;
        %窗口大小 设两个是避免重复
        R1          = 48;
        C1          = 20;
        Test_Feature= [];%特征矩阵初始化
        Test_Labels = [];%labels初始化
        Postion     = [];%每一个检测窗口的位置初始化       
        Img         = pixel_gray(cc1:cc2,rr1:rr2,i);
        Img0        = pixel_original(:,:,:,i);
        I           = Img;
        imshow(Img0);
        title('监测效果');
        hold on;
        [H,W]     = size(I);
        [Hss,Wss] = size(pixel_gray(:,:,i));
        %调整图像大小,使其和模板大小匹配
        ResizeTimes = 1.1;
        ResizeNum   = floor(min(log(H/R0)/log(ResizeTimes),log(W/C0)/log(ResizeTimes)))+1;
        for n=1:1
            n
            HStepNum=floor((H-R1)/PStep+1);
            WStepNum=floor((W-C1)/PStep+1);
            for k=1:WStepNum
                for m=1: HStepNum
                    PImg         = I((m-1)*PStep+1:(m-1)*PStep+R1,(k-1)*PStep+1:(k-1)*PStep+C1);
                    Times        = C0/C1;
                    PosImg       = imresize(PImg,Times,'bilinear');%缩放
                    feat         = func_haar_like2(PosImg);
                    Test_Feature = [Test_Feature,feat'];
                    Test_Labels  = [Test_Labels,-1];
                    %对应的窗口坐标
                    P            = [(k-1)*PStep+1,(m-1)*PStep+1,C1,R1]';
                    Postion      = [Postion,P];
                end
            end
            R1 = floor(R1*ResizeTimes);
            C1 = floor(C1*ResizeTimes);
        end

%         %对测试集进行[0,1]归一化
%         [Test_Feature,pstest] = mapminmax(Test_Feature');
%         pstest.ymin           = 0;
%         pstest.ymax           = 1;
%         [Test_Feature,pstest] = mapminmax(Test_Feature,pstest);
%         WinNum                = size(Test_Feature,2);
        R_label               = sign(Classify(GLearners, GWeights, Test_Feature'));%这就是测试结果
        %画出最终检测结果为行人的检测窗口
        People_NUM = find(R_label==1);
        WPostion   = Postion(:,People_NUM);
        color      = ['r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y','r','b','c','k','y','w','m','k','y'];
        i          = 1; 
        k          = 1;
        hold on;
        rectangle('Position',[(abs(rr1)),(abs(cc1)),abs(rr2-rr1),abs(cc2-cc1)],'EdgeColor','g','linewidth',2);
 
        
        WPostion2 = unique(WPostion','rows');
        for j=1:size(WPostion2,1)
            rectangle('Position',[WPostion(1,j)+rr1,WPostion(2,j)+cc1,WPostion(3,j),WPostion(4,j)],'EdgeColor',color(1),'linewidth',2);
        end
        pause(0.01);
    end  
end




三、仿真测试结果

A09-35