嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

NVIDIA Jetson Nano应用-运行OpenCV的Face Detection – 上篇

作者

张嘉钧

难度

普通

材料表

Webcam X1

NVIDIA JetsonNano X1

所需设备与系统

我们使用的设备是Jetson Nano A02,系统为官方的 JetPack 4.4.1系统

事前准备 ( 重新安装OpenCV )

开始之前请先帮我安装这个好用的第三方工具jetson_stats,可以监测Jetson 系列的设备使用状况,安装方法如下:

$ sudo -H pip install -U jetson-stats
$ sudo reboot

重开机过后可以先执行jtop来看是否能成功运行!其中 jtop可以监控实时的状况、jetson_swap可以开启swap空间、jetson_release可以查看Jetson Nano系统以及常用工具的版本等等:

$ jtop

0152_83c2427089fc432d18460f624e4b865151fefd57.png

这次的内容主要是运行OpenCV,Jetson系列的Tegra系统已经支持OpenCV 4.4.1,不过我们这次会使用到OpenCV的深度学习模块(DNN) 需要使用到CUDA,然而Tegra预设的OpenCV是没办法使用CUDA的,我们可以透过jetson_release来查看OpenCV的版本以及是否能使用CUDA ( compiled CUDA):

$ jetson_release

0242_7a96cad82345cde01ee693cea539260b7873ebb8.png

可以注意到 compiled CUDA的选项是 NO,所以我们需要耗费一点时间来重建OpenCV。

1、将 gdm3调整成 lightdm ( 可选 )

Gdm3就是常见的ubuntu接口,可以透过下列指令调整成lightdm接口,这是一个轻量化的图形化接口:

$ sudo dpkg-reconfigure gdm3

0345_15393964d6345c26bda7c710eea9965743fbe400.png

透过jtop指令可以查看两个接口的内存使用状况,在MEM的字段可以发现原本gdm3使用了大概1.1G左右的容量,转成lightdm之后变成了0.7G左右:

$ jtop

0448_da5aa470cf4ea8b52ff304ab8169574c0152da58.png

2、给Jetson Nano更多swap空间

原本的swap空间仅有2GB,但我们可以透过jetson_swap来开启swap空间:

$ sudo jetson_swap -d ~ -s 4 -a

0543_73145ba663baa646315af8c6e9bc46368808a48e.png

3.检查CUDA

原厂系统已经安装好CUDA了,不过有时候还是会发生抓不到CUDA的问题,我们可以透过nvcc来检查:

$ nvcc -V

0640_f2980d085be2603c9bbed442b4ed1338fbeb4287.png

如果找不到则需要手动新增到环境变量当中:

$ nano  ~/.bashrc

开启 bashrc后新增下列指令:

export CUDA_HOME=/usr/local/cuda-10.0/
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}bin:$PATH

存档离开并且再执行”nvcc -V”,确认是否成功。

4、安装相依套件

大部分的套件在安装Jetson系列的原厂系统后都已经打包在里面了,不过这边还是全部都列出来以防万一:

# reveal the CUDA location
$ sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf" -y
$ sudo ldconfig -y
# third-party libraries
$ sudo apt-get install build-essential cmake git unzip pkg-config -y
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev -y
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev -y
$ sudo apt-get install libgtk2.0-dev libcanberra-gtk* -y
$ sudo apt-get install python3-dev python3-numpy python3-pip -y
$ sudo apt-get install libxvidcore-dev libx264-dev libgtk-3-dev -y
$ sudo apt-get install libtbb2 libtbb-dev libdc1394-22-dev -y
$ sudo apt-get install gstreamer1.0-tools libv4l-dev v4l-utils -y
$ sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev -y
$ sudo apt-get install libavresample-dev libvorbis-dev libxine2-dev -y
$ sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev -y
$ sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev -y
$ sudo apt-get install libopenblas-dev libatlas-base-dev libblas-dev -y
$ sudo apt-get install liblapack-dev libeigen3-dev gfortran -y
$ sudo apt-get install libhdf5-dev protobuf-compiler -y
$ sudo apt-get install libprotobuf-dev libgoogle-glog-dev libgflags-dev -y

