Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

FLIR ONE Proを分解したら、簡単にLEPTON3.5が取り出せる!!

YOLO学習済みデータをiPhoneで利用する方法は次に回して、今回は最新耳寄り情報です。

FLIR ONE Proって?

 iPhoneやAndroidに取り付けてスマホをサーモグラフィー化する商品で、昨年までの同名商品(FLIR ONE)は、赤外線センサーとして同社のLEPTON3が入っていました。

         f:id:TAKEsan:20180816104920p:plain

 このカメラは、WEBカメラも取り付けてあり、2つのカメラ画像を合成して相互の弱点を補うというものです。しかし、LEPTON3は160X120画素の横長、スマホに表示される画像は縦長です。画像の比率を考慮するとLEPTON3画像のほんの1部しか使っていないことになります。ある意味つまんないですね。

 私たち(渡辺、小野)の作ったThermal Cam3はWEBカメラ未搭載ですが、無線格安、しかもLEPTON3の画像をすべて使い切っています。

 また、この記事でも紹介していますが、以前のFLIR ONEは簡単に分解できることもわかっています。

 果たして新しく、価格が高くなったFLIR ONE Proは簡単に分解できるか?、そしてセンサーは何を使っているかが疑問でした。買うといっても個人ではなかなか........。

今回

 Maker Faire Tokyoで知り合った大澤さんがFLIR ONE Proを持っていると言うことで、早々に分解して送っていただいた写真がこれです。

f:id:TAKEsan:20180816111300j:plain  f:id:TAKEsan:20180816111311j:plain

f:id:TAKEsan:20180816111412j:plain

f:id:TAKEsan:20180816115325j:plain

 本体両側のネジカバーをマイナスドライバーのようなもので外し、ネジ2本を外します。ネジを外す工具は一般的なヘックスローブドライバT5サイズだそうです。面白いことに、以前の製品より構造が簡単になっていることが分かります。LEPTONセンサーはソケットにはまっているだけですから、この段階で簡単に外すことができますし、元に戻すことも以前よりさらに簡単です。

 以下渡辺さん情報。Andoroid版はGPDでも使えるそうです。(FLIR ONEアプリをネットからapk fileダウンロードして入れ替えるとのこと)

f:id:TAKEsan:20180816120247j:plain

f:id:TAKEsan:20180816115523j:plain f:id:TAKEsan:20180816115542j:plain

f:id:TAKEsan:20180816115600j:plain f:id:TAKEsan:20180816115624j:plain

中に入っていたのはLEPTON3.5!!

 いろいろ試していただいた結果、中に入っている赤外線センサーはLEPTON3.5である事がわかりました。この部品はDegiKeyで購入することができて価格は30,631円。

 FLIR ONE Proを持っていて、私たちのThermal Camに興味を持っている方なら、バラさない手はありませんぞ!!

LEPTON3と3.5の違い

 両者とも画素に変化は無く160X120ドットのままですが、出力されたデータから簡単にすべての画素の測定温度を計算できるところが大きく違います。今までのLEPTON3は温度を計算するために、i2cを使ってチップ温度を取得する必要がありました。しかも温度計算方法についてメーカーは非公開。

 LEPTON3.5は通常の使い方をする限りi2cが必要なくなります。i2cのライブラリや余計な計算が必要ないので、私たちの使っているメモリの少ないESP8266には断然有利になります。

 LEPTON3.5用のARDUINO IDEソースも上記記事でダウンロード可能です。

 

 

YOLOオリジナルデータの学習

今回は今年のMaker faire tokyoで使ったAIジャンケンのデータ作成方法を書くことにします。AIの専門家では無いので、固有名詞の間違いはご容赦願います。

         

       今回のデータを使ってジャンケンの手をリアルタイム認識させています。

 YOLOを使った画像認識が早いのは分かりました。ただし練習でおおーっと思った画像認識に使うデータは、他人が用意したものです。自分の必要なデータをどんな用途で使うかで価値が決まって来ますよね。

 用意する学習データは1クラス数千枚単位ですから、アマチュアではチョットって感じです。せっかく苦労して用意しても、使えなかったら何にもならないわけで、今回は「データー作成はそれほどでもなかった」的な記事です。メイカーフェア出展に向けて、サーモグラフィーを利用したジャンケン認識用画像の種類は3クラスとなりますが、これ以上のクラス数でも作成方法の基本は同じです。

 次回は学習済みデータをiPhoneへ移植するまでを取り上げますが、今回の学習済みデータはYOLOが動く環境なら問題なく動作することを確認しています。作成時疑問に思っていたことについても、併せて説明して行きます。

参考資料は1つだけ

 Yoloを使った学習方法の説明は、ネット上でいろいろ見つけることができますが、基本は How to train YOLOv2 to detect custom objects

のようです。疑問に思ったときのヒントは、この記事のどこかに書いてありますので、あまり日本語の記事に惑わされず熟読することが大切。今回は動画から必要画像を取り出して、ただひたすらにクラス分け作業を行う、という方法です。

必要機器

 Mac      : iMacでもMacBookでも何でもOK

 Ubuntuマシン  :必ずNVIDIAのGPUが付いているマシン(今回は1080 Ti 1個)

 iPhone    :  iPhone7以上 (認識に今回はiPhoneを使ったのでUbuntuマシン

         でもOK)

 ソフト    :特に購入ソフトは無し

