caffe源码中的classification.cpp解析
在caffe源码中有一个example文件夹,在example目录下有一个cpp_classification的文件夹,打开它,有一个名为classification的cpp文件,这就是caffe提供给我们的调用分类网络进行前向计算,得到分类结果的接口
1、首先观察Classifier类的构造函数
其主要作用是对操作网络进行前传得到分类结果的类对象进行初始化和一些check
比如检验是否只输入一张图像,检验模型输出结果的blob中的N是否为1
检验输入图像的通道数是否为3或者1
检验网络最后输出的通道数是否等于标签文档中定义的标签的数目
1)首先是设置caffe的cpu或gpu工作模式
2)读取网络结构
3)获取网络规定的单张输入图片的尺寸(宽与高)
4)读取数据集的均值文件
该函数的主要作用是将均值文件(通常是binaryproto格式)读入proto中,再由FromProto函数将proto中的均值文件读取到blob中
在该函数中,检验了均值blob的通道数是否等于输入图像的通道数,假如输入图像是三通道的,那么RGB通道对应各自的均值
2、进行网络前传得到分类结果的Classify函数
N默认参数是5,该函数接受单张图片,并得到概率最大的前N类结果,其中的Predict函数特别重要
该函数进行网络的前传,如果网络使用softmax分类器,则返回网络输入对应于每一个类别的概率,这些概率存储在一个vector中
假如分类网络中分类器采用softmax分类(10类),那么输出blob就有10个通道,每个通道的长宽都是1,这10个数表征输入属于10类中每一类的概率,这10个数之和应该为1.
其中,Predict函数在将输入图像的各个通道放入网格的输入blob中时,caffe是在WrapInputLayer函数中先将网络的输入blob与一个vector<Mat>* input_channels关联起来,再在Preprocess函数中将输入图像逐通道防区input_channels中,此时,输入图像就被写入到输入blob中。
参考自https://blog.****.net/jiongnima/article/details/70197866
其中还有一个测试该cpp文件的例子,这个例子原作者说明了初始化检测对象相当耗时,所以要将检测程序做成一个独立的.so文件。