Raspberry Pi + python + IoTデバイスで、画像処理や機械学習を始めるための環境構築手順

# はじめに

カメラや検出デバイスを使った画像処理や機械学習をラズパイとpythonで始めるために、これまで試行錯誤の上で安定化した環境構築方法をまとめておく。

手持ちのラズパイはPi2Bのため、USB接続のwi-fiモジュールを使っている。

+ [Raspberry Pi2 B](https://www.amazon.co.jp/Raspberry-%E3%83%9C%E3%83%BC%E3%83%89%EF%BC%86%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%BB%E3%83%83%E3%83%88-Physical-Computing-Lab/dp/B00TBKFAI2/ref=sr_1_1?s=computers&ie=UTF8&qid=1505617152&sr=1-1&keywords=Raspberry+Pi2+Model+B+%E3%83%9C%E3%83%BC%E3%83%89%EF%BC%86%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%BB%E3%83%83%E3%83%88+%28Standard%2C+Clear%29-Physical+Computing+Lab)
+ [PLANEX GW-USNANO2A](https://www.amazon.co.jp/%E7%84%A1%E7%B7%9ALAN%E5%AD%90%E6%A9%9F-USB%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%83%BC%E5%9E%8B-150Mbps-X10-10%E5%AF%BE%E5%BF%9C-GW-USNANO2A/dp/B00ESA34GA/ref=sr_1_1?s=computers&ie=UTF8&qid=1505617067&sr=1-1&keywords=GW-USNANO2A)

#基本環境

有線LAN接続できている前提で、基本環境を整備する。

##日本語化

```
sudo dpkg-reconfigure locales
```

CUIで以下を選択し、**了解**する。

- [x] en_GB.UTF-8 UTF-8 
- [x] ja_JP.EUC-JP EUC-JP
- [x] ja_JP.UTF-8 UTF-8

```
sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
sudo apt-get install uim uim-mozc
```

##ClamAV
raspbianにも対応したウイルス対策ソフト[ClamAV](http://www.clamav.net/)。スキャンを自動にするにはcronで実行する必要がある。

```
sudo apt-get install clamav clamdscan
```

##エディタ
emacsが好きなので、インストールする。

```
sudo apt-get install emacs
```

##ユーザ追加、グループ追加
**pi**ユーザではセキュリティが気になるので、開発用のユーザを新規作成。**NAME**にユーザ名を入力。

```
sudo adduser NAME
sudo gpasswd -a NAME sudo
sudo usermod -aG audio,video,plugdev,input,netdev,spi,i2c,gpio,dialout,cdrom NAME
```

##パーティション拡張
`raspi-config`でできるが、これは`fdisk`でやった場合の参考。大容量SDカードを使用しても有効領域が狭い状態なのを解消する。

```
df -kh
sudo fdisk /dev/mmcblk0
p
d
2
p
n
p
2
w
sudo reboot
sudo resize2fs /dev/mmcblk0p2
```

最初のpで表示した2番めのパーティションのstartアドレスを指定し、何も入力しない。（デフォルトでOK）

##NTP
時刻合わせ。

```
sudo apt-get install ntp
sudo emacs /etc/ntp.conf
```

`/etc/ntp.conf`を編集し、日本のNTPサーバに変更。

```text:/etc/ntp.conf
...
...
#server 0.debian.pool.ntp.org iburst   //コメント化
#server 1.debian.pool.ntp.org iburst   //コメント化
#server 2.debian.pool.ntp.org iburst   //コメント化
#server 3.debian.pool.ntp.org iburst   //コメント化
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
...
...
```

```
sudo service ntp restart
ntpq -p
```

##rpi-clone
SDカードのバックアップコマンド[rpi-clone](https://github.com/billw2/rpi-clone)。容量が異なるSDカードにクローンすることが可能！

```
git clone https://github.com/billw2/rpi-clone.git
cd rpi-clone
```

手順はreadmeを見るのが一番だが、一応覚書。
カードリーダをUSBポートに差して、SDカードを挿入、`fdisk`でデバイス名を確認。

```
sudo fdisk -l
```

クローンコマンドを実行し、対話的に設定を答えて実行し、しばらくすると完成。

```
sudo ./rpi-clone sda -f
```

以下のような、バックアップ用のスクリプトを作ると、いつの時点でクローンしたか、何を入力したかをログテキストで管理できる。

```bash:mkclone.scr
#!/bin/sh
dnow=`date +%Y%m%d-%H%M%S`

sudo ./rpi-clone sda -f | tee mkclone_${dnow}.log
echo '## Written install log to "mkclone_${dnow}.log"'
```

#ネットワーク

##wi-fi
**SSID**と**PWD**は自宅のものを入力して暗号化情報を生成。

```
sudo sh -c 'wpa_passphrase SSID PWD >> /etc/wpa_supplicant/wpa_supplicant.conf'
cd /etc/wpa_supplicant/
sudo cp -p wpa_supplicant.conf wpa_supplicant.conf.ORG
sudo emacs wpa_supplicant.conf
```

`/etc/wpa_supplicant/wpa_supplicant.conf`を編集。

```text:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="SSID"
        psk=???????????????????????????????????????????????????????????????
}

```

再起動すれば使えるようになる。

```
sudo /etc/init.d/networking restart
```

##固定IP
DHCPでは嫌な場合の設定。IPアドレスは一例で、**192.168.1.3**に固定する場合。

```
cd /etc/network/
sudo cp -p interfaces interfaces.ORG
sudo emacs interfaces
```

`/etc/network/interfaces`を編集。

```text:/etc/network/interfaces
source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

allow-hotplug wlan0
#iface wlan0 inet manual
iface wlan0 inet static
address 192.168.1.3
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers   192.168.1.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

**dns-nameservers   192.168.1.1    <= これがないと外部アクセスできなくなる**

再起動すれば固定IPになる。確認は`ifconfig`で。

sudo /etc/init.d/networking restart

##http
一応LAMPサーバまで仕上げておく。

```
sudo apt-get install apache2 apache2-utils
```

##mysql
一応LAMPサーバまで仕上げておく。

```
sudo apt-get install mysql-server libmysqlclient-dev
```

##PHP
一応LAMPサーバまで仕上げておく。

```
sudo apt-get install php5 phpmyadmin
```

##samba
ラズパイには基本的にリモートアクセスするので、windowsからファイルの読み書きなどができるようにしておく。

```
sudo apt-get install samba
sudo emacs /etc/samba/smb.conf
```

`/etc/samba/smb.conf`を編集。

```ini:/etc/samba/smb.conf
...
...
 [global]workgroup = YourWorkGrp 
...
...
 [homes]
browseable = no
read only = no
create mask = 0640
directory mask = 0750
...
...
```

**NAME**にはpiユーザや新規作成したユーザを入力。

```
sudo smbpasswd -a NAME
sudo /etc/init.d/samba start
```

##ftp
基本はsambaやrcpだが、ftpも入れておく。
**NAME**にはpiユーザや新規作成したユーザを入力。

```
sudo apt-get install pure-ftpd
sudo groupadd ftpgroup
sudo mkdir /home/NAME/FTP
sudo useradd ftpuser -g ftpgroup -s /sbin/nologin -d /dev/null
sudo chown -R ftpuser:ftpgroup /home/NAME/FTP
sudo pure-pw useradd upload -u ftpuser -g ftpgroup -d /home/NAME/FTP -m
sudo ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth/60puredb
```

##VNC
重くなるのであまり使わないが、一応入れておく。

```
sudo apt-get upgrade realvnc-vnc-server realvnc-vnc-viewer
```

###start VNC service
sudo systemctl start vncserver-x11-serviced.service
sudo systemctl enable vncserver-x11-serviced.service

###stop VNC service
sudo systemctl stop vncserver-x11-serviced.service
sudo systemctl disable vncserver-x11-serviced.service

#開発環境（ハード系）

IoTデバイスはI2CやSPI接続で使用する。

##I2C
これができなくては話にならない。

```
sudo apt-get install i2c-tools python-smbus
```

##fritzing
接続図作成用の神ソフト[fritzing](http://fritzing.org/home/)。ラズパイ上では使わないが、インストールはできることを確認した。

```
sudo apt-get inatall fritzing
```

#開発環境（ソフト系）

開発言語は基本的にpython3を使用する。

##subversion
使い慣れている構成管理ソフト。今どきはgitかも。。。

```
sudo apt-get install subversion
```

##doxygen
ドキュメンテーションソフト。

```
sudo apt-get install doxygen
```

##python
pythonがメインの開発言語になる。

```
sudo apt-get install python-pip python-dev
sudo apt-get install python-scipy
sudo apt-get install python-matplotlib
sudo apt-get install libopencv-dev python-opencv
sudo apt-get install python-opengl
```

あとで削除することになるが、環境確認のためopencvのバージョンをチェック。

```
python -c "import cv2.cv as cv; print(cv.__version__)"
```

##virtualenv
pythonの環境切り替え。入れてはいるがまだ使っていないため、デフォルトでpythonと打つとpython2になる。。。

```
sudo pip install virtualenv virtualenvwrapper
sudo rm -rf ~/.cache/pip
```

`~/.profile`を編集。

emacs ~/.profile

```bash:~/.profile
...
...
# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
```

.profieをsourceして反映。

```
source ~/.profile
```

###make "cv" workspace
```
mkvirtualenv cv -p python3
source ~/.profile
workon cv
```

##picamera
picameraを使用する場合は必要。

```
sudo apt-get install python-picamera python3-picamera
sudo apt-get install python-picamera-docs
```

##twitter
IoTの出力先の有力候補の一つ、twitter。pythonから情報を投げていけるよう、ライブラリを入れておく。あまたあるが、最初に引き当てた[twython](https://github.com/ryanmcgrath/twython)を選択した。

```
sudo pip install twython
sudo pip3 install twython
sudo pip install feedparser
sudo pip3 install feedparser
```

##cffi
pythonからCの関数をコールするためのインターフェースライブラリ[cffi](http://cffi.readthedocs.io/en/latest/)。ctypesでもできるが、記述のすっきりするのはこちら。

```
sudo apt-get install libffi-dev
sudo pip install cffi
sudo pip3 install cffi
sudo pip3 install smbus
```

##requests
pythonのHTTPライブラリである[requests][link-01]。クラウドにアクセスする際も、なるべく汎用なライブラリでコードを書きたいので。

[link-01]:http://requests-docs-ja.readthedocs.io/en/latest/

```
pip3 install requests
pip install requests
```

##java
何かと使いそうなので、念のため。

```
sudo apt-get install oracle-java7-jdk
```

#画像処理

##opencv3
最新系のopencvは自分でコンパイルしてインストールする。現在は3.1.0までうまくいったが、3.2.0はNGだった。

```
sudo apt-get update
sudo apt-get upgrade
```

###Remove default (old) OpenCV
```
sudo apt-get remove libopencv*
sudo apt-get autoremove
```

###Install OpenCV 3.1.0
```
sudo apt-get install build-essential cmake cmake-curses-gui pkg-config
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev libavcodec-dev libavformat-dev libswscale-dev libeigen3-dev libxvidcore-dev libx264-dev libgtk2.0-dev
sudo apt-get -y install libv4l-dev v4l-utils
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3-dev python3-numpy

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

cd opencv-3.1.0
mkdir build
cd build

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

make
sudo make install
sudo ldconfig

python3 -c "import cv2 as cv; print(cv.\_\_version\_\_)"
```

##imagemagick
画像処理、簡易画像ビューア。

```
sudo apt-get install imagemagick
```

以下のようなコマンドで、動作確認。
`convert raspberrypi.png -resize 128x64 -gravity center -background black -extent 128x64 raspberrypi.ppm`

##movie tools
ffmpegの代替。

>
ffmpeg / avconv / mencoder all replaced.
libav-tools and mpv are the updated packages in Jessie:
https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=123442
>

```
sudo apt-get install libav-tools
sudo apt-get install openshot
```

##tesseract-ocr + pyocr
日本語にも対応したOCRソフト[tesseract-ocr](https://github.com/tesseract-ocr/)。pythonから呼び出すラッパーは[pyocr](https://github.com/openpaperwork/pyocr)を選択。

```
apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
tesseract -v
wget https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-3.02.jpn.tar.gz
tar xvfz tesseract-ocr-3.02.jpn.tar.gz
cd tesseract-ocr/tessdata/
sudo cp jpn.traineddata /usr/share/tesseract-ocr/tessdata/
sudo pip install pyocr
sudo pip3 install pyocr
```

以下のように画像ファイル**IMG**を入力すると、文字が解析されてテキストファイルに保存される。

```bash:
tesseract IMG out -l jpn
cat out.txt
```



#音声処理
画像と同じく、音声も重要。

##espeak
発話コマンド。英語のみ対応。。。

```
sudo apt-get install espeak
sudo apt-get install python-espeak
sudo apt-get install python3-espeak
```

こんな感じで、日本語っぽくもしゃべれるが。。。

```sh
espeak -g 20 -w a.wav "anata ga ill"
espeak -g 20 -w w.wav "watashi ga ill"
```

##OpenJtalk
日本語を発話できる[OpenJTalk](http://open-jtalk.sp.nitech.ac.jp/index.php)。英単語がアルファベット読みになる。。。

```
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip
sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice
```

##mplayer
開発環境ではないですが、ラズパイでインターネットラジオを聴きながら開発したいので。

```
sudo apt-get install mplayer
mplayer -playlist shoutcast_???.pls
```

プレイリスト(.pls)の取得ができるインターネットラジオは、例えば[shoutcast](https://www.shoutcast.com/)がある。

#機械学習
IoTとの連携で、理解を深めていきたい領域。

##TensorFlow
最新版は[tensorflow-on-raspberry-pi](https://github.com/samjabrahams/tensorflow-on-raspberry-pi/ "tensorflow-on-raspberry-pi")をチェック。これは1.0.0の場合。

### For Python 2.7
```
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.0.0/tensorflow-1.0.0-cp27-none-linux_armv7l.whl
sudo pip install tensorflow-1.0.0-cp27-none-linux_armv7l.whl
sudo pip uninstall mock
sudo pip install mock
python -c "import tensorflow as tf; print(tf.__version__)"
```

### For Python 3.3+
```
wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.0.0/tensorflow-1.0.0-cp34-cp34m-linux_armv7l.whl
sudo pip3 install tensorflow-1.0.0-cp34-cp34m-linux_armv7l.whl
sudo pip3 uninstall mock
sudo pip3 install mock
python3 -c "import tensorflow as tf; print(tf.__version__)"
```

##keras
TensorFlowを使うなら、[keras](https://keras.io/ja/)があると非常に使いやすくなる。

```
sudo pip install keras
sudo pip3 install keras
sudo apt-get install python3-numpy
sudo apt-get install python3-scipy
sudo apt-get install python3-pandas
sudo apt-get install python3-h5py
```

場合によってはこっち（覚えてないが、pyenvを使ってた場合で、ラズパイではなくubuntuの時だったかと）。

```
pip3 install numpy
pip3 install scipy
pip3 install pandas
pip3 install h5py
pip3 install pillow
pip install numpy
pip install scipy
pip install pandas
pip install h5py
pip install pillow
```

##Mecab
形態素解析エンジン[Mecab](http://taku910.github.io/mecab/)。pythonからも使えるようにします。

```
sudo apt-get install mecab libmecab-dev mecab-ipadic-utf8 python-mecab
sudo pip3 install mecab-python3
python3 -c "import MeCab; print(MeCab.__version__)"
```

##Google Cloud SDK
日々進化している[Google Cloud Platform](https://cloud.google.com/?hl=ja)の[SDK](https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja)。ただし、pythonではこのSDKを使わずに[requests][link-01]を使った実装を目指す。


```bash
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"
echo "deb https://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get apt-transport-https
sudo apt-get update
sudo apt-get install google-cloud-sdk
```