1.動画を用意

 今回はジャンケンですから、iPhoneで録画したこんな感じの動画を用意します。

f:id:TAKEsan:20180815114234p:plain

 赤外線カメラ画像なのでグレースケールデータだけです。後で説明しますが、クラス分けが大変なので1クラスのみで、あらゆる方向から動画を撮影しました。今回はグー、チョキ、パー それぞれの動画ファイルを名前を変えて用意しています。

 YOLOは同一画像で複数のクラスを認識するので、最初は複数のクラスが写っている必要があるかと思いましたが、そんなことは関係ないようです。また、撮影画像のピクセル数はあまり問題にはなりませんでした。結果的に、720pや1080p、540pが混在しても認識への影響は感じられません。

2.MacのiMoveを使って編集

 iMoveを使いましたが動画編集ソフトなら何でもOKです。上の画像のままでは右の方に余計な部分が写っているので、トリムすることと、対象クラスが写っていない不必要な画像をある程度削除しておくことが目的です。(iMoveではトリムでは無くクロップという単語を使います)最終的に720p、MP4で保存しました。

f:id:TAKEsan:20180815115732p:plain

3.動画を複数のjpg画像に変換

 ここからはUbuntuマシンを使います。まず画像変換ソフトをインストール。動画から画像に変換できるソフトなら何でも良いのですが、ffmpegを使いました。ffmpegはMacでもWindowsでも使えますので、特にUbuntuマシンで無くてもOKです。インストール方法は他の記事を参考にして下さい。

 新しいフォルダを作って、その中にmp4ファイルをコピーします。そのフォルダで以下のコマンドを実行。

   ffmpeg -i input.mp4 -vcodec mjpeg -r 5 image_%03d.jpg

    input.mp4:入力動画ファイル名

    image_%03d.jpg:出力ファイル名 

 image001.jpeg.....と名称の付いたファイルがたくさん作成されますが、この例で「image」部分はクラス毎に名称を変更した方が、後からデータを追加するときに便利です。今回のデータは基本8fpsくらいで、iMoveを使って30fpsで保存しています。そのままでは同じアングルの画像がたくさんできてしまうので、1/6ぐらいに間引いて作成しています。なので作った動画に合わせて-r 5部分を変更します。

 コマンドを実行すると、フォルダ内に連番の付いた大量のjpegファイルが作成されます。今回の場合はクラスが3つなので3回実行。当然ですが連番前の名称を変えていれば、同一フォルダ内に作成してもOKです

4.2回目の間引き

 できた画像を確認して、不必要な画像を削除します。よく注意しながら目標のクラスが写っていない画像や、重複があるものはドンドン削除してしまいます。重複が多い場合は、すべて削除してffmpeg の-r以下の数値を減らして再実行した方が早いかもしれません。ここでの削除作業は後の作業効率や認識結果に関わってくるので、重要です。

5.YOLOをインストール

 以下に沿ってインストール。今回はiPhoneとの連携のためV2.0を使いましたが、最新のものでOKです。

Installing Darknet

 GPUを使わなければ意味がありませんのでmakefaileの中のGPU=1 を有効にすることと、OpenCVはあらかじめインストールしておいて OPENCV=1にしておくことも忘れずに!!。OpenCVをインストールしないと、動画系のテストプログラムが実行できません。Yoloはmakeにさほど時間がかかりません。Caffeとは雲泥の差です。

6.ラベリングする(アノテーション)

 Yoloは上記で作ったイメージファイルの他に、これらに対応したTXTファイルが必要です。(イメージファイルのどの部分に対応するクラス画像があるかを示すテキストファイルで、イメージファイルの枚数分必要です)ここら辺が一番単調で、手作業では時間のかかる部分となります。今回ラベリングソフトはlabelimgを使いました。以下インストール方法ですが、すでにpython3をインストールしている場合は3,4行目は必要ありません。

labelimgと言うフォルダができるので、この中に自分の好きな名称のフォルダを作り、先ほど作成したイメージデータを全部コピーします。最初は3つのフォルダが必要かなとも思いましたが、クラス毎にimgデータのファイル郡の名称を変えていればごちゃ混ぜにしてOK。

 次にlabelimg/data の中にあるpredefined_class.txtを修正します(これが一番手っ取り早い)。最初は20クラスぐらいあらかじめ書き込んでありますが、今回は3クラスだけなので、既に書き込んであるクラス名を全部消し、自分の好きな名称でクラス名を改行して書き込みます。今回はguu、tyoki、paaにしました。これは必ず修正が必要です。

labelimgフォルダの中でプログラムを実行します。

 python3 labelimg.py

以下のような画面が表示されるので、次のような設定を行います。

f:id:TAKEsan:20180815230111p:plain

 左側 OpenDir で先ほど作ったイメージデータが入っているディレクトリを指定

    Change Save Dir で同じディレクトリを選択。イメージもアノテーション

    ファイルも同じディレクトリに入れちゃいます。

    さらにSaveの下にある PscalVOC を選択して、必ずYOLOに変更します。

    これを忘れると、最初からやり直しになるので注意

 そして上部のメニューバーからView->Single Class Modeにチェックを入れます。

