使用済みのSDカードをMacからフォーマットしてRaspbianを焼き直す
最近Raspiの環境構築を月10回くらいのペースでやっているので忘れやすいものをメモ
1. SDカードのマウント先を調べる
diskutil list
以降は、disk3(disk3s1, disk3s2)がSDカードのマウント先という前提で進める
2. SDカードをフォーマット
下記コマンドで、アンマウントからフォーマットまでされる
diskutil eraseDisk MS-DOS boot disk3
3.イメージ書き込み
rdiskを指定すると、高速書き込みモード
sudo dd bs=1m if=raspi.img of=/dev/rdisk3 14922+0 records in 14922+0 records out 15646851072 bytes transferred in 677.499756 secs (23094991 bytes/sec)
おまけ
ディスクユーティルから削除
GUIからフォーマットを変更したい場合は、ディスクユーティルを活用する
32GB以下のSDカードにRaspbianを焼きたいなら、フォーマットはMS-DOS
マウント解除
umount disk3
もしくは
ディスクユーティルから「マウント解除」
M5stickV初心者のための最速チュートリアル #2(コイン分類:クラウド学習とエッジAIで画像認識)
- 前提
- 今回できること
- 機械学習のイメージ図
- 0.ファームを焼き込む
- 1.SDカードにbootファイルを展開する
- 2.画像分類したい被写体を撮影する
- 3.クラウドにデータをアップロードする
- 4.モデルをダウンロードする
- 5.M5StickVで推論(物体検出)する
- 所感
前提
前回の続きです。
前回までで環境構築と最低限の動作確認は済んでいることが前提となる。
(ちなみに英語チュートリアルを読んでみるとIDEすらいらないことがわかる)
SDカードが必須です。
今回できること
詳細で柔軟な学習ができる訳ではなく、「1クラスあたり35枚ぐらい写真を撮影してくれれば、10クラスまでの画像分類が簡単にできるよ」というもの。
なのでBoundingBoxが出る訳でもないし、画角内の複数物体検出ができる訳でもない。
今回はコイン分類(1円、100円、500円)を題材にしてみる。
外形からは判断しにくいし反射するので、少し難易度は高いかなと。
下記のイメージ図をみるとわかるが学習はクラウド。
学習済みモデルをエッジで推論するような仕組み。
簡単なことで十分な人からすると、その手間が非常に少なくて小学生でもできそう。
多分、クラウド側ではM5StickVで動くサイズで転移学習をしてくれてるんじゃないかな?
機械学習のイメージ図
参考資料からの抜粋 (https://docs.m5stack.com/#/en/related_documents/v-training からの抜粋)
0.ファームを焼き込む
ここからファームをダウンロードし、ここ(windowsの場合/macの場合)からKflash_GUIをインストールしてファームを焼き込む。
すでに焼いている場合は不要らしい。
1.SDカードにbootファイルを展開する
SDカードの選定
ここでSDカードが対応しているかチェックした方が良い。
現時点では、Kingston(32Gを除く)が良さげ。
今回は手持ちに動作確認が取れたSDがなかったので、 Transcend 64G SDXC FAT32で初期化して果敢に使ってみた。
SDカードにファイル展開
- ここからZipをダウンロードし、SDカード内でUnzipする。
- M5StickV本体にSDカードを挿入する。
ポイントは、SDディレクトリ直下にboot.pyを置かないと認識されない。
OKな例
NGな例
2.画像分類したい被写体を撮影する
- 起動後、下の画像の画面が出て、待っていると撮影画面に写る。
- 写真上部のボタンでクラスを選択し、画面右ボタンで撮影する。(SDスロットは下部にあたる)
(https://docs.m5stack.com/#/en/related_documents/v-training?id=burner-firmware から抜粋)
撮影時制約は、
- 画角内に他の物体が入らないこと
- 1クラスあたり最低35枚撮影すること
- 3クラス以上ないと精度が悪い(らしい)
円コインの分類してみる
今回は、円コインの分類ができるかやって見た。
1円玉、100円玉、500円玉の表面を3カテゴリ分類してみる。
撮影した感覚では
- 1円玉は、100円玉、500円玉と比べて凹凸が浅いので白とびしやすい。
- 100円玉と500円玉は、サイズ差分を除くと1と5の違いくらいしかない。
撮影した条件は下記の通り
制約として、 - コインの表面のみ - 背景は3種類
枚数は下記の通り
コイン | 撮影枚数 |
---|---|
1円玉 | 35枚 |
100円玉 | 44枚 |
500円玉 | 38枚 |
撮影が終わったらSDを確認。
こんな感じでtrain/validフォルダが作成されている。
どうやら自動的に31枚目~35枚目がvalidフォルダに保存されている模様。
(これ入れ替えしたら精度変わるのかな?)
3.クラウドにデータをアップロードする
ここにアクセスしてSDカードのデータをアップロードする。
必要情報は、
- メールアドレス(モデルが送信されるのでお間違いなく)
- 撮影画像のZip
制約は、
- Zip形式であると
- ファイルサイズが200MB以下であること
zipアップロードで失敗するケース
今回は下記のようなフォルダ構成で、upload.zipを作成した。
これでアップロードすると、「[V-Trainer] XXXXXXXXXX Online Training Request Failed (CONTENT: Train or Valid folder not found.)」
原因はzipを展開したフォルダの直下にtrain/validフォルダがないことが予想される。
対策
対策としては、階層を落とせるように2つを直接zip化する。
4.モデルをダウンロードする
- 少し待っていると個人メールアドレスにモデルが飛んでくる(今回は8分で完了)
- モデルをダウンロードし、SDカードにUnzipして、本体に挿入する
メールには学習結果が貼ってある
Your Model Parameters | value |
---|---|
Your Model Parameters | |
Final Loss | 0.02268105202820152 |
Final Accurancy | 0.9901960492134094 |
Final Validation Loss | 0.8285562992095947 |
Final Validation Accurancy | 0.800000011920929 |
Model | Mobilenet V1 Alpha1.0 Depth: 1 |
うん。そこそこって感じですかね。
ConfusionMatrixはvalidフォルダの画像がイケてないから余計悪く見える。
validフォルダを変更したりしたら、めちゃめちゃハマったので一旦このまま進むことにする。
メールに貼られているzipリンクの中身をSDカードに移動する。
ファイル名からするに、量子化したKPUモデルである。
tensorflow-liteのモデルをnncaseで変換して動かせるんでしょうね(期待)
5.M5StickVで推論(物体検出)する
SDカードを挿入して電源を起動するだけで、SD直下のboot.pyが優先され、自動で推論が走る。
いざ、3コインを見分けられるか。
- type:1が1円玉
- type:2が100円玉
- type:3が500円玉
結果動画
Trained model for M5stickV
M5StackVのV-trainingでコイン(1円、100円、500円)判定やってみた。
— motoJapan@enjoy-CVPR2019 (@motoJapanTw) September 15, 2019
精度は各学習データ30枚程度にしては十分、速度もそこそこ出ている。
賞賛すべきはエッジAI実践の手軽さ。#m5StackV #gif pic.twitter.com/jWgbREvMxB
まぁぼちぼちって感じです。
ちなみに動画はベストケースで、遊んで見てわかったのは、100円玉が1円玉に勘違いされやすい。
所感
精度はおいておいて、3000円そこそこでエッジAIできるのはかなり楽しいし、色々とPoCが捗りそう。
次回は、認識結果をSPIで外に出すか、自作のtensorflow-liteモデルを実機で動かすか、MPU6886を動かすか、をやりたい。
M5stickV初心者のための最速チュートリアル #1(IDE環境構築と設定、サンプルコードの実行とログ確認、画像認識(学習、推論))
1.前提
まずM5stack/M5stickVを一度も使ったことがない私のような人が最速で動かすところまでを説明する。
ベストな参考資料はこちら docs.m5stack.com
- この資料は色々なFw書き込み方法などを説明しているが、今回は色々ハックしたい人向けで抜粋する
- 英語読んでガリガリできる人はこれ以下読む必要なし
- 説明もあまり読みたくなければ★1~★7の手順を実行すれば最速で終わる
- Windows or Mac を持っている
2.今回できること
3.ハードウェア構成の最低限の説明
(https://docs.m5stack.com/#/en/core/m5stickv から抜粋)
4.環境構築と設定
一応自分が試した実績として、Windows環境とMac環境では動作確認できた。
IDEダウンロード&インストール
IDEのインストーラをここ(windowsの場合/macの場合)からダウンロードし、インストールする。★1
IDEへの設定
上部メニューから、Tool-> Select Board-> M5StickV
を選択。★2
※0.2.2だと表示がなかったので、0.2.4以上が必要な様子。
PCとM5stickVを接続
USBケーブルで接続する。★3
リンク設定
1.緑のリンクボタンを押下する。★4
2.対応するシリアルポートを選択する。★5
3.macの場合は、シリアルポートを選択し、windowsの場合はCOMポートを選択する。★6
4.「Connecting...」の表示がしばらく出て消えれば成功。
5.サンプルコードの実行とログ確認
実行
今回はIDEの初期サンプルコードを動かす。
初期サンプルコードは、カメラの映像をLCDに表示し、シリアルモニターにログ(フレームレート)を表示するコードである。
緑再生ボタンを押下すると、サンプルコードが実行される。★7
動作確認(LCDとシリアルモニタで確認)
6.所感
ちょー簡単で立ち上げやすい! 次回は画像認識(学習、推論)をまとめたい。
ちなみに、micropythonのAPIはここにまとまっている。
M5stackのMPU6050の場合はこんな感じで呼べるとのこと (M5StickVでは呼び出せなかったので、次回以降の記事で説明します)
import mpu6050 # default: accel_fs = 2G, gyro_fs = 500DPS imu = mpu6050.MPU6050() # 3-tuple of X, Y, Z axis acceleration values in m/s^2 as floats acc = imu.acceleration # 3-tuple of X, Y, Z radians per second as floats. gyro = imu.gyro # 3-tuple of yaw, pitch, roll as floats. ypr = imu.ypr
(https://github.com/m5stack/UIFlow-Code/wiki/Hardware#mpu6050 から抜粋)
7.次回はV-trainer
次回はV-trainerを使ってコイン分類をしたい。
M5StackVのV-trainingでコイン(1円、100円、500円)判定やってみた。
— motoJapan@enjoy-CVPR2019 (@motoJapanTw) September 15, 2019
精度は各学習データ30枚程度にしては十分、速度もそこそこ出ている。
賞賛すべきはエッジAI実践の手軽さ。#m5StackV #gif pic.twitter.com/jWgbREvMxB
以上。
【ECCV2018 論文メモ#5】Multimodal Unsupervised Image-to-Image Translation
生成モデルの論文。
画像の潜在空間は、content空間とstyle空間により構成されている仮説に基づき、encoderとdecoderを定義。
contentは残しながらターゲットドメインのstyleをサンプリングして画像変換を行うものらしい。
犬画像を猫画像にスタイル変換するようなイメージ。
(画像変換サンプル:出典より抜粋)
今回の論文と出典
Multimodal Unsupervised Image-to-Image Translation
https://arxiv.org/abs/1804.04732
著者
Xun Huang, Ming-Yu Liu, Serge Belongie, Jan Kautz
内容
詳細
- 「画像表現はcontent code(ドメイン不変成分)とstyle code(ドメイン依存成分)から成り立つ」という仮説が前提
- この前提の下、encoderにより画像からcontent codeを取り出し、targetドメインのstyleをサンプリングしてdecoderで再構成する
(提案手法の概略図:出典より抜粋)
- encoder/decoderは決定的であるが、styleサンプリングが確率的(正規分布)であるため、既存手法より多様で連続的な出力を得られるという話らしい
- encoderとdecoder(generator)は逆関数として定義される
- S2は事前分布に従い、それ自体は単一モーダルであるが、
- decoderの非線形性が出力画像のマルチモーダル性を生み出している
- 潜在空間(変数)を推定という点でやっていることはVAEに近い気もする
(生成モデルブロック図:出典より抜粋)
- CycleGANに似ているようにも感じるが、入力をドメイン変換してから逆方向に入力すると同じ画像が得られるという特性とは異なる
読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。
以上。
【ECCV2018 論文メモ#4】Person Search by Multi-Scale Matching
人物検索(照合)ですね、単なる人検出ではなくクエリ画像と同じ人物を未加工なシーン情報からロバストに検索するものとなっているようです。
今回の論文と出典
Person Search by Multi-Scale Matching
https://arxiv.org/abs/1807.08582
著者
Xu Lan, Xiatian Zhu, Shaogang Gong
内容
- マルチスケール対応人物検索
- 技術としては、人検出と人物認識の組み合わせ
- 現在の人検出技術は、ミスアライメントや検出ミスなどによるネガティブ効果を軽減することに注力している
- 提案手法ではFaster-RCNNベースで改善を加え、十分に信頼度の高い人検出を行う(ということは遅いのか?)
- 人物検索は人検出より課題をもつタスク(スケール面で)ではあるが、Cross-Level Semantic Alignment (CLSA)という深層学習のアプローチを提案
- CLSAはResNet50をベースに改善を加えている
(提案モデルブロック図:出典より抜粋)
詳細
- 人物認識と人検出は設定されるタスク難易度が異なり、
- 人物認識は事前処理ですでにクロップ済みの人に対して推論を行うが、
- 人検出はエラーやミスアライメントの程度もわからない未加工のシーンから得られる様々なスケール画像に検出を行う。
- そのため、実世界での検証の機会を失っている
- 既存手法のre-idはスケールなど修正済みで検証されている
- 下図はデータセットベンチマークのスケール分布をしてしている
(ベンチマーク別のスケールにおけるバイアス:出典より抜粋)
- 人検出は、Faster-RCNNを改善し、信頼度の高い人検出座標を求める
- ネットワーク改善
- バックボーンとしてResNet-50で事前学習
- 1st-4th層をファインチューニング(低レベルでの特徴量を目的に適用させることが目的)
- オーバーオールのパフォーマンス向上を実現
- 人物識別(CLSA)では、End2Endのピラミッド特徴量表現の学習をベースに、 マルチスケールの人画像に対してロバスト性を高める
- ピラミッドネットワーク特徴量はスケール不変性を学習可能
- 課題としてネットワークは低レイヤーほど識別能力が低いこと
- 組み込みピラミッド特徴量はこの性質と高レイヤーの特徴量を共同で使うことで全体性能を下げる可能性があるが、提案手法で工夫
(Lossの解説:出典より抜粋)
読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。
以上。
【ECCV2018 論文メモ#3】StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction
テーマだけで面白そうだったので読んでみた(らgoogle様の論文でした)
今回の論文と出典
StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction
https://arxiv.org/abs/1807.08865
著者
Sameh Khamis, Sean Fanello, Christoph Rhemann, Adarsh Kowdle, Julien Valentin, Shahram Izadi
内容
詳細
- 既存のステレオマッチング手法(SoTa)ではCRFベースのアプローチが存在する
- 精度は良いが、Computational Costが高く遅い
- 一般的にsolvingはNP困難とされている
NP困難わからない場合は下記参考
motojapan.hateblo.jp
- 提案手法は5つに言及
- 古典手法を超えるサブピクセルマッチ精度をDeepで実現
- 上記により、古典手法ステレオマッチングのデプス推定を、非常な効率的なアルゴリズムをもたらす低解像度コストボリューム(Cost Volumes)で導くことを実証
- 以前のDeepアーキ手法では、タスクに対して過剰にパラメタ化されており、これが低コスト化へ役立つことを提示
- 新しい階層的デプス精緻化層は、エッジ情報を保ちながら高品質にアップサンプルが可能
- 提案システムはハイエンドGPUアーキテクチャで動作
(ネットワーク構造:出典より抜粋)
- Networkブロックは下記3つ
- DownSampling Feature Network
- ステレオ推定の主課題は、一致推定の難易度(完璧な特徴量の一致が理想)
- カラー情報などに依存した既存手法より低コストに特徴量抽出を行う
- Siamese networkベース
- 入力は右目と左目のRGB画像
- 受容野を用いて既存手法同等以上の特徴量を得ることを目標とする
- Cost Volume Filtering
- Hierarchical Refinement
- カラー情報をガイドとして、高周波詳細をブレンドするために視差値を拡張させる
- 具体的には、このネットワークはResidualな構造を持ち、出力される視差の残差を加算する
- 更にそれを階層的に粗い推定結果にマージをしていく
- DownSampling Feature Network
- cost volume output出力(下図上)を、refinement networkの結果(下図下)で更新していく動き
(階層的精緻化の結果:出典より抜粋)
- 性能的は精度(precison)と速度(speed)で測定
- 目視でもHashMatchには限界があり、StereoNet w/ refinementがよく効いている
(既存手法
- 1/16解像度時点のコストボリュームで、high qualityな視差マップを生成するに必要な情報を得ている
(階層的精緻化の階層別効果検証:出典より抜粋)
- errorは全体を通して1以上あるが、高速なステレオ推定実行が可能
(古典手法との精度とスループットについて:出典より抜粋)
読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。
以上。
【ECCV2018 論文メモ#2】Contemplating Visual Emotions: Understanding and Overcoming Dataset Bias
Maker Faire Tokyo 2018では感情推定ロボットを出展したので感情繋がりでこの論文。
エッジAIで、顔認識して追っかけてきて、感情推定をして尻尾かとで感情表現をしています!
— motoJapan@MFTokyo_H0301 (@motoJapanTw) 2018年8月4日
懐いたり怖がったりして可愛いです。(親バカ)
お時間ある方はぜひお立ち寄りください^^ #カメララボ大崎 #CameraLabOsaki #H0301#MakerFaireTokyo2018 #MFTokyo2018 pic.twitter.com/GthzhY1TXq
今回の論文と出典
Contemplating Visual Emotions: Understanding and Overcoming Dataset Bias
https://arxiv.org/abs/1808.02212
著者
Rameswar Panda, Jianming Zhang, Haoxiang Li, Joon-Young Lee, Xin Lu, Amit K. Roy-Chowdhury
内容
詳細
- データセットは、Deep Sentiment, Deep Emotion, Deep Emotion-6の3つで話が展開される
- バイアスの例(Deep Emotion)は、下図の通りで、
- Postive : amusementな画像は、ほぼamusement parkの画像で、視覚的コンセプトの多様性が低い
- Negative : sadnessな画像は、amusement parkの画像は無く、その属性を十分に表現できていない
(バイアスの考察例1:出典より抜粋)
- データセットの持つバイアスを評価する手法をいくつか紹介している
- 3データセットを分類する手法 (ResNet-50)
- 期待値は、全て同じ精度だが偏りがある
- 高い信頼度を示す画像を見ると、Deep Emotionは「屋外画像が多い」、Deep Emotion-6は「中心に対象物があり、背景はクリア」というバイアスがある
- 3データセットを分類する手法 (ResNet-50)
(データセットを3クラス分類した結果(左)と信頼度の高い画像(右):出典より抜粋)
(各データセットをPos/Neg2クラス分類した結果:出典より抜粋)
-
- オブジェクトとシーンについて条件付きエントロピーの分布で評価する手法
(バイアスの考察例2:出典より抜粋)
- データセットの提案
(適切な粒度と呼ばれる25分類:出典より抜粋)
- 効率的なカリキュラム的学習
- データセットに跨った様々なタスクに対してパフォーマンスがでる
- 連続的手順により学習することが可能
- 基本は、学習ステージを分け、早期ステージではlebel 1、後半に進について高いlevelを学習
- 上記を満たすようにCNNに情報を挿入していくようなモデル(ResNet-50 base)
(各データセットでのテスト結果:出典より抜粋)
(テスト結果:出典より抜粋)
読み時間2時間:執筆時間30分:勘違い、間違いあれば教えていただけると嬉しいです。
以上。