项目代码matlab
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 % 可调参数 3 4 test_path=''; 5 neighbour_pixels_affect=3; 6 target_digit=2; 7 % forestTrain()参数设置 8 % .M - [1] number of trees to train 9 % .H - [max(hs)] number of classes 10 % .N1 - [5*N/M] number of data points for training each tree 11 % .F1 - [sqrt(F)] number features to sample for each node split 12 % .split - ['gini'] options include 'gini', 'entropy' and 'twoing' 13 % .minCount - [1] minimum number of data points to allow split 14 % .minChild - [1] minimum number of data points allowed at child nodes 15 % .maxDepth - [64] maximum depth of tree 16 % .dWts - [] weights used for sampling and weighing each data point 17 % .fWts - [] weights used for sampling features 18 % .discretize - [] optional function mapping structured to class labels 19 % format: [hsClass,hBest] = discretize(hsStructured,H); 20 varargin.M=1000; 21 %varargin.H=10; 22 23 % forestApply()的输入设置 24 % data - [NxF] N length F feature vectors 25 % forest - learned forest classification model 26 % maxDepth - [] maximum depth of tree 27 % minCount - [] minimum number of data points to allow split 28 % best - [0] if true use single best prediction per tree 29 30 % forestApply()输出结果及对比的阀值 31 % hs - [Nx1] predicted output labels 32 % ps - [NxH] predicted output label probabilities 33 ps_val_more_than0_3=0.2; 34 35 %滑窗检测,窗口尺度,步长 36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 37 38 data=[]; 39 label=[]; 40 temp_r1=0; 41 temp_c1=0; 42 43 for i_digit=0:9 44 % if(i_digit==target_digit) %%%%%%%%%%%%%%%%%%%%%% 45 % this_image_label=1; 46 % end 47 %数字转字符 48 str=num2str(i); %%数据是不是不平衡 49 path_temp=strcat('C:\Users\cong\Desktop\研一实战\项目\图像中时间数字识别\trainingSample\num',str,'\'); 50 file=dir(path_temp); 51 for i=3:length(file) 52 path= strcat(path_temp,file(i).name); 53 54 %%%%%%%%%%%%%%%%%%%%%%%%%% 55 % 加载图片 56 %%%%%%%%%%%%%%%%%%%%%%%%%% 57 I=imread(path); 58 %I=imread('E:/WeChat.jpg'); 59 %%%%%%%%%%%%%%%%%%%%%%%%%% 60 % 提取channel features 61 %%%%%%%%%%%%%%%%%%%%%%%%%% 62 [all_channel_difference_features,temp_r1,temp_c1]=extract_features(I,1); 63 data=[data,all_channel_difference_features]; 64 label=[label;i_digit+1]; 65 66 % if(i>100 && this_image_label~=1) %%这里只取了前100帧,实际上可以随意抽取一百张 67 % break; 68 % end 69 end % for i=3:length(file) 70 71 end % for i_digit=0:9 72 73 %%%%%%%%%%%%%%%%%%%%%%%%%% 74 % 扔进分类器中,训练 75 %%%%%%%%%%%%%%%%%%%%%%%%%% 76 77 forest = forestTrain( data, label, varargin ); 78 79 %%%%%%%%%%%%%%%%%%%%%%%%%% 80 % 检测,测试 81 test_image=imread(test_path); 82 %滑窗检测,窗口尺度,步长 83 [test_r,test_c,test_z]=size(test_image); 84 for i_test=1:test_r 85 %model 86 87 %resize 88 test_image=imresize(model,temp_r1,temp_c1); 89 test_data=extract_features(test_image,1); 90 [hs,ps] = forestApply( test_data, forest, [], [], [] );%尺度问题 91 if(ps>ps_val_more_than0_3) 92 %画框 93 94 end 95 end 96 97 %%%%%%%%%%%%%%%%%%%%%%%%%%
1 function [ all_channel_difference_features,,r1,c1 ] = extract_features( I,shrink_or_not ) 2 %EXTRACT_FEATURES 此处显示有关此函数的摘要 3 % 此处显示详细说明 4 %%%%%%%%%%%%%%%%%%%%%%%%%% 5 % 提取channel features 6 %%%%%%%%%%%%%%%%%%%%%%%%%% 7 % 参数设置 8 if(shrink_or_not==1) 9 pChns.shrink=4; 10 end 11 12 pChns.pColor.enabled=1; 13 pChns.pColor.smooth=1; 14 pChns.pColor.colorSpace='luv'; 15 16 pChns.pGradMag.enabled=1; 17 pChns.pGradMag.colorChn=0; 18 pChns.pGradMag.normRad=5; 19 pChns.pGradMag.normConst=.005; 20 pChns.pGradMag.full=0; 21 22 pChns.pGradHist.enabled=1; 23 %pChns.pGradHist.binSize= 24 pChns.pGradHist.nOrients=6; 25 pChns.pGradHist.softBin=0; 26 pChns.pGradHist.useHog=0; 27 pChns.pGradHist.clipHog=.2; 28 29 %pChns.pCustom.** 30 31 %pChns.complete= 32 33 % 提取channel features 34 chns = chnsCompute( I, pChns ); 35 % 将各个通道放在矩阵中 36 [r1,c1,ch1]=size(chns.data{1}); 37 [r2,c2,ch2]=size(chns.data{2}); 38 [r3,c3,ch3]=size(chns.data{3}); 39 ch=ch1+ch2+ch3; 40 all_channel=zeros(r1,c1,ch); 41 all_channel(:,:,1:ch1)=chns.data{1}; 42 all_channel(:,:,ch1+1:ch1+ch2)=chns.data{2}; 43 all_channel(:,:,ch1+ch2+1:ch)=chns.data{3}; 44 %%%%%%%%%%%%%%%%%%%%%%%%%% 45 % pooling 46 %%%%%%%%%%%%%%%%%%%%%%%%%% 47 for ii=1:ch 48 %向下采样 49 all_pooling(:,:,ii)=imresize(all_channel(:,:,ii),0.2); 50 end 51 52 %%%%%%%%%%%%%%%%%%%%%%%%%% 53 % 再次做相减特征 54 %%%%%%%%%%%%%%%%%%%%%%%%%% 55 all_channel_difference_features=[]; 56 for ij=1:ch 57 temp=difference_features( all_pooling(:,:,ij),neighbour_pixels_affect ); 58 all_channel_difference_features = [all_channel_difference_features;temp]; 59 end 60 61 end
1 function [ one_channel_difference_features ] = difference_features( one_channel_features,neighbour_pixels_affect ) 2 %DIFFERENCE_FEATURES 计算邻域内个特征之间两两相减 3 %input: 4 % one_channel_features 5 %neighbour_pixels_affect 6 %output: 7 %one_channel_difference_features 8 9 [r,c]=size(one_channel_features); 10 11 one_channel_difference_features=[]; 12 for i=1:r-neighbour_pixels_affect+1 13 for j=1:c-neighbour_pixels_affect+1 14 local_features=one_channel_features(i:i+neighbour_pixels_affect-1,j:j+neighbour_pixels_affect-1); 15 temp=local_feature_compute(local_features); 16 one_channel_difference_features=[one_channel_difference_features;temp];%特征拼接 17 end 18 end 19 end 20 21 function [ local_differece_feature ]=local_feature_compute( local_features ) 22 [r,c]=size(local_features); 23 result_mat=local_features-local_features(1,1).*ones(r,c); 24 result_vector=reshape(result_mat,r*c,1); 25 local_differece_feature=result_vector(2:r*c,1);%把第一个特征去掉,自己减自己没有任何特征信息可言 26 end
%{ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 可调参数 test_path='C:\Users\cong\Desktop\研一实战\项目\图像中时间数字识别\OCR\one\3.jpg'; neighbour_pixels_affect=3; target_digit=2; % forestTrain()参数设置 % .M - [1] number of trees to train % .H - [max(hs)] number of classes % .N1 - [5*N/M] number of data points for training each tree % .F1 - [sqrt(F)] number features to sample for each node split % .split - ['gini'] options include 'gini', 'entropy' and 'twoing' % .minCount - [1] minimum number of data points to allow split % .minChild - [1] minimum number of data points allowed at child nodes % .maxDepth - [64] maximum depth of tree % .dWts - [] weights used for sampling and weighing each data point % .fWts - [] weights used for sampling features % .discretize - [] optional function mapping structured to class labels % format: [hsClass,hBest] = discretize(hsStructured,H); varargin.M=1000; %varargin.H=10; % forestApply()的输入设置 % data - [NxF] N length F feature vectors % forest - learned forest classification model % maxDepth - [] maximum depth of tree % minCount - [] minimum number of data points to allow split % best - [0] if true use single best prediction per tree % forestApply()输出结果及对比的阀值 % hs - [Nx1] predicted output labels % ps - [NxH] predicted output label probabilities ps_val_more_than0_3=0.2; %滑窗检测,窗口尺度,步长 win_h=20; win_w=20; step=1; disp('参数配置成功...'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% disp('正在读入图片及特征提取...'); %读入图片及特征提取 data=[]; label=[]; temp_r1=0; temp_c1=0; for i_digit=0:9 % if(i_digit==target_digit) %%%%%%%%%%%%%%%%%%%%%% % this_image_label=1; % end %数字转字符 str=num2str(i_digit); %%数据是不是不平衡 path_temp=strcat('C:\Users\cong\Desktop\研一实战\项目\图像中时间数字识别\trainingSample\num',str,'\'); file=dir(path_temp); for i=3:length(file) path= strcat(path_temp,file(i).name); %%%%%%%%%%%%%%%%%%%%%%%%%% % 加载图片 %%%%%%%%%%%%%%%%%%%%%%%%%% I=imread(path); %I=imread('E:/WeChat.jpg'); %%%%%%%%%%%%%%%%%%%%%%%%%% % 提取channel features %%%%%%%%%%%%%%%%%%%%%%%%%% [all_channel_difference_features,temp_r1,temp_c1]=extract_features(I,neighbour_pixels_affect,1); data=[data,all_channel_difference_features]; label=[label;i_digit+1]; if(rem(i,100)==0) disp('...'); end end % for i=3:length(file) disp('数字') i_digit disp('的特征提取完毕...'); end % for i_digit=0:9 disp('读入图片及特征提取完毕...'); %%%%%%%%%%%%%%%%%%%%%%%%%% % 扔进分类器中,训练 %%%%%%%%%%%%%%%%%%%%%%%%%% data=data'; disp('正在训练,请稍等...'); forest = forestTrain( data, label, varargin ); disp('训练完毕...'); %} %%%%%%%%%%%%%%%%%%%%%%%%%% % 检测,测试 test_label=[]; test_label_p=[]; win_h=40; win_w=30; windSize = [30,40]; step=2; ps_val_more_than0_3=0.07; disp('正在检测...'); test_image=imread(test_path); %滑窗检测,窗口尺度,步长 [test_r,test_c,test_z]=size(test_image); figure; imshow(test_image); hold on for i_test=1:step:test_r-win_h+1 for j_test=1:step:test_c-win_w+1 %model model=test_image(i_test:i_test+win_h-1,j_test:j_test+win_w-1,:); %resize test_image_rs=imresize(model,[temp_r1 temp_c1]); test_data=extract_features(test_image_rs,neighbour_pixels_affect,0); test_data=test_data'; test_data=single(test_data); [hs,ps] = forestApply( test_data, forest,0,0,1);%尺度问题 test_label=[test_label,hs]; test_label_p=[test_label_p,ps(hs)]; if(ps>ps_val_more_than0_3) %画框 %draw_rect(test_image,); i_test j_test rectangle('Position',[i_test,j_test,20,20],'LineWidth',4,'EdgeColor','r'); %pointAll = [i_test,j_test]; %[state,results]=draw_rect(test_image,pointAll,windSize); hold on end end hold on end disp('检测完毕!恭喜恭喜!') %%%%%%%%%%%%%%%%%%%%%%%%%%