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

📄 adaboostm2.asv

📁 这是用matlab编写人脸检测软件
💻 ASV
字号:
%*************************************************************************
%  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 = 300; %boosting的次数
CLASSNUM = 10;
fp = fopen('result.txt','w');
CLASSRATE = zeros(58,50);
PseudoLoss = zeros(1,TT);
TrainError = zeros(1,TT);
for CLASSNUM = 15:5:15
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) = (nRightCount)
        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) = nRightCount/ALLNUM;
%         fprintf(1,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',t,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM));
%         fprintf(fp,'t=%d,DIM= %d,RightCount=%d,RightRatio=%d\n',t,DIMNUM,nRightCount,CLASSRATE(CLASSNUM,DIMNUM));
%     end
    

    [plValue,plIndex] = sort(PseudoLoss);
    for  test = 1:ALLNUM
        hfx = zeros(1,CLASSNUM);
        for t=1:50
            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 + -