AKIBAko

自分のためのナレッジ的ブログ

Amazon de Dash

Amazon Dash Button を早速買ってみた
ピッタリほしいのは無かったのだが、ティッシュとかトイレットペーパーは必要だろうとエリエールのやつを購入

f:id:minori-san:20161206220327j:plain

Amazonアプリから Dash Button の Wi-Fi を設定し、購入可能商品の中から購入するものをいずれか一点選ぶ(複数はダメなのね)
あとはボタンを押すだけでトイレットペーパーを買いまくれるのである。やったね

f:id:minori-san:20161206220916j:plain

Raspberry pi をアクセスポイントに

最近の寒さはなんなんだ 体調くずれまくりである。。

で、Raspberry pi をアクセスポイントにしようという話

Wifiドングルはこいつを使用

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2

 

hostapd インストール

$ sudo apt-get install -y hostapd

hostapd.conf の編集
hostapd.conf を examples から展開

$ zcat /usr/share/doc/hostapd/examples/hostapd.conf.gz | sudo tee -a /etc/hostapd/hostapd.conf

で /etc/hostapd/hostapd.conf を確認して、下記の値が違ってたら修正

interface=wlan0
ssid=my-raspberry
hw_mode=g
wpa=2
wpa_passphrase=PASS
wpa_key_mgmt=WPA-PSK WPA-PSK-SHA256

/etc/network/interfaces を編集
wlan0 のネットワークを static で設定しなおし

(修正前)
:
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
:

(修正後)
:
auto wlan0
iface wlan0 inet static
hostapd /etc/hostapd/hostapd.conf
address 192.168.64.1
netmask 255.255.255.0
:

DNSMASQ インストール
DHCPサーバは、今回 dnsmasq を使うことにした

$ sudo apt-get install -y dnsmasq

/etc/dnsmasq.conf の編集
下記の値を修正する

interface=lo,wlan0
no-dhcp-interface=lo
dhcp-range=192.168.64.20,192.168.64.254,255.255.255.0,12h

IP Foward 設定

/etc/sysctl.conf で 以下をアンコメント

net.ipv4.ip_forward=1

/etc/rc.local に以下の行を追加して起動時に iptable 設定する

iptables -t nat -A POSTROUTING -s 192.168.64.0/24 ! -d 192.168.64.0/24  -j MASQUERADE

 

Raspberry pi リブート後、wlan0 がアクセスポイントとして立ち上がってたら OKAY

pi@raspberrypi:~ $ iw wlan0 info
Interface wlan0
        ifindex 3
        ssid my-raspberry
        type AP
        wiphy 0

DIGITS で MNIST リベンジ

Raspberry pi に DIGITS をインストールするというあまりにも無駄なことに頑張ってみた

DIGITS インストール

DIGITS/BuildDigits.md at master · NVIDIA/DIGITS · GitHub の手順どおりで特にエラーもなく DIGITS 起動までOK

関連ライブラリのインストール

$ sudo apt-get install --no-install-recommends git graphviz python-dev python-flask python-flaskext.wtf python-gevent python-h5py python-numpy python-pil python-pip python-protobuf python-scipy

DIGITSダウンロード

$ DIGITS_ROOT=~/digits
$ git clone https://github.com/NVIDIA/DIGITS.git $DIGITS_ROOT

Pythonパッケージをインストール

$ sudo pip install -r $DIGITS_ROOT/requirements.txt
$ sudo pip install -e $DIGITS_ROOT

DIGITS起動

$ cd ~/digits
$ ./digits-devserver

ちょっと感動。。Raspberry pi でも DIGITS が動いた f:id:minori-san:20161117000735p:plain  

MNIST トレーニング

データセットを取得

$ cd ~/digits
$ python -m digits.download_data mnist ~/mnist

データベースを作成してトレーニングを開始

f:id:minori-san:20161117001543p:plain

トレーニングは開始できたが、絶望的に時間がかかる。
ラズパイがんばれ!とりあえず2エポックまわしたときのモデルで推論

f:id:minori-san:20161117001941p:plain

f:id:minori-san:20161117001949p:plain

おー、ちゃんと分類できている。すばらしい

webカメラを買った

これ

LOGICOOL ウェブカム HD画質 120万画素 C270

LOGICOOL ウェブカム HD画質 120万画素 C270

安いからある程度は気にしないつもりだけど、
未開封パッケージの外面からでも見える擦り傷ってどうなの?
新品じゃないのかしら。。

