Openvino_ARM源码编译+nano_detect树莓派部署实测

        目前openvino在树莓派上的部署形式是和NCS组合在一起使用,树莓派无法单独使用,今年5月Github上开源了openvino在ARM上独立运行的源码编译方法,以实现openvino在树莓派的独立部署。 参考openvino_ARM编译方法 ,折腾一番后,在安装Ubuntu18.04的树莓派4B上实现了openvino加速工具的部署,并基于该加速工具测试了目标检测方法nano_detect,分享给后来之人。 

        一 、openvino交叉编译

        首先给出github的交叉编译教程:Github-openvino交叉编译教程,目前支持的软硬件搭配如下图所示,硬件系统是树莓派4B,操作系统Debian32位和Ubuntu64位。

                                

        我选择了Ubuntu18.04作为操作系统进行编译, 编译是在自己的x86-64主机上做的,步骤如下:

(1)安装docker

sudo apt-get install docker

(2)clone代码仓

git clone --recurse-submodules --single-branch --branch=master https://github.com/openvinotoolkit/openvino_contrib.git 

 (3)创建docker镜像

cd openvino_contrib/modules/arm_plugin
docker image build -t arm-plugin -f Dockerfile.RPi64_bionic .

(4)arm架构openvino交叉编译

mkdir build
docker container run --rm -ti -v $PWD/build:/armcpu_plugin arm-plugin

第四步时间较长,得个把小时,等着就行,直到生成如下所示的文件

        编译完成的文件夹如上图所示,除了armcpu_package和OV_ARM压缩包,其他文件夹都是从github上下载下来的,可以独立下载再执行交叉编译,下载方法这里有:Github Project子库git方法

        我们需要的就是OV_ARM压缩包,把这个文件夹拷贝到树莓派4B上进行解压,得到需要的各个库文件,与官方提供的openvino差别不大,至此,交叉编译完成。

二、openvino在树莓派4B部署及nano_detect测试

(1)树莓派4B配置openvino和主机端配置方法相同,核心就是添加环境变量,添加方法如下:

sudo vi ~/.bashrc
source ../bin/setupvars.sh
source ../opencv/setupvars.sh

 配置完成后开始测试nano_detect,nano_det GitHub开源链接如下Github:Nano_Detect,没接触过的去了解一下,令人膜拜的目标检测算法。

在开源代码里添加推理时间获取代码并进行推理,设置推理次数20次,计算平均值,基于openvino的nano_detect推理时间如下所示,平均推理时间330ms。

(2)彩蛋(nuhui大佬yyds)

基于ncnn的nano_det在树莓派4B部署方法如下图所示,平均推理时间147ms。

 三、感悟总结

(1)PC端Intel芯片2.6GHz主频推理速度16ms,但到了ARM上只有330ms,可以看到推理速度掉速比较大,猜测是由于Intel指令集和arm指令集的差异导致的,无法最大程度使用树莓派4B。

(2)后期做一些openvnio自带库的推理,看看速度如何,但官网给的样例推理速度也不快,提速空间不大,整体有点小失落,折腾了两三天速度不尽人意。

(3)nihui大佬,yyds。PC端Intel芯片2.6GHz主频推理速度27ms,树莓派4B达到147ms。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
在使用 C++ 实现 "estimate_pose_for_tag_homography" 算法之前,需要确保已经安装了适当的开发环境和相关的计算机视觉库和工具包,如OpenCV和Eigen等。 以下是一个简单的示例代码,演示如何使用 OpenCV 库和 Eigen 库实现 "estimate_pose_for_tag_homography" 算法: ``` #include <iostream> #include <opencv2/opencv.hpp> #include <Eigen/Dense> using namespace std; using namespace cv; using namespace Eigen; int main() { // Load reference image and target image Mat ref_img = imread("ref_image.jpg"); Mat target_img = imread("target_image.jpg"); // Detect and match features between reference image and target image vector<KeyPoint> ref_kp, target_kp; Mat ref_desc, target_desc; Ptr<ORB> orb = ORB::create(); orb->detectAndCompute(ref_img, Mat(), ref_kp, ref_desc); orb->detectAndCompute(target_img, Mat(), target_kp, target_desc); BFMatcher matcher(NORM_HAMMING); vector<DMatch> matches; matcher.match(ref_desc, target_desc, matches); // Extract matched feature points vector<Point2f> ref_pts, target_pts; for (int i = 0; i < matches.size(); i++) { ref_pts.push_back(ref_kp[matches[i].queryIdx].pt); target_pts.push_back(target_kp[matches[i].trainIdx].pt); } // Compute homography matrix Mat H = findHomography(ref_pts, target_pts, RANSAC); // Compute pose from homography matrix Matrix3d K, R; Vector3d t; K << 1000, 0, ref_img.cols/2, 0, 1000, ref_img.rows/2, 0, 0, 1; Matrix3d H_eigen; cv2eigen(H, H_eigen); Matrix3d inv_K = K.inverse(); Matrix3d A = inv_K * H_eigen; double scale = 1.0 / A.col(0).norm(); A *= scale; double sign = (A.determinant() > 0) ? 1 : -1; R.col(0) = A.col(0).normalized(); R.col(1) = A.col(1).normalized(); R.col(2) = R.col(0).cross(R.col(1)); t = sign * scale * A.col(2); cout << "Rotation matrix:" << endl << R << endl; cout << "Translation vector:" << endl << t << endl; return 0; } ``` 该代码演示了如何使用 ORB 特征检测算法和 BFMatcher 特征匹配算法来检测和匹配参考图像和目标图像之间的特征点,然后使用 findHomography 函数计算单应性矩阵,并使用 Eigen 库和数学公式计算出姿态(旋转矩阵和平移向量)。在实际应用中,还需要对算法进行优化和调整,以提高估计精度和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值