MotoJapan's Tech-Memo

技術めも

使用済みの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で画像認識)

前提

前回の続きです。

motojapan.hateblo.jp

前回までで環境構築と最低限の動作確認は済んでいることが前提となる。

(ちなみに英語チュートリアルを読んでみるとIDEすらいらないことがわかる)

SDカードが必須です。

今回できること

詳細で柔軟な学習ができる訳ではなく、「1クラスあたり35枚ぐらい写真を撮影してくれれば、10クラスまでの画像分類が簡単にできるよ」というもの。

なのでBoundingBoxが出る訳でもないし、画角内の複数物体検出ができる訳でもない。

今回はコイン分類(1円、100円、500円)を題材にしてみる。

外形からは判断しにくいし反射するので、少し難易度は高いかなと。

f:id:motojapan:20190917004221p:plain

下記のイメージ図をみるとわかるが学習はクラウド

学習済みモデルをエッジで推論するような仕組み。

簡単なことで十分な人からすると、その手間が非常に少なくて小学生でもできそう。

多分、クラウド側ではM5StickVで動くサイズで転移学習をしてくれてるんじゃないかな?

機械学習のイメージ図

参考資料からの抜粋 f:id:motojapan:20190917003519p:plainhttps://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カードにファイル展開

  1. ここからZipをダウンロードし、SDカード内でUnzipする。
  2. M5StickV本体にSDカードを挿入する。

ポイントは、SDディレクトリ直下にboot.pyを置かないと認識されない。

OKな例

f:id:motojapan:20190917003311p:plain

NGな例

f:id:motojapan:20190917003419p:plain

2.画像分類したい被写体を撮影する

  1. 起動後、下の画像の画面が出て、待っていると撮影画面に写る。
  2. 写真上部のボタンでクラスを選択し、画面右ボタンで撮影する。(SDスロットは下部にあたる)