Single Class Modeとはクラス名が同一の場合、連続でデータを入力できるので、1つのクラスに対応したjpeg画像がここで生きることになります。但しSingle Class Modeにすると最初だけClass名選択をする必要があります。

 今回は連番以外の名称をクラス別に変えているので途中クラス選択の必要がありますが、その場合は一時的にSingle Class Modeを外して違うクラスを選択後、またSingle Class Modeにします。とにかく少ないデータで一度使ってみて、コツをつかんで下さい。操作は直感でできちゃいます。

 画像中のクラス画像選択はD、 選択した画面を保存して次の画面に移る場合はWキーを押します。

 D-->マウスで対角指示-->W-->D-->マウスで対角指示-->W と連続してクラス指定が可能で、慣れると1枚の画像のアノテーション所要時間は2秒程度。上手く行けば1時間で1500枚以上のクラス分け(アノテーション)が可能です。但ししばらく作業をしていると、キーボードを操作している左手がしびれてしまいますのでご注意を!!。

 ここで1枚の画像に複数のクラス画像が入っている場合、いちいちクラス名を指定しなければ無いのでグンと効率が落ちます。

ってことをマスターしてしまえば、基本データ作りは一応完成です。ここで作ったデータはtiny_Yoloでも標準Yoloでも使用できます。

 Yoloのアノテーションのファイルは以下のようになっています。内容が違っている場合や、クラス番号が正常で無い場合はlabelimgの設定を疑って下さい。

f:id:TAKEsan:20180816102939p:plain

最初の数値がクラス番号で、今回は0~2の3種類。この場合は画像に存在するクラスがTyoki=1で1個のみ。その次の4つの数値はTyokiの範囲を示します(yoloは比率で表すようです)

f:id:TAKEsan:20180816103351p:plain

       この場合は1つの画像にGuu=0とPaa=2が存在していることを示します。

7. またまたダメ押しのチェック

 これで終了とも思えるのですが、必ず間違いがあるので、もう一度ダメ押しのチェックを行います。イメージとアノテションファイルをごちゃ混ぜにした成果がここに出ます。以下のように同一名のjpgとtxtファイルができますが、たまにjpgファイルに対応しているtxtファイルが作られていない場合があるので、それを見つけ出してダブっているjpgファイルを消してしまいます。例えば普通は以下のようにjpgとtxtが交互に並びますが、txtファイルが作成されていないと、jpgファイルが続くことになります。

f:id:TAKEsan:20180816002346p:plain

8.yoloの下準備

 Darknetをインストールするとdarknetディレクトリができます。

darknet/data の中に先ほど作ったjpgとtxtの入ったごちゃ混ぜデータをディレクトリごと移動またはコピー。

 その中にprocess.pyの名称で、以下の内容のファイルを作成

import glob, os

# Current directory
current_dir = os.path.dirname(os.path.abspath(__file__))

# Directory where the data will reside, relative to 'darknet.exe'
path_data = 'data/obj/'

# Percentage of images to be used for the test set
percentage_test = 10;

# Create and/or truncate train.txt and test.txt
file_train = open('train.txt', 'w')  
file_test = open('test.txt', 'w')

# Populate train.txt and test.txt
counter = 1  
index_test = round(100 / percentage_test)  
for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")):  
    title, ext = os.path.splitext(os.path.basename(pathAndFilename))

    if counter == index_test:
        counter = 1
        file_test.write(path_data + title + '.jpg' + "\n")
    else:
        file_train.write(path_data + title + '.jpg' + "\n")
        counter = counter + 1

これは

How to train YOLOv2 to detect custom objects

に掲載されてます。何をするのかというと、ディレクトリの中のデータを教師ファイルと学習用ファイルに分けてそれぞれリストファイルを作ります(train.txtとtest.txt)標準では教師ファイルは全体の10%ですが、これを変える場合はpercentage_test = 10 のところを15とか30とかにします。この数字の変更はかなりシビアで、最終的にできた学習済みファイルの結果を試して最適値を探します。最終的にと簡単には言いますがGTX1080 Tiで学習させても数時間必要ですので、容易ではありません。今回の場合30%で一番良い結果が得られました。実行方法は、

   python process.py

 実行環境はPython2である事に注意です。画像が不足していると感じた場合は、追加画像群を他の場所でアノテーションして、すべてこの場所に放り込み、再度python process.pyを実行するだけです(その場合は画像名称を変えることを忘れずに!!)。

9.cfgファイルを変更

 tinyYOLO標準YOLOでは変更内容が違うことに注意して下さい。変更ファイルは、darknet/cfgの中に入っています。

tinyYOLOの場合(今回のiPhoneを使う場合)  

  tiny-yolo-voc.cfgを変更します

   2行目 batchを64に変更(初めから書いてあったと思う)

   3行目 subdivisions=8に変更(これも初めから書いてあったと思う)

  120行目 classes=20を3に変更 (クラスの数です)

  1.   114行目 filters=512 を 40に変更 (class+5)*5の計算値 (3+5)*5=40

                クラスの数が変わればfiltersの数値も変わることに注意!!

標準yoloの場合

    How to train YOLOv2 to detect custom objects

  に沿って、yolo-voc.cfg内容を変更します

10.あらかじめトレーニングされたデータをダウンロード

 一応 darknet/ 内に必要ファイルをダウンロードします。このファイルは学習を収束させるために必要なファイルだそうです。  

YOLO V2とV3とではデータが違います。

  YOLO V2.0の場合は

     downloaded

    darknet19_448.conv.23がダウンロードされます。

  YOLO V3.0の場合は

    wget https://pjreddie.com/media/files/darknet53.conv.74

    darknet53.conv.74がダウンロードされます。

