摘要:一个Linux人脸识别小项目,可以拿过来来练练手。使用瑞芯微RV1126核心板通过瑞芯微API进行视频采集并进行人脸识别,并输出到设备上。
![2a38eea42a7c2c6264b520175eee175b.png](https://i-blog.csdnimg.cn/blog_migrate/05a027a8d72e57aaffba96a1f0cee540.png)
01
搭建NFS环境
网络文件系统NFS,是由SUN公司研制的UNIX表示层协议,能使使用者访问网络上别处的文件就像在使用自己的计算机一样。我们可以Ubuntu上制作板子需要的文件,然后使用NFS来加载文件到板子的DDR上。
因为我们使用的板子内存太小,而人脸识别有需要很多的文件来支持,板子放不下,只能通过这种挂载的方式,将程序运行所需要的数据库模型文件放在挂载的目录下,这样就可以了。
1.1 安装NFS服务
在Ubuntu终端执行以下指令安装NFS。
sudo apt-get install nfs-kernel-server
1.2 新建NFS共享目录
新建NFS共享目录,并给予NFS目录可读可写可执行权限。
sudo mkdir /home/zhiguoxin/linux/nfs
sudo chmod 777 /home/zhiguoxin/linux/nfs/
1.3 配置NFS服务
执行以下指令打开etc/exports
文件
sudo vi /etc/exports
进入etc/exports
文件,在最后添加如下内容
/home/zhiguoxin/linux/nfs *(rw,sync,no_root_squash)
/home/zhiguoxin/linux/nfs 表示NFS共享的目录,*表示允许所有的网络段访问,rw表示访问者具有可读写权限,sync表示将缓存写入设备中,可以说是同步缓存的意思。no_root_squash表示访问者具有root权限。修改完如下图所示。
![29447a005c29442aa969778268e28d39.png](https://i-blog.csdnimg.cn/blog_migrate/2c1dcf6dd02ac7fd3f0ab0c69739a76c.png)
修改完以后保存退出。执行以下指令重启 NFS 服务器。
sudo /etc/init.d/nfs-kernel-server restart
执行以下指令查看 NFS 共享目录。
showmount -e
![6c96fe798ca1e6e41947b97b06f31c64.png](https://i-blog.csdnimg.cn/blog_migrate/142d08e959367258eb23d83643728ad3.png)
网络环境
确保网络环境正常,Ubuntu、Windows和开发板能相互ping 通。开发板IP:192.168.100.75 虚拟机IP:192.168.100.100 电脑网口IP:192.168.100.102
02
交叉编译SQLite3数据库
2.1、准备源码
源码可以周期官网下载,放在我的共享文件夹下,然后解压。
![70673e2492b0cd40121799e80111f8b0.png](https://i-blog.csdnimg.cn/blog_migrate/646bb4b4fd30c66d054fcffdde4d0f81.png)
2.2、准备RV1126的sdk包
这个RV1126的源码包在购买板子的时候商家会送你的
![2d4cf5593e7ef9424be21c178312eb25.png](https://i-blog.csdnimg.cn/blog_migrate/1944fefabe698e89980d28f38b34285d.png)
这个那文件夹里面有交叉编译工具链。在交叉编译之前,得在sdk里面找到交叉编译工具链:
![cfda201b4f970d8c21f6d16642403ed2.png](https://i-blog.csdnimg.cn/blog_migrate/23fa328e0e10c4d0240184d59a0a6493.png)
然后我这里放在samba共享目录下,我的共享文件夹对应我的ubuntu的目录是
/home/zhiguyoxin/shared/
![d286d0455c97c9815e852bad671ee2e2.png](https://i-blog.csdnimg.cn/blog_migrate/48caa9c12abf832d80d7d891ffdfa90b.png)
现在开始来交叉编译SQLite3,这个SQLite3的源码还是用之前给大家的源码包:
![64bb1d93d0e12f932ef394c9db536658.png](https://i-blog.csdnimg.cn/blog_migrate/e1833251c7275ff4bde182c418fbf239.png)
使用命令解压
tar -zxvf sqlite-autoconf-3380500.tar.gz
![fbc2cba10933c3ecce737ff0c27ac046.png](https://i-blog.csdnimg.cn/blog_migrate/d29bbaeaefb401c0162a5cd7a4c5fdf2.png)
![152d579f85010d166fe1e5d464ed958b.png](https://i-blog.csdnimg.cn/blog_migrate/d01af6c7e18a5f9725edfe5b3c077ce9.png)
2.3、交叉编译SQLite3
然后开始进行交叉编译,不过在在这之前,先在当前目录下创建一个文件夹来存放等下交叉编译出来文件:
mkdir arm_sqlite3_install
![a5b6c0487a98326a4299e7ee2f3ba47d.png](https://i-blog.csdnimg.cn/blog_migrate/dc9a286bde74d29b116f184d52a14365.png)
最后最为关键部分是,现在找到那个之前交叉编译的路径来,也就是结对路径:
/home/zhiguoxin/shared/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin
接着刚才建立的arm_sqlite3_install,也是要找到他的绝对路径来:
/home/zhiguoxin/shared/sqlite-autoconf-3380500/arm_sqlite3_install
![1a38fd686b4a8df81866e3cfb1493cdb.png](https://i-blog.csdnimg.cn/blog_migrate/d282b2513d7c668e9a3d806e365f9d0e.png)
最后就可以按照下面这个命令来执行编译了:
./configure CC=/home/zhiguoxin/shared/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc --host=arm-linux --prefix=/home/zhiguoxin/shared/sqlite-autoconf-3380500/arm_sqlite3_install
![f295bd945cc18f7c1c83d4a1cbac486f.png](https://i-blog.csdnimg.cn/blog_migrate/fcaedef20987440f840da1db91e57427.png)
然后执行分别执行以下命令即可:
make -j8
make install
最后在arm_sqlite3_install
目录下生成四个文件:
![d2fe5d6225fe0e1a90124607a1f60cef.png](https://i-blog.csdnimg.cn/blog_migrate/b4df3439a89c3e4fdd3d27f33fc08a00.png)
进入到arm_sqlite_install
目录下的lib
目录,这里面就是交叉编译出来的.so
的动态库文件,如下图所示:
![6972a90443472b0b1d0c75379bc9270d.png](https://i-blog.csdnimg.cn/blog_migrate/8bd648d1d4b4e089cd919c29d256e5cf.png)
我们把这些动态库进行一个打包:
zip -r arm_sqlite3_lib.zip *so*
![b114054e5dd7c189e8a251842f2a5c7e.png](https://i-blog.csdnimg.cn/blog_migrate/9bbe6093bdb0dc150955824ad1bea8ee.png)
把这个打包文件拷贝到nfs目录下去:
cp -rf arm_sqlite3_lib.zip /home/zhiguoxin/linux/nfs
![696f81b99d6e59d32fe725af4d78c609.png](https://i-blog.csdnimg.cn/blog_migrate/cebc756705d920727a285a3073a7e3df.png)
![d2c49ab7494506845475be1790cc6b06.png](https://i-blog.csdnimg.cn/blog_migrate/633a1c881d7b0b193d30d26243e19c39.png)
令外还要将sqlite3可执行文件拷贝至/home/zhiguoxin/linux/nfs目录下
![2becc9b44b501d4790e17b95cf13bfe1.png](https://i-blog.csdnimg.cn/blog_migrate/fb1daf977344f5541f0ea15f0e5b73da.png)
使用这个可执行文件我们查看数据库中的数据,做一下添加删除的操作。
03
交叉编译OpenCV
同样现在官网下载号源码包,放再共享文件夹下
![a6f509a338bff415671971f59c978ab3.png](https://i-blog.csdnimg.cn/blog_migrate/2c18d8d3dc6e73de72de34cba9d4041c.png)
解压
unzip opencv-3.4.12.zip -d opencv-3.4.12
![606d31aa894f4a19db131afec28b3113.png](https://i-blog.csdnimg.cn/blog_migrate/4611c83285a63e5dd16e08ae62fe9beb.png)
进入解压后的opencv版本platforms/linux目录下去:
cd opencv-3.4.12/platforms/linux
修改arm-gnueabi.toolchain.cmake
vim arm-gnueabi.toolchain.cmake
![bd6c549b529a2e2165b764bc8779df87.png](https://i-blog.csdnimg.cn/blog_migrate/fcbb37a9d8cfe46a58b9762f70bd5a54.png)
将里面的交叉编译路径修改成你自己的路径
/home/zhiguoxin/shared/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf
![e4128d5bb2fc015819bf22e1edd87646.png](https://i-blog.csdnimg.cn/blog_migrate/fae43009ffd4c3ec126896d08866cf54.png)
建立一个build目录,并进入build下去:
![7f2d2eda93ca31617efde10c4424a78a.png](https://i-blog.csdnimg.cn/blog_migrate/04fbc6ba8d3e8f07ce2b50cde690f3e9.png)
编译:
cmake -DCMKAE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake -DCMAKE_INSTALL_PREFIX=/opt/arm_opencv -DSOFTFP=ON -DENABLE_PROFILING=OFF -DWITH_OPENCL=OFF -DWITH_TBB=ON -DWITH_V4L=ON -DHAVE_CAMV4L2=ON -DBUILD_TESTS=OFF -DINSTALL_PYTHON_EXAMPLES=OFF -DBUILD_EXAMPLES=OFF -DWITH_FFMPEG=ON -DHAVE_FFMPEG=ON -DBUILD_opencv_js=OFF -DENABLE_NEON=OFF -DENABLE_VFPV3=OFF ../
![5454bb1e2d22abfdafcee614e6d7352f.png](https://i-blog.csdnimg.cn/blog_migrate/c55570408e9544d35674c92d92dd8b5e.png)
![3c07252114807ef7287acf94cbe62039.png](https://i-blog.csdnimg.cn/blog_migrate/a7343d36841d0ac211c178add69a52a2.png)
然后执行下面两句
make -j8
make install
最后结果:
![c487e10d647aefb282a909c11289e612.png](https://i-blog.csdnimg.cn/blog_migrate/efcdc476627a9a3e4312b82f5a2bee69.png)
先进入到build目录下的lib目录下,你会看到很多动态库,
![c8c6e168458d93d61173aa6b7c29ac04.png](https://i-blog.csdnimg.cn/blog_migrate/97f92a31d670c026d9b318b3000e750f.png)
对其打包:
zip -r arm_opencv_lib.zip lib*
![4e783c100fdf0e0c1c94189af182a07e.png](https://i-blog.csdnimg.cn/blog_migrate/8cc5c813df14e4ef0883ee078bfb0712.png)
将文件拷贝至/home/zhiguoxin/linux/nfs//共享文件夹
cp -rf arm_opencv_lib.zip /home/zhiguoxin/linux/nfs/
![5d1912e7768cfe18ab3f3ebca1aa9e4a.png](https://i-blog.csdnimg.cn/blog_migrate/235f424bf6bb6575e19af834ce0b5a64.png)
04
移植rknn动态库
把sdk里面的rknn动态库移植到nfs目录下,这是我放sdk的路径:
![87785894d6860dd6390213ba4ee1f955.png](https://i-blog.csdnimg.cn/blog_migrate/d32983454881d850e19f9cb2924931b3.png)
将这个文件拷贝到/home/zhiguoxin/linux/nfs目录下,用啥方式都可以,只要拷贝过去就可以了。
05
RV1126人脸识别工程交叉编译
首先下载人脸识别源码,我下载后之后放在这里
![fae4a1c1671775ed420518e808ed6826.png](https://i-blog.csdnimg.cn/blog_migrate/464519b4deb5892a863e66509843c7ea.png)
在编译之前,我们要修改一下Makefile:
vim Makefile
这里修改成你的sdk交叉编译工具链的路径
![5d230cbd44c4fca3d8a6cc8981be3424.png](https://i-blog.csdnimg.cn/blog_migrate/a297b516bff21be1f9f358df008e4a47.png)
然后make就看可以了
make
5.1 移植人脸识别数据模型
将人脸识别数据模型拷贝至/home/zhiguoxin/linux/nfs/
cd /home/zhiguoxin/myproject/rockx_face_recognize_project_rtsp
cp rockx_data/ -rf /home/zhiguoxin/linux/nfs/
![b5fdfcd2644a23873443757addffb854.png](https://i-blog.csdnimg.cn/blog_migrate/77fe6fac838618d8580c9d29bef44551.png)
5.2 移植人脸识别可执行程序
将人脸识别编译出来的可执行程序拷贝至/home/zhiguoxin/linux/nfs/
![1effcbcdabdf3cc9257404255308cdbf.png](https://i-blog.csdnimg.cn/blog_migrate/bf10b44ae1ac61f2da29e31b98453bf0.png)
5.3 移植人脸识别插入人脸数据可执行程序
将人脸识别编译出来的插入人脸数据库可执行程序拷贝至/home/zhiguoxin/linux/nfs/
![a2cd9d8fe73b470704b6dfb4d72effdb.png](https://i-blog.csdnimg.cn/blog_migrate/e44fd962eda63aa9410114ae42b35202.png)
5.4 移植人脸识别数据库
将数据库文件face.db文件拷贝至/home/zhiguoxin/linux/nfs/
![4b9c56ede7062f52bbd96e1da736df4a.png](https://i-blog.csdnimg.cn/blog_migrate/d1566337826db4e693b90ba665ec816a.png)
06
RV1126板子的处理
6.1 挂载
在开发板的/mnt/新建一个nfs文件夹
cd /mnt/
mkdir nfs
在板子上使用nfs挂载,之后在ubuntu上的/home/zhiguoxin/linux/nfs放的文件,都会在共享在板子的/mnt/nfs目录下
mount -t nfs 192.168.100.100:/home/zhiguoxin/linux/nfs /mnt/nfs -o nolock
192.168.100.100是我虚拟机的IP地址
/home/zhiguoxin/linux/nfs是我虚拟机下的nfs目录
/mnt/nfs是板子的挂载目录
![6ddc7e8232dbb898ee656050404768e5.png](https://i-blog.csdnimg.cn/blog_migrate/445b670e7f31b53f0235e6d87d7f6de6.png)
6.2 删除原有数据库表
./sqlite3 face.db
.tables
select *from face_data_table;
delete from face_data_table;
.quit
6.3 插入人脸数据
./rkmedia_rockx_face_insert liuyao liuyao.png
./rkmedia_rockx_face_insert yangjiacheng yangjiacheng.png
![eca6154bc93077cbb5558d846d7a9b70.png](https://i-blog.csdnimg.cn/blog_migrate/546a2ccc8d55db5de4bc235758bd2bc2.png)
6.4执行程序
./rkmedia_rockx_face_rga_rtsp_main
![dfdbb1227012daa6790d619f6bde0080.png](https://i-blog.csdnimg.cn/blog_migrate/4259b274afb5a57909d7e658e402ca96.png)
ffplay –x 800 –y 400 rtsp://192.168.100.75/live/main_stream
或者使用vlc拉流
![fb2a7c80a8ec980e1250e8d52bdf19c9.png](https://i-blog.csdnimg.cn/blog_migrate/739f235c5e93b779f8c29e0dca9dfefd.png)
![d1e44cad8a3f67485fc4169a8a969c2c.png](https://i-blog.csdnimg.cn/blog_migrate/8d95633d2ee302ef17e430257d40350c.png)
-END-
往期推荐:点击图片即可跳转阅读