AI挑战营(进阶) 三:获取onnx模型
<div>紧跟上节我们介绍了InsightFace中各个流程使用到的模型并选择了retinaface和arcface来实现我们人脸识别的任务。</div><div> </div>
<div>根据LuckFox官方和RKNPU2的文档指引,我们需要先获取onnx(最常用)的模型格式,但这在InsightFace官方程序中并未提供,我们可以自己找一下已有的insighface,onnx化部署工作。</div>
<div>一般我会先在onnx_model_zoo项目下寻找,这个项目由ONNX官方收录了许多完成了预训练的ONNX模型,可以降低我们的转换工作的难度。</div>
<div> </div>
<div>但是很不幸,这里只提供了retinanet的网络模型,并没有retinaface的模型,而且里面的arcface模型采用的骨干网络为ResNet100过于复杂庞大,虽然也可以转换为rknn而且精度更高,但不适合在RV1106这样计算资源十分紧张的端侧设备上部署,我们希望能找到一个使用mobilenetssd作为骨干网络的arcface模型。</div>
<div> </div>
<div>最后我在这两个项目里面找到了我们需要的onnx模型。</div>
<div>RetinaFace: <a href="https://github.com/bubbliiiing/retinaface-pytorch" target="_blank">https://github.com/bubbliiiing/retinaface-pytorch</a></div>
<div>ArcFace: <a href="https://github.com/yakhyo/face-reidentification/tree/main">https://github.com/yakhyo/face-reidentification/tree/main</a></div>
<div></div>
<div>其中的retinaface模型仍需要我们从pth转换到onnx但这个过程比较简单,前面也已经有网友给出了转换步骤和脚本</div>
<div> </div>
<div>
<pre>
<code class="language-bash">git clone https://github.com/bubbliiiing/retinaface-pytorch
cd retinaface-pytorch
touch 2onnx.py</code></pre>
<p> </p>
<pre>
<code class="language-python">#2onnx.py
from nets.retinaface import RetinaFace
from utils.config import cfg_mnet
import torch
model_path='model_data/Retinaface_mobilenet0.25.pth' #模型路径
model=RetinaFace(cfg=cfg_mnet,pretrained = False) #模型初始化
device = torch.device('cpu')
model.load_state_dict(torch.load(model_path,map_location=device),strict=False) #模型加载
net=model.eval()
example=torch.rand(1,3,640,640) #给定输入
torch.onnx.export(model,(example),'model_data/retinaface.onnx',verbose=True,opset_version=9) #导出</code></pre>
<p> </p>
</div>
<div></div>
<div>接着我们可以通过<a href="https://netron.app/">https://netron.app/</a>,将模型拖入观察一下模型结构,主要是确认一下输入和输出的大小</div>
<div>Retianface:</div>
<div></div>
<div>Arcface: </div>
<div>我们发现arcface模型的batch没有固定,rv1106似乎也不支持批量推理和动态输入,所以需要我们手动调整一下</div>
<div>
<pre>
<code class="language-bash">touch crop_model.py</code></pre>
<p> </p>
<pre>
<code class="language-python">#Crop_model:
import onnx
def change_input_size(model_path, new_size1):
model = onnx.load(model_path)
for input in model.graph.input:
input.type.tensor_type.shape.dim.dim_value = new_size1
onnx.save(model, model_path)
change_input_size("w600k_mbf.onnx", 1)</code></pre>
<p> </p>
</div>
<div>调整完成后得到的arcface模型结构如下:</div>
<div></div>
<div>至此我们就得到了retinaface和arcface两个关键的onnx模型,下一节我们将完成onnx2rknn的工作。</div>
<div>这里也给出了onnx模型供大家参考</div>
<p><!--importdoc--></p>
<p>大佬,</p>
<p>最后我在这两个项目里面找到了我们需要的onnx模型。</p>
<p>RetinaFace: <a href="https://github.com/bubbliiiing/retinaface-pytorch" target="_blank">https://github.com/bubbliiiing/retinaface-pytorch</a></p>
<p>ArcFace: <a href="https://github.com/yakhyo/face-reidentification/tree/main" target="_blank">https://github.com/yakhyo/face-reidentification/tree/main</a>找这种仓库有什么方法吗?还是纯知识阅历呀</p>
<p> 大佬大佬,我帮你看了一下,Arcface模型里最后一层有Gemm算子,我也遇到了这个问题,期待大佬的后续实现<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
<p>关于模型动态输入的问题,为什么很多端侧ai不支持动态输入啊,怎么知道能不能支持的<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/persevering-face_1f623.png" width="28" /></p>
<p>另外题外话,有没有大佬可以解释一下,Retina模型里的gather算子和unsqueeze算子是啥,rknn转换大概是怎么处理他们的?最后运行在gpu还是cpu?<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/funk1.gif" width="53" /></p>
iexplore123 发表于 2025-1-4 17:57
大佬大佬,我帮你看了一下,Arcface模型里最后一层有Gemm算子,我也遇到了这个问题,期待大佬的后续 ...
<p>这个Gemm算子支持问题其实好像不是问题,是他们文档写得太弯弯绕绕了,其实是支持的,转换后这部分rknn api会调用cpu计算<img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/funk1.gif" width="53" />我竟然被这个耽搁这么多天</p>
iexplore123 发表于 2025-1-5 14:50
这个Gemm算子支持问题其实好像不是问题,是他们文档写得太弯弯绕绕了,其实是支持的,转换后这部分rknn a ...
<p>一般如果转换和执行都不报算子错误或者版本不支持其实就没问题,这个主要我之前先在rk3588的板子跟着别人的例程试过arcface,可以直接运行所以就没注意这个问题<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan70.gif" width="57" /></p>
zhuxirui 发表于 2025-1-12 00:58
一般如果转换和执行都不报算子错误或者版本不支持其实就没问题,这个主要我之前先在rk3588的板子跟着别人 ...
<p><img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/dizzy-face_1f635.png" width="28" />我后面知道了忘了回了,rknn的文档指引太差了</p>
sgf201 发表于 2025-1-4 12:37
大佬,
最后我在这两个项目里面找到了我们需要的onnx模型。
RetinaFace: https://github.com/bu ...
<p>一般的话你找项目名+onnx就可以,如果没有的话一些基于pytorch框架项目可能也会预留有onnx的转换脚本</p>
页:
[1]