【雑記】「RとKerasによるディープラーニング」が素晴らしい

コンピューティングのGPGPUの仕組みには興味あって、CUDAとかはチョイチョイ触っていたのですが、昨今、流行りの、カメラ+深層学習にはどうも興味が湧かなくて静観していました。

が、お仕事でJetson NanoとかCoral DevBoardとかを扱わなければならず、「深層学習マルデワカリマセン」では通用しないので、、、みなさんに追いつけるよう、機械学習と深層学習をちびちびとやり始めました。

しかし、マジ辛い。

深層学習の参考書を読み漁ってみると、パーセプトロンから始まって、多層、活性化関数、出力層と、、、聞きなれない用語と数式が多数。 数学はわりと好きな方なのですが、用語が多いのは辛い。選んだ本が悪いのか(オイオイ)と思い、他の参考書も見てみるが、どれもこれもだいたい似たような感じ。(オイオイオイ)

が、最近手に取った「RとKerasによるディープラーニング」が、俺が求めていたのはまさにこれだーーーーー!!!だったので、ブログ書くことにしました。

続きを読む

MT3620開発ボードを有線イーサネット接続

久しぶりのAzure Sphere投稿です。

MT3620にはWi-Fi 2.4G/5Gが内蔵されているので、ネットワークにサクッと繋がるのですが、、、
展示会や勉強会でWi-Fi混雑していると、ネットワークに繋がらないことがあります。

展示物がただの置物になってしまうなんて、、、想像しただけでも怖いですよね。

そんなあなたに朗報が!

Azure Sphereの18.11で、Private Networkとして有線イーサネットが利用可能になり、
そして、19.05から、Wi-Fiの代わりに(Public Networkとして)有線イーサネットが利用可能になりました!!

続きを読む

VSCode + Remote - SSHでRaspberry Pi開発

Visual Studio Code拡張のRemote Developmentの中の1つ、Remote - SSHが、知らぬ間にARM/ARM64に対応していたので、どんな感じで動くか試しました。

VSCode拡張 Remote Development

リモートマシンのフォルダ(ディレクトリ)やDockerコンテナを、都度ファイルコピーとかの操作をすることなく遠隔で表示、編集などをするための、VSCode拡張パックです。

marketplace.visualstudio.com

