「AI」タグアーカイブ

ロボット犬『Mini Pupperミニぷぱ』で 書道

すき 0
0

これまでミニぷパに色々な動作や機能を実装し楽しんでまいりましたが、
ついに字を書けるようになりました!

 

動作

早速 凛々しい書道スタイルをご覧ください。

 

足に筆ペンを固定していますw

 

機構

基本的には以前ロボットアームで実施した機構と同じです。

Processing で制御 ーロボットアーム自作への道3ー

 

Processingのウィンドウ上の座標をミニぷパに送信して足の平面座標(x, y)として制御します。

マウスをクリックすると足の高さを下げて筆ペンを地面に接地します。
ドラッグで線や絵を描けます。マウスがクリックされていない時は足を20mm上げてペン先を浮かせています。

 

ProcessingからのUSBシリアルはATOM Liteで直接うまく受信できなかったので
前回のAIカメラ HuskyLensの時と同様に一旦Seeeduino XIAOで受信してATOMに座標情報を送りました。

次の記事

次期モデル Mini Pupper 2 の初期サンプルを味わう

ロボット犬『Mini Pupperミニぷぱ』を AIカメラ HuskyLens で堪能

0
0

前回は9軸 IMUセンサ BNO055を用いてミニぷぱ制御を楽しみました。

ダイソー版 プラレール を改造したよ♪

 

ここでは更に AIカメラ HuskyLensを追加して ミニぷぱを賢くしちゃいます。

 

 

AIカメラ HuskyLens

HuskyLensは顔認識、物体追跡、物体認識、ライン追跡、色認識、タグ認識などの機能を有するAIカメラです。

 

 

ここではHuskyLensの設定で色認識データをI2C出力にして使用しました。

 

認識した色の座標位置でミニぷぱを制御します。

 

 

HuskyLensをミニぷぱに接続

前回製作したATOM Liteをコントローラに採用したミニぷぱにHuskyLensを接続します。

注意点

HuskyLensのI2C出力をATOM Liteに接続して素直に行きたかったのですが。。
毎度恒例の問題発生。

以下のHuskyLens Arduinoライブラリを使用してI2C通信したいのですが、ESP32には使用できませんでした。
 https://github.com/HuskyLens/HUSKYLENSArduino/tree/master/HUSKYLENS/examples/HUSKYLENS_I2C

かなりライブラリを修正しないといけない感じだったので直結は潔くあきらめて、Seeeduino XIAOで中継することにいたしました。

 

構成

 

HuskyLensとATOM Lite間にSeeeduino XIAOを挿入してI2C-Uart変換を実施しています。

 

 

部品

 

動作

赤色の横方向座標で旋回移動させてみました。

XIAOからのHuskyLensデータをATOM Liteを2コアにしてCore0で常時シリアル受信するようにして、サーボ制御との並行動作を実現しています。

 

これまで仕込んだ歩行動作なども問題なく実行できます。

 

おわりに

AIカメラ HuskyLensの追加によって ミニぷぱ がとても賢くなりました!

今回は色認識で制御していますが顔認識やライントレースなどもできそうです。

どんどん賢く 高機能になる 我が家のミニぷぱ

 

そのうちしゃべりだして立ち上がって二足歩行するかもしれませんね。

次の記事

Clock Arm 時計を自作

HuskyLens で ロボットアーム制御

0
0

前回は HuskyLens の物体追従機能を用いてお絵描きを楽しみました。

HuskyLens でお絵描き実験

今回は長らくの夢であった”画像認識でロボットアームを制御”を試してみました。

 

 

顔認識

HuskyLens の  Face Recognition (顔認識)は複数個の顔を学習し識別することが可能です。

顔の複数認識のやり方は公式ドキュメントの通りです。

 
デフォルトでは顔認識機能で特定の顔の学習・識別は1つしかできません。

Functionボタンを長押しで、Learn Multipleを選択しONしてセーブします。

 
コレで複数の顔を学習し識別することが可能となります。

学習はカメラを向けて顔が認識された際にLearningボタンを押すとIDがふられ学習されます。
再びLearningボタンを押すと次の顔の認識モードになり、同様に別の顔を認識させてLearningボタンを押しIDをふります。

認識動作

3つの顔を学習し認識できるようにしました。

 

TakamizawaをID1
KonosukeをID2
SakuraiをID3
としました。

この顔認識の中心座標3点から角度を導出して、ロボットアームを動かしてみました。
未来でしょ?

 

構成

HuskyLens で認識した3つの顔の中心座標をArduinoにシリアル伝送します。
Arduinoで3点から算出した角度でサーボを動かします。

ソフトウェアシリアルとサーボ制御が共存できなかったので
ハードウェアシリアル(D0, D1)を使用しています。

部品

ロボットアーム

以前作ったロボットアームの1軸を使用します。

Clock Arm 時計を自作

角度算出

HuskyLens で認識した3つの顔の中心座標から角度$θ$を算出します。

 

3点からなる三角形の各辺は

$$a = \sqrt{(x_1  –  x_3)^2 +(y_1  –  y_3)^2 }$$

$$b = \sqrt{(x_1  –  x_2)^2 +(y_1  –  y_2)^2 }$$

$$c = \sqrt{(x_2  –  x_3)^2 +(y_2 –  y_3)^2 }$$

余弦定理より角度$θ$は以下で算出されます。

$$θ = \cos^{-1} \left(\frac{b^2 + c^2 – a^2}{2 b c} \right) $$

 

HuskyLensで撮影するための顔画像移動治具も作成いたしました。

Arduinoコード

公式のHuskyLens  Arduinoチュートリアルを参考にプログラミングしました。

チュートリアル:Arduino Tutorial
Arduinoライブラリ:https://github.com/HuskyLens/HUSKYLENSArduino
参考サンプルコード:HUSKYLENS_GET_STARED.ino

 
 

動作

3つの顔を認識して角度を算出してロボットアームのサーボモータを動かしています。

ちょっと遅延ありますができました!

