1.结构信息
net是ncnn的核心部分,起着组织整个框架结构的作用,捋顺net的结构,基本上对ncnn的代码框架也就有一个大概的了解了。首先看一下net的类结构信息。
class Net
{
public:
int usewinograd_convolution; //是否使用winograd进行卷积
int use_sgemm_convolution; //是否使用矩形乘法的形式进行卷积
int use_int8_inference; //是否使用int8进行推断
int use_vulkan_compute; //是否使用gpu
int load_param(FILE *fp); //从参数文件中读取网络结构
int load_model(FILE *fp); //从模型文件中读取模型参数
Extractor create_extractor(); //net中的另一个类Extractor
protected:
std::vector<Blob> blobs;//网络的所有blob,但是不包含blob的具体数据(nchw维数据)
std::vector<Layer*> layers;//网络的所有层指针
int forward_layer(int layer_index, std::vector<Mat> &blob_mats, Options &opt);
int find_blob_index_by_name(const char* name); //通过blob名字查找blobs里的index
int find_layer_index_by_name(const char *name); //通过layer名字确定layer的索引
}
class Extractor
{
public:
int Extractor::input(const char *blob_name, const Mat &in);
int Extractor::input(int blob_index, VkMat &feat, VkCompute &cmd);
int Extractor::extract(const char *blob_name, Mat &feat);
int Extractor::extract(blob_index, const Mat &feat);//次函数直接forward_layer()
private:
const Net *net;
std::vector<Mat> blob_mats; // 该结构体是blob的真正数据存放
Option opt;
}
2.forward_layer
- forwar_layer有两个主要输入参数,分别是layer_index和blob_mats
layer_index:要提取的blob的生产者
blob_mats:整个网络中所有blob的真正数据
首先根据layer_index找到对应layer,然后提取该layer的bottom_index和top_index,再根据bottom_index找到对应的blob,最后找到该blob的生产者,也就是上一层,进入递归调用。直到找到网络的第一层。 - 入栈过程工作是从后往前找:layer_index——>bottom_blob——>bottom.producer(layer_index)不断找当前层的前一层,终止条件是bottom_blob维度不等于0
- 出栈是从前往后一次执行layer的类成员函数
layer->forward(bottom_blob, top_blob,opt)
:第一层的的输入是数据,得到输出,再作为下一层的输入,依次出栈,bottom_blob_index和top_blob_index是在入栈时候确定好的。