Raspberry pi をアクセスポイントに
最近の寒さはなんなんだ 体調くずれまくりである。。
で、Raspberry pi をアクセスポイントにしようという話
Wifiドングルはこいつを使用
BUFFALO 11n対応 11g/b 無線LAN子機 親機-子機デュアルモード対応モデル WLI-UC-GNM2
- 出版社/メーカー: バッファロー
- 発売日: 2011/07/30
- メディア: Personal Computers
- 購入: 198人 クリック: 5,602回
- この商品を含むブログを見る
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 が動いた
MNIST トレーニング
データセットを取得
$ cd ~/digits $ python -m digits.download_data mnist ~/mnist
データベースを作成してトレーニングを開始
トレーニングは開始できたが、絶望的に時間がかかる。
ラズパイがんばれ!とりあえず2エポックまわしたときのモデルで推論
おー、ちゃんと分類できている。すばらしい
webカメラを買った
これ
LOGICOOL ウェブカム HD画質 120万画素 C270
- 出版社/メーカー: ロジクール
- 発売日: 2010/08/20
- メディア: Personal Computers
- 購入: 21人 クリック: 267回
- この商品を含むブログ (20件) を見る
安いからある程度は気にしないつもりだけど、
未開封パッケージの外面からでも見える擦り傷ってどうなの?
新品じゃないのかしら。。
で、とりあえず 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 |
---|---|---|---|---|---|---|---|---|---|
やったことを記載しておく
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'
とにかくビルドにめちゃ時間かかったので、動きは今度確認しよう