11.さらに2つのファイルを作ります

  darknet/cfgの中にobj.namesファイルを作成

  obj.names :先ほどのpredefined_class.txtと内容が同じファイル。

        クラス名を改行しながら書きます。今回はGoo、Tyoki、Paa

f:id:TAKEsan:20180815230202p:plain

  obj.data    :必要ファイルのリンクを書き込んだファイル。以下のような感じ。

      class   必ず指定。今回の場合3

      train ディレクトリとファイル名を指定 先ほどのtrain.txt

      valid ディレクトリとファイル名を指定 先ほどのtest.txt

      names   クラスファイルの場所とファイル名 obj.names

      backup  学習済みデータの保存先 このままでOK

f:id:TAKEsan:20180815230221p:plain

12.いよいよ学習

darknet/  ディレクトリ内で以下を実行。今までの作業はこのコマンドを実行させるために必要なことだったと言うことですね。

 tiny Yoloでyolo v2.0の場合

./darknet detector train cfg/obj.data cfg/tiny-yolo-voc.cfg darknet19_448.conv.23

 

 標準YoloでYolo v3.0の場合は

./darknet detector train cfg/obj.data cfg/yolo-voc.cfg darknet53.conv.74

となります。

 今までのリンク先などの設定で、データの置き場所などが変更可能だと言うことが分かると思います。ある程度慣れてきたら自分の環境に合わせて変更してしまえば、もっと使い安くなります。

13.すんなり行けば良いのですが

 ここまでの過程が複雑でデータ量が多いことから、普通は簡単には動いてくれません!!

 実行してから、まず最初の1〜2分の段階でjpegに対応したtxtファイルがありませんのようなエラーメッセージが出たら、アノテーションが上手くいってません。上記7.をもう一度確認してjpegファイルがダブってないかチェック後、必ず 

python proxess.pyを再実行。同様のエラーが無くなるまで同じことを繰り返します。上手くいくと以下のような画像になります。

f:id:TAKEsan:20180815230846p:plain

 この場合はtiny-yolo-voc.cfgを使ってsubdivisions=8にした場合で、これを40,000回繰り返し(tiny-yolo-voc.cfgの15行目 max_batchの最後の数値を40,000にした)、100回毎にでデータがdarknet/dataの中に自動保存されます。つまりこの例では400回上書き保存されます。  

 subdivisionsの値を少なくすると計算がメモリー上に展開されるようで、全体のスピードが多少速くなりますが、GPUメモリーが不足してエラーになる可能性があります。

 上の画像のように、8回毎に平均値が出ます。avgの手前の数値が0に近づくほど良好とのこと。今回のデータでは1.455029になっていますが、これ以上続けてもほとんど変わらないことと、次で説明する認識テストもほぼ良好なので。ここで打ち切っています。

 ただし標準Yoloでの学習は確実にゼロに近づきます。また白黒で学習させているのにカラー画像でも認識するのには驚いてしまいました。Tiny Yoloではそうはいきません。

 このほか、Classがゼロだったり他の数値が表示されていない場合は、クラス分けやクラスの数の指定が各段階で上手くいっていない可能性があります。再度確認となりますが、「6.クラス分けをする」だけは慎重に作業する必要があります。ここで設定を間違うとアノテーションを最初からやり直ししなければなりません。

 今回約4,500枚のデータを使い4万回の繰り返しで、大体6時間(GTX 1080 Ti)ぐらい必要でした。学習時間はGPU性能に依存します。

14.学習結果の確認

 学習結果は、darknet/backupに保存されます。tiny-yolo-voc.backup又はyolo-voc.backupがそのデータで、

./darknet detector test cfg/obj.data cfg/yolo-voc.cfg backup/tiny-yolo-voc.backup test.jpg

(標準学習の場合はtiny-を消します)

と打ち込み認識したいサンプル写真を指定(test.jpg)すると現在の学習状況が確認できます。満足できる認識内容なら、どの段階でもCtrl+Cで打ち切り可能。その場合は.backupが学習済みデータになります。その他に各段階でデータが作成されていますので、それらを利用することも可能です。

 学習実行内容をよく見ていると、数値にかなり波があるので、avgの手前の数値が0に近付いたとしても、少なくとも1万回以上は繰り返さないと満足な結果は得られないようです。 ここら辺はデータ量や質によりなんとも言えないので、ヒーター付き集塵機(GPUの付いたUbuntuマシンを私はこう呼びます。夏場はさらに冷却用の扇風機が必要...)の電気料金が許す限り自分で試して見るしかありません。

f:id:TAKEsan:20180815235143p:plain

以上の作業は慣れるとスイスイなのですが、伝わったかなー、伝わんねーだろーなー。

 2ヶ月前の作業を思い出しながら書いたので、結構疲れた....。

 

                             では、また。

この後追加学習を試してみました。以下参照

takesan.hatenablog.com

 

 

今年もMaker Faire Tokyo 2018に出ます!!

 今年もメイカーフェア東京(Maker Faire Tokyo 2018)に出展することになりました。

    This year we will also exhibit at Maker Faire Tokyo (Maker Faire Tokyo 2018).

f:id:TAKEsan:20180704201130j:plain

 今まで、格安WIFI付きプロセッサ(ESP8266)とFLIR LEPTON赤外線センサーで、どれだけ本格的・実用的なiPhoneアプリが作れるかどうか追求してきました。

  Until now, We have been trying more practical iPhone apps with cheap WIFI core (ESP 8266) and a FLIR LEPTON infrared sensor.

