⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adaboostm2.m

📁 这是用matlab编写人脸检测软件
💻 M
字号:
%*************************************************************************
%  AdaBoost.M2 和PRM(Probabilistic reasoning models 1)的结合
%  参考文献:  
%  1. Chengjun Liu and Harry Wechsler, "Robust Coding Schemes for
%  Indexing and Retrieval from Large Face Database", IEEE Trans. Image 
%  Processing, vol.9, 132-137, 2000
%  2. Yoav Freund and Robert E.Schapire, "A Decision-Theoretic Generalization of 
%  On-line Learning and an Application to Boosting, Journal of computer and 
%  system sciences,55.119-139 (1997)    
%**************************************************************************
%  算法描述:
%     通过不停的改变权重,然后根据权重重新采样
%  
%********************************************************************
%
%
%***********************************************************************
clear;
%***********************************************************************
EACHNUM = 4;
TT = 200; %boosting的次数
CLASSNUM = 10;
fp = fopen('result.txt','w');
CLASSRATE = zeros(58,50,TT);
PseudoLoss = zeros(1,TT);
for CLASSNUM = 30:2:30
ALLNUM = CLASSNUM * EACHNUM;
for DIMNUM = 50:50                                                
    % *****************初始化样本*******************************
    for i=1:CLASSNUM
        s{i}=strcat('s',int2str(i));
    end
    trainface=[];
    for i=1:CLASSNUM  %训练样本数据
        loadface=loadimages(strcat('D:\code\matlab\feret\face_for_train\',s{i},'\'), '', 'jpg');
        trainface=[trainface loadface];
        train_label((i-1)*EACHNUM+1:i*EACHNUM)=i;
    end
    testface=[];
    for i=1:CLASSNUM  %测试样本数据
        testface=[testface loadimages(strcat('D:\code\matlab\feret\face_for_test\',s{i},'\'), '', 'jpg')];
        test_label((i-1)*EACHNUM+1:i*EACHNUM)=i;
    end
    MASK = ones(size(trainface{1}));   %将二维图像矩阵转换为一维向量
    index = find(MASK);
    trainX = zeros(size(index,1),size(trainface,2));
    for i = 1:ALLNUM
    trainX(:,i) = trainface{i}(index)./256;
    end
    testX=zeros(size(index,1),size(testface,2));
    for i=1:size(testface,2),
        testX(:,i)=testface{i}(index)./256;
    end
    clear trainface testface;  %清除变量,释放内存
    %***********************初始化样本*************************************

    %*********对图像进行PCA降维处理,AdaBoost.M2是基于PCA降维后的数据的*****
%    fprintf(1,'begin PCA\n');
    trainY = PCA(trainX,trainX,DIMNUM);
    testY = PCA(testX,trainX,DIMNUM);
    clear trianX testX;
    yResult = zeros(1,ALLNUM);
%    fprintf(1,'begin test\n');
    %***********PCA降维*****************************************************
    
    %******************AdaBoost.M2的初始化*************************************
    
    DD = ones(TT,ALLNUM);  %样本的分布
    HH = zeros(ALLNUM,CLASSNUM,TT); %结果
    HHH = zeros(TT,CLASSNUM,ALLNUM);
    QQ = zeros(ALLNUM,CLASSNUM,TT); 
    WW = zeros(ALLNUM,CLASSNUM,TT); %权重
    result_label = zeros(1,ALLNUM);
    W = zeros(TT,ALLNUM);
    DD(1,:) = 1/ALLNUM;
    for temp =1:ALLNUM
        WW(temp,:,1) = DD(1,temp)/(CLASSNUM -1);
        WW(temp,train_label(temp),1) = 0;
    end
    
    for t = 1:TT  %boosting的次数
        W(t,:) = sum(WW(:,:,t),2)';
        for temp = 1:ALLNUM
            QQ(temp,:,t) = WW(temp,:,t)./W(t,temp);
        end
        DD(t,:) = W(t,:)./sum(W(t,:));  %归一化
        nRightCount = 0;
        for temp = 1:ALLNUM
            yClass = prm_distribution(trainY(:,temp),trainY,train_label,DD(t,:),CLASSNUM,EACHNUM);
            HH(temp,yClass,t) = 1;
            if yClass == train_label(temp)
                nRightCount = nRightCount + 1;
            end
        end  
        
        TrainError(t) = (ALLNUM-nRightCount)/ALLNUM;
        for test = 1:ALLNUM
            testYY = testY(:,test);
            yClass = prm_distribution(testYY,trainY,train_label,DD(t,:),CLASSNUM,EACHNUM);
            HHH(t,yClass,test) = 1;
        end
        pseudo_loss = 0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for temp = 1:ALLNUM %计算pseudo_loss
            incorrect_total = sum(QQ(temp,:,t).* HH(temp,:,t));  %QQ(temp,train_label(temp),t) =0
            pseudo_inc = DD(t,temp) * (1- HH(temp,train_label(temp),t) + incorrect_total);
            pseudo_loss = pseudo_loss + pseudo_inc;
        end  %计算pseudo_loss
        if pseudo_loss == 0 
            TT = t-1;
            break;
        end
        pseudo_loss = pseudo_loss/2;
        PseudoLoss(t) = pseudo_loss;
        bt = pseudo_loss/(1-pseudo_loss);
        for temp = 1:ALLNUM  %设置新的权重
            for tmp = 1:CLASSNUM
                temp_power = (1+ HH(temp,train_label(temp),t)  - HH(temp,tmp,t) )/2;
                WW(temp,tmp,t+1) = WW(temp,tmp,t) * (bt.^temp_power);
            end
        end%设置新的权重
        for test = 1:ALLNUM
            HHH(t,:,test) = HHH(t,:,test).*log(1/bt);
        end
        fprintf(1,'CLASSNUM = %d,t=%d,nRightCount=%d,pseudo_loss=%d,bt = %d\n',CLASSNUM,t,nRightCount,pseudo_loss,bt);
        fprintf(fp,'CLASSNUM = %d,t=%d,nRightCount=%d,pseudo_loss=%d,bt = %d\n',CLASSNUM,t,nRightCount,pseudo_loss,bt);
    end  
    %***AdaBoost*************************************************************************
    
    for t = 1:TT
        for test = 1:ALLNUM  %依据权重得到最终分类
            hfx = zeros(1,CLASSNUM);
            hfx = sum(HHH(1:t,:,test),1);
            [yValue,yClass] = max(hfx);
            yResult(1,test) = yClass;            
        end   
        %*******计算识别率***************
        nRightCount = 0;  
        for i = 1:ALLNUM
            if test_label(i) == yResult(1,i)
                nRightCount = nRightCount + 1;
            end
        end    
        CLASSRATE(CLASSNUM,DIMNUM,t) = nRightCount/ALLNUM;
        fprintf(1,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',t,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM,t));
        fprintf(fp,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',t,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM,t));
    end
    

%     [plValue,plIndex] = sort(PseudoLoss);
%     for  test = 1:ALLNUM
%         hfx = zeros(1,CLASSNUM);
%         for t=1:TT/2
%             hfx = hfx + HHH(plIndex(t),:,test);            
%         end
%          [yValue,yClass] = max(hfx);
%          yResult(1,test) = yClass;
%     end
%      %*******计算识别率***************
%      nRightCount = 0;  
%      for i = 1:ALLNUM
%         if test_label(i) == yResult(1,i)
%             nRightCount = nRightCount + 1;
%         end
%     end 
%     CLASSRATE(CLASSNUM,DIMNUM) = nRightCount/ALLNUM;
%     fprintf(1,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',TT,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM));
%     fprintf(fp,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',TT,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM));

end  %DIMNUM
end
save('m2_cr.mat','CLASSRATE');
fclose(fp);







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -