在树莓派上优化安装OpenCV(翻译)
原文链接:Optimizing OpenCV on the Raspberry Pi - PyImageSearch
https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/
by Adrian Rosebrock on August 21, 2017 in Deep Learning, OpenCV 3, Tutorials
本教材适用于高级Raspberry Pi 用户,这些人希望在他们的 Pi中,在将OpenCV用于计算机视频和图像处理方面,挤出每一点性能。
我假设:
1. 你已经研究过我先前的Raspberry Pi + OpenCV 教材(最好是多次)。
2. 你熟悉指令行和Unix 环境。
因为这是高级教程,我不能手把手教,而是聚焦于优化方面。如果你被卡住,或是运行出错,你就要回到先前我在 PyImageSearch那里提供的教材。
当你完成本教材以后,在执行 OpenCV 和Python脚本时,你的 Raspberry Pi将有30%的速度增加。
为能学到更多你的 Raspberry Pi上的 OpenCV优化,请读此文件。
Raspberry Pi上的 OpenCV优化
几周前我展示了:“怎样在你的Raspberry Pi上配置一个深度神经网络”。其结果是满意的,对于图像分类利用GoogLeNet用时1.7秒,利用 SqueezeNet则用时0.9秒。
当然我想知道我们是否还能做得更好。
虽然我们不能在 Raspberry Pi上培训神经网络,但我们可以在Pi上配置前期培训网络--只要我们能够充分优化 Raspberry Pi(以及网络能够适合 Pi硬件的有限内存)。
本教材的其余部分,我们将讨论在OpenCV安装时会用到的优化。下面我们要有七个安装步骤。
在优化 OpenCV编辑安装后,我们将做几个快速测试,看看新安装的OpenCV是否比先前安装的版本快。
这里我的目的是展示优化的结果,事实上在Raspberry Pi 3上更快,在你自己的项目中应当毫不犹豫地加以应用。
在我的关于Raspberry Pi下的OpenCV优化研究中,我碰到Sagi Zeevi所写的极好的文章。
在文章里 Sagi推荐应用:
1、NEON
2、VFPV3
3、以及可选线程构筑块(TBB)。我不喜欢TBB,因为(1)性能增加有限(2)由于在Raspberry Pi上安装笨拙,有好多麻烦。
最重要的还是从NEON 和 VFPV3中来。
ARM NEON是对ARM处理器所做的一种优化构架扩展。它由 ARM 工程师设计专用于加快视频处理,图象处理,加速识别以及机器学习。
此优化支持Single Instruction Multiple Data (SIMD)(单指令多数据)(而不是SISD, MISD, MIMD),它描述一个构架,在那里管线中的多个处理元件在多个数据点(硬件)均按一个指令执行。
ARM工程师也构筑了VFPV3,这是一个浮点优化,进入Raspberry Pi 3中应用。这里链接的ARM页面描述了优化中所包含的特性,诸如可配置舍入模式以及非数字行为的定制缺省。
这就意味着我们的神经网络可能更快运行,因为Raspberry Pi 3上的ARM处理器有了硬件优化,从而我们可以取得4× ARM Cortex-A53, 1.2GHz处理器的优点。
我想你对此结果已经有了深刻印象,就让我们往前走,去实现优化安装OpenCV到Raspberry Pi.上。
Step #1:扩展文件系统与收回空间
对于以下教材,我们先做以下假设:
1、 你用的是新品牌货,更新安装 Raspbian Stretch。
2、你不是第一次在 Raspberry Pi上利用Python虚拟环境安装OpenCV。如果你是的话,请你研究我的introductory OpenCV install guides之一去求得解决。
3、你习惯应用指令行和 Unix环境。
4、你知道怎么调试 CMake常见错误输出(Python虚拟环境找不到,丢失 Python库等等)
又,本教材是一份高级指南,故我对所提供的指令,仅仅作一个解释,希望是中肯的。--总的说来,你在执行前应当知道这些指令是做什么的。
第一步是运行raspi-config并扩展你的文件系统。
1 $sudo raspi-config
随后重启你的Raspberry Pi。
1 $sudo reboot
从这里,删除 Wolfram Engine and LibreOffice ,能在你的 Raspberry Pi中收回 ~1GB 空间:
1 2 3 4 | $sudo apt-getpurge wolfram-engine $sudo apt-getpurge libreoffice* $sudo apt-getclean $sudo apt-getautoremove |
Step #2:安装相关件
以下指令将更新和升级一些现存的包,随后安装相关件,I/O库。以及为 OpenCV优化包:
1 2 3 4 5 6 7 8 9 | $sudo apt-getupdate&&sudo apt-getupgrade $sudo apt-getinstall build-essential cmake pkg-config $sudo apt-getinstall libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev $sudo apt-getinstall libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $sudo apt-getinstall libxvidcore-dev libx264-dev $sudo apt-getinstall libgtk2.0-dev libgtk-3-dev $sudo apt-getinstall libcanberra-gtk* $sudo apt-getinstall libatlas-base-dev gfortran $sudo apt-getinstall python2.7-dev python3-dev |
全部过程持续约5分钟。
注:我加入了libcanberra-gtk*,它获取 ARM专用 GTK 防止 GTK 报警(非出错,报警),在Raspberry Pi中运行Python + OpenCV 文本时你可能会碰到。
Step #3:下装OpenCV原码
接下来为opencv 和 opencv_contrib库下装 OpenCV原码。接着进行非归档操作。
1$cd ~
2$wget -Oopencv.ziphttps://github.com/Itseez/opencv/archive/3.3.0.zip
3$unzip opencv.zip
4$wget -Oopencv_contrib.ziphttps://github.com/Itseez/opencv_contrib
/archive/3.3.0.zip
5$unzip opencv_contrib.zip
注:你需要击以上码块工具条中的“<=>”钮,从而获取zip文档的全路径。
本博客中,我们利用OpenCV 3.3;当然,当更新的 OpenCV版本发布后你可以更新对应版本号。
Step #4:建立你的Python虚拟环境并安装NumPy
我们将利用 Python虚拟环境,用 Python做工作时这是最好的做法。
用以下指令你可以安装 pip, virtualenv, 和virtualenvwrapper。
1 2 3 4 5 | $wget https://bootstrap.pypa.io/get-pip.py $sudo python get-pip.py $sudo python3 get-pip.py $sudo pip install virtualenv virtualenvwrapper $sudo rm -rf ~/.cache/pip |
当virtualenv 和 virtualenvwrapper安装后,打开你的~/.profile文件,加以下行到文件的底部,利用你喜欢的终端基文本编辑器,如vim , emacs , 或 nano均可。
1 2 3 | # virtualenv and virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh |
从这里,重装你的~/.profile文件去改变你的现行子程序的开始。
1 | $source ~/.profile |
每次你打开一个新的终端/SSH进入Pi时你需要运行source ~/.profile,以确保你的系统变量设置正确(它们也把文件装在根目录处)。
接下来,建立 Python 3虚拟环境:
1 | $mkvirtualenv cv –ppython3 |
这里我建立一个命名为CV的Python虚拟环境,我用的是Python3(或者,你也可以用Python 2.7,只要改变 -p切换到 python2)
你可以按你个人需要命名虚拟环境,而我按PyImageSearch的标准命名惯例,利用 cv。
最后把NumPy安装到 Python 虚拟环境。
1 | $pip install numpy |
Step #5:在Raspberry Pi中编辑和安装优化后的OpenCV库。
现在我们准备编辑并安装 Raspberry Pi的优化版本。
用workon指令,确保你处于CV虚拟环境下:
1 | $workon cv |
从这里组态你的 build:
O 1 2 3 4 5 6 7 8 9 10 11 |
$cd ~/opencv-3.3.0/ $mkdirbuild $cdbuild $cmake -DCMAKE_BUILD_TYPE=RELEASE\ -DCMAKE_INSTALL_PREFIX=/usr/local\ -DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules\ -DENABLE_NEON=ON\ -DENABLE_VFPV3=ON\ -DBUILD_TESTS=OFF\ -DINSTALL_PYTHON_EXAMPLES=OFF\ -DBUILD_EXAMPLES=OFF.. |
请注意 NEON and VFPV3标记怎样被使能。
如果你用的Python2.7,你的“Python2”部分应当是这样的。
.图1:运行 CMake去为OpenCV3.3生成build文件。
从cv
virtualenv引出的Python2.7 和NumPy环境下OpenCV得到正确构建。
否则,当你对Python 3编辑 OpenCV时,检查CMake的输出的“Python 3”部分。
.在运行 CMake之后,Python 3 + NumPy在Raspberry Pi.上的CV virtualenv环境内得到正确设置。
注意 Interpreter , Libraries , numpy , and packages path 变量是怎样正确设置的。
在你开始编辑之前,我建议你加大交换空间。这能让你用四核Raspberry Pi 编辑 OpenCV而没有由于内存耗尽而引起编辑挂断。
打开你的 /etc/dphys-swapfile文件,对 CONF_SWAPSIZE变量作编辑:
1 3 4 | # set size to absolute value, leaving empty (default) then uses computed value # you most likely don't want this, unless you have an special disk situation # CONF_SWAPSIZE=100 CONF_SWAPSIZE=1024 |
注意,我加大了交换文件从 100MB to 1024MB。这是在Raspbian Stretch上具有多核情况下的 OpenCV 编辑的秘密武器。
如果你不执行这一步,你的 Pi很可能会中止。从这里,启动交换文件。
1 2 | $sudo /etc/init.d/dphys-swapfile stop $sudo /etc/init.d/dphys-swapfile start |
Note: Increasing swap size is a great way to burn out your Raspberry Pi microSD card
注:增大交换文件是耗尽你的 Raspberry Pi microSD卡的最大途径。
对闪存类存储而言,你只能执行有限的写的数量,当此卡不能维持1’和0’时就不能再写。
我们只是在短时内加大交换文件故此这不是大事。
无论如何,要保证在安装OpenCV + Python以后备份你的.img文件,以防你的卡不可预期过早死掉。在这个页面中你可以读到更多有关加大交换文件而使内存卡恶化的情况。
现在我们开始更新交接文件,开始利用全部四核编辑优化 OpenCV。
图3::对于 Raspberry Pi 3,我们的 OpenCV 3.3优化编辑成功完成。
假设编辑 OpenCV没有错误(如同以上截屏),你可以在你的 Raspberry Pi上安装你的 OpenCV优化版本:
$sudo makeinstall $sudo ldconfig |
别忘了回到 /etc/dphys-swapfile 文件并执行以下指令:
1、恢复 CONF_SWAPSIZE to 100MB.
2、重启交换服务。
Step #6:完成你的RaspberryPi上的优化OpenCV安装
如果你为 Python 3编辑了OpenCV,你应当发布以下指令去符号链接cv2.so,绑定到你的cv虚拟环境。
1 2 3 4 | $cd /usr/local/lib/python3.5/site-packages/ $sudo mvcv2.cpython-35m-arm-linux-gnueabihf.socv2.so $cd ~/.virtualenvs/cv/lib/python3.5/site-packages/ $ln -s /usr/local/lib/python3.5/site-packages/cv2.socv2.so |
记住在你分别应用Python 3.4, Python 3.5, Python 3.6情况下,应当作更新,才能获得准确的通道。
如果你用Python2.7编辑OpenCV,你就用以下指令去符号链接cv2.so文件到 cv虚拟环境下。
1 2 | $cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ $ln -s /usr/local/lib/python2.7/site-packages/cv2.socv2.so |
Step 7:测试你的优化OpenCV +Raspberry Pi安装
作为快而清晰的检测,访问虚拟环境,启动 Python核,尝试输入 OpenCV库:
1 2 3 4 5 6 7 | $source ~/.profile $workon cv $python >>>import cv2 >>>cv2.__version__ '3.3.0' >>> |
祝贺,你已经在你的 Raspberry Pi 3.上安装了优化 OpenCV 3.3。
那么,这些优化有多好呢?
在用本教材工作后,你大概好奇OpenCV + Raspberry Pi优化有多好。
考虑到我们刚刚对浮点运算所作的优化,作为测试我们要在Raspberry Pi上运行一个先期训练深度神经网络,相同于我们上周所做的工作。
作为开始,我们应用此博客的“Downloads”部分,下装我们的先期培训卷积神经网络+示例图象+分类脚本。
从这里,启动一个shell,并执行以下指令:
1 2 3 4 5 6 7 8 9 10 | $python pi_deep_learning.py --prototxt models/bvlc_googlenet.prototxt\ --model models/bvlc_googlenet.caffemodel --labels synset_words.txt\ --image images/barbershop.png [INFO]loading model... [INFO]classification took0.87173seconds [INFO]1.label: barbershop,probability: 0.78055 [INFO]2.label: barber chair,probability: 0.2194 [INFO]3.label: rocking chair,probability: 3.4663e-05 [INFO]4.label: restaurant,probability: 3.7258e-06 [INFO]5.label: hair spray,probability: 1.4715e-06 |
图4:在带有OpenCV 3.3优化安装的Raspberry Pi 3上,通过GoogLeNet运行“理发店”图象,实现48.82%增速。
这里你能看到GoogLeNet在0.87秒内归类了我们的图象,也就是从上周的1.7秒得到 48.82%的巨大改进。
再试一下SqueezeNet:
1 2 3 4 5 6 7 8 9 10 | $python pi_deep_learning.py --prototxt models/squeezenet_v1.0.prototxt\ --model models/squeezenet_v1.0.caffemodel --labels synset_words.txt\ --image images/barbershop.png [INFO]loading model... [INFO]classification took0.4777seconds [INFO]1.label: barbershop,probability: 0.80578 [INFO]2.label: barber chair,probability: 0.15124 [INFO]3.label: half track,probability: 0.0052872 [INFO]4.label: restaurant,probability: 0.0040124 [INFO]5.label: desktop computer,probability: 0.0033352 |
图5.通过 Raspberry Pi 3 上的 Squeezenet,利用我们的优化OpenCV 3.3.安装也实现性能增加。
在0.47秒内正确地将输入图象分类,这是从上周 0.9秒的另一巨大改进(47.78%)。
建立在我们所做结果的基础上,很明显,我们的 OpenCV 优化得到重大影响。
总结
在今天的博客中,我们学会了怎样优化安装Raspberry Pi上的 OpenCV。
这些优化来自更新我们的CMake 指令,让它包括 NEON and VFPV3。
在对OpenCV进行基准点测试时,能导致近30%的速度增加。
当然,当在OpenCV 3中严格运用新的dnn模块时,我们会看到会有48%的速度增加。
我希望你享受本教材并享受你的 OpenCV + Raspberry Pi!