1.算法描述
行人检测技术已经成为计算机视觉领域的关键研究方向。行人检测的最重要的任务就是对行人目标进行准确定位。行人检测技术有很强的使用价值,可以与多人跟踪、行人重识别等技术结合,应用于汽车无人驾驶系统、智能机器人、智能视频监控、人体行为分析、人流量统计系统、智能交通领域。
目前的行人检测任务主要为基于图像特征的方法。基于图像特征的方法,主要通过手动构造行人特征,如hog等,再结合svm、adaboost等分类器训练检测器来实现行人检测。在实际场景下,多个行人与摄像头之间的距离远近不一,摄像头捕获的图像中行人尺寸不同,而现有检测过程中的特征尺寸单一,无法覆盖所有的待检测行人尺寸,出现漏检情况,导致检测效果不佳。另外,在密集人群场景下,行人之间会出现重叠情况,检测出多个目标的候选区域框距离比较近时,在最终去掉重复任务的检测框时,容易误除,导致密集行人检测效果不佳。
支持向量机(support vector machines, SVM)是二分类算法,所谓二分类即把具有多个特性(属性)的数据分为两类,目前主流机器学习算法中,神经网络等其他机器学习模型已经能很好完成二分类、多分类,学习和研究SVM,理解SVM背后丰富算法知识,对以后研究其他算法大有裨益;在实现SVM过程中,会综合利用之前介绍的一维搜索、KKT条件、惩罚函数等相关知识。本篇首先通过详解SVM原理,后介绍如何利用python从零实现SVM算法。
实例中样本明显的分为两类,黑色实心点不妨为类别一,空心圆点可命名为类别二,在实际应用中会把类别数值化,比如类别一用1表示,类别二用-1表示,称数值化后的类别为标签。每个类别分别对应于标签1、还是-1表示没有硬性规定,可以根据自己喜好即可,需要注意的是,由于SVM算法标签也会参与数学运算,这里不能把类别标签设为0。
2.仿真效果预览
matlab2022a仿真结果如下:
第一步:读取图片视屏序列
function [n_frames,I3] = func_readvedio(folder,list);
n_frames = 0;
for i=1:length(list)
I = imread(fullfile(folder,list(i).name));
I2 = rgb2gray(uint8(I));
I3(:,:,i) = I2;
n_frames = n_frames + 1;
end
这样写可以专门用来读取连续编号的图片序列作为视屏。
第二步:提取背景
对应的代码如下所示:
//以上就是求解图像的差分
CDM(1:rows,1:cols,2:frames) = d(1:rows,1:cols,2:frames);
CDM(abs(CDM) < T)=0;
CDM(abs(CDM) >= T)=255;
//求CDM值
m=0;
for i=1:rows
for j=1:cols
for k=2:frames
if CDM(i,j,k) == 0
m(k)=1;
end
if CDM(i,j,k) == 255
m(k)=rand(1);
end
end
position(i,j) = func_position(m);
end
end
//获得背景
第三步:当前图片与背景的差
function images2 = func_subbackground(image,back,frames,T2);
rows = size(image,1);
cols = size(image,2);
for k=1:frames
images(1:rows,1:cols,k) = back(1:rows,1:cols)-image(1:rows,1:cols,k);
images2(1:rows,1:cols,k) = im2bw(images(1:rows,1:cols,k),T2);
end
这里求解差,并将得到的结果求二值图
第四步:形态学处理
rows = size(image,1);
cols = size(image,2);
for k=1:frames
images3(1:rows,1:cols,k)=bwareaopen(image(1:rows,1:cols,k),10);
end
这里我们主要将视屏中的个别噪点去掉使画面更加’干净’;
第五步:边缘检测
function images = func_edgecheck(image,frames);
rows = size(image,1);
cols = size(image,2);
for k = 1:frames
for i=2:rows
for j=2:cols
if image(i,j,k)==1 &&(image(i+1,j,k)==0||image(i-1,j,k)==0||image(i,j+1,k)==0||image(i,j-1,k)==0)
images(i,j,k)=255;
else
images(i,j,k)=0;
end
end
end
end
普通边间求解法
统计人员像素并分析出对应的密集度。
3.MATLAB核心程序
folder = 'Vedio\02\'; list = dir('Vedio\02\*.jpg'); level = 60; level2 = 0.25; level3 = 8000;%用来区分低密度还是中高密度的门限值 level4 = 1200; flag = 0;%1:低密度,0:高密度 density = 1;%定义一个密度变量,记录不同时刻的密度变化 %step1:读取图片序列 [n_frames,I3] = func_readvedio(folder,list); %step2:提取背景 back3 = func_getbackground(I3,n_frames,level); rows = size(I3,1); cols = size(I3,2); clear folder list; %由于是基于视屏的,所以下面采用一个循环的处理方法进行处理,每次只处理一个图片 for k = 1:n_frames%下面的处理都是基于逐帧的 disp('当前帧数');k %step3:背景差 images2(1:rows,1:cols,k) = func_subbackground(I3(1:rows,1:cols,k),back3,level2); %step4:形态学处理 images3(1:rows,1:cols,k) = func_Xintai(images2(1:rows,1:cols,k)); %step5:统计前景像素数目 Num(k) = func_pixel(images3(1:rows,1:cols,k)); %低密度 %低密度 %低密度 %低密度 if Num(k) < level3%说明是低密度 flag = 1; %step6:边缘检测 images4(1:rows,1:cols,k) = func_edgecheck(images3(1:rows,1:cols,k)); %step7:统计前景边缘像素数目 Num2(k) = func_pixel(images4(1:rows,1:cols,k)); if Num2(k) <level4 disp('人口密度很低,密度等级:1'); density(k) = 1; else disp('人口密度低 ,密度等级:2'); density(k) = 2; end end %高密度 %高密度 %高密度 %高密度 if Num(k) > level3%说明是中高密度 flag = 0; %人群密度特征提取 d=1; [Energy8_0(k),Contrast8_0(k),Correlation8_0(k),Homogeneity8_0(k)] = func_different_L_features(images3(1:rows,1:cols,k),k,d); level = 8; %选取0度和90度的作为训练数据 [train1_data_0,train1_data_90,train2_data_0,train2_data_90,test_data_0,test_data_90]=func_loaddata(level); %high_low = 1; %中密度分类值 %high_low = -1;%高密度分类值 %输出结果为error=1,说明不是该类;输出为0,说明属于某类型 %0度数据的训练 [error01,Output01] = func_classifer(train1_data_0,train2_data_0,test_data_0,1); [error02,Output02] = func_classifer(train1_data_0,train2_data_0,test_data_0,-1); %90度数据的训练 %[error901,Output901] = func_classifer(train1_data_90,train2_data_90,test_data_90,1); %[error902,Output902] = func_classifer(train1_data_90,train2_data_90,test_data_90,-1); if error01 == 0 & error02 == 1 disp('人口密度高 ,密度等级:4'); density(k) = 4; end if error01 == 1 & error02 == 0 disp('人口密度中 ,密度等级:3'); density(k) = 3; end end figure(1); imshow(I3(1:rows,1:cols,k)); title(['人口密度等级',num2str(density(k))]); drawnow end if flag == 1 figure; %1随帧数变化前景像素数变化曲线 subplot(211);plot(Num,'b-*');title('随帧数变化前景像素数变化曲线'); %3前景人数与人数的拟合曲线 %曲线拟合 xdata1=1:length(Num); a1=polyfit(xdata1,Num,1); y1=polyval(a1,xdata1); %人数曲线拟合 x1=1:8; y1=5*a1(1)*x1+a1(2); subplot(212);plot(y1,x1,'r-*'); title('前景人数与人数的拟合曲线'); end
标签:SVM,end,image,cols,rows,matlab,func,密集度,data From: https://www.cnblogs.com/51matlab/p/17304165.html