f:id:motojapan:20190917003450p:plain (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フォルダに保存されている模様。

(これ入れ替えしたら精度変わるのかな?)

f:id:motojapan:20190917003557p:plain

3.クラウドにデータをアップロードする

ここにアクセスしてSDカードのデータをアップロードする。

必要情報は、

  • メールアドレス(モデルが送信されるのでお間違いなく)
  • 撮影画像のZip

制約は、

  • Zip形式であると
  • ファイルサイズが200MB以下であること

zipアップロードで失敗するケース

今回は下記のようなフォルダ構成で、upload.zipを作成した。

f:id:motojapan:20190917003640p:plain

これでアップロードすると、「[V-Trainer] XXXXXXXXXX Online Training Request Failed (CONTENT: Train or Valid folder not found.)」

原因はzipを展開したフォルダの直下にtrain/validフォルダがないことが予想される。

対策

対策としては、階層を落とせるように2つを直接zip化する。

4.モデルをダウンロードする

  1. 少し待っていると個人メールアドレスにモデルが飛んでくる(今回は8分で完了)
  2. モデルをダウンロードし、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

f:id:motojapan:20190917003801p:plain

f:id:motojapan:20190917003830p:plain

f:id:motojapan:20190917003902p:plain

うん。そこそこって感じですかね。

ConfusionMatrixはvalidフォルダの画像がイケてないから余計悪く見える。

validフォルダを変更したりしたら、めちゃめちゃハマったので一旦このまま進むことにする。

メールに貼られているzipリンクの中身をSDカードに移動する。

f:id:motojapan:20190917004149p:plain

ファイル名からするに、量子化したKPUモデルである。

tensorflow-liteのモデルをnncaseで変換して動かせるんでしょうね(期待)

5.M5StickVで推論(物体検出)する

SDカードを挿入して電源を起動するだけで、SD直下のboot.pyが優先され、自動で推論が走る。

いざ、3コインを見分けられるか。

f:id:motojapan:20190917004221p:plain

  • type:1が1円玉
  • type:2が100円玉
  • type:3が500円玉

結果動画

Trained model for M5stickV

まぁぼちぼちって感じです。

ちなみに動画はベストケースで、遊んで見てわかったのは、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.今回できること

  • ゼロから環境構築をする
  • M5stickVに、IDEからサンプルコードを流し込んでログなどを確認する (Windows/Mac)
  • (次回) V-trainerと言うのを使って物体認識

3.ハードウェア構成の最低限の説明

f:id:motojapan:20190916181045p:plain (https://docs.m5stack.com/#/en/core/m5stickv から抜粋)

4.環境構築と設定

一応自分が試した実績として、Windows環境とMac環境では動作確認できた。

IDEダウンロード&インストール

IDEインストーラをここ(windowsの場合/macの場合)からダウンロードし、インストールする。★1

過去IDEバイナリのダウンロードはこちら

IDEへの設定

上部メニューから、Tool-> Select Board-> M5StickV を選択。★2

f:id:motojapan:20190916181648p:plain ※0.2.2だと表示がなかったので、0.2.4以上が必要な様子。

PCとM5stickVを接続

USBケーブルで接続する。★3

リンク設定

1.緑のリンクボタンを押下する。★4

f:id:motojapan:20190916181718p:plain

2.対応するシリアルポートを選択する。★5

f:id:motojapan:20190916181742p:plain

3.macの場合は、シリアルポートを選択し、windowsの場合はCOMポートを選択する。★6

4.「Connecting...」の表示がしばらく出て消えれば成功。

5.サンプルコードの実行とログ確認

実行

今回はIDEの初期サンプルコードを動かす。

初期サンプルコードは、カメラの映像をLCDに表示し、シリアルモニターにログ(フレームレート)を表示するコードである。

緑再生ボタンを押下すると、サンプルコードが実行される。★7

f:id:motojapan:20190916182140p:plain

動作確認(LCDとシリアルモニタで確認)

  • LCDは本体を確認する
  • シリアルモニターはIDE左下のシリアルターミナルを押下する

f:id:motojapan:20190916182433p:plain

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を使ってコイン分類をしたい。

以上。

【ECCV2018 論文メモ#5】Multimodal Unsupervised Image-to-Image Translation

生成モデルの論文。
画像の潜在空間は、content空間とstyle空間により構成されている仮説に基づき、encoderとdecoderを定義。
contentは残しながらターゲットドメインのstyleをサンプリングして画像変換を行うものらしい。
犬画像を猫画像にスタイル変換するようなイメージ。
f:id:motojapan:20180825144511p:plain
(画像変換サンプル:出典より抜粋)

今回の論文と出典

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(ドメイン依存成分)から成り立つ」ということ
  • 確率的要素を含めてこのロジックで画像を再構成することで画像生成を行う
  • ポイントは次の3点
  1. ラベリングとしてのデータペアは不要で教師なし学習であること
  2. 既存手法のような1-to-1の決定的なマッピングを行うモデルではなく、画像表現マルチモーダルな出力を得ることができること
  3. ユーザがstyleを入力できること

詳細

  • 「画像表現はcontent code(ドメイン不変成分)とstyle code(ドメイン依存成分)から成り立つ」という仮説が前提
  • この前提の下、encoderにより画像からcontent codeを取り出し、targetドメインのstyleをサンプリングしてdecoderで再構成する

f:id:motojapan:20180825144459p:plain
(提案手法の概略図:出典より抜粋)

  • encoder/decoderは決定的であるが、styleサンプリングが確率的(正規分布)であるため、既存手法より多様で連続的な出力を得られるという話らしい

f:id:motojapan:20180825144504p:plain
ドメイン内変換/クロスドメイン変換:出典より抜粋)

  • encoderとdecoder(generator)は逆関数として定義される
  • S2は事前分布に従い、それ自体は単一モーダルであるが、
  • decoderの非線形性が出力画像のマルチモーダル性を生み出している
  • 潜在空間(変数)を推定という点でやっていることはVAEに近い気もする

f:id:motojapan:20180825144508p:plain
(生成モデルブロック図:出典より抜粋)

  • 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をベースに改善を加えている

f:id:motojapan:20180823070753p:plain
(提案モデルブロック図:出典より抜粋)

詳細

  • 人物認識と人検出は設定されるタスク難易度が異なり、
    • 人物認識は事前処理ですでにクロップ済みの人に対して推論を行うが、
    • 人検出はエラーやミスアライメントの程度もわからない未加工のシーンから得られる様々なスケール画像に検出を行う。
  • そのため、実世界での検証の機会を失っている
  • 既存手法のre-idはスケールなど修正済みで検証されている
  • 下図はデータセットベンチマークのスケール分布をしてしている

f:id:motojapan:20180823070747p:plain
ベンチマーク別のスケールにおけるバイアス:出典より抜粋)

  • 人検出は、Faster-RCNNを改善し、信頼度の高い人検出座標を求める
    • ネットワーク改善
    • バックボーンとしてResNet-50で事前学習
    • 1st-4th層をファインチューニング(低レベルでの特徴量を目的に適用させることが目的)
    • オーバーオールのパフォーマンス向上を実現
  • 人物識別(CLSA)では、End2Endのピラミッド特徴量表現の学習をベースに、 マルチスケールの人画像に対してロバスト性を高める
    • ピラミッドネットワーク特徴量はスケール不変性を学習可能
    • 課題としてネットワークは低レイヤーほど識別能力が低いこと
    • 組み込みピラミッド特徴量はこの性質と高レイヤーの特徴量を共同で使うことで全体性能を下げる可能性があるが、提案手法で工夫