これはパックで、中身は3つのVSCode拡張が入っています。

  1. Remote - SSH
    物理/仮想のリモートマシンにSSHで接続して、ソースコードを表示、編集などをすることができます。
  2. Remote - Containers
    Dockerコンテナ (略
  3. Remote - WSL
    WSL(Windows Subsystem for Linux) (略

Remote DevelopmentできるLinux

リリース当初はx86_64しか対応していなかったと思うのですが、、、
なにげなくドキュメントを見ていたら、ARM/ARM64が追加されていました!!

code.visualstudio.com

f:id:matsujirushix:20190908192114p:plain

こりゃ、いいじゃん!
ってことで、試すことに。

いざ接続!

VSCodeを最新(1.38.0)にして、Remote - SSHが最新(0.46.0)になっていることを確認。

configをこんな感じに設定して、
f:id:matsujirushix:20190908193455p:plain

Remote ExplorerRaspberry Piに接続しようとすると、自動的にVSCode ServerをRaspberry Piにインストールされて、
f:id:matsujirushix:20190908202643p:plain

Raspberry Piのファイルを、母艦から編集できるようになりました。
f:id:matsujirushix:20190908203833p:plain

IntelliSense

何故か、IntelliSenseが機能しない。

VSCodeのExtensionsを見ると、SSH: RASPILOCALに分かれていて、LOCALのC# ExtensionにInstall in SSH: raspiの文字が。
f:id:matsujirushix:20190908204123p:plain

なんだろ、VSCode Server側にExtensionが入る必要があるのかな?

Install in SSH: raspiをクリックしてみたところ、SSH: RASPIのところにC# Extensionが追加された、
f:id:matsujirushix:20190908204412p:plain

けど、IntelliSense機能せずorz

Terminal

ターミナルは普通に動きます。
f:id:matsujirushix:20190908204816p:plain

Debugging

うーむ、launch.jsonをがんばって設定してみるが、動かん。
f:id:matsujirushix:20190908210216p:plain

Issue: Feature request: support Linux ARM

余談

言語がC#(NETCore)じゃなくてPythonだと、デバッグもできるみたい。(Scott Hanselmanのブログ)

.NET Core 3.0 SDKをRaspberry Piで動かしてみた

OSインストール

最新のRaspbianをダウンロードしてmicroSD焼きます。
現時点の最新、2019-07-10-raspbian-buster-lite.imgを使いました。
あと、sudo apt updatesudo apt upgradeも忘れずに実行。

NETCore 3.0インストール

最新のNET Core 3.0をダウンロード、インストールします。
現時点の最新はv3.0.100-preview9

まずはダウンロード。

wget https://download.visualstudio.microsoft.com/download/pr/33387ff2-7687-4564-a90d-28b9539e0d3b/f75a063b80fc5a94a4d35689aee8b108/dotnet-sdk-3.0.100-preview9-014004-linux-arm.tar.gz

RaspbianはARM32なので、Linux.NETCore BinariesにあるARM32をクリックすると、ダウンロードURLを得ることができます。

約113Mbytesのファイルでした。

次に、ダウンロードしたファイルを解凍します。

mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100-preview9-014004-linux-arm.tar.gz -C $HOME/dotnet

最後に、環境変数DOTNET_ROOTPATHに、解凍したディレクトリを設定します。
これは.bashrcの最後に以下を追加してログインし直し。

export DOTNET_ROOT=$HOME/dotnet
export PATH=$PATH:$HOME/dotnet

Hello World!

.NETCoreでコンパイル、実行できるか確認します。

dotnet new console -o myApp
cd myApp
dotnet run

Hello World!と表示されれば正常です。

Single-file executables

2回目以降でも、相変わらず起動に時間がかかるのですが、
f:id:matsujirushix:20190908165253p:plain

.NETCore3から使えるようになった(?)、Single-file executablesで、どれくらい起動時間が短縮されるか見てみましょう。

dotnet publish /p:PublishSingleFile=trueで実行ファイルを生成すると、
f:id:matsujirushix:20190908165825p:plain

エラーorz

あ、-rオプションでRuntime Identifierというのを指定する必要があるみたい。

気を取り直して、リトライ。

dotnet publish -r linux-arm /p:PublishSingleFile=true

できたっぽい。
f:id:matsujirushix:20190908170752p:plain

起動がクッソ速くなった。
f:id:matsujirushix:20190908170914p:plain

仕組みについては、ここに書いてあるようです。

ML.NET Object Detection

ML.NET Samplesにある、Object Detectionを動かしてみました。

github.com

Object Detectionサンプル

学習済みモデルTiny Yolo2を.NET Coreコンソールアプリ(+ML.NET)で動かすサンプルプログラムです。

実行

Visual StudioObjectDetection.slnを開いて実行するだけ。

こんな感じで、画像に含まれるオブジェクトをコンソールに表示します。

=====Identify the objects in the images=====

.....The objects in the image image1.jpg are detected as below....
car and its Confidence score: 0.9697261
car and its Confidence score: 0.6674223
person and its Confidence score: 0.5226038
car and its Confidence score: 0.5224892
car and its Confidence score: 0.4675334

.....The objects in the image image2.jpg are detected as below....
cat and its Confidence score: 0.6461141
cat and its Confidence score: 0.6400049

.....The objects in the image image3.jpg are detected as below....
chair and its Confidence score: 0.8405777
chair and its Confidence score: 0.7963627
diningtable and its Confidence score: 0.6056049
diningtable and its Confidence score: 0.3737413

.....The objects in the image image4.jpg are detected as below....
dog and its Confidence score: 0.7608147
person and its Confidence score: 0.6321325
dog and its Confidence score: 0.5967442
person and its Confidence score: 0.5730396
person and its Confidence score: 0.5551758

========= End of Process..Hit any Key ========

また、assets/images/output フォルダに、オブジェクトを検知した結果画像を保存します。

f:id:matsujirushix:20190901115438p:plain

処理時間

ここかな?というところに、Stopwatchを追加して測りました。

var sw = new System.Diagnostics.Stopwatch();
sw.Restart();
IList<YoloBoundingBox> detectedObjects = boundingBoxes.ElementAt(i);
sw.Stop();
Console.WriteLine($"Elapsed time = {sw.ElapsedMilliseconds}");

Surface Pro 4Core i7-6650U@2.20GHz)で、この結果でした。

Elapsed time = 1485
.....The objects in the image image1.jpg are detected as below....

Elapsed time = 1300
.....The objects in the image image2.jpg are detected as below....

Elapsed time = 1299
.....The objects in the image image3.jpg are detected as below....

Elapsed time = 1277
.....The objects in the image image4.jpg are detected as below....

Learn ML.NETのGet started in 10 minutesをやってみた

某氏と話していて「ML.NETいけるんじゃね?」(←だいぶ省略)と興味が湧いてきたのだが、Machine Learningよくわからないマンなので、、、
とりあえず、Get startedがあったので、Windowsでやってみました。

dotnet.microsoft.com

  1. Visual Studioをインストール → VS2019 16.2.3
  2. ML.NET Model Builder拡張をインストール → 16.0.1908.1402
  3. コンソールアプリ(.NET Core)プロジェクトを新規作成 → このときにソリューションとプロジェクトを同じディレクトリに配置しないこと
  4. プロジェクトにMachine Learningを追加 → Sentiment Analysisを選択

Time to trainの時間内に、さまざまなModelを試すみたい。

10秒
f:id:matsujirushix:20190831111821p:plain

30秒
f:id:matsujirushix:20190831111956p:plain

60秒
f:id:matsujirushix:20190831112732p:plain

最後にCodeを選択すると、自動的にソリューションにプロジェクトが2つ追加されました。

f:id:matsujirushix:20190831113410p:plain

ML.NET Model BuilderでTrainして、その結果がmyMLAppML.Modelライブラリとして生成されているようです。

で、myMLAppML.Modelライブラリを利用して推論するサンプルアプリがmyMLAppML.ConsoleAppアプリ

myMLAppML.ConsoleAppアプリのProgram.csを見ると、

MLContext mlContext = new MLContext();
ITransformer mlModel = mlContext.Model.Load(GetAbsolutePath(MODEL_FILEPATH), out DataViewSchema inputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);

で、MODEL_FILEPATHからpredEngineを生成して、

ModelInput sampleData = CreateSingleDataSample(mlContext, DATA_FILEPATH);
ModelOutput predictionResult = predEngine.Predict(sampleData);

で、ModelInputをpredEngineに通してModelOutputを得ています。

MODEL_FILEPATHはMLModel.zipを指しており、これが学習済みモデルのようです。

MLModel.zipの中身は、

f:id:matsujirushix:20190831144210p:plain

なんだろ?
ML.NETのクラスをシリアライズした感じなのかな?

Visual Studioさえ入っていれば、VS拡張でササッとできてお手軽でした。