f:id:TAKEsan:20180705100857p:plain

 昨年に引き続き今年も赤外線カメラ(FLIR LEPTON1,3,3.5)を使います。もちろん小型ドローンへの搭載も着々とバージョンアップが進んでいます。

 今年は大きく分けて3つの内容になります。今までは、開発時間に追われてブログ更新をしてませんでしたが、公開できる面白い材料がずいぶんそろってきましたので、頑張って今後紹介して行きたいと思ってます。

  We are still using FLIR LEPTON 1, 3, 3.5 this year as well. Of course small drone test has steadily been upgraded.

  This year we expanded three main items. Until now, we are too busy to update our blogs, but a lot of awesome idea we will introduce you, so we will do our best and we want to introduce it in the future.

今年はメンバーが3人になりました    This year three members have become

 東北と関西の共同作品です。こんな感じのロゴにしました。WT&Dに名称変更。

  It is a collaboration work between Miyagi, Hyogo and Kyoto. We made it as a logo like this. Changed name into WT & D this time.

              f:id:TAKEsan:20180705101320p:plain

 

1.小型ドローンへのLEPTON搭載?    LEPTON installed in a small drone?

 確実に進化しています。成果のお話は会場で!!

 It evolves reliably. Talk about achievements at the venue! !

f:id:TAKEsan:20180705102508p:plain          えっドビー軽量化?       weight reduction?

2.小型サーモグラフィ画像2個で立体表示可能か?   Can 3D display be possible with two small thermographic images?

 前回の記事で最後の方に動画を付けましたが、こんな感じです。

  We attached a movie in the last article. it is like this.

           www.youtube.com

 ステレオメガネやスマホゴーグルで立体画像が確認できます。サーモグラフィー画像2画面同時表示、しかもWIFIでリアルタイムってのはありそうで無かった未知の領域です。これはコンピューターで遠近を認識できることを意味しますが、この動画のDepth画像や3Dメッシュ画像で確実に距離を認識していることが分かると思います。

  You can check stereoscopic images with stereo glasses or smartphone goggles. It is an unknown area which was not likely to be real-time with WIFI simultaneous display of thermographic picture 2 screens at the same time. This means that you can recognize the perspective in the computer, but you can see that the distance is definitely recognized by Depth image and 3D mesh image of this movie.

f:id:TAKEsan:20180705104206p:plain

3.小型サーモグラフィ画像で画像認識は可能か?    Can image recognition be possible with a small thermographic image?

 画素の少ないサーモグラフィで、ジャンケンの手の形がどれだけ正確に認識できるかどうかトライしてみました。初めはLEPTON3.5で作ったデータで学習させた結果をLEPTON3.5で認識させていましたが、試しに画素の荒いLEPTON1(たった80x60画素)で認識させたところ、まともに動くことが分かりました。会場ではWIFIの混線が予想されるので、妨害電波に強いLEPTON1系のアプリを使う予定です。日本国内でもこのセンサーをお持ちの方が多いと思いますので、今後ブログ上で学習データの作成方法やソースを公開して行こうと思っています。

 今回のソフトは、熱を発する人間の手のひらだけを画像認識できます。一種の温度フィルターですね。これができたってことは応用が無限に広がります。それもTX2じゃなくてiPhoneで!!(画像はiPhone7 plusです)どう思います?

 With a thermography with few pixels, I tried to see how accurately the hand shape of Rock-paper-scissors could be recognized. Initially we was letting LEPTON 3.5 recognize the result of learning with data created with LEPTON 3.5, but when I tried to recognize it with a rough LEPTON 1 (only 80 × 60 pixels), we found it to work properly It was. At the venue, it seems that WIFI 's crosstalk is expected, so we plan to use LEPTON 1 series applications that are stronger against jamming waves. We think that there are many people who have this sensor even in Japan, so I'm thinking about going to introduce how to create learning data and sources on our blog in the future.
 The software of this time can recognize only the palm of the human's fingers image. Is it a kind of temperature filter? The fact that this can be done spreads the application infinitely. It's not TX 2 but on the iPhone! ! (The image is iPhone 7 plus) What do you think?

    

  f:id:TAKEsan:20180705105004p:plain

 そして、応用。2種類のジャンケン画像を読み取ってf:id:TAKEsan:20180524102209j:plain (Juneチャン)が、歌います(簡単な手話の解読)。高齢者の脳トレに最適!!。

 And application. two kinds of Rock-paper-scissors images (June Chan), but my dog sings (easy decoding of sign language). Ideal for the brain train of elderly people! ! .

    

今回のアプリは、    This time,

  すべてアプリ登録しているThermal Cam3、1を利用して作りましたが、マルチスレッド化しているので申請条件に合わないため、アプリストアから配布ができません。ただしテストフライトという形なら配布が可能ですので、希望する方はコメントして下さい。

 I made it using Thermal Cam 3 & 1 which all the applications are registered, but because it is multi-threaded, it can not be distributed from the apps store because it does not meet the apple application requirements. However, since distribution is possible in the form of Test Flight, please comment if you wish.

      f:id:TAKEsan:20180704191549j:plain

Thermal Cam、Thermal Cam3のインストール方法は、       How to install Thermal Cam, Thermal Cam 3,

 この記事をご覧下さい。性能を上げるため来月中を目標にバージョンアップする予定です。
 Please see this article. We plan to upgrade to the target next month to improve performance.

