#深度学习# 树梅派3B+(Raspberry 3B+ )安装Raspbian系统 安装Tensorflow 安装Keras 源码方式安装OpenCV踩坑排雷记录(持续更新)

intel NCS & OpenVINO 交流QQ群:608483784

1.准备阶段

1.1 硬件准备

首先 我们需要以下东西:
0.一块树梅派3B+
1.一个内存卡(速度越快越好,博主使用的三星64Gevo U4卡 写入大约30MB/s
2.一台能用的电脑(本文章所用电脑为Windows10系统)
3.显示屏 鼠标 键盘 一个好用的电源(以树梅派不提示欠压为准)

1.2 软件准备

有了硬件之后,我们需要准备以下软件(软件版本可能不同,博主不保证不同版本的可用性)
@Windows平台 需要准备:
1.解压缩软件(推荐:7-Zip)用于解压系统包".xz"文件。
2.Win32DiskImager 用于将".img"磁盘映像文件写入TF卡中。
3.DiskGenius 用于TF卡需要恢复为单分区重新写入系统时。
4.Raspbian系统包

2.系统安装与部署

<注意> 博主不温馨的提示:数据无价,在进行本章节的操作时,请务必留意每步操作是否正确。由于自己疏忽所导致的数据丢失请自行承担痛苦:)

2.1 TF卡分区

无论新旧TF卡,博主都建议使用DiskGenius将TF卡所有分区删除并重新建立分区。以避免不可预料的分区错误问题。
选择分区
清空分区
建立新分区
选择参数

最后,保存分区表,退出。

2.2 TF卡写入系统引导与系统文件

1.将TF卡格式化后,使用7-Zip将下载好的".xz"文件打开,解压缩包内的".img"磁盘映像文件。
2.打开Win32DiskImager,选择".img“磁盘映像文件,选择正确的TF磁盘盘符,点击写入按钮等待数据写入。

3.写入完成后,Windows系统可能会提示需要格式化磁盘,此时务必选择不格式化。因为写入了树梅派系统的TF卡由两个分区组成。第一个分区为Boot引导分区,可被Windows系统识别,而第二个分区为系统运行分区,此分区无法被Windows系统识别,Windows默认会提示用户格式化为Windows可识别分区。如不慎格式化,请从2.1节再来一遍:)

2.3 树梅派系统初始化

将写入了系统文件的TF卡插入树梅派TF卡槽,连接好显示屏,鼠标,键盘(缺少三个外设的操作方法不在本博客中讨论),连接电源,等待树梅派初始化开机。

<注意> 如果显示屏右上角出现黄色闪电图标,说明树梅派当前处于欠压状态,请更换优质电源与优质数据线,直至欠压图标消失。如果在欠压模式下初始化/运行系统,系统很可能会在高负载时断电重启。此情况可能会导致不可预料的系统问题。如果系统黑屏,红色电源灯断续点亮,则系统可能严重欠压导致无法正常初始化硬件,也请更换电源与数据线。

<建议> 博主推荐使用5V 2.4A的充电器作为电源,最好具备线损补偿功能。有关充电器的相关信息,建
议移步至充电头网了解详情。

稍等片刻后,图形界面出现,便可以开始树莓派的配置工作了。
树莓派激动人心的亮屏

<建议> 通过Preferences-Raspberry Pi Configuration中的Resolution选项可改变分辨率,通过Disable Overscan来去除屏幕黑边。
在这里插入图片描述

在这里插入图片描述

等待系统更新软件包以及语言包后,重启树莓派。

2.4 系统软件包更新

系统重启后,通过以下命令检查更新。

sudo apt-get update 
sudo apt-get upgrade
sudo rpi-update

2.5 *系统状态监测

为了时刻了解树莓派的工作状态,我们可以使用一个python脚本来监控树莓派的温度,CPU用量,内存用量,磁盘用量:

cd ~
touch hw_info.py

使用编辑器打开home目录下的hw_info.py,写入如下内容:

import os                                    
def getCPUtemperature():
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=","").replace("'C\n",""))                                                           
def getRAMinfo():
    p = os.popen('free')
    i = 0
    while 1:
        i = i + 1
        line = p.readline()
        if i==2:
            return(line.split()[1:4])                   
                       
def getCPUuse():
    return(str(os.popen("top -n1 | awk '/Cpu\(s\):/ {print $2}'").readline().strip()))
                                          
def getDiskSpace():
    p = os.popen("df -h /")
    i = 0
    while 1:
        i = i +1
        line = p.readline()
        if i==2:
            return(line.split()[1:5])


