メインコンテンツまでスキップ

「RaspberryPi」タグの記事が26件件あります

全てのタグを見る

· 約8分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

ディープラーニングの本をいくつか読んだけど、いまいちピンとこない。 技術的にすごいことはわかったけど、で?って感じでした。 画像認識したかったらAmazon Rekognitionとか使えばいいんでしょ?自分でディープラーニングすることなくない?と思ってました。

手を動かすことにしました。 →上手くいかなかった。。原因をだれか、教えて!!

題材

ダイソーで秤を買いました。 メモリが200g以下になったことを検知して「もうすぐ無くなるよ!」と言えれば、何かと役に立つのではないかと考えました。

スクリーンショット (294).png

画像の取得

画像はRaspberry Pi Zero にUSBカメラ(Logicool C200)をつけて撮りました。

環境セットアップ

Raspberry Pi でカメラ https://qiita.com/suppy193/items/e9faedbc268d439bd02b を参考に、インストールとmotion.confを変更。起動はこちらの方法で行いました。

sudo motion -n

起動後、http://xxx.xxx.xxx.xxx:8080にアクセスし、以下の設定を変えました。

設定項目変更後の値
target_dir/home/pi/motion
text_right(not defined)
text_event(not defined)
snapshot_interval1

設定変更は即時反映のようです。 こうして1秒間隔で画像を取得しました。

取得した画像

秤のうえに牛乳パックをおいて、水をチョロチョロいてれるところを1秒間隔でキャプチャ。 こんな感じです。

スクリーンショット (296).png

200g以下の画像を200枚、200g以上の画像を200枚ほど用意しました。

学習

Kerasを使いました。主にこちらを参考にしました。

kerasでCNN 自分で拾った画像でやってみる https://qiita.com/haru1977/items/17833e508fe07c004119

モデルもそのまま参考にしても良かったのですが、何がなんやらわからなかったので、Kerasが予め対応している有名なモデルをそのまま使うことにしました。Googleの人が作ったものだとすごいんでしょ的な発想でMobileNetを選びました。

利用可能なモデル https://keras.io/ja/applications/

また、作ったモデルを保存しました。

Keras modelを保存するには? https://keras.io/ja/getting-started/faq/#keras-model

できたコードがこちら

0212_train.py
## coding:utf-8

from keras.applications.mobilenet import MobileNet

from keras.preprocessing import image
from keras.preprocessing.image import array_to_img, img_to_array, list_pictures, load_img
import numpy as np
from keras.utils import np_utils
from sklearn.model_selection import train_test_split

X = []
Y = []

## 対象Aの画像
for picture in list_pictures('./test0212_1_50/'):
img = img_to_array(load_img(picture, target_size=(224,224)))
X.append(img)

Y.append(0)

## 対象Bの画像
for picture in list_pictures('./test0212_2_100/'):
img = img_to_array(load_img(picture, target_size=(224,224)))
X.append(img)

Y.append(1)

## arrayに変換
X = np.asarray(X)
Y = np.asarray(Y)

## 画素値を0から1の範囲に変換
X = X.astype('float32')
X = X / 255.0

## クラスの形式を変換
Y = np_utils.to_categorical(Y, 2)

## 学習用データとテストデータ
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=111)

## MobileNetのモデルを利用
model = MobileNet(include_top=True, weights=None, classes=2)

## コンパイル
model.compile(loss='categorical_crossentropy',
optimizer='SGD',
metrics=['accuracy'])

## 学習
history = model.fit(X_train, y_train, epochs=15,
validation_data = (X_test, y_test), verbose = 1)

filepath = '0212_my_model.h5'
model.save(filepath)

学習開始!

python -m 0212_train

処理が終わるとモデルが出来上がります。

躓いた点1「ファイル名問題」

画像のファイル名に-があるとだめでした。-はファイル名に使えないってそういうもんなんでしょうか?-_に一括置換して対処しました。

ファイル名を一括置換するワンライナー https://qiita.com/goking/items/ff6ea22a4b5559d30896

ls -1 *.jpg | awk '{print;gsub(/-/,"_");print}' | xargs -n 2 mv