takesan.hatenablog.com

 

 

 

 

 

 

ジュンちゃん手術をする!!

 我が家のアイドルトイプードルのJUNEですが、1才にも満たない頃フローリングですってんころりん。右後ろ足の膝のお皿が外れ安くなりました。グルコサミンを飲ませたりしてだましだまし散歩を続けましたが、今年獣医さんに連れて行ったら、外れた膝のお皿がずれたままくっついてしまったとか....。膝蓋骨脱臼のグレード4だそうです。道理で散歩の途中で座り込んでしまうことが多くなったわけだ。

 このままでは左足もおかしくなってしまうと言うことで即手術命令!!。最悪歩けなくなるかもしれないと思い。いくらか歩けているうちに毎日少しずつお散歩をさせ(今から思えば考えすぎでした)、

f:id:TAKEsan:20180524143650j:plain

 我が家から車で2.5時間。盛岡の岩手大学動物病院を紹介してもらって連れて行くことに..。

 前日は心配して友人から送ってもらったお守りを付けて、夕ご飯以降絶食絶水。僕の作ったご飯しか食べないというような悪いしつけをしたので、冷凍にして持参。ついでに事前にトリミングして、狂犬病やワクチンの注射をしてから手術に挑ませることにしました。

f:id:TAKEsan:20180524102209j:plain

岩手山がとても素晴らしかった!!

f:id:TAKEsan:20180524102350j:plain

後ろ姿が泣ける。

f:id:TAKEsan:20180524102430j:plain

 手術内容は、右膝の皮膚をタテに5cmくらい切って、お皿がずれないように足膝部分の骨を削る。横にくっついてしまった膝のお皿を外し、所定の部分まで引っ張ってピンで固定。なんていう飼い主としては身の毛もよだつような内容。

 5/8入院、5/9夕方手術、5/10病院で安静、5/11退院という強行スケジュールでした。5/9の手術後、先生から無事終了の連絡が来て一安心して見たものの、こんなに早く退院して良いのと思いながら迎えに行きました。

 うちのワンコは病院が大嫌いなのですが、岩手大学動物病院では先生を初め皆さんに優しくしていただいたようで、別れ際に先生へお礼(ペロペロ)をしてました。でも帰ってきたときは、こんな痛々しい姿に....。 飼い主としては不安です。

f:id:TAKEsan:20180524103914j:plain

  家の中では飛び跳ねないようにケージ入り命令が出たのですが、なにせしつけが悪く野放し状態で育てたので、ケージに入る訳もなく、

f:id:TAKEsan:20180524103308j:plain

 入れると暴れるだけなので、かえって悪くなると思って、部屋を小さく仕切り様子を見ることにしました。寝るときも一緒でないと本人は気が済まないので、ベッドから飛び降りないようリードを付けて一緒にご就寝することに..。

 1週間目でこちらのお医者さんに行って包帯を取っ替えて、2週間目で再びこちらのお医者さんで抜糸。

f:id:TAKEsan:20180524105221j:plain

 平気で歩いてます。まだ、かさぶたを噛む可能性があるので、エリザベスカラーを付けたままです。術後1ヶ月でCTを撮りに又岩手大学へ行くことになりますが、飛び跳ねないような環境を作れば、なんとか大丈夫そうです。やれやれ。

 

iPhone とOFとOpenCV3.4でcontribが実行できないのか?

ご存じの通り

 OpenCVのiOS版にはcontribが付いていません!!。このライブラリは面白そうなものがたくさんあって、どうしても実行したくなるわけです。でも、iPhoneのカメラを使うだけでもテクニックが必要なSwiftやオブジェクティブCから利用するんじゃなかなか難しいのが私の課題。OF(めんどくさいから今後Openframeworksの略)だったら全然問題ないところから、発想が展開していくことになります。

 まず、iOS用の最新OpenCVが存在するって事を知りませんでした。XcodeでのiOS開発はちまたで言うところのクロスコンパイルなんですね。iPhoneじゃ開発能力不足だから母艦iMacでコンパイルしてバイナルファイルをiPhoneに転送するって発想です。これが大きな障害になるポイント。はたして無事インストールできて、OFで使えるのか?でした。

f:id:TAKEsan:20180417212245j:plain

今回はLEPTON3の立体画像をiPhoneで楽しめる上にOpenCVで距離深度を確認、そしてメッシュ変換までです。こんなことやってる方はいないと思うので結構ワクワクでした。なんつったって無線がキクー!!

で、OpenCV for iOSをインストールして見ると

 終わってみるとほんとに簡単でした。標準インストールするだけです。以下はMacでの場合だけなのであしからず。まず標準OpenCV3.4.1のソースコードを

GitHub - opencv/opencv: Open Source Computer Vision Library

そしてこっちのiOS版3.4.1 contribのソースコードを

Releases · opencv/opencv_contrib · GitHub

つまりiOS版の同じバージョンのソースコードをダウンロードします。

 この2つのファイルをダウンロードして解凍した後、自分のMacの作業フォルダにコピーします。まずは、OpenCV iOS版のコンパイルから。これはOpenCV iOS版の標準インストールドキュメント通りです。

  cd /

  sudo ln -s /Applications/Xcode.app/Contents/Developer Developer

  cd ~/<my_working_directory>

  python opencv/platforms/ios/build_framework.py ios

 iOS版の特定ソースはなくて、OpenCV標準ソースファイルでインストールできます。