AIカメラHuskyLens によって実にインタラクティブな仕組みが簡単に実現できました。

HuskyLensは高機能なセンサとも言えますし、空間を超えたインターフェイスとも言えそうです。

これはいろんな応用ができて、むしろ出来過ぎて発散しそうです!

次の記事

Microsoft MakeCode で ビジュアルプログラミング

HuskyLens でお絵描き実験

0
0

HuskyLens の公式紹介動画にある物体追従によるエフェクト描画みたいのをやりたく実験いたしました。

 

 

構成

HuskyLens の物体追従機能で学習した物体(ここではHuskyLens君のキーホルダー)の中心座標を検出してArduinoにシリアル伝送します。

更にArduinoからProcessing へ座標を送信してパレットに描画させます。

 

Arduinoコード

公式のHuskyLens  Arduinoチュートリアルを参考にプログラミングしました。

チュートリアル:Arduino Tutorial
Arduinoライブラリ:https://github.com/HuskyLens/HUSKYLENSArduino
参考サンプルコード:HUSKYLENS_GET_STARED.ino

 
ソフトウェアシリアル(RX : D10, TX : D11)でHuskyLens からの物体中心座標を受信し、
USBシリアルでPCのProcessingに送信します。

検出される座標はHuskyLensの画像サイズと同様に320×240です。

Processingコード

Arduinoからの座標を受信してパレットに点を描画します。

参考

 

動作

いいですねぇ

物体の学習も簡単だし、シリアル出力でデータを気軽に利用できるので
これはかなり応用ができそう!

応用 (2020/6/4)

Color Recognition 機能で色を3色学習してお絵描きしてみました。

次の記事

Microsoft MakeCode で ビジュアルプログラミング

HuskyLens を MakeCodeで楽しむ

0
0

前回、味見程度ではありますが HuskyLens の動作を楽しみました。
今回はHuskyLensの沼にもう少しだけ踏み込んでみようと思います。

 

 

MakeCode

サヌキテックネットさんの記事でHuskyLensがMakeCodeでプログラミングできることがわかりました。

MakeCodeはブロックエディタやJavaScriptエディタでプログラムできるWebベースのコードエディタです。
 https://www.microsoft.com/ja-jp/makecode

micro:bitやAdafruitのCircuit Playground Express というマイコンシリーズなどに対応しています。

Microsoft MakeCode で ビジュアルプログラミング

 

前述の記事のとおりHuskyLensのブロックも用意されていますのでここでは、micro:bitと組み合わせて楽しみました。
めっちゃ便利!!

 

micro:bit(Maqueen)と連結

ここではmicro:bit用のロボットプラットフォームMaqueenとHuskyLensを連結して使用します。
付属の金具で可愛く実装できました♪

 

 

HuskyLensの4ピンコネクタとMaqueenのI2Cコネクタで結線します。

 

 

MakeCodeコーディング

まずはMakeCodeにMaqueenとHuskyLensのブロックを追加します。

micro:bitのプロジェクトを起動して”高度なブロック” ->  “拡張機能”で検索して追加します。

  • Maqueen:Maqueenと検索
  • HuskyLens:”https://github.com/tangjie133/pxt-huskylens”と入力し検索

物体追従 味見

学習した物体(HuskyLens君)を検出したら、右赤LEDを光らす。

“最初だけ”でI2C通信と物体追従モードを確立させます。

“ずっと”で物体検出したら右赤LEDを点灯させてます。

簡単すぎる。。。

物体追従 モータ駆動

対象の物体がHuskyLensの画面の中央に来るようにモータを駆動し旋回する。

物体の中心座標がx軸の中心(160)付近からずれたらモータで旋回するようにしました。

 

 

ちょっと制動が甘いですが。。。簡単にできてしましました。
モータ駆動はArduino IDEとかでまじめに制御したほうがよさそうです。
 

おわりに

HuskyLensのたぐいまれなるAI機能をI2C通信で気軽に利用することができました!

micro:bitと接続してMakeCodeで試せるのも簡単で魅力的ですね。
思い付きが簡単に実現できるので今後もいろいろ作ってみたいです。

次の記事

HuskyLens でお絵描き実験

HuskyLens をつかってみた

0
0

なんと DFRobot様よりAIカメラ HuskyLensをいただきました!
ありがとうございます!!

 
可愛いメッセージカードやキーホルダーやHuskyLens用のシリコンケースもいただきました。

 

HuskyLensは”HuskyLensの大冒険”と題して
日本での販売拡大を進めているようですので、今後入手しやすくなるのではないでしょうか。

 

 

HuskyLens

HuskyLensは顔認識、物体追跡、物体認識、ライン追跡、色認識、タグ認識などの機能を有するAIカメラです。

参考

とにかくつかってみた

電源投入ですぐに動きます。
USBマイクロケーブルを繋いで給電し起動します。

 

物体追従が機能選択ボタンで選択して、追従する物体を学習ボタンで決定するだけで実行出来てしまいました。

簡単すぎる。。学習については物体の向きや角度を変えることで更に学習され追従性度が増すとのことです。
黄色い四角で認識されているときは学習も同時に行っているようです。

顔認識

色認識

金魚の色を選択して金魚を認識することもできました。
本当に簡単!

 
 

おわりに

AIカメラ HuskyLensを提供いただき、
電源入れるだけで各種機能を簡単に利用することができました。
すごい時代だ。。。

HuskyLensには外部出力用の4ピンコネクタもあるので、
次回はマイコンと組み合わせてなにかしらしてみたいと思います。

次の記事

HuskyLens を MakeCodeで楽しむ

UnitV で金魚ステータス判別テスト ーエッジAI活用への道 15ー

0
0

金魚水槽監視システムがだいぶ形になってきまして、いよいよ本題のエッジAIの活用です。

ここではUnitVで金魚を認識してその座標から金魚のステータスを判別できるかの検証です。
金魚は寝るとプカ~っと水中で浮いているので、就寝中は座標が変化しないはずです。

それでは実験スターティン
 

 

構成

UnitVとM5StickCを4ピンケーブルで接続して、UnitVで金魚を認識して 座標をUARTでM5StickCに送ります。

M5StickCは受け取った金魚座標をWiFiでUDPブロードキャストします。

 

オリジナル金魚モデルで画像認識

金魚の認識モデルは以前に作ったお手製のものを使用します。

オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー

ファームウェアは M5StickV_Firmware_1022_beta.kfpkg を使用し、 Kflash_GUIで書き込みました。

金魚モデル(kmodelファイル)はアドレス0x600000に書き込みました。

UnitVコード(MaixPy IDE)

コードはYolo-digit-detector/micropython_code/racoon_detector.py を参考にして作成し、MaixPy IDEで書き込みました。

金魚を認識して その中心座標(x, y)をUART送信します。
画角は224×224。

 

M5StickCコード(Arduino IDE)

UnitVからの金魚座標をM5StickCで受けてUDPで送信しました。

 

実験の様子

UnitVで水槽を監視して金魚ちゃんの位置を認識します。

 
水槽の横にUnitVを配置してデータをとってみました。

座標プロット

M5StickCからUDP送信される座標(x:横、y:縦)をPCで受けてプロットいたしました。

以下、縦軸が$\sqrt{x^2+y^2}$ 横軸が時刻のグラフです。

  • 2/11 14:50~2/12 7:40

     
  • 2/12 22:48~2/13 9:36

グラフより1時~5時の間で明らかに移動量が減っており就寝していることが見て取れます。

意外とガッツリ休んでるんですねww
なんだか可愛い 😀 

おわりに

AIカメラで金魚を認識し、その座標から移動量の推移を監視して金魚の就寝が判別できそうだという結論に至りました。

次はこの移動量から就寝を検知して自動動画撮影を目指したいと思います。

ではまた!
 

参考

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

金魚水槽監視システム製作開始 ーエッジAI活用への道 14ー

0
0

さてこれまではAIカメラ UnitVを吟味してまいりましたが、
いよいよ金魚水槽監視システムの製作に取り掛かりたい思います。
 

現行のシステム

これまで はMaixduinoを用いて金魚水槽のLED照明の制御、水温/pHの測定を実施しておりました。


 

LCDに水温/pHを表示し、UDP送信してログ管理したりしておりましたが、
UDP受信やカメラ撮影映像のストリーミングができないままでおりました。

またセンサの接続にマイコンを挿入したり冗長な構成でもございました。

 

新規システム

新たなシステムでは以下のような構成としました。

  • UnitVで金魚を認識
  • ESP32:LED、温度/pHセンサ制御。UnitVからのシリアル受信。
        Webサーバとしてブラウザ表示。
  • ESP32-CAM:動画ストリーミング

UnitVで金魚認識と動画撮影を実施しようと思いましたが、速度でないので断念しました。

部品

  • AIカメラ UnitV
  • ESP-32S

  • ESP32-CAM

  • 防水温度センサ DS18B20
  • pHセンサ PH-4502C
  • フルカラーLED Neopixel (WS2812B ) 48セル

ESP32-CAM

以下を観て速攻Amazonで購入しました。安すぎる!

Arduino IDEでの設定は以下の通りです。書き込みにはUSBシリアルコンバータが必要です。

技適未取得機器を用いた実験等の特例の届出

私が購入(2020/1/18)したESP32-CAMには技適マークはついておりませんでした。

ですので、2019年11月20日よりスタートし、技適マークがなくても申請すれば180日間使用できると話題の
“技適未取得機器を用いた実験等の特例の届出”を提出してみました。

以下のサイトより届出書を作成し、最寄りの総合通信局へ郵送しました。
金曜日に郵送して、翌週の月曜日にメールにて承認されました。簡単ですね。
 https://www.tele.soumu.go.jp/j/sys/others/exp-sp/index.htm
 

あとはサンプルコードを書き込んで、ESP32-CAMのIPにアクセスするだけです。
画像サイズやホワイトバランスなど詳細設定がブラウザから実施できます。すごい!

 

現状の動作

まだUnitVによる金魚認識は導入しておりませんが、現状のシステム動作をご覧ください。

ブラウザ画面

ESP32-CAMのストリーミング画像を表示し、
水槽のLEDの輝度調整や水温/pHを表示します。

 

 

当然スマホからも閲覧・操作可能です。

今後課題

  • 水温/pHの値のブラウザ定期更新表示
  • UnitVによる金魚の位置座標の取得及びステータスジャッジ(就寝中とか)
  • ESP32-CAMの調整画面のマージ
  • データログ取得・管理

参考

LED スライダ制御

ESP32アナログ入力

ESP32 IP固定

Fritzingパーツ

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

UnitV と M5StickC で動画ストリーミングを堪能 ーエッジAI活用への道 13ー

0
0

前回はUnitVで撮影した画像をシリアルでM5StickC に転送してLCD表示いたしました。
今回はM5StickCをWebサーバにしてUnitV撮影映像をストリーミングいたしました。

 

構成

例のごとくUnitVとM5StickCをUnitVに付属された4ピンコネクタケーブルでつなぐだけです。

UnitVで撮影した映像をjpeg圧縮してM5StickCにUART転送して、
M5StickCでWiFi配信いたします。

 

参考

今回はnnnさん(@nnn112358)のツイートや記事をおおいに参考にさせていただきました。
有用な情報を公開していただき本当に感謝しかありません。

UnitVコード(MaixPy IDE)

UnitVで撮影jpeg画像(320×240)を10バイトの開始データと共にUART送信します。

JPEGの圧縮率は50%にしました。
転送ボーレートは1152000にしました。

M5StickCコード(Arduino IDE)

 ESP32のWebサーバのサンプルコードHelloServer.ino とnnnさんのサーバコードを参考にコーディングしました。

起動後、以下にアクセスで静止画と動画をweb表示します。
 http://[M5StickCのIP]/pic:静止画表示
 http://[M5StickCのIP]/stream:動画表示 

 