躓いた点2「パソコンスペック低すぎ問題」

書くのも恥ずかしいスペックのパソコンしか持ってないので、学習にすごーーーーく時間がかかりました。 正確には、時間がかかりそうだったので途中でやめました。 ちょうど見つけた以下の内容を参考にColaboratoryを使いました。するとあっという間に終わりました。すごい、GPU!!

【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935

予測

Raspberyy Pi zeroにkerasとTensorFlowをインストールしようとしましたが、pip install kerasでは時間がめっちゃかかるのとエラーになっちゃいました。調べると、ビルド済みのものがあるようなので、そちらを利用することにしました。

RasPiでKeras/TensorFlowを動かす https://qiita.com/kazunori279/items/1e23679c534a49c0e837

http://ci.tensorflow.org/view/Nightly/ にあるnightly-pi-zero-python3の成果物tensorflow-1.6.0rc0-cp34-none-any.whlを使うことにしました。

その先のインストールが結構手間取ったので、正しい手順が示せません。。

ソースはこちら

0212_predict.py
## coding:utf-8

from time import sleep

from keras.applications import mobilenet

from keras.models import load_model
from keras.preprocessing import image
from keras.preprocessing.image import img_to_array, load_img
import numpy as np
from keras.utils import np_utils

model = load_model('0212_my_model.h5', custom_objects={
'relu6': mobilenet.relu6,
'DepthwiseConv2D': mobilenet.DepthwiseConv2D})

while True:
X = []

picture = '/home/pi/motion/lastsnap.jpg'
img = img_to_array(load_img(picture, target_size=(224, 224)))
X.append(img)

X = np.asarray(X)
X = X.astype('float32')
X = X / 255.0

features = model.predict(X)

print(features)

if features[0][0] > 0.5:
print('水が減っています! (' + str(features[0][0]) + ')')
else:
print('水は十分あります! (' + str(features[0][0]) + ')')

sleep(60)

予測結果

失敗。。。 ものをおいても、置かなくても「水が減っています!」

(venv) pi@pizero:~/motion/python/project $ python -m 0212_predict
Using TensorFlow backend.
[[1.000000e+00 5.362379e-25]]
水が減っています! (1.0)
[[1.000000e+00 6.591085e-25]]
水が減っています! (1.0)
[[1.0000000e+00 6.2064603e-25]]
水が減っています! (1.0)
[[1.000000e+00 6.305497e-25]]
水が減っています! (1.0)
[[1.0000000e+00 1.2839705e-24]]
水が減っています! (1.0)

終わりに

ダイソーの秤が200g以下かどうかは、残念ながらAmazon Rekognitionではわかりません。 クラウドが提供しているものはあくまで汎用的な画像認識。 クラウドのAPIでできない画像認識/分類をしたければ、自分でモデルを作らなくちゃいけない。逆にモデルさえ作っちゃえば、世界にひとつだけの、画像認識システムができるんですね。 失敗しちゃったけど。。。

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

Firefox開発元のMozillaがIoTデバイスを管理するGatewayを公開しました。 バージョン0.3なので初公開ではないのかな? いち早く使ってみました。

公式サイト

インストール手順のブログ →インストール手順はここを参考にしました。

GitHubのWiki →インストールした後に何ができるかよくわからなかったのですが、ここに書いてあります。

用意したもの

  • Raspberry Pi Zero W
  • SDカード 4GBでいけました

インストール

  1. ここからOSイメージをダウンロード
  2. EtcherでSDカードにコピー
  3. SDカードをRaspberry Piにセット
  4. 電源オン
  5. 初回起動時にはRaspberry PiがWi-Fiのアクセスポイント(SSID:Mozilla IoT Gateway)として起動するので、パソコンをそっちのWi-Fiに接続する
  6. ホスト名はgateway.localなので、ブラウザでアクセス。
    ※私の環境(Windows 10)では上手く接続できなかったので、ipconfigしてデフォルトゲートウェイのIPアドレスに接続しました。
  7. Wi-FiルーターのSSIDが表示されるので選択、パスワードを入力。
  8. 「Connecting...」の表示になると、Raspberry Piのアクセスポイントオフになり、Wi-Fiルーター側のネットワークに接続します。
  9. パソコンをWi-Fiルーターに接続しなおし、再度gateway.localにアクセス。
  10. 外からアクセスするためのドメインxxxxx.mozilla-iot.orgが取得できるので、xxxxxの部分とメールアドレスを入力
  11. 確認メールが届くので、メール記載のURLにアクセス。
  12. ユーザーアカウントを作成する。

これで初期設定が完了です。 お気づきかとおもいますが、専用のドメインが取得できますので、これで外からもアクセスできます。

できること

機器制御

アドオンを追加することで様々な機器に対応できる仕組みになっています。バージョン0.3で用意されているアドオンは以下のものです。 残念ながら我が家には対応した機器がありません。

  • GPIO → 後述
  • Philips Hue
  • TP-Link
  • Virtual Things
  • Zigbee
  • Z-Wave

そのうちAlexaやGoogle Homeに対応するかなー。期待大。

フロアマップ

フロアマップが作れるみたいです。へー。

ルール

IFTTT的な「○○になったら××する」ができます。

GPIOでLチカしてみよう

ここの内容です。 https://github.com/mozilla-iot/wiki/wiki/Configuring-GPIO-for-use-with-the-gpio-adapter

初期状態で18番ピンに割当らてています。 上の手順に沿って、ボタンの設定をしても何も変わらず。。

Raspberry Piとスマホは同じWi-Fiに接続していますが、Wi-Fiを切ってもインターネット経由でオンオフができました。

その他

Raspberry Piにログインしたい

初期状態ではユーザーpi、パスワードraspberryです。SSHしたい場合にbootパーティションにsshファイルが必要なのも同じです。

https://github.com/mozilla-iot/wiki/wiki/Logging-into-the-Raspberry-Pi

· 約6分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

スマートホーム楽しいですね。

  1. Echo Dot購入
  2. 「天気が聞ける目覚まし」だともったいない
  3. 家電を操作したい
  4. できた!感動!!
  5. さらにスマホのAlexaアプリで外からも操作できる!!!
  6. でもAlexaアプリが使いにくい⤵⤵⤵
  7. Googleアシスタントでもできるようにしよう!!!!

ここまで来ました。

Echoからの家電操作

Echoからの家電操作は以下の投稿が参考になると思います。 Node-REDがキモです。初代Raspberry Piでも問題なく動作します。

Raspberry Pi での Node-RED 利用 https://qiita.com/minatomirai21/items/184e04bab76bee70470e

ラズベリー・パイ専用 学習リモコン基板 ADRSIRを動かす(AlexaやNode-REDも使って) https://qiita.com/michan06/items/08514e8e67960e45ff69

Amazon Echoで「○○をつけて」と言って家電を操作する https://qiita.com/machu/items/122c8403b35748bd5f4c

Amazon Echoとラズパイで、音声で照明をon/offする https://qiita.com/kikuzo/items/753b5065dde9633bda18

irMagician + Node-RED + Amazon Echo (互換機) - 設定編 https://qiita.com/ooo_6502/items/da30035e41b3dbe5391b

Googleアシスタントからの家電操作

さて、Googleアシスタントを使った家電操作について調べたところ、大きく2つの方法が見つかりました。

  • Raspberry PiをWebサーバーにしてDDNSで公開
  • Beebotteというサービスを使う

Google HomeでRaspberry Piを経由してリモコンをコントロールする https://qiita.com/from_Unknown/items/5cf452cbf0ca74c4248a

IFTTT から Raspberry Pi に指示を出す https://qiita.com/minatomirai21/items/4c4e777b43ede1e42900

LINEをトリガーに家のGoogleHomeを喋らせる https://qiita.com/ktetsuo/items/5cd3cc72f18fa885affd

ポートの開放することなく、Respberry Piに外からアクセスすると投稿している以上、ポートを開放しない縛りでいきたいのと、単純に模倣するだけでは面白くないのでBeebotteを使わずTwitterを使うことにしました。

