经过一段时间的瞎搞,总算把一个检测人体2D关键点的模型能够在HI3516DV300上生成结果,获取开发板上输出的blob hex数据通过python+opencv解析在PC上看,效果还是有差距的:
不过没有关系,事情总得一步步来。以前我就是太着急,总期望在短时间内获得一定的结果,最后获得的多半是不好的结果和自我怀疑。质量互变,否定之否定,螺旋上升,实践总结再实践直到达到目的,这是规律。
关于人体关键点的检测若是能在海思平台实现以及优化再做一系列博客。
需要使用openCV是到了一个比较麻烦的时刻:从NNIE输出的数据是HI_S32转成浮点型的一张张46*46置信图数据,为了找到人体关键点的坐标位置,需要对置信图进行高斯滤波,边沿查找等运算获取结果。对应python代码是:
当然海思平台运行的是C/C++程序,python也不是那么适合嵌入式平台。
为了实现从海思NNIE输出中结算出人体关键点在图象内坐标位置,按照我目前的理解,应该是有两种路径:移植openCV或者通过海思的IVE(Intelligent Video Engine)计算。
(或许对于单个人体的检测直接使用NMS非极大值抑制也行,而海思SVP的sample里面有整个函数,不过仅适用单个目标)
先移植openCV试试。
我使用的是ubuntu16.04虚拟机环境。
openCV获取:
安装wget:apt-get install wget
wget -O opencv-3.4.3.zip https://github.com/Itseez/opencv/archive/3.4.3.zip
wget -O opencv_contrib-3.4.3.zip https://github.com/Itseez/opencv_contrib/archive/3.4.3.zip
解压openCV以及openCV_contrib到同级目录:
unzip opencv-3.4.1.zip
unzip opencv_contrib-3.4.1.zip
HISI交叉编译器安装:
参考《Hi3516CV500╱Hi3516DV300╱Hi3516AV300 开发环境用户指南.pdf》即可
cmake安装:
apt-get install cmake cmake-gui
openCV交叉编译:相关资料网上一大堆,可以参考这几个博客:
https://www.cnblogs.com/huty/p/8518227.html
https://blog.csdn.net/avideointerfaces/article/details/89477828
这里会在opencv-3.4.3的目录下新建两个目录:build output
注意最好把opencv-3.4.3整个路径的权限都 chmod 777,另外最好在cmake把build_OPENCV_WORLD也选上
make
那么问题来了,编译期间会出一些错误,虽然不一定每个人都会遇到,这里记录下我遇到的:
<0> 错误信息:先参照以上的两篇博客
<1> 错误信息:找不到zlib.h
解决方法:在opencv-3.4.3路径下找到CMakeLists.txt内的ocv_include_directories(),改为./3rdparty/zlib/
<2> 错误信息:
Scanning dependencies of target opencv_core
[ 37%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/lapack.cpp.obj
In file included from /home/samba2/opencv-3.4.3/modules/core/src/lapack.cpp:43:0:
/home/samba2/opencv-3.4.3/modules/core/src/precomp.hpp:46:38: fatal error: opencv2/opencv_modules.hpp: No such file or directory “#include "opencv2/opencv_modules.hpp"
解决方法:
具体原因也没有探究,我编译期间出现各种少了头/源文件的错误。解决办法就是找到这些文件然后拷贝到缺少文件的路径。这些缺少的文件基本都在build目录下,报错就找到并且拷进去吧。
例如上面这个错误,就通过:cd build ;cp -rf ./opencv2/ /home/samba2/opencv-3.4.3/modules/core/src/; 解决
需要注意的是,如果缺少的是#include
如果缺少的是#include "xxxxx.h"这样的文件,那直接拷贝到缺少该文件的源码路径就行了,这都很好理解的
一般情况下按照以上方法就能过编译,当然每个人环境不一样可能遇到不一样的问题,应该需要各自解决。
通过编译后,make install,output目录下就会有include lib文件夹,全部拷贝到海思开发板备用。
接下来需要验证一下移植的库是否可用:
<1>
将opencv-3.4.3/output下的include lib文件拷贝到交叉编译器的路径下,我的路径是:
/opt/hisi-linux/x86-arm/arm-himix200-linux/arm-linux-gnueabi/
将/opecv-3.4-3/output下include目录下的opencv & opencv2文件夹拷贝到arm-linux-gnueabi/include下
将/opecv-3.4-3/output下lib目录内所有文件拷贝到arm-linux-gnueabi/lib下
<2>
随便找一段opencv的代码demo.cpp:
#include
using namespace cv;
extern "C" {
int main(int argc, char *argv[]){
Mat img = imread("./demo.jpg");
Mat gray;
if(img.empty()){
printf("read img err...\n");
return -1;
}
cvtColor(img, gray, COLOR_BGR2GRAY);
imwrite("demo_gray.jpg", gray);
return 0;
}
}
通过命令编译:
arm-himix200-linux-g++ demo.cpp -I/opt/hisi-linux/x86-arm/arm-himix200-linux/include/ -lopencv_highgui -lopencv_core -lopencv_imgproc -lpthread -lrt -lopencv_objdetect -o demo
如果编译了opencv_world,则用以下命令编译:
arm-himix200-linux-g++ demo.cpp -I/opt/hisi-linux/x86-arm/arm-himix200-linux/include/ -lopencv_world -lpthread -lrt -ldl -o demo
编译出的demo可执行文件与demo.jpg拷贝到开发板执行,生成灰度图对比原图:
至此,可以认为openCV初步移植成功。
openCV移植初步成功后,下一步就是如何将openCV的代码与海思SVP的代码融合并且成功编译运行,由于掺杂了C/C++编程,因此需要花些时间来解决。
这里要参考和感谢其它博客的大神:
海思AI芯片(Hi3519A/3559A)方案学习(十八)如何将sample sdk代码重构并编译成动态链接库:
https://blog.csdn.net/avideointerfaces/article/details/96141090
海思AI芯片(Hi3519A/3559A)方案学习(十九)如何在推理动态链接库中引入opencv库:
https://blog.csdn.net/avideointerfaces/article/details/97012873
我将参照这些大神的思路来实现自己的人体关键点检测功能