動作

念願のUnitVによる撮影映像をストリーミング配信することができました!

おわりに

さて、だいぶ回り道しましたがUnitVとの距離はかなり縮まったと思います。
次回からはやっとハイテク金魚水槽システムの実現に向けて検討を開始したいと思います。

それではまた

次の記事

金魚水槽監視システム製作開始 ーエッジAI活用への道 14ー

UnitV で画像シリアル転送の味見 ーエッジAI活用への道 12ー

0
0

前回よりUnitV を使用したハイテク金魚水槽システムの実現に方向転換しているこの道。
今回はUnitV で撮影した画像をシリアルでM5StickC に転送して表示してみます。

 

構成

UnitVとM5StickCをUnitVに付属された4ピンコネクタケーブルでつなぐだけです。

 

動作

早速動作をご覧ください。

撮影画像(64×160)をUARTでM5StickCに送って表示しています。FPS 3ってところでしょうか。。

あとなんか色がおかしいです。おそらく転送や受信でおかしいことをしているのでしょう。。。俺のことだし

ではコード(間違い探し)をご覧ください。

UnitVコード(MaixPy IDE)

UnitVで撮影画像(64×160)をUART送信します。demo_uart.py とdemo_camera.pyを参考にコーディングしました。

転送ボーレートは921600にしました。

参考

M5StickCコード(Arduino IDE)

 64ピクセル × 160ピクセル × 2バイトの撮影画像を受信してLCDに表示します。

参考

 

おわりに

送受信コードのどこかに問題があるために色がおかしいですが、撮影画像のビットマップUART転送は現実的ではないことを実感として得ることができました。

次回は圧縮してWiFi転送なぞを試してみたいです。

ではまた

追記

色修正 (2020/1/17)

M5StickCのLCD表示の際に色がおかしかった原因がわかりました。

M5StickCコードの23行目で2バイトの色データ生成しているのですが、
ビットシフトの時に16ビットにキャストし忘れてました。。

 

無事に色が正常に表示されるようになりました。

色修正2 (2020/1/18)

ご指摘がありました。ありがとうございます!

その通りでした。単純に()するだけで改善しました。

 

ビットシフトより足し算の方が演算の優先順位が高い!

勉強になりました。

ボーレート変更 (2020/1/18)

転送ボーレートを921600 → 1152000 (1M)にしてみました。

少し早くなったかな。

あとUnitVの撮影画像をサイズ変更して出力すると左上に偏ります。。 sensor.set_framesize や sensor.set_windowing が中央でクロップしてくれないんです。。

なんだかなぁ 🙄 
 

参考

copy() (2020/1/18)

これでカメラ中央の絵を取り扱えるようになったが、VGA取り込んでいるので当然遅い。。。

次の記事

UnitV と M5StickC で動画ストリーミングを堪能 ーエッジAI活用への道 13ー

UnitV をゲットしました! ーエッジAI活用への道 11ー

0
0

素晴らしい金魚水槽システムを目指して歩んできたこの道。
これまではSipeed Maixduino での構築を目指しておりました。

MaixduinoはK210に加えてESP32が搭載されており無敵のマイコンだと思うのですが、Pythonでのマイコン操作になれていないためどうしてもUDPでのデータ受信や映像のストリーミングができず頓挫しておりました。

そんなおりに大変良い製品の発売がM5Stack社より発表されました。

 
K210とカメラのみというシンプルなユニットのUnitVです。
画像認識はこいつに任せて、あとの機能は外部に搭載してハイテク金魚水槽システムの実現を目指すことにします。

 

UnitVの購入

初めてAliExpressでお買いモノしました。

12/6に購入して1/14に到着しました。いやー待った。お待たせし過ぎたかもしれません。
 

 

初期設定

以下を参考に各種設定しました。
 UnitV Quick Start

ファームウェアは M5StickV_Firmware_1022_beta.kfpkgKflash_GUIで書き込みました。

プログラミングは MaixPy IDE で実施するのですがバージョンはv0.2.4じゃないとうまくいかないようです。

オリジナル金魚モデルで画像認識

早速、依然作ったオリジナル金魚モデルで画像認識を試してみました。
結論から申しますと全く問題なくUnitVでも動作いたしました。

オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー

 

Maixduinoの時と同様に、作った金魚認識モデル(kmodelファイル)を書き込みます。

 

コードはYolo-digit-detector/micropython_code/racoon_detector.py を使用します。MaixPy IDEで書き込みました。

また画面方向調整のためコードに以下の挿入・変更施しました。

動作

Maixduinoと同じように動きました。
LCDはないのでMaixPy IDEの画面で動作確認しました。

 

UnitVにはNeopixelが搭載されておりますので夜間撮影時の照明となるか試してみました。

 

照明として使えそうですが、ちょっと金魚がビックリしてますねw
 

シリアル通信

今後UnitVを外部端末と接続して色々するための準備として、まずはUARTでのデータ送信を試してみました。

UnitVに付属されてきた4ピンケーブルでM5StickCに接続して通信してみました。

動作

UnitVのボタンA, Bを押すとLEDの色が変わり、UARTでデータをM5StickCに送信します。
データを受けたM5StickCはデータに応じて画面が変わります。

UnitVコード(MaixPy IDE)

UnitVでUART送信します。demo_uart.py を参考にコーディングしました。
ボタンA, Bを押すとLEDの色を変えて それぞれ文字A, Bを送信します。

M5StickCコード(Arduino IDE)

UnitVからの文字を受けてLCDの背景色を変えて、文字を表示します。

 

参考

おわりに

エッジAI活用への道はこのたび方向転換しUnitVの導入の検討を開始しました。

さてうまくいくのでしょうか?道は続きます。

ではまた

次の記事

UnitV で画像シリアル転送の味見 ーエッジAI活用への道 12ー

Maixduino で温度、pHデータをUDP送信 ーエッジAI活用への道 10ー

0
1