仕組み

スマートホーム (2).png

No説明番号
1Googleアシスタントに「テレビつけて」と言う
2Googleアシスタントで「テレビつけて」を受けたら、Twitterに「テレビつけて」とツイートする②③
3Node-REDでTwitterを監視。自分のアカウントが「テレビをつけて」とつぶやいたら家電操作④⑤

簡単!ノンプログラミング!サーバーレス!マイクロサービス!

IFTTTの設定

トリガーにGoogleアシスタント、アクションにTwitterを設定したのですが、一つ問題が発生しました。 Twitterの制限で同じ内容のツイートは1回しか呟けないようです。 そこで末尾にタイムスタンプをつけて回避します。

トリガーがGoogleアシスタントのときには{{CreatedAt}}というパラメーターを付与できるのですが上手くいかなかったので以下のようにして回避しました。

Noトリガーアクション
1Googleアシスタントに「テレビつけて」Webリクエストで次のNo.2を呼ぶ
2WebhookでNo.1のリクエストを受けるTwitterに「テレビつけて{{OccurredAt}}」とツイート

Node-REDの設定

Twitter in ノードを使うことで、特定のユーザーのツイートを監視することができます。ツイートをトリガーにして、フローを作っていきます。

スクリーンショット (288).png

スクリーンショット (289).png

switchで「テレビつけて」が含まれるものだけにフィルターをかけ、execノードでテレビを付けるスクリプトを実行します。

スクリーンショット (290).png

スクリプトだけは自力で作りました。 スクリプト実行後は、「つけました」と呟くもいいですし、更にIFTTTのWebhookにリクエストするなど、もう、なんでもできます。

終わりに

ポートの開放もないですし、各サービスのアカウントを乗っ取られない限り、 比較的セキュリティも確保できるのではないでしょうか?

注意点としてはTwitterのアカウントを専用に用意しツイートを非公開にすることをオススメします。そうしないと「テレビ消します」=外出中がバレてしまいますので。

ちょっとタイムラグはありますが、実用的です。

番外編

私の朝食は食パンですが、よく買い忘れます。 上で紹介した仕組みを改良して、食パンがないときにスマホに通知が来るようにしました。 もうスマートホームではありません。スマート食パンです。

Noトリガー&アクションサービス
1家の近くのコンビニに近づいたら、Twitterに「食パンある?」と呟くIFTTT + Android Location
2Twitterの「食パンある?」つぶやきを監視し、HC-SR04(超音波距離センサー)で食パンとの距離を計測。30cm以上だったら「食パンなし」とするRaspberry Pi + HC-SR04
3食パンがないときは、Webhookを呼ぶIFTTT + Webhook
4Webhookを受けたらLINE Notifyで「食パンないよ」と通知IFTTT + LINE Notify
5食パン買い忘れない!!

スクリーンショット (292).png

次は冷蔵庫の中監視したいな。。

· 約3分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

Raspberry Pi3じゃなくてもGoogle Assistantができるみたいなので、Raspberry Pi1で試してみました。 たぶんZeroでもできると思います。 (Zero W買えませんでした)

Python全くわかりませんが、手順に沿ったらできました。 「OK Google」は対応してないのかな?

参考サイト

ハードウェア

  • Raspberry pi1
  • スピーカー … 100均で買った
  • マイク … LogicoolのWebcam C200が手元にあった

セットアップ

Install Python 3

$ sudo apt-get update
$ sudo apt-get install python3 python3-venv

作業用ディレクトリの作成

$ cd ~
$ mkdir MyGoogleHome
$ cd MyGoogleHome
$ python3 -m venv env
$ env/bin/python -m pip install --upgrade pip setuptools
$ source env/bin/activate

OAuthクライアントIDの作成とJSONファイルの入手

https://developers.google.com/assistant/sdk/prototype/getting-started-other-platforms/config-dev-project-and-account を参考に、client_secret_<client-id>.jsonを入手。

Authorization

$ pip install --upgrade google-auth-oauthlib[tool]
$ google-oauthlib-tool --client-secrets [jsonファイル] --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless

コマンド実行後、「このURLにアクセスしてね」的なメッセージが出力され、コードの入力待ち状態になります。 ブラウザでURLにアクセスし、指示に従ってコードを入手。入手したコードをターミナルに貼り付ける。

サンプルプログラムの入手

$ sudo apt-get install portaudio19-dev libffi-dev libssl-dev
$ pip install --upgrade google-assistant-sdk[samples]

おそらく、google-assistant-sdkそのものもダウンロードしてくると思われます。 結構時間かかります。。。

サンプル実行

$ googlesamples-assistant-pushtotalk
$ googlesamples-assistant-pushtotalk 
INFO:root:Connecting to embeddedassistant.googleapis.com
Press Enter to send a new request... ←エンターを入力して英語で質問開始。
INFO:root:Recording audio request.
INFO:root:End of audio request detected
INFO:root:Transcript of user request: "who is the first American President". ←自動で質問が終わったことを検知して、質問した内容が出力
INFO:root:Playing assistant response. ←音声出力
INFO:root:Finished playing assistant response.
Press Enter to send a new request... ←エンター待ちになって、繰り返す

すごーい

終わりに

英語が喋れなので、AndroidのGoogle翻訳アプリに喋ってもらいました。

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

自宅に設置したRaspberry Piに外出先からアクセスしたいことってありますよね。 でも、そのためだけにルーターのポートを解放するのも、セキュリティが心配。 そんなあなたに、VNCのクラウドサービスを紹介します。

RealVNC

https://www.realvnc.com/

スクリーンショット 2017-03-02 23.55.43.png

Wikipediaによると、オリジナルのVNCの"正統な後継ソフト"だとのこと。 Seamlessly connect devices directly or via the Cloud.とのことで、 RealVNCのアカウントを作成することで、クラウドを介してインターネット越しのVNCにアクセスすることができます。

スクリーンショット 2017-03-02 23.57.07.png

個人利用であれば、HOMEプランのアカウントが無料で作成でき、クラウド連携ができます。他にPROFESSIONALプラン、ENTERPRISEプランがあるようですので、詳しくは公式サイトを確認してください。

https://manage.realvnc.com/pricing

アカウント作成

サイト上部の「SIGN IN」から登録をすることで、アカウントが作成できます。登録自体は難しいことはないと思います。

VNCサーバー(Raspberry Pi)の設定

VNCを有効にする

raspi-configコマンドから、VNCを有効にしましょう。

アカウントの設定

Raspberry Pi右上のツールバーのところのVNCアイコンを右クリックし、Licensingを選択します。

Kobito.kGjeED.png

  1. Sign in to your RealVNC accountを選択します。
  2. そして先ほど作成したアカウント情報を設定します。
  3. Direct and cloud connectivityを選択します。

VNCクライアントの設定

Viewerのインストール

RealVNCのサイトからインストーラーをダウンロードします。 いろいろなOS向けに提供されています。

スクリーンショット 2017-03-03 6.07.53.png

インストーラーを実行してインストールします。 VNC Serverは今回は必要ないので、インストールしなくてもOKです。

スクリーンショット 2017-03-03 6.11.30.png

アカウントの設定

インストールが終わったら、起動し、アカウントの設定を行います。 これといって難しいところはないと思います。

接続

設定が終わったら、接続できることを確認してください。

おまけ

サーバー側のオプション設定に、

  • Allow Cloud connection
  • Allow direct VNC connections over TCP

の設定があります。

オプション設定はRaspberry Pi右上のツールバーのところのVNCアイコンを右クリックし、Optionsを選択すると表示されます。

Kobito.GNHoth.png

Allow direct VNC connections over TCPのチェックを外すと、5900番ポートでLISTENしなくなり、クラウド経由の方法でのみ接続できる状態となります。

  • SSHオフ
  • VNCのダイレクトコネクトオフ
  • VNCのクラウドコネクトだけオン
  • RealVNCのアカウントで二段階認証の設定をする

としておくと、Raspberry Piのセキュリティ対策として良いのではないでしょうか。