f:id:motojapan:20180823070800p:plain
(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

内容

  • StereoNet:リアルタイムエッジ認識デプス推定のためのガイド付き階層的精緻化
  • ステレオRGBを入力にエッジ情報を保存しながらデプスをEnd2Endのネットワークで推定
  • 既存手法に比べてサブピクセル精度でステレオ推定が可能で高速
  • このステレオ推定により、リアルタイムなパフォーマンスを低解像度コストボリューム(Cost Volumes)を用いることで実現している
  • Cost Volumesは、高精度な視差を求めるのに必要な情報をエンコードする
  • Titan X GPUを用いることで720 [p] 60 [fps] を実現
  • 実装は細かく記載あり

詳細

  • 既存のステレオマッチング手法(SoTa)ではCRFベースのアプローチが存在する
    • 精度は良いが、Computational Costが高く遅い
    • 一般的にsolvingはNP困難とされている

NP困難わからない場合は下記参考
motojapan.hateblo.jp

  • 提案手法は5つに言及
  1. 古典手法を超えるサブピクセルマッチ精度をDeepで実現
  2. 上記により、古典手法ステレオマッチングのデプス推定を、非常な効率的なアルゴリズムをもたらす低解像度コストボリューム(Cost Volumes)で導くことを実証
  3. 以前のDeepアーキ手法では、タスクに対して過剰にパラメタ化されており、これが低コスト化へ役立つことを提示
  4. 新しい階層的デプス精緻化層は、エッジ情報を保ちながら高品質にアップサンプルが可能
  5. 提案システムはハイエンドGPUアーキテクチャで動作

f:id:motojapan:20180820234227p:plain
(ネットワーク構造:出典より抜粋)

  • Networkブロックは下記3つ
    • DownSampling Feature Network
      • ステレオ推定の主課題は、一致推定の難易度(完璧な特徴量の一致が理想)
      • カラー情報などに依存した既存手法より低コストに特徴量抽出を行う
      • Siamese networkベース
      • 入力は右目と左目のRGB画像
      • 受容野を用いて既存手法同等以上の特徴量を得ることを目標とする
    • Cost Volume Filtering
      • Cost Volume Filteringは既存手法[25]であり、マッチングのためにカラー情報を直接利用する
      • 一方、提案手法ではピクセルレベルでの特徴量を利用し、マッチングを行う
      • 入力はDownSampling Feature Networkの出力
      • モバイル動くほど軽量化、サブピクセル精度を実現
      • 視差コスト関数は、”soft arg min”を採用
      • このネットワークの出力時点では推定精度は荒い
    • Hierarchical Refinement
      • カラー情報をガイドとして、高周波詳細をブレンドするために視差値を拡張させる
      • 具体的には、このネットワークはResidualな構造を持ち、出力される視差の残差を加算する
      • 更にそれを階層的に粗い推定結果にマージをしていく
  • cost volume output出力(下図上)を、refinement networkの結果(下図下)で更新していく動き

f:id:motojapan:20180820234231p:plain
(階層的精緻化の結果:出典より抜粋)

  • 性能的は精度(precison)と速度(speed)で測定
  • 目視でもHashMatchには限界があり、StereoNet w/ refinementがよく効いている

f:id:motojapan:20180820234236p:plain
(既存手法との比較:出典より抜粋)

  • 1/16解像度時点のコストボリュームで、high qualityな視差マップを生成するに必要な情報を得ている

f:id:motojapan:20180820234240p:plain
(階層的精緻化の階層別効果検証:出典より抜粋)

  • errorは全体を通して1以上あるが、高速なステレオ推定実行が可能

f:id:motojapan:20180820235103p:plain
(古典手法との精度とスループットについて:出典より抜粋)


読み時間2時間:執筆時間45分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。

【ECCV2018 論文メモ#2】Contemplating Visual Emotions: Understanding and Overcoming Dataset Bias

Maker Faire Tokyo 2018では感情推定ロボットを出展したので感情繋がりでこの論文。

今回の論文と出典

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

内容

  • 視覚的感情の考察:データセットバイアスの理解とその克服
  • 感情データセットには、バイアスが存在する
  • 話したいのは3つの話題
  1. 最新のデータセットや精度の話を追わず、既存データセットの持つバイアス問題点を認識し、方法論の見直すこと
  2. Webなどの大規模データを用いることで、バイアス効果を軽減できること、シンプルなカリキュラム(体系的)学習方法を提案し、SoTAを達成したこと
  3. データセットの提案すること

詳細

  • データセットは、Deep Sentiment, Deep Emotion, Deep Emotion-6の3つで話が展開される
  • バイアスの例(Deep Emotion)は、下図の通りで、
    • Postive : amusementな画像は、ほぼamusement parkの画像で、視覚的コンセプトの多様性が低い
    • Negative : sadnessな画像は、amusement parkの画像は無く、その属性を十分に表現できていない

f:id:motojapan:20180818155938p:plain
(バイアスの考察例1:出典より抜粋)

  • データセットの持つバイアスを評価する手法をいくつか紹介している
    • 3データセットを分類する手法 (ResNet-50)
      • 期待値は、全て同じ精度だが偏りがある
      • 高い信頼度を示す画像を見ると、Deep Emotionは「屋外画像が多い」、Deep Emotion-6は「中心に対象物があり、背景はクリア」というバイアスがある

f:id:motojapan:20180818160008p:plain
(データセットを3クラス分類した結果(左)と信頼度の高い画像(右):出典より抜粋)

    • Pos/Neg2クラス分類する手法 (ResNet-60)
      • 感情情報を圧縮して2クラス(Pos/Neg)分類する
      • 各データセットでcrossにtrain/testした結果を考察
      • Binary Coss-Dataset Generationと呼ぶが、これの優位点は次の2点
        • 「シンプルな2値分類は評価の難しいデータセットにフェアな比較が可能」
        • 「シンプルなテストに一般化できていないモデルの場合、適切な粒度に分類したデータでもうなく動かないことがわかる」

f:id:motojapan:20180818160037p:plain
(各データセットをPos/Neg2クラス分類した結果:出典より抜粋)

    • オブジェクトとシーンについて条件付きエントロピーの分布で評価する手法
      • これでデータセットの中のデータ量を調査
      • 条件:確率をふっても変化が少ない感情属性はそもそもデータセットに少ないと解釈できる

f:id:motojapan:20180818160045p:plain
(バイアスの考察例2:出典より抜粋)

  • データセットの提案
    • WEBEmoというデータセットを提案
    • Deep Emotion の12倍のデータ量
    • Web上に存在するデータを既存研究をベースに組織化したもの
    • 良い点は、下記の2点
      • 検索エンジン差を軽減できること」
      • 「異なるタスクを学習することで区別可能な感情特徴量を学習できること」
    • 感情データセットは階層化
      • level 1 : 2 [categories](basic)
      • level 2 : 6 [categories]
      • level 3 : 25 [categories](fine-grained)

f:id:motojapan:20180818160049p:plain
(適切な粒度と呼ばれる25分類:出典より抜粋)

  • 効率的なカリキュラム的学習
    • データセットに跨った様々なタスクに対してパフォーマンスがでる
    • 連続的手順により学習することが可能
    • 基本は、学習ステージを分け、早期ステージではlebel 1、後半に進について高いlevelを学習
    • 上記を満たすようにCNNに情報を挿入していくようなモデル(ResNet-50 base)

f:id:motojapan:20180818160053p:plain
(各データセットでのテスト結果:出典より抜粋)
f:id:motojapan:20180818160057p:plain
(テスト結果:出典より抜粋)

読み時間2時間:執筆時間30分:勘違い、間違いあれば教えていただけると嬉しいです。

以上。