项目作者: JiangShaoYin

项目描述 :
Use C program language to do inference by file "*.pth" produced by deep neuron network.C语言实现VGG的前向传播
高级语言: C
项目地址: git://github.com/JiangShaoYin/DNN.git
创建时间: 2019-10-30T09:27:11Z
项目社区:https://github.com/JiangShaoYin/DNN

开源协议:

关键词:
c dnn

下载


C语言实现VGG的前向传播

background

已有”.pth”模型文件, 从模型中读取参数, 接收固定尺寸的人脸图片输入(224 * 224),利用模型, 计算照片中人的年纪。

网络backbone采用的VGG11,将最后一层的输出改成101,预测目标年龄的概率分布。

网络基础架构如下:

  1. layer 1
  2. (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  3. (1): ReLU(inplace=True)
  4. (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  5. layer 2
  6. (3): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  7. (4): ReLU(inplace=True)
  8. (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  9. layer 3
  10. (6): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  11. (7): ReLU(inplace=True)
  12. layer 4
  13. (8): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  14. (9): ReLU(inplace=True)
  15. (10): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  16. layer 5
  17. (11): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  18. (12): ReLU(inplace=True)
  19. layer 6
  20. (13): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  21. (14): ReLU(inplace=True)
  22. (15): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  23. layer 7
  24. (16): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  25. (17): ReLU(inplace=True)
  26. layer 8
  27. (18): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  28. (19): ReLU(inplace=True)
  29. (20): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  30. )
  31. fc1
  32. (linear0): Linear(in_features=25088, out_features=4096, bias=True)
  33. (relu0): ReLU(inplace=True)
  34. (dropout0): Dropout(p=0.5, inplace=False)
  35. fc2
  36. (linear1): Linear(in_features=4096, out_features=4096, bias=True)
  37. (relu1): ReLU(inplace=True)
  38. (dropout1): Dropout(p=0.5, inplace=False)
  39. fc3
  40. (last_linear): Linear(in_features=4096, out_features=101, bias=True)
  41. softmax()

输出目标年纪的101维向量后,用softmax计算年龄的概率分布,把概率当成权值p,总年龄为:

usage

在main.c文件中设置输入图片和是否保存网络参数。

  1. char* FILEPATH = "../face.jpg"; // 尚未完成resize功能,目前只能接受224*224*3的图片输入
  2. bool SAVE_FILE = FALSE; // 设置全局变量,控制是否保存网络参数,和中间层的feature map

pipeline

  • 在python里面将pth文件里面的每层参数打开,分别写入各自name命名的文件中(没有找到C语言下读取pytorch训练模型的API, 先用这种原始的方式读参数)。

  • 用c读文件,load到相应的conv矩阵中,开始前向传播。

  • 输出计算结果

example

模型在笔记本上训了1个epoch, 准确率较低, 着急做写C的forward过程,就没有再训练。测试图片的输出结果是49岁。

模型参数地址:
链接:https://pan.baidu.com/s/1AKx5M0kVDQWgBjE9VUmvlQ
提取码:ywsy
将parameters.rar在根目录下解压即可,如下图所示:

the end~