素晴らしき金魚水槽システムの実現を目指し、 Sipeed Maixduino で金魚水槽の 温度pH値 を取得してUDP送信し、それをブラウザ表示データベース保存までを実施しております。また水草育成促進のためにLED照射も実施しています。

データのUDP送信のご報告が抜けておりましたので、ここでさせていただきます。

 

構成

Arduinoマイコンにセンサを接続してUARTでデータをMaixduinoに送信して搭載されたESP32のWiFiでUDP送信しています。

部品

  • Sipeed Maixduino

     
  • Adafruit Metro Mini 328 – 5V 16MHz

     

  • 防水温度センサ DS18B20

     
  • pHセンサ PH-4502C

     
  • フルカラーLED Neopixel (WS2812B ) 48セル

Adafruit コード

Arduino IDEでコーディングできるマイコンのAdafruit Metro Mini 328を使用して温度とpH値、pHセンサの電圧を取得して1分おきにMaixduinoへUART送信します。

Adafruit Metro Mini 328はArduino IDEにおいてAruino UNOとして振る舞いボードライブラリのインストールなどは必要ありません。

Maixduinoコード

MicroPythonでコーディングし、MaixPy IDEで書き込みました。
MaixduinoによるUDP送信は以下のサンプルコードを参考にしております。
 https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_esp32_socket%20_udp_cli.py

Adafruit Metro Mini 328からのセンサデータをUARTで受信し、値をディスプレイ表示し、WiFiでUDP送信します。

LEDテープは急に点灯すると金魚ちゃんがビックリするとお母ちゃんに言われたので、電源投入後データ受信(1分)ごとに少しづつ輝度を上げて最終輝度に達するようにしています。

あくまで金魚ファーストです。

 

動作

水温とpHが送信されPC上でUDP送信を確認できました。
以下の動画では1秒ごとに送信してNode-REDで受信して確認しています。

おわりに

どんどん金魚水槽が理想のシステムに近づいてまいりました!引き続き頑張りましょう 🙂 

それでは次の道でお会いいましょう。

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

Sipeed Maixduino で 温度センサ DS18B20 を堪能 ーエッジAI活用への道 6ー

0
0

金魚水槽管理システムを目指しております このエッジAI活用への道。
水槽の温度やpHを測定し、画像認識によって金魚の位置も監視したいと考えております。

ここでは温度センサ DS18B20 で温度を測定して測定値をMaixduinoのディスプレイに表示するところまで試してみました。

 

 

構成

Maixduinoで直接DS18B20 を制御したかったのですが、現行ファームにはライブラリがないため断念しました。Arduinoマイコンを介してUARTで温度を取得するようしました。

部品

  • Sipeed Maixduino

     
  • Adafruit Metro Mini 328 – 5V 16MHz

     

  • 防水温度センサ DS18B20

    この温度センサについては以下もご参照ください。

温度センサ で 水温計 作製

 

Adafruit Metro Miniコード

Arduino IDEでコーディングできるマイコンのAdafruit Metro Mini 328を使用して温度センサのデータを取得してMaixduinoへUART送信します。

Adafruit Metro Mini 328はArduino IDEにおいてAruino UNOとして振る舞いボードライブラリのインストールなどは必要ありません。

温度を測って1秒おきにUART送信しています。

Maixduino UART受信

Adafruit Metro Mini 328からの温度データをUARTで受信します。
MicroPythonでコーディングし、MaixPy IDEで書き込みました。

D2ピンでUART受信して値をディスプレイに表示します。

UART受信コードはトラ技2019年11月号のRISC-V特集の第4章が非常に参考になりました。

参考

 

動作

温度センサの値をMaixduinoのディスプレイに表示させています。

 

おわりに

マイコンを介してですが温度センサの値がMaixduinoで取得できるようになりました。金魚水槽の水温を監視しロギングできるようにしたいと考えております。

さてそろそろMaixduinoに搭載されているESP32を使用してwebとの連携も試していかないといけませんねぇ。

それでは次の道でお会いしましょう!

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

Sipeed Maixduino で Neopixel を堪能 ーエッジAI活用への道 5ー

0
0

さて素晴らしき金魚水槽管理システムを目指してスタートした、このエッジAI活用への道。
目指すシステムは以下の通りでございます。

 

5回目の今回はSipeed MaixduinoでフルカラーLED Neopixelの制御を試してみました。
MicroPythonでNeopixelを動かすのは初めてございます。

 

 

構成

部品

  • Sipeed Maixduino

     
  • フルカラーLED Neopixel (WS2812B )

MicroPythonコード

準備

Maixduinoを用いてNeopixel (WS2812B)をMicroPythonで用いるために、kflash_guiでファームウェアを書き込みます。

ファームは現時点(2019/10/31)で最新の maixpy_v0.4.0_13_ga40842f.bin を書き込みました。古いファームですとWS2812B用ライブラリが追加されていなかったりするのでお気を付けください。

コード

Neopixel制御用のサンプルコード ws2812.py を参考にコーディングしました。MaixPy IDEで書き込みました。

2行目の from board import board_info を追加しないとエラーが出ました。

NeopixelのデータピンをD4ピンとして、徐々に輝度を増減させて赤く点滅するコードとなっております。Neopixelのセル数は6個で動作させました。

参考

動作

無事にMaixduinoを用いて MicroPythonでのNeopixel制御ができました!

 

金魚水槽用照明への応用

Neopixelを制御できるようになったので早速 金魚水槽の照明にしてみました。

コード

LEDを白色に光らせています。LCDディスプレイはOFFしています。

参考

おわりに

ここでは素晴らしき金魚水槽管理システムを目指して水槽用照明をNeopixelで作製しました。
キレイ 🙂 ♪ これで水草の成長も促進されると嬉しいなぁ。

今後は時刻や遠隔操作よる照明のON/OFFを実現したいと考えております。

それでは次の道でお会いいましょう。

次の記事

Sipeed Maixduino で 温度センサ DS18B20 を堪能 ーエッジAI活用への道 6ー