インストールに使用するpython は2.7.12で、brewCmakeなど私の環境ではインストール済み。つまずいた場合は、自分でなんとかして下さい。コンパイルは私のiMacで30分以上必要でした。

 結果的に自分の作業フォルダにiosってディレクトリができるので、フォルダの中に以下のようにopencv2.frameworkってディレクトリができれば一応完成です。

f:id:TAKEsan:20180319204754p:plain

OFで普通に使えるようにするには

OFは0.9.8です。うまくいけば2ステップで完了。

 まずこんな感じで作ろうとしてプロジェクトに、ビルドしたopencv2.frameworkを追加します。さっきどこにopencv2.frameworkを作ったかを忘れずに!!

f:id:TAKEsan:20180319210148p:plain

で、ofxiOS_Prefix.pch にopencv.hppをインクルード文他を追加します。使いやすいようにこの段階でnamespaceを追加します。#import <Foundation/Foundation>の前に挿入することが重要だったような...。

f:id:TAKEsan:20180319210207p:plain

 試しにこのままビルドしてみてエラーがなければ成功ですが、もしエラーが出ればダメ押しで、以下のようにHeader Search Pathsにopencv2.frameworkの存在する場所を指定してみます。大概この段階で実行可能環境ができてしまいます。

f:id:TAKEsan:20180319210223p:plain

 ビルドエラー無しでここまでできれば、問題はofImageとMatとの変換だけになります。OpenCVとOpenFrameworks間のデータで問題になるのはimgeとMatの相互変換だけで、例えばL_image っていうofImageをOpenCVのimgRっていうMatに変換する場合は、

  cv::Mat imgR = cv::Mat(L_img1.getHeight(),L_img1.getWidth(), CV_8UC3, L_img1.getPixels().getData());

 Matを使ってOpenCVで画像処理を加えた後、ここではtakeっていうofImageに変換すればすぐDrawできちゃいます。

 

   take.setFromPixels( imgR.ptr(),  imgR.cols,  imgR.rows, OF_IMAGE_COLOR, false);

 両者にはRGB BGR変換とかいろいろ中間処理の必要な場合がありますが、基本ポインタ+αなので、実行時は高速変換できてしまいます。(forの二重ループを使うよりはです)

 キーポイントはCV_8UC3 OF_IMAGE_COLORでした。内容は私が説明するより先人がたくさん書いていますので、そちらを参考にして下さい。

じゃーofxOpencvやofxCVはどうなるんだろー

 はっきり言って必要性は感じない。データの変換作業だけが一見やっかいなだけでこつを飲み込めばこっちの物です。なんつったってこっちは最新のOpenCVでーす。

今回の目玉contribはどのようにして実行できるようになるのか?

 肝心のcontrib導入方法です。またまた時間がかかっちゃいますが、今までの処理が無事終わっていれば、再コンパイルするだけで済みます。

 バージョンを合わせたmoduilesの必要なcontribのモジュールフォルダをopencvフォルダにコピーして再度コンパイルし直すだけ!!。私の場合ximgprocが必要だったのでximgprocフォルダをコピーして、OpenCVを再コンパイルするだけでした。少し前はインストールがかなりめんどくさかったようですが、今はぜーんぜん。

f:id:TAKEsan:20180417203036p:plain

                           contribのなかのmoduilesフォルダの中の各ライブラリフォルダを......

f:id:TAKEsan:20180417203006p:plain

                              OpenCVのなかのmoduilesにコピーして再コンパイルするだけ!!

じゃー何ができるの? 

  iOSの場合、C++の方がSwiftより実行スピードが速いって事が経験的に分かってたのですが、OF+Opencv+contribで去年の今頃は、こんなのできるとは思ってませんでした。

              www.youtube.com

今までの集大成です。Swiftなし。OFだけです。Appleのアプリ審査が通れば皆さん簡単に実行できると思うんですが、無料で申請すれば簡単に通ったりして......。

 

 

                           では、また。

 

 

openFrameworks でCoreML (YOLO)!!

openFrameworks for iOSでYOLOを動かしてみました。

前回紹介したGitHub - hollance/YOLO-CoreML-MPSNNGraph: Tiny YOLO for iOS implemented using CoreML but also using the new MPS graph API. iOSでのYOLO実行環境はSwiftでした。SwiftはUI環境を整備しなくてはいけないので、私にはとてもやっかいです。これをOpenframeworksで実行させたら、簡単に画像を加工できるはず。この記事には、YOLO標準データをCoreML専用に変換するPythonスクリプトも入っているので再学習も可能のはずです。結果、ソースの変更でopenFrameworksでもCoreMLが実行できました。肝心の画像認識部分の実行速度は、Swift版より今回移植したC++版の方がかなり早くなっているようです。画像加工が簡単なので少し表示内容を変更しています。画像認識部分はマルチスレッドにしているので、画像を加工しても画像表示はCoreML(物体認識部分)に影響されません。ただし実行時iPhoneがかなり熱くなるので、連続して実行する場合は1分前後が目安です。iPhone7以降で実行可能。

f:id:TAKEsan:20180102224325p:plain

openFrameworksはdownload | openFrameworksからiOS版をダウンロードしてインストールして下さい。

以下iPhone 7plusで動かした場合

               

以下iPhone Xで動かした場合

               

