当前位置:   article > 正文

基于Openpose框架的人脸关键点heatmaps预测模型设计、训练_heatmap openpose

heatmap openpose

    众所周知,人脸识别中有一项重要的任务-人脸关键点预测,通过这个环节对齐,才能进行人脸识别,提高人脸识别的准确率。另外,一些活体检测/人脸状态分析也需要利用该方案进行实现。

    经典的人脸检测模型MTCNN中具有人脸关键点的预测功能,但其关键预测精度比较差,对于大角度、模糊、遮挡、小尺度等情况的人脸效果下降更加严重。因此我结合openpose的关键点预测模型,自行设计了如下的人脸关键点热图预测模型,经过验证可以很好的实现人脸关键点预测的效果。

训练网络设计

    由于经典的openpose框架中heatmaps的热图有6个stage进行预测和中间监督,但我按照原始的框架发现到达后面几个stage后,loss基本和前面的stage一致,但多个stage对模型的速度会有影响,因此设计了3个stage和4个stage的版本,这里主要介绍4个stage的版本。

利用netscope可以将设计的网络可视化如下(如果看不清,可以利用我下面提供的proto内容自行验证):

所设计的网络proto文件内容如下:

  1. name: "landmarks-net"
  2. input: "data"
  3. input_shape {
  4. dim: 1
  5. dim: 3
  6. dim: 112
  7. dim: 112
  8. }
  9. layer {
  10. name: "conv1_1"
  11. type: "Convolution"
  12. bottom: "data"
  13. top: "conv1_1"
  14. param {
  15. lr_mult: 1.0
  16. decay_mult: 1
  17. }
  18. param {
  19. lr_mult: 2.0
  20. decay_mult: 0
  21. }
  22. convolution_param {
  23. num_output: 64
  24. pad: 1
  25. kernel_size: 3
  26. weight_filler {
  27. type: "gaussian"
  28. std: 0.01
  29. }
  30. bias_filler {
  31. type: "constant"
  32. }
  33. }
  34. }
  35. layer {
  36. name: "relu1_1"
  37. type: "ReLU"
  38. bottom: "conv1_1"
  39. top: "conv1_1"
  40. }
  41. layer {
  42. name: "conv1_2"
  43. type: "Convolution"
  44. bottom: "conv1_1"
  45. top: "conv1_2"
  46. param {
  47. lr_mult: 1.0
  48. decay_mult: 1
  49. }
  50. param {
  51. lr_mult: 2.0
  52. decay_mult: 0
  53. }
  54. convolution_param {
  55. num_output: 64
  56. pad: 1
  57. kernel_size: 3
  58. weight_filler {
  59. type: "gaussian"
  60. std: 0.01
  61. }
  62. bias_filler {
  63. type: "constant"
  64. }
  65. }
  66. }
  67. layer {
  68. name: "relu1_2"
  69. type: "ReLU"
  70. bottom: "conv1_2"
  71. top: "conv1_2"
  72. }
  73. layer {
  74. name: "pool1_stage1"
  75. type: "Pooling"
  76. bottom: "conv1_2"
  77. top: "pool1_stage1"
  78. pooling_param {
  79. pool: MAX
  80. kernel_size: 2
  81. stride: 2
  82. }
  83. }
  84. layer {
  85. name: "conv2_1"
  86. type: "Convolution"
  87. bottom: "pool1_stage1"
  88. top: "conv2_1"
  89. param {
  90. lr_mult: 1.0
  91. decay_mult: 1
  92. }
  93. param {
  94. lr_mult: 2.0
  95. decay_mult: 0
  96. }
  97. convolution_param {
  98. num_output: 128
  99. pad: 1
  100. kernel_size: 3
  101. weight_filler {
  102. type: "gaussian"
  103. std: 0.01
  104. }
  105. bias_filler {
  106. type: "constant"
  107. }
  108. }
  109. }
  110. layer {
  111. name: "relu2_1"
  112. type: "ReLU"
  113. bottom: "conv2_1"
  114. top: "conv2_1"
  115. }
  116. layer {
  117. name: "conv2_2"
  118. type: "Convolution"
  119. bottom: "conv2_1"
  120. top: "conv2_2"
  121. param {
  122. lr_mult: 1.0
  123. decay_mult: 1
  124. }
  125. param {
  126. lr_mult: 2.0
  127. decay_mult: 0
  128. }
  129. convolution_param {
  130. num_output: 128
  131. pad: 1
  132. kernel_size: 3
  133. weight_filler {
  134. type: "gaussian"
  135. std: 0.01
  136. }
  137. bias_filler {
  138. type: "constant"
  139. }
  140. }
  141. }
  142. layer {
  143. name: "relu2_2"
  144. type: "ReLU"
  145. bottom: "conv2_2"
  146. top: "conv2_2"
  147. }
  148. layer {
  149. name: "pool2_stage1"
  150. type: "Pooling"
  151. bottom: "conv2_2"
  152. top: "pool2_stage1"
  153. pooling_param {
  154. pool: MAX
  155. kernel_size: 2
  156. stride: 2
  157. }
  158. }
  159. layer {
  160. name: "conv3_1"
  161. type: "Convolution"
  162. bottom: "pool2_stage1"
  163. top: "conv3_1"
  164. param {
  165. lr_mult: 1.0
  166. decay_mult: 1
  167. }
  168. param {
  169. lr_mult: 2.0
  170. decay_mult: 0
  171. }
  172. convolution_param {
  173. num_output: 256
  174. pad: 1
  175. kernel_size: 3
  176. weight_filler {
  177. type: "gaussian"
  178. std: 0.01
  179. }
  180. bias_filler {
  181. type: "constant"
  182. }
  183. }
  184. }
  185. layer {
  186. name: "relu3_1"
  187. type: "ReLU"
  188. bottom: "conv3_1"
  189. top: "conv3_1"
  190. }
  191. layer {
  192. name: "conv3_2"
  193. type: "Convolution"
  194. bottom: "conv3_1"
  195. top: "conv3_2"
  196. param {
  197. lr_mult: 1.0
  198. decay_mult: 1
  199. }
  200. param {
  201. lr_mult: 2.0
  202. decay_mult: 0
  203. }
  204. convolution_param {
  205. num_output: 256
  206. pad: 1
  207. kernel_size: 3
  208. weight_filler {
  209. type: "gaussian"
  210. std: 0.01
  211. }
  212. bias_filler {
  213. type: "constant"
  214. }
  215. }
  216. }
  217. layer {
  218. name: "relu3_2"
  219. type: "ReLU"
  220. bottom: "conv3_2"
  221. top: "conv3_2"
  222. }
  223. layer {
  224. name: "conv3_3"
  225. type: "Convolution"
  226. bottom: "conv3_2"
  227. top: "conv3_3"
  228. param {
  229. lr_mult: 1.0
  230. decay_mult: 1
  231. }
  232. param {
  233. lr_mult: 2.0
  234. decay_mult: 0
  235. }
  236. convolution_param {
  237. num_output: 256
  238. pad: 1
  239. kernel_size: 3
  240. weight_filler {
  241. type: "gaussian"
  242. std: 0.01
  243. }
  244. bias_filler {
  245. type: "constant"
  246. }
  247. }
  248. }
  249. layer {
  250. name: "relu3_3"
  251. type: "ReLU"
  252. bottom: "conv3_3"
  253. top: "conv3_3"
  254. }
  255. layer {
  256. name: "conv3_4"
  257. type:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/799986
推荐阅读
相关标签
  

闽ICP备14008679号