5、从来源建置OpenCV

我们可以到OpenCV Release当中去找想要的版本,可以从下图看到4.5.2跟3.4.14是OpenCV官网所推荐的,那我们就直接尝试安装最新的版本看看,因为最新版的DNN模块(深度学习)支持了更多元的神经网络层。

0747_219abc4324537aff8f5ecd663e23032875a0531e.png

a、移动到家目录并下载OpenCV来源包病解压缩:

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.2.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.2.zip
$ unzip opencv.zip && unzip opencv_contrib.zip

b、改目录名称并删除压缩文件:

$ mv opencv-4.5.2 opencv
$ mv opencv_contrib-4.5.2 opencv_contrib
# clean up the zip files
$ rm opencv.zip && rm opencv_contrib.zip

c、建立一个文件夹存放所有建构完的函式库:

$ cd ~/opencv
$ mkdir build && cd build

d、产生CMake配置档案,-D将给予特定参数,这些参数将会宣告OpenCV建构的位置、方法等等的:

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_OPENCL=OFF \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=5.3 \
-D CUDA_ARCH_PTX="" \
-D WITH_CUDNN=ON \
-D WITH_CUBLAS=ON \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_NEON=ON \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D WITH_OPENGL=ON \
-D BUILD_TIFF=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D BUILD_TESTS=OFF \
-D WITH_EIGEN=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_opencv_python3=TRUE \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=OFF ..

执行成功你将会看到与我类似的画面。

0838_dc200e98572a944dffea03e6a41434a115c7e026.png

e、进行建构,这边可以透过 -j 设定要用几个核心运行 make:

$ make -j4

0935_a9599aac0f14d7f775daa423ffe5b989119abfeb.png

f、删除旧有的OpenCV:

$ sudo rm -r /usr/include/opencv4/opencv2
$ sudo make install
$ sudo ldconfig
# cleaning (frees 300 MB)
$ make clean
$ sudo apt-get update

g、清除OpenCV 来源包:

$ sudo rm -rf ~/opencv
$ sudo rm -rf ~/opencv_contrib

h、检查OpenCV

透过jetson_release 可以注意到 complied CUDA的选项已经变成 YES了:

$ jetson_release

1051_ec4f044458b29c91b3dded146176f17dc3c72112.png

接着可以使用python3导入OpenCV看看:

$ python3 -c "import cv2;print(cv2.__version__)"

1168_3512fe35e02e58c463abca29bf8be26960cc7f29.png

7、撰写一个简单的测试程序

快速地来写一个实时影像显示的程序来检验OpenCV是否能成功运行吧!

a、新建python档案并进行编辑:

$ cd ~
$ nano cv_test.py

b、复制贴上下列程序:

import cv2
cap = cv2.VideoCapture(0) # USB CAMERA INDEX: 0
while(True):
        ret, frame = cap.read() # GET FRAME
        cv2.imshow("cv real-time capture", frame) # SHOW FRAME
        if cv2.waitKey(1)==ord('q'): # PRESS q TO EXIT
                break
cv2.destroyAllWindows()
cap.release()

c、执行程序:

$ python3 cv_test.py

OpenCV的人脸辨识

OpenCV的人脸辨识有两种方法,在3.X版本以前经常会使用Cascade Classifier,但后面开始都比较推荐使用Deep Learning来解决,OpenCV现在也都整合了各大AI框架,像是常见的TensorFlow、PyTorch、Caffe等甚至YOLO也有支持了,但看程序还是支持TensorFlow、Caffe比较多,接下来我们就来执行看看旧版常用的对象侦测Cascade Classifier以及后来追上的DNN的吧!

