β

[原创] 在树莓派3上使用微软ELL嵌入式学习库(4)

编码无悔 / Intent & Focused 38 阅读

转载需注明出处: https://www.codelast.com/

本文是 上一篇文章 的续文。
微软于2017年6月底发布了一个主要用于嵌入式系统(例如,树莓派,ARM Cortex-M0等)的机器学习库 ELL (Embedded Learning Library,嵌入式学习库)。
为了在树莓派上跑起来ELL的demo,需要先在PC上做大量工作,前几篇文章正是记录了这个过程中遇到的种种问题。
从本文开始,我们终于可以把工作转到树莓派上了——不枉前面克服的所有困难,这一刻,我们离成功是如此之近。
注:本文的所有操作,都是在树莓派上运行的。

在上一篇文章中,我在Ubuntu PC上已经编译出了一个 compiled_darknetReference_pi3 目录,并且把它拷贝到了树莓派上。现在要做的,就是用这个目录下的文件,编译出一个Python module(_darknetReference.so),然后就可以在树莓派上跑ELL的image classification demo了。
但是,在编译这个Python module之前,我们有一些准备工作要做——安装必需的软件。
文章来源: https://www.codelast.com/

首先,为什么要在树莓派上安装Python 3.4呢?
因为ELL提供的demo就是一个Python程序,并且它支持的Python版本是3.4。

前面的一篇文章 中,我已经在PC Ubuntu上,通过miniconda安装过了Python 3.6,并且也解释了为什么要通过conda环境来安装Python 3.6,而不是直接在系统里装。
在树莓派上,我们也是出于相同的想法,使用miniconda环境来安装Python 3.4:


wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh
chmod +x Miniconda3-latest-Linux-armv7l.sh
./Miniconda3-latest-Linux-armv7l.sh

非常简单就装好了。
注意:和前面的文章里的做法一样,在安装即将结束的时候,我允许miniconda把PATH路径添加到我的 .bashrc 文件中。

可以通过下面的方式,来激活conda环境:


source ~/.bashrc
conda create --name py34 python=3
source activate py34

文章来源: https://www.codelast.com/
在这个conda环境中安装 NumPy 和 OpenCV:


(py34)[root@alarmpi ~]# conda install numpy
(py34)[root@alarmpi ~]# conda install -c microsoft-ell opencv

这个过程基本不会有什么问题和坑。

在正式开始编译Python module之前,我们事实上还需要安装一个依赖软件:OpenBLAS,如果你是Rabpbian系统,那么通过 apt-get install 就可以安装,但不巧,我用的是Arch Linux ARM系统,没有OpenBLAS可以直接通过 pacman -S(相当于Rabpbian的 apt-get install) 安装,为此,我在Arch Linux ARM上搜了一下:


[root@alarmpi ~]# pacman -Ss blas
extra/blas 3.7.1-1
    Basic Linear Algebra Subprograms
extra/cblas 3.7.1-1
    C interface to BLAS
extra/liblastfm 1.0.9-2
    A Qt4 C++ library for the Last.fm webservices

相关的package一共就两个:blas和cblas,如果安装了cblas,会自动把blas也装上,因为cblas依赖于blas。
我到底该装哪个呢?没头绪。于是我把blas和cblas都装了,试试看后面的步骤能不能走下去吧!
(但是我想提前剧透一下,这样做后面的路是走不通的,如果不想等的话可以直接看 这个 链接里的解决方案)
文章来源: https://www.codelast.com/

除了OpenBLAS,还有其他一些依赖软件要安装,它们都是在我跑demo程序挂了之后,根据错误信息发现的,在你的树莓派上,可能你已经装过了,或者在装其他的软件时把依赖也带进去了:


pacman -S ffmpeg2.8 libpng12

还记得我们从PC上拷贝过来的 compiled_darknetReference_pi3 目录吧?现在要进到这个目录下编译了。需要特别注意的是:编译不要在miniconda环境下进行。


cd compiled_darknetReference_pi3
mkdir build
cd build
cmake ..
make

如果一切顺利,就会在build目录下编译出一个30M大的_darknetReference.so文件了。
但这个Python module能work吗?不试你是不知道的,于是跑ELL的demo来测试一下。

激活miniconda环境,把USB摄像头插到树莓派的USB接口上,然后run ELL的demo:


(py34)[root@alarmpi ~]# cd compiled_darknetReference_pi3
(py34)[root@alarmpi ~]# python compiledDarknetDemo.py

如果你的运气真的特别好,那么这个demo就能跑起来。
在这里,我要特别提一下,我的树莓派OS Arch Linux ARM是没有安装图形界面的,所以在command line下跑上面的demo,会直接报错:

(frame:12648): Gtk-WARNING **: cannot open display:

这个程序里调用了图形界面相关的功能,所以跑不起来是正常的。和PC上的demo程序一样,我对这个程序也做了 类似的改造 ,去掉GUI相关的功能,只把predict结果打印到command line。
文章来源: https://www.codelast.com/
然而就算是做了这样的改造,demo又能跑起来了吗?
我没那么好的运气。运行 python compiledDarknetDemo.py 之后还是报错:
ImportError: build/_darknetReference.so: undefined symbol: cblas_sgemm
这个问题的根本原因在于:用pacman -S cblas安装的blas不能用——前面已经提前剧透过了。这个问题的解决办法请看 这个 链接。

至此,解决了最后这个问题之后,我终于可以在树莓派上把darknet的demo跑起来了,部署ELL到树莓派上的整个过程真的太麻烦了——这主要是各种依赖软件的版本问题导致的。

在下一篇文章中,我们会简单地看一下ELL在树莓派上的实用性如何——速度以及精度等。

作者:编码无悔 / Intent & Focused
最优化之路
原文地址:[原创] 在树莓派3上使用微软ELL嵌入式学习库(4), 感谢原作者分享。

发表评论