InspireFace交叉编译,于RV1106部署运行
<div class='showpostmsg'> 本帖最后由 周国维 于 2024-11-29 20:46 编辑<p>书接上文,完成了SDK验证后,接下来就是InspireFace的交叉编译和部署</p>
<p> </p>
<p>交叉编译第一步就是先确定目标机的芯片架构,很简单就可以确定rv1106是32位的armv7芯片</p>
<p> </p>
<p>第二步是下载InspireFace的源码,<a href="https://github.com/HyperInspire/InspireFace" target="_blank">https://github.com/HyperInspire/InspireFace</a>,这个不是整个SDK,只有C++的源码,干净点</p>
<p>InspireFace还依赖了很多别的包,都要手动下载,git clone下不来就下载压缩包,在解压到目标文件夹下</p>
<p> </p>
<p> </p>
<p>第三步设置交叉编译链,按项目文档来说应该是在docker镜像上编译的,但懒得弄了,直接把ubuntu上前文的RV1106系统SDK的交叉编译链在CMAKE上设置为环境编译变量,而且最好还是用官方sdk提供的编译链进行交叉编译,不然就算编译通过到目标机上执行也可能有依赖问题。</p>
<p> </p>
<p>PS: 一定要把project(InspireFace)放到环境编译变量之下,不然cmake就会进入奇怪的构建循环</p>
<p>第四步,配置编译环境定义,cmake默认编译的目标程序是运行在X86平台上的,要修改为上文所说的armv7</p>
<p> </p>
<p> </p>
<p>第五步执行mkdir build && cd build && cmake .. 如果没有报错就执行make,然后接下来就是趟雷区,哪里编译不过改哪里</p>
<p>第一个雷出现在rknn_init这个函数,因为使能了RKNN,所以会编译RKNN相关的函数,但RKNN又分为RKNPU1和RKNPU2,而InspireFaced是默认支持rv1109和rv1126,是比较老的RKNPU1,rknn_init这个函数有变动,所以需要手动改完rknn_init的入参,还好不多。</p>
<p> </p>
<p>第二个雷出现在编译MNN这个库的时候,如果按默认的配置进行编译,编译会通过,但在执行链接的时候你会喜提很多函数的 undefined symbol </p>
<p>究其根本这一切都和MNN_USE_NEON这个宏变量有关,因为MNN_USE_NEON默认是没使能的,但对某些函数,它只限定了实现,没限定声明,</p>
<p>所以会出现undefined symbol ,而armv7是默认支持NEON操作的,所以要修改MNN的CMakeLists,使能MNN_USE_NEON</p>
<p> </p>
<p>关闭MNN_ARM82 是因为某个函数找不到实现,懒得找了就直接关闭使用</p>
<p>第三个雷是在链接opencv这个库的时候,它的.o文件会有些古老的底层函数一直都是undefined symbol,可能和交叉编译链版本有关</p>
<p> </p>
<p>按经验告诉我,可能又要升级,又要改配置,但最后发现改了一堆东西都没卵用,所以灵光一闪,想到<a href="http://git@github.com:LuckfoxTECH/luckfox_pico_rkmpi_example.git" target="_blank">http://git@github.com:LuckfoxTECH/luckfox_pico_rkmpi_example.git</a>这个例程源码里</p>
<p>有opencv-mobile已经编好的.a文件,直接设置导入路径就能用了·</p>
<p> </p>
<p>作为代价就是有些sample编译不过,要注释掉</p>
<p> </p>
<p>但无关大雅,最后还是成功通过编译,然后确定libInspireFace.so是否为32位ARM架构,是的话就没什么问题了</p>
<p> </p>
<p>编译完后,执行adb pull .\libInspireFace.so /lib,把动态链接库放到目标机的/lib目录下,然后下载InspireFace的模型包,我选的是Pikachu试试水</p>
<p> 把里面的Pikachu和build/sample/FaceDetect这个sample例程同样放到/root目录下,然后第四个雷就来了</p>
<p>首先是test_res这个包里的jpeg图片居然cv::imread读不出来,还得转成jpg图像才能读,而更奇葩的是Pikachu这个模型包里找不到sample源码里的face_detect这个模型,</p>
<p>如果不是遍历了模型包的参数,还不知道模型名称对不上,后面还加了尺寸大小,真是坑爹。</p>
<p> </p>
<p>修改完程序后执行,需要的话到附件下载</p>
<p> </p>
<p>再看下人脸识别效果</p>
<p> </p>
<p>效果可以,但如果只是0.4秒的速度那真的只能当玩具了,不过现在是单单用cpu计算的,后面看来就要用上rknpu加速和优化模型了</p>
<p>移植InspireFace比移植open3D点云库简单多了,不过后面的工作就进到技术深水区,共勉。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </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>
页:
[1]