周国维 发表于 2024-12-18 19:34

【嵌入式AI挑战营 】scrfd模型剪枝尝试,以及添加到摄像头例程

<div class='showpostmsg'> 本帖最后由 周国维 于 2024-12-18 19:41 编辑

<p>因为活动管理员的催更,所以就加更一集模型剪枝和添加到Luckfox Pico Max开发板摄像头例程</p>

<p>&nbsp;</p>

<p>模型蒸馏(Model Distillation)是一种在机器学习和深度学习中使用的模型压缩技术,目的是在保留模型性能的前提下,将复杂的&ldquo;大&rdquo;模型简化成更小、更高效的模型。这个过程涉及将一个称为&ldquo;<b>教师模型(Teacher Model)</b>&rdquo;的大模型中的知识传递给一个较小的&ldquo;<b>学生模型(Student Model)</b>&rdquo;。</p>

<p>但前提是没蒸馏前的模型就是&ldquo;大&rdquo;模型了,但现在我所选用的<a href="https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape320x320.onnx" target="_blank">scrfd_500m_bnkps_shape320x320.onnx</a>模型才2.5M,已经足够小了,感觉已经榨不出水分了,而且弄起来很复杂,所以pass这步。</p>

<p>接下来看剪枝,下面是在网上找的,<a href="https://segmentfault.com/a/1190000045481580" target="_blank">https://segmentfault.com/a/1190000045481580</a></p>

<p data-first-child="" data-pid="onDkcpPB"><a data-paste-text="true" data-za-not-track-link="true" href="https://zhida.zhihu.com/search?content_id=441591974&amp;content_type=Answer&amp;match_order=1&amp;q=%E5%89%AA%E6%9E%9D&amp;zhida_source=entity" target="_blank">剪枝</a>分为非结构化剪枝和结构化剪枝</p>

<p data-pid="mqwKQkkV">非结构化剪枝:以filter的单个权重或者<a data-paste-text="true" data-za-not-track-link="true" href="https://zhida.zhihu.com/search?content_id=441591974&amp;content_type=Answer&amp;match_order=1&amp;q=%E5%85%A8%E8%BF%9E%E6%8E%A5%E5%B1%82&amp;zhida_source=entity" target="_blank">全连接层</a>的单个神经元作为研究对象,通过剪枝策略将不重要的权重或者<a data-paste-text="true" data-za-not-track-link="true" href="https://zhida.zhihu.com/search?content_id=441591974&amp;content_type=Answer&amp;match_order=2&amp;q=%E7%A5%9E%E7%BB%8F%E5%85%83&amp;zhida_source=entity" target="_blank">神经元</a>去除掉。由于来自不同权重矩阵的不同稀疏度导致的负载失衡,这些方法对线程级并行性产生了负面影响。不规则的稀疏性也会影响内存性能,因为它会在数据访问位置中产生变化,从而降低跨各种平台(GPU、CPU、TPU)缓存的性能。</p>

<p data-pid="AvORFCID">&nbsp;</p>

<p data-pid="Ee3WTZQa">在结构化修剪中,对整个<b>滤波器</b>(如图1(c))或连续<b>通道</b>(如图1(b))进行修剪,以增加模型的稀疏性。<b>滤波器/通道修剪</b>提供了更均匀的权重矩阵,并减小了模型的大小。与非结构化修剪相比,简化的矩阵有助于减少乘法和累加(MAC)操作的数量。然而,结构化修剪也会降低模型的准确性,因为可以有助于模型整体准确性的权重也将与冗余权重一起被修剪。结构化修剪也可以与TensorRT等加速算法一起使用。与非结构化修剪不同,由于权重矩阵的统一性质,结构化修剪可以更好地利用各种平台在内存和带宽方面提供的硬件加速。</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;因为模型是运行在npu的,所以排除非结构化剪枝,主要关注结构化剪枝,但网上大部分都是讲解原理和计算公式,都没什么基于实际工程的例程,下面是我的一些尝试,感觉没什么实际效果,就图一个试试。</p>

<p>首先是使用onnx-modifier,onnx-modifier是一款基于可视化界面的ONNX模型编辑工具,由GitHub用户ZhangGe6开发。该工具的核心理念是通过可视化的方式来编辑和预览ONNX模型,从而大大提高编辑效率。onnx-modifier基于流行的网络可视化工具Netron和轻量级Web应用框架Flask构建,结合了两者的优势,为用户提供了直观且功能强大的操作界面。</p>

<p>原本的<a href="https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape320x320.onnx" target="_blank">scrfd_500m_bnkps_shape320x320.onnx</a>模型分为3个步进等级,8,16,32,分别用来匹配不同的人脸尺寸,我想或许可以只保留一个通道,比如8,其他的都去掉</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>选择节点,然后点击删除节点以及子节点,就可以把16和32的通道给去掉</p>

<p> &nbsp; &nbsp;</p>

<p>把新的onnx模型给下载下来,然后用上集的脚本转换为rknn模型再丢进去运行,发现去不去掉通道,消耗时间的耗时差别微乎其微,都是在0.09s~0.1s之间波动,用到的测试例程也是上集的,所以这步没什么卵用。</p>

<p>然后我看到rknn-toolkit2里的模型config配置参数里有些优化选项,也打开试一下</p>

<p> &nbsp;</p>

<p> &nbsp;</p>

<p>结果还是在0.09s~0.1s之间波动,只不过更偏向到0.09s的范围,还是突破不到0.08s,同样没卵用。</p>

<p>估计要起到真正的效果,得看每一层的卷积的耗时和权重,一步步调整,没弄过,不会弄,所以剪枝这步pass。</p>

<p>另外rv1106的手册上说gpu支持int4的量化精度,但实际rknn-toolkit2里又不支持int4的量化。</p>

<p> &nbsp;</p>

<p>所以就不折腾模型了,之前都是用图片看效果,感觉差点意思,所以还是用摄像头获取图像数据再用模型处理。</p>

<p>基于luckfox_pico_rkmpi_example里的luckfox_pico_rtsp_retinaface示例上修改,就把人脸识别的模型和处理换成现在的<a href="https://bj.bcebos.com/paddlehub/fastdeploy/scrfd_500m_bnkps_shape320x320.onnx" target="_blank">scrfd_500m_bnkps_shape320x320.onnx</a>模型,其余不变,源码看附件,因为加上了人脸识别,帧率降低了,勉强能用。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

brack 发表于 2025-1-6 16:15

<p>大咖有新发现啊,学习了</p>
页: [1]
查看完整版本: 【嵌入式AI挑战营 】scrfd模型剪枝尝试,以及添加到摄像头例程