写在前面
最近正好在做一个基于ZYNQ的人脸识别项目,所以就打算先用PS端做一个C语言的卷积神经网络,结果去网上搜,C语言神经网络的资料有很多,但是好多都不是很好部署,讲解的也不太详细。最后实在没办法,想趁着这个假期没事干,重复造一遍轮子,自己手搓一遍C语言卷积神经网络,也算是加深理解,打发假期时光了。
由于本人是微电子专业,所以代码规范性,代码风格可能比计算机科班出身的同学差很多,也请大家见谅。大家作为参考就好,也非常欢迎计算机专业的同学在我的这个基础上做改进。
我总共编写了3个工程,分别是1)PC端使用malloc动态数组的手写数字识别,2)用于嵌入式设备部署的使用静态数组的手写数字识别,3)以及用于嵌入式设备部署的使用静态数组的人脸识别。这三个工程我都把全部工程上传到gitcode上开源了,供大家参考~
代码开源地址
我把3个工程代码开源在GitCode了,链接在下面,大家自取
还有Gitee代码链接:
C语言卷积神经网络_无训练仅用于嵌入式部署: 我自己使用C语言卷积神经网络,注意:无训练仅用于嵌入式部署https://gitee.com/zhao15947470421/C_CNN.git
上面这个链接我同学测试了一下,可能打不开,我还上传了百度网盘,地址在下面
链接:https://pan.baidu.com/s/1Nb2OU4yLefUBnJ9IZx-G9A?pwd=zh66
提取码:zh66
代码简介
首先,我先说几点这个代码的注意点:
- 本程序的各个神经网络函数以及参数是以pytorch框架作为参考的,所以例如卷积层中的参数in_channels表示输入的数据通道数,参考pytorch函数即可。
- 卷积函数Conv和池化函数MaxPool没有padding功能,padding直接设置为0即可
- 本程序只做部署推理,没有训练
- 所有的权重和偏置以及输入数据均在头文件中
- 本程序是在VS2022软件下编写,其他的环境可能各个文件的引用会有问题
- 本程序现有历程是一个LeNet-5网络做手写数字识别以及一个aceNet人脸识别
- 本程序在VS2022中直接点击调试按钮或者按F5即可运行
压缩包里面只包括了代码,需要自己新建一个VS工程,然后添加这些代码,下面说一下这些文件的作用:
- data_define.h是输入的数据以及每一层神经网络大小的定义头文件,
- weignt_and_bias_layerx.h就是第x层网络的权重和参数数据头文件,
- Conv.c, MaxPool.c这些就是卷积,池化层的c文件,每一个函数都有一个对应的.h头文件,
- 主函数就在main.c中,
- LeNet.ipynb就是这个网络训练的pytorch代码,
- 最后还有4个txt文件就是原始的输入数据。
实例讲解具体使用方法
我感觉还是通过一个具体的实例,一步一步教大家怎么使用这个代码比较好。
步骤1 首先通过pytorch等框架训练好一个神经网络
第一步就是通过pytorch或者tensorflow等框架训练好一个神经网络,然后将神经网络的结构和参数打印出来,就像下面这样:
这里我推荐使用pytorch的一个tor