這篇主要是關(guān)于行人檢測的matlab程序,說明如下。
四種算法分別為svm+hog,svm+hog+lbp,adaboost+hog,adaboost+hog+ulbp+cn
每種算法都分別有兩個(gè).m文件究孕,一個(gè)為訓(xùn)練過程,一個(gè)為驗(yàn)證過程
以svm+hog為例:
svm_hog_train.m為訓(xùn)練程序
訓(xùn)練過程:
1.訓(xùn)練用樣本數(shù)為正樣本500個(gè)区转,負(fù)樣本500個(gè)
2.1000個(gè)樣本進(jìn)行隨機(jī)排序后函似,選擇75%即750作為訓(xùn)練樣本,250個(gè)作為驗(yàn)證樣本店乐。
3.采用matlab自帶的svmtrain進(jìn)行訓(xùn)練艰躺,考慮到新版本中可能沒有svmtrain和svmclassify,所以把相關(guān)文件也一并拷貝進(jìn)svm文件夾中
訓(xùn)練結(jié)束后眨八,
1.顯示auc,accuracy,confusion_matrix,FR,MR
2.隨機(jī)選擇一個(gè)圖片畫出其直方圖
3.畫出ROC曲線圖
4.保存訓(xùn)練模型svm_hog_struct.mat腺兴,用于測試
5.保存驗(yàn)證樣本的label矩陣,即svm_hog_label_test.mat
6.保存驗(yàn)證樣本的驗(yàn)證結(jié)果廉侧,即svm_hog_group
7.5和6保存結(jié)果用來畫四種算法的對比圖
預(yù)測過程:
1.選擇test_images中任意一張圖片作為測試圖片页响,這里的圖片中分有行人(1,2,5,6,7.png)和沒有行人(3,4.png)
2.執(zhí)行文件后,會(huì)顯示帶有檢測框的圖片
3.由于訓(xùn)練樣本數(shù)少段誊,特征未做pca闰蚕,未對被檢測圖片做預(yù)處理,檢測框的選擇及候選框的篩選未做進(jìn)一步完善枕扫,所以顯示的帶檢測框的圖片不夠準(zhǔn)確
生成ROC曲線:
執(zhí)行roc_of_4_algorithm.m即可陪腌,如果重新執(zhí)行,務(wù)必保證所有算法的訓(xùn)練過程驗(yàn)證樣本數(shù)相同烟瞧,我的是(500+500)*0.25=250
加載圖片并顯示預(yù)測結(jié)果的matlab GUI界面诗鸭。
下面一點(diǎn)點(diǎn)來說明:
首先是圖片裁剪,正樣本:
%將正樣本剪裁成64x128的圖片参滴,一共生成2416個(gè)負(fù)樣本
clear all;
clc;
file_train_pos_path='I:\INRIADATA\normalized_images\train\pos\';
img_train_pos_path_list=dir(strcat(file_train_pos_path,'*.png'))
for i = 1:length(img_train_pos_path_list)
img_name=img_train_pos_path_list(i).name;
image = imread(strcat(file_train_pos_path,img_name));
b = imcrop(image,[17,17,63,127]);
% imshow(image);
% imshow(b);
a=sprintf('%04d',i);
imwrite(b,strcat('I:\new\images\trains\pos_',num2str(a),'.png'),'png'); %關(guān)鍵是這句
end
負(fù)樣本:
%將負(fù)樣本進(jìn)行隨機(jī)剪裁出10個(gè)64x128的圖片强岸,因?yàn)橛衘pg和png兩種格式,分成兩次處理砾赔,一共生成12180個(gè)負(fù)樣本
clear all;
clc;
file_train_neg_path='I:\INRIADATA\normalized_images\train\neg\';
% img_train_neg_path_list=dir(strcat(file_train_neg_path,'*.jpg'));
img_train_neg_path_list=dir(strcat(file_train_neg_path,'*.png'))
% img_train_neg_path_list=[img_train_neg_path_list1 img_train_neg_path_list2]
for i = 1:length(img_train_neg_path_list)
img_name=img_train_neg_path_list(i).name;
image = imread(strcat(file_train_neg_path,img_name));
size_image=size(image);
edge_y=size(image,1);
edge_x=size(image,2);
for j = 1:10
rand1=randperm(edge_x-64,1);
rand2=randperm(edge_y-128,1);
b = imcrop(image,[rand1,rand2,63,127]);
% imshow(image);
% imshow(b);
a=sprintf('%04d%02d',i+306,j);
imwrite(b,strcat('I:\new\images\trains\neg\neg_',num2str(a),'.png'),'png'); %關(guān)鍵是這句
end
end
然后就是測試集圖片蝌箍。
本文提到的四種檢測方法設(shè)計(jì)到四種特征的提取,分別是HOG,LBP,ULBP,CN暴心,下面分別來看各個(gè)特征的提取方法:
hog特征:
function [feature] = hogcalculator(input_img)
%自己編寫的HOG特征提取函數(shù)
%灰度化妓盲,input_image的size為(64,128,3),而hog算法處理的是位深度為8的圖像专普,轉(zhuǎn)換公式為GRAY=a*RED+b*GREEN+c*BLUE
input_img=rgb2gray(input_img);
%顯示圖像悯衬,實(shí)際運(yùn)行過程中需要注釋
% imshow(input_img);
%得到灰度化之后圖像的尺寸,即64x128
[m n]=size(input_img);
%hog算法需要進(jìn)行Gamma歸一化,降低強(qiáng)光等影響
img=sqrt(double(input_img)); %伽馬校正
%下面是求邊緣
fy=[-1 0 1]; %定義豎直模板
fx=fy'; %定義水平模板
Iy=imfilter(img,fy,'replicate'); %豎直邊緣
Ix=imfilter(img,fx,'replicate'); %水平邊緣
Ied=sqrt(Ix.^2+Iy.^2); %邊緣強(qiáng)度
Iphase=Iy./Ix; %邊緣斜率檀夹,有些為inf,-inf,nan筋粗,其中nan需要再處理一下
%下面是求cell
step=8; %step*step個(gè)像素作為一個(gè)單元
orient=9; %方向直方圖的方向個(gè)數(shù)
jiao=360/orient; %每個(gè)方向包含的角度數(shù)
Cell=cell(1,1); %所有的角度直方圖,cell是可以動(dòng)態(tài)增加的策橘,所以先設(shè)了一個(gè)
ii=1;
jj=1;
for i=1:step:m %如果處理的m/step不是整數(shù),最好是i=1:step:m-step
ii=1;
for j=1:step:n %注釋同上
tmpx=Ix(i:i+step-1,j:j+step-1);
tmped=Ied(i:i+step-1,j:j+step-1);
tmped=tmped/sum(sum(tmped)); %局部邊緣強(qiáng)度歸一化
tmpphase=Iphase(i:i+step-1,j:j+step-1);
Hist=zeros(1,orient); %當(dāng)前step*step像素塊統(tǒng)計(jì)角度直方圖,就是cell
for p=1:step
for q=1:step
if isnan(tmpphase(p,q))==1 %0/0會(huì)得到nan娜亿,如果像素是nan丽已,重設(shè)為0
tmpphase(p,q)=0;
end
ang=atan(tmpphase(p,q)); %atan求的是[-90 90]度之間
ang=mod(ang*180/pi,360); %全部變正,-90變270
if tmpx(p,q)<0 %根據(jù)x方向確定真正的角度
if ang<90 %如果是第一象限
ang=ang+180; %移到第三象限
end
if ang>270 %如果是第四象限
ang=ang-180; %移到第二象限
end
end
ang=ang+0.0000001; %防止ang為0
Hist(ceil(ang/jiao))=Hist(ceil(ang/jiao))+tmped(p,q); %ceil向上取整买决,使用邊緣強(qiáng)度加權(quán)
end
end
Hist=Hist/sum(Hist); %方向直方圖歸一化
Cell{ii,jj}=Hist; %放入Cell中
ii=ii+1; %針對Cell的y坐標(biāo)循環(huán)變量
end
jj=jj+1; %針對Cell的x坐標(biāo)循環(huán)變量
end
size(Cell);
size(Hist);
%下面是求feature,2*2個(gè)cell合成一個(gè)block,沒有顯式的求block
[m n]=size(Cell);
feature=cell(1,(m-1)*(n-1));
for i=1:m-1
for j=1:n-1
f=[];
f=[f Cell{i,j}(:)' Cell{i,j+1}(:)' Cell{i+1,j}(:)' Cell{i+1,j+1}(:)'];
feature{(i-1)*(n-1)+j}=f;
end
end
%到此結(jié)束沛婴,feature即為所求
% 下面是為了顯示而寫的
% l=length(feature);
% f=[];
% for i=1:l
% f=[f;feature{i}(:)'];
% end
% figure
% hist(f)
未完待續(xù)...