Sipeed Maixduino を Arduino IDE で味見 ーエッジAI活用への道 4ー

0
0

さてこれまでは金魚の認識を目指してオリジナルの認識用モデルをつくってMaixPy IDEでMaixduinoに書き込んで認識動作を確認いたしました。

MaixduinoはArduino IDEでもコーディングできるとのことで今回はArduinoサンプルコードを試してみました。

今後Maixduinoにセンサなども接続して画像認識と連動などもしたいと考えており、慣れ親しんだArduino IDEでも設計できれば最高と思った次第です。

 

Arduino IDEの導入

以下を参考にArduino IDEにMAixボード用のライブラリをインストールします。
 https://maixduino.sipeed.com/en/get_started/install.html
 

2019年10月現在ライブラリのバージョンは0.3.10でした。

なお、Aduono IDE のバージョンは1.8.10だとMaixduinoに搭載したSDカードが認識出来ませんでした。めっちゃハマりました。。。(´;ω;`)ウゥゥ

1.8.9では問題なく動作しました!!

 

ボード設定は以下のようにいたします。

物体認識サンプル

スケッチ例の物体認識 mobilenet_v1.ino を試してみました。
 スケッチ例 → Maix_KPU → mobilenet_v1

コードの説明にもあるように認識モデルをSDカードに保存してMaixduinoに搭載する必要があります。

mobilenet_0x300000.kfpkgをDLして解凍しm.kmodelをmというファイルに名前変更してSDに保存します。

動作

なんかたくさん文字が出て色々認識してくれてます。1000クラスの認識モデルのようです。ちょっと驚いたのがキーボードのスペースキーまで認識してますね。

さて例のごとくコードの意味は全くよくわからないのですが。SDカードのモデル(m)を前回作成した金魚モデルにしてみたのですが金魚が認識されるようにはなりませんでした。いずれもmobilenet形式なのでいけると思ったのですが甘かったです。

ちゃんと勉強しないと。。。しかしここからオリジナルの認識モデルを導入できるようにするのはつらい感じがします。なんとなく。。。
 

音声認識サンプル

物体認識はいまのところ残念な結果でしたが、驚いたのは音声認識サンプルコードです。MaixduinoにはMEMSマイクが搭載されています。

スケッチ例の voice_control_led_en.ino です。

モデルにはred, green, blue, turn offの4つの発話があり、それぞれ配列パターンが4つづつ入っておりました。発話認識でGPIOピンを制御してLEDを点灯させています。

中国語のサンプルもありましたよ。

 

もっとすごいのが発話の配列パターン録音用のサンプルもあることです。get_voice_model.ino をMaixduinoに書き込んで発話パターンを録音します。パターンを先ほどの音声認識サンプルに貼り付ければオリジナルの音声認識コードが書けてしまうのです。

早速、「赤」、「緑」、「青」、「消して」を4回ずつ録音して先ほどの英語のコードのモデルの配列を入れ替えてみました。

できたー!いやーこれは可能性広がりそう。たった4個のデータでどうやってるんだろう?これが転移学習というヤツなのでしょうか?
 

 

おわりに

Arduinoのサンプルコードでサクッとオリジナル認識モデル動くかと期待したのですが難しそうです。やはりMaixPy IDEで開発がよさそうな気が来ております。

ちょうどトランジスタ技術 2019年11月号がK210マイコン特集でMAixボードのGPIOやUARTの使用法が記載されていたのです♪

それでは道はまだまだ続きます!

次の記事

Sipeed Maixduino で Neopixel を堪能 ーエッジAI活用への道 5ー

オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー

0
0

さて前回アライグマの画像データサンプル を用いてMaixduino用の画像認識モデルを製作する手順を学び紹介させていただきました。

ここでは金魚の画像を元に認識モデルを生成して我が家の金魚ちゃんのMaxduinoのカメラでのリアルタイム認識を目指します。

手順としましては前回のアライグマの画像を金魚にしてラベリングし同様に学習しただけですが、改めて順にご説明させていただきます。
 

 

金魚画像の準備

我が家のカワイイ金魚(和金)の認識を目指して認識用モデルを作るべく学習用の画像を準備します。赤い和金の画像をGoogleで40個、自分で撮影したものを173個の計213画像 用意しました。

画像のラベリング(アノテーション)

画像の学習には教師データが必要となります。今回は金魚しか認識しませんのでクラスをgoldfishとして画像の一つ一つにどこに金魚がいるかをラベル付けする必要があります。深層学習などではラベル付けをアノテーション作業というようです。

アノテーションはアライグマの画像データサンプル にならってPascal VOC形式(xml)で行います。

ここではアノテーション作業に非常に有用なソフト LabelImg を使用しました。

Virtual Box上のUbuntuにLabelImgをインストールしました。Python3とGUIソフトのQt5を使用します。

LabelImgの使い方

LabelImgを起動し”Open Dir”で画像が保存先を指定し、”Change Save Dir”でアノテーションデータ保存先を指定します。Use default labelにチェックを入れてモデルのクラス名(goldfish)を記載しておくと便利です。

 

“Create\nRectBox”をクリックして画像をドラッグして金魚の場所を指定します。

 

“Save”で以下のようなPascal VOC形式のアノテーションデータが生成されます。

これをすべての画像に対して実施します。かなり大変ですね。。。。今回は金魚だけ認識するので1クラスで十分ですがいろんなものを識別するモデルを生成するには膨大なデータと手間が必要となりますね。

AIは人間の仕事を奪うといいますが、逆に増やしてはいやしないか。。。とすら思いました。

 

 

学習

アライグマの時同様に以下の学習用プロジェクトデータに画像とアノテーションデータをコピーして学習します。
 https://github.com/AIWintermuteAI/Yolo-digit-detector

configsフォルダに学習設定jsonファイルを作成します。

正直この辺の値や正確な意味はよくわかってないです。。。随時理解したら追記したいと思います。

actual_epoch:全体の学習回数
train_image_folder:学習する画像のパス
train_annot_folder:学習画像データのアノテーションデータのパス
train_times:学習サイクル
valid_image_folder、valid_annot_folder:検証用のデータのパス
 ここをカラにすると学習用のデータからランダムに2割のデータを検証用
 として学習されます。
valid_times:検証回数
batch_size:?
learning_rate:?
saved_folder:?
first_trainable_layer:?
jitter:?
is_only_detect:?

どうしたら効率よく良いモデルができるのかこの辺の設定が要だと思うのですが、じっくり勉強します。

学習開始-モデル生成

以下で設定した条件での学習がスタートします。深層学習ライブラリ Keras + TensorFlowで学習しているようです。

python train.py -c configs/goldfish.json 

学習が終了すると、model.tfliteというモデルファイルが生成されます。

学習モデルの変換

生成されたモデルmodel.tflite をMaixduinoでも利用できる.kmodelファイルに変換します。

変換にはSipeed社の提供するMaix Toolboxを使用します。以下をDLします。
 https://github.com/sipeed/Maix_Toolbox

DLし展開したら、まず以下を実施して環境を構築します。

bash get_nncase.sh 

実行後に生成されるimagesフォルダには入力サイズである224 x 224の画像をいくつか入れておきます。これをしないと変換時にエラーがでます。
 https://bbs.sipeed.com/t/topic/569/7

先ほど生成したモデル model.tflite をMaix Toolboxに入れて以下実施で変換開始します。

./tflite2kmodel.sh model.tflite 

以上でK210用のmodel.kmodelファイルが生成されました。

ファーム、モデル書き込み

kflash_guiでファームと.kmodelファイルをMaixduinoに書き込みます。

ファームは maixpy_v0.4.0_13_ga40842f.bin を書き込みました。学習モデルmodel.kmodelはアドレス0x600000に書き込みました。

Micropythonコード

コードはYolo-digit-detector/micropython_code/racoon_detector.py を使用します。MaixPy IDEで書き込みました。

また画面方向調整のためコードに以下の挿入・変更施しました。

 
 

動作

40画像

Googleで和金を検索して40個の画像を取得してモデル生成しました。

静止画の金魚は認識できましたが水槽の動く金魚の認識はできませんでした。

95画像

水槽の金魚の写真を55枚追加しました。

水槽の金魚も何となく認識できるようになってきました。

175画像

更に水槽の金魚の写真を追加

いい感じいい感じ♪

213画像

更に更に水槽の金魚の写真を追加

完ぺきではないけど大分いいですね。オリジナルの金魚認識モデル生成ができました!

この金魚認識でなのをするかはまた違うお話。
是非またいらしてください。この道へ

246画像(2019/10/16追記)

もう少し我が家の金魚ちゃんたちの写真を増やして、さらに学習時の検証回数”valid_times”を1から3に増やしました。

ほぼ完ぺきに認識しだした。。。やったー!

参考

追記

2020/1/16

Yolo-digit-detectorやMaix Toolboxに更新があるとのことでここで紹介した手法だと現在(2020年1月)エラーがでるようです。
紅樹タカオさん が解決してくれていますので是非ご参照ください。

M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

K210 物体認識モデルの生成 ーエッジAI活用への道 2ー

0
0

ハイエンドな金魚水槽システムの実現を目指して前回より始まりました エッジAI活用への道。今回は金魚の認識を目指して、まずはオリジナルの物体認識モデルの生成方法について調べました。

 

 

Maixduinoによる物体認識

前回はMaixduinoで顔認証まで試しましたが、20種ほどの物体を認識できるサンプルコードもありました。
 https://bbs.sipeed.com/t/topic/683

tiny-yolo v2というディープラーニングアルゴリズムを用いているようで 鳥、人、車など20種類の物体を認識できるモデルとK210用コードが公開されてございます。

残念ながら魚は認識できません。認識モデル作成が必須ですね。

認識モデルの生成調査

ところで認識モデルってどうやってつくるの?サンプルコード動かすだけでもヒーヒー言ってるのに。。。

ネット検索してもK210向けの生成方法が一連の流れで記載されているものは見つけられず、エラーで動かないなどの記事が目立ちました。

そんなときグッドタイミングである記事が投稿されました。

https://www.hackster.io/dmitrywat/object-detection-with-sipeed-maix-boards-kendryte-k210-421d55

アライグマの画像(200枚)を用いて学習しK210向けの認識モデルを生成しておりました。まさにやりたいこと!セレンディピティね!

ここではこの記事に従いアライグマ認識モデルの生成手順について説明いたします。かなり格闘しました。。。尚、深層学習に関する詳しい内容は全く理解しておりません。あしからず。

アライグマ認識モデルの生成

公開されている記事やソースを用いてアライグマ認識モデルの生成します。また学習により生成されたモデルをK210用に変換してMaxduinoに書き込んで実動作検証も致しました。

Ubuntuの導入

Win10でもモデル生成はできるようですが、モデル変換ツールがLinux向けでしたのでVirtual BoxでUbuntuを導入しました。

以下の記事のとおりにVirtualBox 5.2.32とUbuntu 18.04.01をインストールしました。

学習環境の構築

環境構築にはMinicondaというAnacondaの最小版インストーラを用いました。以下で各OS インストールできます。
 https://docs.conda.io/en/latest/miniconda.html

随時必要なものをインストールします。

プロジェクトデータを以下よりDLして所定の場所に展開します。
 https://github.com/AIWintermuteAI/Yolo-digit-detector

展開したYolo-digit-detectorフォルダに移動して以下を実施

conda create -n yolo python=3.6

conda activate yolo 

必要なパッケージをインストールするためにパッケージ一覧のテキスト requirements.txt をフォルダ内に作成します。

そして、以下実施で各パッケージがインストールされます。

pip install -r requirements.txt

pip install -e .

以上で学習環境が整いました。

深層学習

アライグマの画像を準備しいよいよ学習しモデルを生成します。

以下の画像データフォルダをDLしてYolo-digit-detectorフォルダに展開します。
 https://github.com/datitran/raccoon_dataset

以下の実施で学習がスタートします。

python train.py -c configs/raccoon.json 

Kerasという深層学習ライブラリをしようしているらしいです。画像入力サイズは224 x 224。その他の設定などはよく理解できておりません。。。

学習モデルの変換

学習が終わるとmodel.h5とmodel.tfliteというモデルファイルが生成されます。これをMaixduinoでも利用できる.kmodelファイルに変換します。

変換にはSipeed社の提供するMaix Toolboxを使用します。以下をDLします。
 https://github.com/sipeed/Maix_Toolbox

DLし展開したら、まず以下を実施して環境を構築します。

bash get_nncase.sh 

実行後に生成されるimagesフォルダには入力サイズである224 x 224の画像をいくつか入れておきます。これをしないと変換時にエラーがでます。
 https://bbs.sipeed.com/t/topic/569/7

先ほど生成したモデル model.tflite をMaix Toolboxに入れて以下実施で変換開始します。

./tflite2kmodel.sh model.tflite 

以上でK210用のmodel.kmodelファイルが生成されました。
 


 

アライグマ認識モデルの動作

ファーム、モデル書き込み

kflash_guiでファームと.kmodelファイルをMaixduinoに書き込みます。

ファームは maixpy_v0.4.0_13_ga40842f.bin を書き込みました。学習モデルmodel.kmodelはアドレス0x600000に書き込みました。

Micropythonコード

コードはYolo-digit-detector/micropython_code/racoon_detector.py を使用します。MaixPy IDEで書き込みました。

また画面方向調整のためコードに以下の挿入・変更施しました。

動作

完璧な動作ではないですがアライグマを認識できました!!!

 

あとは金魚画像をあつめてモデル生成できるかですね! 😀 
地雷たくさんありそうですが。。。

参考

追記

2020/1/16

Yolo-digit-detectorやMaix Toolboxに更新があるとのことでここで紹介した手法だと現在(2020年1月)エラーがでるようです。
紅樹タカオさん が解決してくれていますので是非ご参照ください。

M5StickVやUnitVで使えるkmodelファイルをローカル環境で作成する。

次の記事

金魚水槽のフィルターをブクブクから外掛けフィルターへグレードアップ

Sipeed Maixduino を購入 ーエッジAI活用への道 1ー

0
0

我が家でもエッジAIなるものを活用してみたくSipeed Maixduinoというものを購入してみました。

ここではMaixduinoの初期設定から開発環境の導入までを記載いたします。

 

 

Maixduinoとは

Sipeed 社のK210搭載AI開発ボードです。2.4インチLCDとカメラモジュールがついて非常にお買い得な商品です。ESP32も搭載されております。

 

Arduinoのようにピンヘッダもついていますので入門としては最適ではないでしょうか。

参考

ファーム更新

Maixduinoのファームウェアアップデートはkflash_guiというソフトで実施します。私はバージョン1.5.3を用いました。

ファームウェアは以下より入手します。
 https://github.com/sipeed/MaixPy/releases

私はバージョン0.3.2を用いました。maixpy_v0.3.2_minimum.binをダウンロードしました。

先ほど入手したkflash_guiを起動しFileで.DLしたbinファイルを指定します。ボードとシリアルポートを設定後 “Download”クリックでファーム更新されます。

maixpy_v0.3.2_full.binを書き込むとメモリ不足で動きませんでした。

参考

MaixPyでカメラとLCDのテスト

MaixduinoにはMaixPyというK210向けのMicropython環境がすでに搭載されています。MaixduinoとPCをUSB接続してシリアル通信で実行可能です。

私はWin10PCでTera Termで楽しみました。ポートとボーレート(115200)を指定するのみで使用できます。

Pythonのように対話形式での利用も可能ですがctrl+eでコードまるごと貼り付けできctrl+dで実行されます。
 

以下のカメラで撮った画像をLCDに表示するコードを実行してみました。

LEGOでケース製作

ちょっとカメラやLCDのフレキがプラプラですごく扱いにくいのでLEGOでケースこしらえました。

かなり扱いやすくなりました♪

MaixPy IDE

シリアルでコード入力しつつけるのもつらいのでやはりIDEを導入したく。いろいろな開発方法があるようで何を使っていいかわからなかったのでツイッターでアンケートを取ってみました。

MaixPy IDEの人気が高かったので早速導入しました!

MaixPy IDE導入

バージョン0.2.3をインストールしました。

maixpy-ide-windows-0.2.3.exe をDLしてインストールしました。

  • MaixPy IDEを起動して”ツール”クリック -> “Select Board”選択 -> “Sipeed Maixduino”選択
     
  • 接続アイコンをクリックしてボードのUSBポートを指定します。接続後アイコンは緑から赤になります。

     
  • コードを記載してスクリプト実行アイコンクリックで開始されます。
     

     

     
  • コードをMaixduinoのフラッシュに書き込むには
    “ツール”クリック -> “Save open script to board(boot.py)”クリックで実施されます。

顔認識サンプルコード

顔認識コードを試してみました。

学習済み顔認識モデル face_model_at_0x300000.kfpkg をkflash_guiであらかじめ書き込んでおきます。 

ほぼサンプルコード通りに書き込みましたが、カメラとLCDディスプレイの位置関係によって表示画像の回転やミラー反転が必要でした。

lcd.direction(lcd.YX_RLUD)

上記をlcd.init()後に挿入しました。
R, LとU, Dの位置を変更することでLCD表示画像が回転したりミラー反転します。

 

参考

 


 

今後の夢

将来的には以下のようなシステムを構築したいと思います。雑でアレですが。。
金魚水槽にエッジAIを組み込んで素敵なシステムを実現したいです。

まだできるかどうかもわかりませんがこの道もひたむきに進むのみです。

参考

 

次の記事

オリジナル金魚認識モデルの生成 ーエッジAI活用への道 3ー