で、とりあえず RaspberryPi での動作確認

import cv2
import sys, time

# cascade_path = "/home/pi/opencv-2.4.13/data/haarcascades_GPU/haarcascade_frontalface_alt.xml"
# cascade = cv2.CascadeClassifier(cascade_path)

cam = cv2.VideoCapture(0)
cam.set(3, 320)
cam.set(4, 240)

if cam.isOpened() is False:
        print("cannot open the device")
        sys.exit()

while True:
        ret, img = cam.read()
        if ret == False:
                continue

        # img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # facerect = cascade.detectMultiScale(img_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
        # if len(facerect) > 0:
        #       for rect in facerect:
        #               cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0,0,255), thickness=2)

        cv2.imshow("web cam", img)

        if cv2.waitKey(10) >= 0:
                break

        time.sleep(0.1)

cv2.destroyAllWindows()

顔検出とか入れてみたら死ぬほど重かったのでコメントアウト
RaspberryPi の限界を感じる

Raspberry pi で MNIST

この前トレーニングした MNIST で手書き数字を分類してみたが全然ダメ
なんでじゃー

手書き数字は以下

0.jpg 1.jpg 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 7.jpg 8.jpg 9.jpg
f:id:minori-san:20161107231839j:plain f:id:minori-san:20161107231840j:plain f:id:minori-san:20161107231841j:plain f:id:minori-san:20161107231831j:plain f:id:minori-san:20161107231832j:plain f:id:minori-san:20161107231833j:plain f:id:minori-san:20161107231834j:plain f:id:minori-san:20161107231835j:plain f:id:minori-san:20161107231836j:plain f:id:minori-san:20161107231837j:plain

 
やったことを記載しておく

meanファイルを作成

$ cd ~/caffe
$ ./build/tools/compute_image_mean examples/mnist/mnist_train_lmdb examples/mnist/mean.binaryproto

mean.binaryproto から mean.npy を作成
https://github.com/BVLC/caffe/issues/290 を参考に下記のスクリプトを作成して mean.binaryproto を mean.npy に変換する

  • ~/caffe/examples/mnist/mean_bp2npy.py
import caffe
import numpy as np
import sys

if len(sys.argv) != 3:
print "Usage: python convert_protomean.py proto.mean out.npy"
sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
data = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(data)
arr = np.array( caffe.io.blobproto_to_array(blob) )
out = arr[0]
np.save( sys.argv[2] , out )

スクリプトを実行

$ cd ~/caffe/examples/mnist
$ python mean_bp2npy.py mean.binaryproto mean.npy

mean.npy ができたので、推論してみる
~/caffe/python/classify.py を使っても良いのだろうが、python の勉強のために下記スクリプトを作成

  • ~/caffe/examples/mnist/mnist_iter.py
#!/usr/bin/python

import sys, os

prototxt = sys.argv[1]
model    = sys.argv[2]
mean     = sys.argv[3]
imgs     = ['0.jpg', '1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg', '6.jpg', '7.jpg', '8.jpg', '9.jpg']

if os.path.exists(prototxt) == False or os.path.exists(model) == False or os.path.exists(mean) == False :
    print("File does not exist")
    sys.exit()

import cv2
import caffe
import numpy as np

datas = []
net    = caffe.Classifier(prototxt, model, mean=np.load(mean), image_dims=(28,28))

for img in imgs :
    datas.append(caffe.io.load_image(img, color=False))
outdt  = net.predict(datas)

for i in range(0, len(imgs)) :
    sortdt = sorted(range(len(outdt[i])), key=lambda x:outdt[i][x], reverse=True)
    print '--------- [%s] ---------' % (imgs[i])
    for j in sortdt[0:3] :
        score = outdt[i][j]
        if score != 0 :
            print '%d.jpg - %f percent' % (j ,score*100)
    print ''

スクリプトの実行

$ cd ~/caffe/examples/mnist
$ python mnist_iter.py lenet.prototxt lenet_iter_10000.caffemodel mean.npy 

全然分類できていない
スクリプトが悪いのか、画像が悪いのか、やり方が悪いのか。。

--------- [0.jpg] ---------
5.jpg - 100.000000 percent

--------- [1.jpg] ---------
5.jpg - 100.000000 percent

--------- [2.jpg] ---------
5.jpg - 100.000000 percent

--------- [3.jpg] ---------
5.jpg - 100.000000 percent

--------- [4.jpg] ---------
5.jpg - 100.000000 percent

