目的:打算使用深度学习的方式实现人脸关键点的检测,第一步是要学习深度学习。
步骤:第一步在ufldl上面学习深度学习的算法基础知识,然后找博客上基于python调用theano库实现人脸关键点检测的算法,看懂后基于C++实现,然后用java实现app,调用C++实现的算法。
ufldl上的第一章是基于BP网络实现稀疏自编码器,在matlab上实现。
稀疏自编码器的实现:ufldl上已经给出了整体的框架,我们需要将三个地方补全。由于我对matlab各种函数不熟悉,所以采用的是参考别人实现的代码,然后去理解的方式,等到ufldl教程后面几课越来越熟悉,再自己来实现。
首先是补全sampleIMAGES.m中的代码,该代码从IMAGES.mat中随机提取8×8×10000张sample patches,用来做输入样本。
tic
image_size=size(IMAGES);
i=randi(image_size(1)-patchsize+1,1,numpatches); %产生1*10000个随机数 范围在[1,image_size(1)-patchsize+1]之间
j=randi(image_size(2)-patchsize+1,1,numpatches);
k=randi(image_size(3),1,numpatches); % 随机的选取图片 10000次
for num=1:numpatches
patches(:,num)=reshape(IMAGES(i(num):i(num)+patchsize-1,j(num):j(num)+patchsize-1,k(num)),1,patchsize*patchsize);
end
toc
说明:
tic和toc用来计时,返回tic-toc之间代码运行花费的时间;
IMAGES是512×512×10的数组,所以size(IMAGES)返回512 512 10的向量;
i=randi(512-8+1,1,10000),会返回一个1×10000的随机数组,数组中的元素属于(0,505],也就是[1,505];(ps:上面介绍randi函数说产生的是开区间,但是我试了发现并不是开区间,是可以取到505的,不过这里并没有什么影响,就不去纠结这一点了)
所以i j k都是1×10000的数组,元素大小位于1-505;
sample=IMAGES(i(num):i(num)+patchsize-1,j(num):j(num)+patchsize-1,k(num))
上面这句话采用全下标的方式访问3维数组IMAGES的元素,行从i(num)到i(num)+7,列从j(num)到j(num)+7,页选择k(num);
<