执行范例程序 ( Quick Reference )

我们先来快速执行一下范例程序,我们将在下一篇针对两者进行较详细的介绍

 

Cascade Classifier 辨识人脸

要执行Cascade Classifier的程序可以到刚刚重新建构OpenCV的文件夹当中寻找,执行 ~/opencv/samples/python/facedetect.py即可进行实时的人脸辨识,在原厂提供的cascade classifier模型有很多种选项可以选择,默认的是haarcascade_frontalface_alt.xml以及haarcascade_eye.xml。

1254_3342406dfc8f5a1a15597b514e3eae3c4d1e7ec5.png

我们来执行看看范例吧:

$ cd ~/opencv/samples/python/
$ python3 facedetect.py

1333_bd9ecf524331f226b01291019d222afede8a94fb.png

 

透过DNN模块辨识人脸

如果想要尝试使用Deep Neural Network ( 深度神经网络 ) 的方式可以至~/opencv/samples/dnn/ 找到相关的程序,

  1. 下载模型

首先要先下载模型,需要透过download_models.py来下载模型,我很认真的研究了一下到底要输入那些参数才能正确下载,后来发现只要输入错误的模型名称就会提示了:

$ python3 download_models.py test

1439_8c193cb4ddf6ce5181a6fcd0593da07fcec507bb.png

下载人脸辨识模型 opencv_fd至face_detector文件夹当中:

$ python3 download_models.py --save_dir face_detector/ opencv_fd

1534_f5b265bab639510065320690c4733a84032ecef5.png

2、找到对应配置文件

而这些模型使用的时候需要搭配对应的配置档案使用但是我们这次要运行的opencv_fd的配置文件已经在face_detector文件夹当中,比较需要注意的地方是不同的框架模型对应到不同的配置文件,其中Caffe的版本有两个版本可以选择:

 

Caffe

TensorFlow

Model

opencv_face_detector.caffemodel

opencv_face_detector_uint8.pb

res10_300x300_ssd_iter_140000_fp16.caffemodel

Config

deploy.prototxt

opencv_face_detector.pbtxt

3、执行人脸辨识程序

由于人脸辨识是透过对象侦测的程序来执行,所以我们执行的程序为object_detection.py,需要给予model跟config的位置:

$ python3 object_detection.py --model face_detector/opencv_face_detector_uint8.pb --config face_detector/opencv_face_detector.pbtxt

1640_e45d0975bf9472edc19e2d120e10c4c15c49e3db.png

OpenCV默认的模型是Caffe的:

$ python3 object_detection.py --model face_detector/ face_detector/opencv_face_detector.caffemodel --config face_detector/deploy.prototxt

OpenCV还提供了另外一个Caffe 模型:

$ python3 object_detection.py --model face_detector/res10_300x300_ssd_iter_140000_fp16.caffemodel --config face_detector/deploy.prototxt


可以发现其实三种的模型的效能差不多,以FPS的角度来看由快到慢分别是opencv_face_detector.caffemodel、opencv_face_detector_uint8.pb、res10_300x300_ssd_iter_140000_fp16.caffemodel,其中fp16数据精度最大所以最慢,少了0.06左右的FPS,不过准确度可以发现类似的画面他辨识度最高。

结论

恭喜各位完成OpenCV重新安装并且尝试执行过Open

0_cover1_bd9ecf524331f226b01291019d222afede8a94fb.png

CV的人脸辨识范例,接着我们将会更深入探讨一些基本原理以及API的使用。

相关文章

In OpenCV 4.x, please don't use the HAAR cascade detector to detect faces! There are better and more accurate methods

Python 使用 OpenCV、Dlib 實作即時人臉偵測程式教學

Install OpenCV 4.5 on Jetson Nano

Opencv之使用HaarCascade进行人脸检测

opencv实战3: CascadeClassifier+Haar特征进行人脸检测

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw
DesignSpark Electrical Logolinkedin