前回のSwift版より認識スピードが倍近く速くなっているので(計測ポイントは同じ)ハードの実力はすごいの一言。ただ、画像のフレームレートが下がっていますが、カメラ画像の大きさに影響するようです(今回は1280X720としたので遅くなっている)-->1/27修正 今はiPhoneXで29~30FPS、iPhone +で20FPS位になってます。-->1/28修正 画素を元々のswift版と同じ640x480として、内部を少し変えたらiPhoneXで45~60FPS、iPhone +で30FPS位になりました。動画画像は60Fpsでも認識スピードは変わらないのであしからず。マルチスレットにするとiPhoneXだとまだまだ+αが可能ですなー。(肝心な部分を抜かしているような気もしないではありませんが...)

                

1/28修正 最終的にこのくらい。iPhoneXで動画が最高60Fpsいってました。640x480だと認識率が落ちるようですが、これで文句言う人あんまりいないでしょ。

やはりiPhone7の倍くらいスピードが違いました。

ソースは以下に公開しました。

実機でないと実行できないので注意。(Yoro_of2.zipをダウンロード)

https://drive.google.com/drive/folders/0BzqxnYlVMv6uRUtMb2pRXzdsNlU?usp=sharing

急いで作ったので、グローバル変数が多いですが、addonにすれば、かなり簡単に応用できると思います。YOLOの学習済みCoreMLファイル「TinyYOLO.mlmodel」は、プロジェクトにコピーすると、自動的にobjectiv-Cのヘッダーファイル(TinyYOLO.h)が作成されます。画像の変換に利用しているだけですが、ofxCVアドオンをダウンロードして追加してください。1/27修正 結構頻繁にハングアップしていましたが、修正済み。oF上の画像部分取得コマンドofImage.cropFromに少しバグがあるようです。1/28修正 解像度変更とマルチスレッド見直しでスピードが大幅に上がった。

多分Signing系のエラーが出ますので、赤矢印部分を自分の環境に設定して下さい。

f:id:TAKEsan:20180102223102p:plain

                             では、また。

 

 

iPhone X ..........。

前回

 ディープラーニングの学習済みデータを使って、iPhoneXやJetson TX2を使っていろいろ試してみましたが、Tiny YOLO単一環境では一体どのくらいの差があるかどうかざっとテストしてみました。

f:id:TAKEsan:20171213214635j:plain

 Tiny YOLOを使った理由は、iPhone環境でYOLOを使ったサンプルはTiny YOLOしかないからなんですが、同じデータセットを使って実際認識試験をしたら一体どのくらいの差があるんでしょうか?非常に興味深いところです。TX2の方はDARKNETの標準インストールです。

Installing Darknet

当然GPUはON、CUDNNもONです。Tiny YOLOは20クラス同時に認識しますが

まずはTX2から。

YOLO: Real-Time Object Detection

で、Tiny YOLOをインストールしてdarknetフォルダの中で次のコマンドを実行します。当然クロックを最大にする./jetson_clock.sh を実行させてから。

./darknet detector demo cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights -c 0

     youtu.be

大体15~16FPSってとこでしょうか。ちなみにGPUもCUDNNも外してmakeした実行結果は0.4FPSなので、GPU環境じゃないと動画の認識は不可能でした。つまりCPU単独実行の場合の38倍ぐらい早くなってます。

次にiPhone7 plus

GitHub - hollance/YOLO-CoreML-MPSNNGraph: Tiny YOLO for iOS implemented using CoreML but also using the new MPS graph API.

をダウンロードして、この中の「TinyYOLO-CoreML」をビルドします。すでにTineYOLOデータが入っていますのですぐにビルドできます。このサンプルはiPhone のカメラを使うので実機でしかテストできませんが、現状のXCODE9.2は簡単に実機テストできます。詳しくは他の記事を参考にしてください。エラーが出るとすればSigningの設定変更だけです。

     youtu.be

11~13FPSです。やはりTX2よりはいくらか遅い。

そしてiPhoneX

     youtu.be

28FPS前後!!なんてこっちゃ。早すぎる。iPhone8でも同じくらいのスピードってことですね。1/30追記:このソフトはマルチスレッドで動いているようで、28FPSはどうやらカメラ画像のみのスピードのようです。実際の認識スピードは0.07秒=14.3FPSってところです。この後openFrameworksに移植したところ20〜22FPSまで上げることができました。

 Nvidia Jetson TX2は、ディープラーニングに特化していて、一般的なこの種のボードでは最上位のはずです。しかもNvidia公表では単精度の浮動小数点演算で2Tflopsを達成してることになっています。それでも画像の学習には能力不足で、母艦の最速GPUが必要。TX2は学習結果の認識に特化してるはずです。この結果は何を意味するんでしょうか?。方やCUDA+CUDNN、方やMETAL。同じデータセットを使って同数の20クラスを同時認識。結果はiPhoneXが圧倒的に早い。METALなんか発展途上で....なんて考え方は捨てた方が良さそうです。

 また、いくらTiny YOLOでも、前述の通りGPU無しでは実用に耐えるスピードまでは行き着きません。問題は開発環境だけって事になります。性能についてAppleはかなり控えめに報道してるって感覚。

 アプリを使う側は、プログラムの過程なんかどうでも良いわけで、この結果から見る限りiPhoneXはTX2の遙か上を行ってるって事になりますが、どう思います?

 

                                                                                                     では、また。