CPU_temp = getCPUtemperature()
CPU_usage = getCPUuse()

RAM_stats = getRAMinfo()
RAM_total = round(int(RAM_stats[0]) / 1000,1)
RAM_used = round(int(RAM_stats[1]) / 1000,1)
RAM_free = round(int(RAM_stats[2]) / 1000,1)

DISK_stats = getDiskSpace()
DISK_total = DISK_stats[0]
DISK_used = DISK_stats[1]
DISK_perc = DISK_stats[3]

if __name__ == '__main__':
    print('')
    print('CPU Temperature = '+CPU_temp)
    print('CPU Use = '+CPU_usage)
    print('')
    print('RAM Total = '+str(RAM_total)+' MB')
    print('RAM Used = '+str(RAM_used)+' MB')
    print('RAM Free = '+str(RAM_free)+' MB')
    print('')  
    print('DISK Total Space = '+str(DISK_total)+'B')
    print('DISK Used Space = '+str(DISK_used)+'B')
    print('DISK Used Percentage = '+str(DISK_perc))

保存后,在终端使用命令:

watch -n 5 python3 hw_info.py

即可在终端中获得树莓派当前状态,每5秒更新一次。
在这里插入图片描述

3.Python环境配置

<提示> 本文章所使用的Python版本为Python3.5.3

3.1 更新pip3

由于Raspbian自带的pip3为9.0.1版本,较为老旧,我们使用以下命令来更新pip3:

python3 -m pip install --upgrade pip  

<雷区> 尝试在更新完pip3后,键入命令:

pip3 list

查看是否能返回Python3已安装模块列表,如果返回错误信息:

Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'

请坐和放宽,使用以下命令:

sudo nano /usr/bin/pip3

将内容:

from pip import main
if __name__ == '__main__':
    sys.exit(main())

修改为:

from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

Ctrl+O保存 Ctrl+X退出
再次尝试:

pip3 list

出现模块列表说明修改成功。
此时 尝试键入命令:

sudo pip3 list

如果出现跟刚才相似的错误,请再次坐和放宽,并执行以下命令:

sudo visudo

将:

Defaults        env_reset

修改为:

Defaults        !env_reset

Ctrl+O保存
<雷区> 保存时记得将系统自动添加的后缀名".tmp"去掉,系统询问是否覆写,按Y确认。
Ctrl+X退出

再执行:

sudo nano  .bashrc

在文件末尾添加:

alias sudo='sudo env PATH=$PATH'

Ctrl+O保存 Ctrl+X退出
执行:

source ~/.bashrc

再次测试:

sudo pip3 list

出现模块列表,即可正常使用pip3。

3.2 卸载Numpy

<雷区> 博主在安装Keras环境的过程中,被Numpy模块卡住很久,具体表现为import numpy的时候,或者其他模块需要import numpy的时候,会ImportError:

ImportError: 
Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control).  Otherwise reinstall numpy.

Original error was: libf77blas.so.3: cannot open shared object file: No such file or directory

发生此问题的原因是Numpy版本>=1.14.0时,Numpy需要调用atlas-base库,我们现在先将旧版本的Numpy卸载,等待下一步Tensorflow将Numpy作为依赖库安装。
执行指令:

sudo pip3 uninstall numpy

卸载完成后,进行下一步安装。

3.3 安装Tensorflow

执行以下命令安装Tensorflow:

sudo pip3 install Tensorflow

安装完成后 使用python3检查是否能正常import Tensorflow

python3
>>>import tensorflow

如果出现3.2节提到的Numpy错误,请继续往下看。

3.4 解决import Numpy 缺少 libf77blas.so.3 错误

解决此问题十分简单,使用以下指令安装libatlas3-base软件包:

sudo apt-get install libatlas3-base

安装完成后,再次import Tensorflow测试是否能正常import
<问题> 如果import Tensorflow后,出现以下RuntimeWarning:

/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412
  return f(*args, **kwds)

是可以正常使用Tensorflow的(Keras例程可用,但不能保证有潜在问题发生。欢迎讨论此问题!)

3.5 安装Keras

在确认Tensorflow可用后,我们进行Keras的安装:

sudo pip3 install Keras

安装完成后,使用命令:

python3
>>>import keras

如果没有出现错误,就可以使用keras的官方例程来测试keras是否能正常工作。
Keras官方GitHub链接:https://github.com/keras-team/keras
可使用此命令下载Keras源码:

