很早之前就想写这个,自己研究了很久。
本人多年从事图像相关的FPGA工作,近几年接触了CNN,就想着在FPGA中实现CNN的加速,爱好使然。
要实现对CNN的加速,就必须了解CNN是怎么计算的。
考虑在FPGA中实现深度学习算法,需要matlab上用自己的写的代码实现算法的每一步。
1.编译matcaffe,编译matcaffe会遇到很多坑, 将caffemodel导入到matlab中;
2.将训练好的网络在matlab上测试,选择一个合适的网络来学习,最终选择了MTCNN,MTCNN输出结果很直观,bbox框和67个人脸特征点,由三个小网络组成Pnet,Rnet,Onet三个网络可以单独测试;用自家闺女照片测试如下:
3.用自己的代码替代caffe的测试过程,主要是要改写forward函数;
4.要改写forward函数,首先要将所有的参数导入到matlab中,要能够识别网络结构文件(prototxt),根据网络结构读取并保存数据;实现代码包括:
(1)caffemodel2mat.m
(2)isnum.m
(3)match_str.m
5.开始实现单个网络,Onet可以输出bbox框和67个人脸特征点,方便验证结果。需要保证实现的代码跟原来的运行结果一致;实现代码包括:
(1)cnnConvolve4D.m 卷积
(2)cnnPool4D.m 池化
(3)cnnrelu4D.m 激活函数relu
(4)cnnSoftMax4D.m 分类
(5)My_net_forward.m 关键函数调用整个卷积过程
基本实现了cnn的常规功能
6.Onet验证ok了,可以继续验证Rnet,结果跑不通。检查网络发现Rnet有一层卷积的步长为2,所以需要修改卷积的代码,添加步长设置,当步长大于1时调用cnn_my_conv2函数。
7.继续验证Pnet,又是出了好多小问题。Pnet可以输入任意尺寸的图像,之前的网络是按照方形图像设计的,所以就先用方形图像验证,验证ok。如下图所示,输入图片尺寸为500X500,调用原始代码耗时0.83s,全部用自己的代码耗时36.16s,自己写的代码的执行效率肯定大打折扣
8.优化卷积,使用im2col来加速,添加函数cnn_fast_conv4D,结果发现需要的时间更长了,完成上图500X500的图片需要时间接近4000s,这个时间在pc上完全不能接受,但为后续实现提供了加速方案。
9.修改 cnnConvolve4D和cnnPool4D允许输入图片的尺寸不是方形。
371132449@qq.com