![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ncnn
文章平均质量分 81
阅读腾讯的推理框架---ncnn,跟随知乎大佬嘻嘻嘻的阅读方法来逐步深入。
Dynamicw
菜鸟起飞
展开
-
ncnn源码阅读(五)----算子注册机制
在使用时,将算子的对象指针转为父类的指针进行调用,这个地方使用的是多态的特性。从上面可以看出,只要我们将每个算子都对上述的结构体赋值即可,单以往对结构的赋值都是在代码中实现的,也就是在运行期才会赋值成功。通过上述的代码,可以实现通过一个头文件,对结构体的数组进行赋值,并通过sizeof得到数组的长度。然后根据每个算子中都存在上述的函数,那可以将每个算子的名字和对应算子中的函数的函数指针关联起来。在ncnn就是通过头文件的方式来初始化结构体数组,而头文件,则是在编译期生成,不是提前添加好的。原创 2023-08-02 14:49:03 · 554 阅读 · 0 评论 -
ncnn源码阅读(四)----模型推理过程
为了减少计算量,并不需要推理完成所有的网络,只要计算到当前需要的blob的那一层即可,所以在前向计算的时候,需要知道网络中目标层的索引,以及运行的模式。在Extractor类中的blob_mats是这个类共享的,而Net类中的blob是数据节点。blob_mats中存储的是每个数据节点的具体数值,与Net类中的blob依次对应。上述分支中表达的意思是:根据blob名字得到索引,然后根据索引在blob_mats获取的数据是无效数据,所以需要进行网络的前向计算得到当前blob数据节点的具体数据。原创 2023-08-01 15:34:08 · 437 阅读 · 0 评论 -
ncnn源码阅读(三)----数据结构Mat
在ncnn中的数据结构是Mat,类似于OpenCV中的Mat,但又增加了一些属于它本身的一些特性,在这个部分学习一下ncnn的Mat。上面的三个构造函数内部,都会调用到create函数,而在create内部又会调用release函数,这是因为create的调用者不局限在构造函数中,其它的调用在后面再细说。先将原始指针偏移一个指针大小,然后再做内存对齐,偏移的一个指针大小用来存储原始指针。实现:一段堆空间存储引用计数,当发生拷贝时,引用计数加1,销毁的时候,引用计数减1,如果引用计数为0,则释放资源。原创 2023-07-11 16:41:42 · 841 阅读 · 0 评论 -
ncnn源码阅读(二)----网络模型结构和权重参数的加载
ncnn推理框架中把模型的结构和权重参数分为两个文件进行存储,实现了结构和权重的分离。在xxx.param中存储了模型的结构信息,在xxx.bin中存储了模型的权重信息。xxx.param的文件结构如下:layer:描述网络一共有多少层,例如:ReLU、Conv 都叫一个layer;blob:表示数据节点,例如一个Conv就有一个输入blob和输出blob;bottom_count:当前层接收输入blob的层个数top_count:将当前层的输出作为输入blob的层个数。原创 2023-07-06 16:45:09 · 844 阅读 · 0 评论 -
ncnn源码阅读(一)----阅读方法和参考教程
目前我的工作涉及推理框架较多,所以就想阅读一些他人的开源框架,来提升自己在语言层面和框架层面的认知。这个过程中发现了一些比较好的教程,我的阅读ncnn源码之旅将参考。原创 2023-06-25 19:46:37 · 480 阅读 · 0 评论