--------- [5.jpg] ---------
5.jpg - 100.000000 percent

--------- [6.jpg] ---------
5.jpg - 100.000000 percent

--------- [7.jpg] ---------
5.jpg - 100.000000 percent

--------- [8.jpg] ---------
5.jpg - 100.000000 percent

--------- [9.jpg] ---------
5.jpg - 100.000000 percent

学習回数も頑張って1万回しても結果変わらないし、mean を消しても結果がぼんやりするだけで全然ダメだった
トレーニング時の accuracy ってなんじゃい

Rasspberry pi で画像解析

をしたかったけど Raspberry pi メモリ 1GB だと結構厳しいみたい。。
Caffe のリファレンスモデルで推論してみたらメモリ不足で落ちてしまった

bvlc_reference_caffenet で推論

リファレンスモデルの取得

$ cd ~/caffe/models/bvlc_reference_caffenet
$ wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

リファレンスモデルで推論
画像はとりあえず Caltech101 から chair を入力。deploy.prototxt と mean.npy はデフォルトのまま

$ cd ~/caffe/python
$ python classify.py ~/101_ObjectCategories/chair/image_0010.jpg result.npy

実行結果はメモリ不足。。 やり方を考える必要がありそう

:
  File "/home/pi/caffe/python/caffe/classifier.py", line 26, in __init__
    caffe.Net.__init__(self, model_file, pretrained_file, caffe.TEST)
MemoryError

MNIST でトレーニング

mnist なら動かせるかなと思いトレーニングしてみた

mnist データの取得

$ cd ~/caffe/data/mnist
$ ./get_mnist.sh

データベースの作成

$ cd ~/caffe/examples/mnist
$ ./create_mnist.sh

solver.prototxt の編集
学習回数とかスナップショットとか回数をかなり少なく編集

net: "examples/mnist/lenet_train_test.prototxt"
test_iter: 10
test_interval: 50
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005
lr_policy: "inv"
gamma: 0.0001
power: 0.75
display: 10
max_iter: 1000
snapshot: 100
snapshot_prefix: "examples/mnist/lenet"
solver_mode: CPU

トレーニング実施

$ cd ~/caffe
$ examples/mnist/train_lenet.sh

回数かなり減らしたのにめちゃ時間がかかる。。
やってみてから気づいたが、Raspberry pi で学習する必要は全くなかった。

Iteration accuracy loss
100 0.904 0.33312
200 0.888 0.362638
300 0.974 0.0817223
400 0.99 0.0362336
500 0.975 0.0846267
600 0.943 0.158974
700 0.965 0.114721
800 0.982 0.058539
900 0.993 0.0229984
1000 0.975 0.0803299

でも、とりあえず学習はできているようだ。
あとで手書き数字で推論してみよ

RaspberryPi に Caffe

RaspberryPi で画像認識なんかをさせてみようと Caffe をいれてみた
学習は無理でもインファレンスはできるんじゃないかと。。

http://caffe.berkeleyvision.org/install_apt.html
ここを参考に Raspberry Pi で下記を実施  

  • General dependencies
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev

 

  • BLASインストール
$ sudo apt-get install libatlas-base-dev 

 

  • その他パッケージ
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

 

  • Caffe を取得
$ git clone https://github.com/BVLC/caffe.git
$ cd caffe

 

  • Caffe のビルド
    CPU_ONLY にしなければ、RaspberryPi でも GPU を使ってくれるのかな?
$ mkdir build
$ cmake ..
$ make all
$ make instll
$ make runtest

 

  • pycaffe のビルド
    python で使いたいので pycaffe をビルド
$ make pycaffe

 

  • caffe へのパス設定
$ cd ~/
$ echo 'export PYTHONPATH=~/caffe/python/:$PYTHONPATH' >> ~/.bashrc
$ source .bashrc

 

パスが設定できたところでインストール完了。 あとは python で caffe がインポートできるか確認してみる

ImportError: No module named skimage.io

skimage が無いとのこと。とりあえず apt-get でインストール

$ sudo apt-get install python-skimage

再度、caffe インポートすると、次は protobuf が無いらしい

ImportError: No module named google.protobuf.internal

protobuf も apt-get でインストールすると、やっと caffe のインポートに成功

pi@raspberrypi:~ $ python
Python 2.7.9 (default, Sep 17 2016, 20:26:04)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import caffe
>>> caffe.__version__
'1.0.0-rc3'

とにかくビルドにめちゃ時間かかったので、動きは今度確認しよう