前几天做了个项目,关于在树莓派上跑人脸识别来着。网上资源很少,就自己来写写吧。
首先当然是入手一个树莓派啦~ 关于怎么装系统就不说了。用的是xshell和winscp。
开始安装opencv的时候,我第一次是用apt方式安装的,直接sudo apt-get install libcv-dev就好了。只不过用这个命令前记得 update一下。其实我觉得我讲这个方式没啥用。。。因为虽然这个方式,opencv的代码能跑,但是我使用seetaface的时候出毛病了。。以至于后来我又去官网下载源码载入的。。源码的话,推荐直接Cmake安装就好了。(源码编译的时间好久好久,感觉要5个小时来着),然后记得要在build目录里 make install呀。
opencv测试代码:#include <opencv/cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
IplImage* img = cvLoadImage(argv[1]);
IplImage* dstimg = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
cvCvtColor(img,dstimg,CV_BGR2GRAY);
cvNamedWindow("Oringinal Image");
cvShowImage("Original Image",img);
cvNamedWindow("Gray Image");
cvShowImage("Gray Image",dstimg);
cvWaitKey(0);
return 0;
}
编译的时候 直接手动写上静态链接库:g++ XXX.cpp -o XXX -lopencv_core -lopencv_proc -lopencv_highgui。(XXX是你cpp文件名)然后直接 ./ XXX+ 图片 调用就可以啦,可以看到效果。
到这里应该都没有什么问题。然后就是开始我们的配置seetaface啦
先去官网下一个zip,压缩后扔到树莓派就好了。
配置SeetaFace:
我在这里用的都是cmake的图像化界面,命令行也用过,不过自己出了些问题,所以还是用图形化界面啦。
1、detection
在detection里新建一个build目录。
用cmake, source配置SeetaFace选择detection目录。目标目录就选择这个build目录,直接生成就好了。不出意外会报错。
因为树莓派这个系统是被阉割的,所以这个USE_SSE可以去掉了,不然编译无法通过。然后进入到这个build目录下,输入指令make。(对了,我喜欢用root权限来。不然有些地方权限不够容易出错。)
make的过程中,不出意外又会出错。
应该是这个问题,可以看到的是,没有-msse4.1这个玩意。。所以,我们要把他删了。
找到这个dir文件夹,找到里面的 flag.make文件。 里面有一行关于 -msse4.1 的,单单把这删了就可以了。
另外一个要删的地方就是,里面有个link.txt,同样删除。
然后再进行编译,应该就能过咯。可以看到的是生成了一个facedet_test 的文件,
./facedet_test [在此处填写测试图片路径] ../model/seeta_fd_frontal_V1.0.bin 这样就可以进行测试了。
2、alignment
同样 ,在alignment里也是同样的操作。
3、indefication
最后呢,就是identification里的操作了。
同样的话
将之前生成的libseeta_facedet_lib, libseeta_fa_lib复制到build文件夹中
然后在src/test/CMakeLists.txt文件中循环前添加
link_directories(${PROJECT_BINARY_DIR})
补全
target_link_libraries(${BIN} viplnet ${OpenCV_LIBS} seeta_facede_lib seeta_fa_lib)
不出意外又要出问题了,这里比较麻烦,要改加速器的代码,不然无法执行。找到这个math_function 文件,修改里面的加速器。修改代码如下:
include "math_functions.h"
#include <cstdint>
float simd_dot(const float* x, const float* y, const long& len) {
float inner_prod = 0.0f;
long i=0;
// add the remaining values
for (; i < len; ++i) {
inner_prod += x[i] * y[i];
}
return inner_prod;
}
void matrix_procuct(const float* A, const float* B, float* C, const int n,
const int m, const int k, bool ta, bool tb) {
#ifdef _BLAS
arma::fmat mA = ta ? arma::fmat(A, k, n).t() : arma::fmat(A, n, k);
arma::fmat mB = tb ? arma::fmat(B, m, k).t() : arma::fmat(B, k, m);
arma::fmat mC(C, n, m, false);
mC = mA * mB;
#else
CHECK_TRUE(ta && !tb);
const float* x = B;
for (int i = 0, idx = 0; i < m; ++i) {
const float* y = A;
for (int j = 0; j < n; ++j, ++idx) {
C[idx] = simd_dot(x, y, k);
y += k;
}
x += k;
}
#endif
}
修改后重新跑一下,不出意外。。可能又会出现类似问题:
这里我是因为路径问题。。后来直接全部改成绝对路径了。。。虽然不太好。。。。
基本后来我遇到的都是一些路径问题,修改一下就可以了。 然后开始跑seetaface的代码,会发现。。在树莓派上跑整个流程好慢好慢。。。所以想用opencv 打开摄像头实时。。基本别想了。。。推荐把人脸对齐和比较扔服务器上跑。。不说了。我吃饭去了。。。