sudo git clone https://github.com/keras-team/keras.git

4.OpenCV 源码编译安装

注:本节引用博主Joeya_ICT的博客内容,原帖地址:https://blog.csdn.net/leaves_joe/article/details/67656340

4.1 下载OpenCV依赖包

安装build-essential、cmake、git和pkg-config:

sudo apt-get install build-essential cmake git pkg-config 

安装jpeg、tif、jpeg-2000、png图像工具包

sudo apt-get install libjpeg-dev 
sudo apt-get install libtiff-dev 
sudo apt-get install libjasper-dev 
sudo apt-get install libpng-dev 

安装视频I/O包

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

安装gtk2.0

sudo apt-get install libgtk2.0-dev

安装优化函数包

sudo apt-get install libatlas-base-dev gfortran

4.2 Swap扩容

<雷区> 由于OpenCV源码编译需要消耗大量的内存空间,而树莓派3B+内存容量只有1GB,不足以支持OpenCV的编译需求。Raspbian在TF卡内默认使用了100MB的空间作为Swap(虚拟内存),用于将内存里没有活跃使用的代码迁移保存,把内存空间腾给正在运行的程序使用。但这个Swap空间实际上是不足以缓存编译时产生的数据的。如果内存以及Swap分区都被装满了,就会导致树莓派死机,虽然系统仍然在运行,但毫无性能可言。所以,我们在进行编译OpenCV源码之前,先将Swap进行扩容。
我们先打开dphys-swapfile文件:

sudo nano dphys-swapfile

找到文件内容:

CONF_SWAPSIZE=100

将100更改为期望的Swap空间大小,博主使用了2048MB,即2G空间。
然后Ctrl+O保存,Ctrl+X退出。
现在重启dphys-swapfile服务:

sudo /etc/init.d/dphys-swapfile restart

现在可以使用命令确认Swap是否为更改后的大小了:

free -h

确认Swap分区扩容后,我们就可以进行下一步的编译了。

4.3 编译OpenCV源码

<建议> 由于树莓派性能限制及内存限制,编译源码可能会消耗大量时间,以及产生大量热量。请确保您的树莓派配备了稳定的电源系统与散热系统。

使用下列命令,获取OpenCV源码:

cd ~
wget -O opencv-3.4.2.zip https://github.com/Itseez/opencv/archive/3.4.2.zip
unzip opencv-3.4.2.zip
wget -O opencv_contrib-3.4.2.zip https://github.com/Itseez/opencv_contrib/archive/3.4.2.zip
unzip opencv_contrib-3.4.2.zip

在完成了源码的下载以及解压后,执行下列命令:

 cd ~
 cd opencv-3.4.2
 mkdir release
 cd release

执行完上述命令后,便在OpenCV的源码目录下新建了名为release的文件夹,此文件夹用于接下来的编译以及安装。

接下来执行以下命令:

/** CMAKE_BUILD_TYPE是编译方式
* CMAKE_INSTALL_PREFIX是安装目录
* OPENCV_EXTRA_MODULES_PATH是加载额外模块
* INSTALL_PYTHON_EXAMPLES是安装官方python例程
* BUILD_EXAMPLES是编译例程(这两个可以不加,不加编译稍微快一点点,想要C语言的例程的话,在最后一行前加参数INSTALL_C_EXAMPLES=ON \)
**/

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \
    -D CMAKE_INSTALL_PREFIX=/usr/local \
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.4.2/modules \
    -D INSTALL_PYTHON_EXAMPLES=ON \
    -D BUILD_EXAMPLES=ON ..

如果卡在download某个文件的状态,请尝试更换一个Wi-Fi网络。
如果cmake的过程中出现了错误,请检查是否完整的安装之前的依赖包。
无论何种情况导致cmake没有完整的执行完毕,请使用以下命令清空release文件夹下的内容。注意,请确认终端的当前路径是release文件夹内:

sudo rm -rf *

清空了所有文件后可重新开始cmake编译。

如果cmake成功编译了,博主建议将release复制一份备份至opencv-3.4.2文件夹下,以备接下来的make命令出错时能够恢复release文件夹内容。

接下来进行下列命令:

sudo make

对release进行make编译操作。
<注意> 这条命令会消耗相当长时间(好几小时),请确保树莓派具备良好的供电及散热,避免从头再来:)
当然,可以通过-j参数来指定make操作使用的核心数,树莓派3B+具备4个核心,即可以使用如下命令调用4个核心进行四线程同步编译:

sudo make -j 4

核多力量大嘛:)

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页