2018年9月30日日曜日

AIの本質

英語ですが動画でとても正確な説明をしているサイトがありました。
一冊の本を読むよりこの動画を眺めて下さい。
イメージを掴めれたら良いです。

https://youtu.be/aircAruvnKk


一番有名な0から9までの手書きの数字を学習して推測するまでの過程が
説明されています。基本的な説明で今はこの考え方は古くなっていますが初心者の理解にはとても良い説明です。
チャピター3まで視聴出来れば良いですが、多分眠たくなるでしょう。
13002通りの計算を手書きの数字を学習する際に計算で重みとバイアスを記憶していって新しい手書きの数字を0−9のどれかの推測をします。実質98%位の確率です。
5000位のサンプルを13002回計算しますが要は0−9かどうかの計算なので5000X13002回=65010000回CPU計算するよりGPUで5000の並列処理で13002回計算する方が効率的です。
この点と点の結びつきや重みやバイアスが脳神経科学によるものでこれをコンピュータでシミュレートするのがAIです。
画像認識、音声認識等ほぼ同じ様な工程で認識して推測すると思って頂いて良いと思います。

数式のイメージを分かりやすく説明すると%Zで事故電流を求めたりインピーダンスマップからそれぞれの継電器の制定値を求めたりするのと同じです。要はオームの法則で数値を求めるだけです。インピーダンスがあるので一見難解に思う様に見ると理解し易いのではと思いますが如何ですか?

openCV make file ②(忘備録)

9月29日14時
コピペやGUIに慣れると直ぐに嵌ります。Orz...
cdで目的のディレクトリーに行けない。思い込みと基本がなってない。覚えたつもりで入力しても間違えてるし。
cd ~/でどこにいくのかcdファイル名とコマンドの直後のスペースの意味。理解したつもりだとなにを間違ったのか分からない。
まずlsコマンドとls /でディレクトリーの確認をして思い込みを無くして。作業に慣れる。これコマンド操作の基本。

make fileの作業手順
①ターミナルの起動後コマンドでmkdir hello作業用ディレクトリーhelloを作る。(既にディレクトリーがある場合は②から)
②lsコマンドもしくはls /コマンドでディレクトリーの確認でhelloが表示されるか確認。
③cd helloで作業用ディレクトリーに移動
④pwdでどこに居るか念の為確認する。
g++ -o aaa aaa.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`で実行ファイル生成
-o オプション+スペース+実行ファイル名 でa.out でなく自分の好きな実行ファイル名を付けられます。

念の為もう一つ例:g++ -o main main.cpp `pkg-config --cflag opencv` `pkg-config --libs opencv`
⑥作業ディレクトリーで./aaaで実行

若しくは一つの例./mainで実行

 `pkg-config --cflags opencv` `pkg-config --libs opencv`の意味


これをコンパイルするときには,(1)cv.hなどのOpenCVのヘッダファイルが何処にあるのかの指定と,(2)libcvなどのOpenCVのライブラリが何処にあるのかの指定が必要です.これらを勝手にリストアップしてくれるのがpkg-configというコマンド.
まず,(1)のヘッダファイルについては
pkg-config --cflags opencv
を実行することでリストアップできます.僕の環境では
-I/opt/local/include/opencv
となりました.次に,(2)のライブラリについても同様に
pkg-config --libs opencv
を実行することでリストアップできます.僕の環境では
-L/opt/local/lib -lml -lcvaux -lhighgui -lcv -lcxcore
となりました.これをg++に引数としてソースコードと一緒に渡してやればコンパイル出来ますです.
g++ -o main main.cpp -I/usr/include/opencv -L/usr/lib/opencv -lcv -lhighgui
ここで,pkg-configの結果を直接g++に渡したいものです.そこで登場するのが`(バッククオート).コマンドを`で囲むと,その部分が,そのコマンドを実行した結果に置き換わります.つまり
g++ -o main main.cpp `pkg-config --cflag opencv` `pkg-config --libs opencv`
と書けばOK
毎回こんな長いコマンドを打つのはやってられないので,Makefile
main: main.cpp
     g++ -o main main.cpp `pkg-config --cflag opencv` `pkg-config --libs opencv`

と書いてやれば,makeコマンド一発でコンパイル出来ます.
もうちょっと洗練して
main: main.o
     g++ -o $@ $< `pkg-config --libs opencv`
.cpp.o:
     g++ -o $@ -c $< `pkg-config --cflags opencv`
とかくとなおよし.

2018年9月27日木曜日

今後のタイムスケジュール

9月27日
少なくとも年内は基礎的な事に時間を頂きます。作業日誌的な内容になる事が多くなりますが、我慢下さい。

12月初め期限の商工会議所のAIコンペは意識していますが、10月末に出れるか結論を出すつもりです。

AIのハードウェアは既に決まっています。まだ使いこなせないのにこんなの買いました。

開発者用の販売で最新のXavierを入手しました。もうトヨタは自動運転の自動車のテストしていると思いますがこれを積んで開発中だと思います。



AIを搭載したロボット、自動車や機器として開発商品化している主な会社は
トヨタ、ヤマハ、任天堂等々 ー 大多数はnvidia(時価9兆円)と共同開発
              (私がインストールしたCUDA等で開発されています。)
日産            ー Google
(カルソニックも含めてAIの開発の話は聞いた事がない。)            
フォルクスワーゲン、BMW ー     Intel 

ソフトバンク(孫正義氏)が3.3兆円で買収したARM、Qalcomm(携帯やスマホの通信部分のと3G、4G、5Gの特許の多数を所有)、アップル、マイクロソフト等も何かしら出てくると思います。中国も近年侮れないです。テンセント(中国のグーグル)は実力は日本以上です。

今、自社でXavierで何か出したらこの業界では注目される位凄いものです。
商工会程度のAI作品ならこれ使ってるだけで審査員が凄いって思う位のものです。

自動運転をAIで開発する事が進んでいますが、一般に入手可能なハードは一択でNVIDIAのjetsonシリーズのTX2かXavierだけです。インテルMovidius(単体では動かずラズベリーパイLinuxかパソコンのUSBに刺して使うGPUです。)がありますが、非力(TX2の1/5程度)です。ラズベリーパイLinuxに元からあるGPUより早いですが、今年そのラズベリーパイのGPUに最適化されたデモではほぼ同じ位の能力でインテルも大した事はない印象。

グーグルはハードは未定です。おそらくXavierを使うと思います。
インテルは2000年初頭に車載機器で失敗しています。ハードが専用設計で開発者が手を出せないのでまた失敗すると思います。

今回FLIRに一緒に掲載された小野さんはNVIDIAの開発には定評があり、ブログの閲覧履歴もTOYOTA,TOSHIBA,PANASONICのドメインからのアクセスがある位です。
TX2はほぼ環境は出来ていますが私が操作する為、基本的な事を今教えてもらっています。9月10日に先行発売されたXavierは現在環境構築中です。

年内に社内でXavierで何らかのデモの予定です。ただXavierは価格が2499ドルなので高額でTX2(8万円位)でもAIで何かデモ出来ないか検討中です。
性能差と価格差の比較ですが、XavierはGPUの性能は今の私の母艦パソコン並その1/10がTX2それでも凄かったのですが。。。(過去形)
トヨタ工場の搬送システムはAIにTX2が採用されています。
因みに任天堂のスイッチ(今CMで流行りのゲーム)にはNVIDIAのtegraというTX2の2世代前の技術が使われています。アーキテクチャはTX2とほぼ同じです。
オリジナルのTX2マザーボード付き(大きすぎる!)
Xavierの値段1/3で能力1/10
これをマザーボードを小型Linux機に乗せ変えて基盤自作してバッテリー駆動に改良!
smockParticlesシミレーションが30FPS位

性能差と価格比のイメージを分かりやすく説明すると、TX2(10万円のパソコン)とXavier(200万円のワークステーション)位の差で分かります?

タイムスケジュールと目標ですが、来年2月末の準備期間後XavierでAI開発が出来る様にしたいと思っています。makefileのコマンド関係はやはりすぐには理解出来ない。2日掛かってほとんど進捗なしに等しいです。
プログラマーになろうとしているのではないですが、ある程度理解しないとサンプルプログラムも実行ままならないです。

make fileという操作(忘備録)


以下作業の忘備録な為、私以外の人が読んでも意味不明です。 
GNU Cコンパイラーは難しく調べても、内容が私にはまだ理解出来ません。熱が出そうです。9月26日27日で進捗がほとんどありません。

これが理解出来ないと実行ファイルを扱えないのでおまじないだと思う様にします。
オプションはこれからもう少し時間が必要です。

以下忘備録

OpenGL OPenCL CUDA qt5関連も全部入れてしまいました。これでOpencvexampleは全て実行可能になります。
 ビルド時一番の注意点はCUDA_ARCH_BINの番号。散々エラーが出て悩みましたが、GTX10806.1を指定すれば簡単にインストールできることが分かりました。
 まず依存ファイルインストール。Caffe分も含めて多分これで全部です。python-opencvは故意に外してあります。
sudo apt-get install qt5-qmake
sudo apt-get install qt5-default
sudo apt-get purge python-pip
sudo python get-pip.py
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install cmake git aptitude screen g++ libboost-all-dev \
libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \
bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \
libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \
libgoogle-glog-dev python-skimage python-protobuf python-pandas 

 何でもかんでも入れちゃいます。そしてお好きなバージョンのOpencvをダウンロード。
 解凍してOpencvのフォルダに移動しますが
mkdir build
cd build
cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN=6.1 -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D WITH_OPENCL=ON -D WITH_QT=ON -D WITH_OPENGL=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=ON -D BUILD_opencv_python2=ON -D PYTHON_EXECUTABLE=$(which python) ..
sudo make -j8
sudo make install
 ワーニングが多少出ますが、すんなりコンパイルできます。ビルド中観察して見てるとOpencv2.4.13の方がNVCCを使う時間が多い様な...。感じ。コンパイルできたら、以下を直すことでopencvを使ったgpucコードで書かれたソースが
  g++ 該当ソース.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`
だけで簡単にコンパイルできます。



33%で止まったらまだまだです。肝心のGPU関連のコンパイルまで行ってません。
buildディレクトリに入ってると思いますが、一応buildの中身を全部消してから
以下のコマンドはbuile内で実行しないと大変なことになりますので注意です。
エラーメッセージを見ると、CUDA9.2にリンクしてないような気配です。(compute_61CUDA9.2のアーキテクチャですからCUDA9.2が認識されてないような感じ)
/home/.bashrc直してます?

とりあえず以下のコマンドを実行してから
export PATH=/usr/local/cuda-9.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64:$LD_LIBRARY_PATH

make clean     エラー出るかもしれませんが気にしない
sudo rm -r *     buildの中身を全部消す

ここで再度
cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN=6.1 -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D WITH_OPENCL=ON -D WITH_QT=ON -D WITH_OPENGL=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=ON -D BUILD_opencv_python2=ON -D PYTHON_EXECUTABLE=$(which python) ..

多分ここではエラーが出ないはず
sudo make -j8
sudo make -j8は今の渡辺さんがつまずいてるとこだと思います。
これでエラーが無くなったら
sudo make install
です。


vimは操作がとても面倒でとんでもなく多くのコマンドがあってプロ向きのエディッタです。vim覚えるのは時間の無駄(覚えたんだったら何にも言えないけど)。nanoの方が無難.nanoが実行できなかったら sudo apt install nano でフリーソフトnanoをインストールします。
  
.bashrcですが、実際homeに行って ls でディレクトリ内のファイルを表示させてみて下さい。 あるはずの .bashrc は見つからないはず。これは隠しファイルです
ls -a でないと隠しファイルが表示されません。コマンド操作の基本重要です。
home ~/.bashhrc が正しいかどうか調べたかったら .bashrcvimで編集できるテキストファイルですから、 cat home ~/.bashhrc を実行して、ファイルの中身を表示できれば正解。ダメならエラー表示されるだけ….


良かったね~~~。make -j8まで行って、エラーで無かったらこっちのもの。
samplesに入るとcとかccpとか gpuとか python っていうフォルダあるから、こんなかの cppgpu に いろんなファイルがありますので(これ全部単独アプリです)
片っ端からやってみると良い 例えば aaa.cppなら g++ aaa.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`  
って打ち込むと、aaa っていう実行ファイルができるはずで  ,/aaa で実行します。 
ただこれらのソースはcmakeで指定してる-DBUILD_EXAMPLES=ONのでもうどこかに実行形式ファイル作られてると記憶してます。sanmleの中にbinってフォルダがあればその中に入ってます。 
じゃなかったら各フォルダの中に.cppと同じ実行形式ファイルが存在してます。動かし方はcppソースを見るしかありませんmain()部分の最初の方です。

但しopencv のサンプルプログラムは 単独で動くものが少なくて 必ず aaa の後に 入力ファイル名とか 数値を書かないと実行できないものが多い。
ソースを読むしかありません。 又はネットで解説を探すとかです。

Pythonはもっと簡単なので、ヴィデオ関連のはWevカメラ繋げば実行できるはず。大体Pythoncppの中身は同じようなやつです。gpuなんかCUDAがらみなので面白いと思います。


全部ごっちゃまぜで記憶してました。出力ファイル指定してないからa.outでしたね。

メール見ると ,/a.out で最初がカンマになってるけど?
ピリオドにしてる? buildに自動作成された実行形式ファイルをターミナルから試して見れば?
make中にこれらの実行形式ファイルが作成されたと言うことは、CpenCVがまともに作成されて
必ずコンパイル出来て実行できるってことです。

動かなければ必ずファイルが無いとか理解不能とかエラーメッセージ出るから、メッセージまるごと検索してみて下さい。


OPENCV3.3.1に関して、私も母艦Ubuntu3.3.1をインストールしてみました。
a.out っていうのは実行形式のファイルです。
私のでは ./a.out  だけでhogが動きます。

まず ./a.out を実行して、ターミナルにエラーメッセージが出たのかで無いのか、出たとすればどのようなエラーメッセージなのかが分からないと対処のしようがありません。
hogの場合はwebカメラが母艦に繋がれていないと  error:cant open camera: 0
とかのエラーメッセージがターミナルに表示されてそのままプログラムが終わってしまいます。
またピリオドをコンマに変えた場合は そんなファイルが無い的なメッセージが表示されます。
これが知りたいんです。出てきたメッセージを送って下さい。短時間で解決できます。

なので、動かない症状が分からないといつまでものまま。こちらとすれば謎解きみたいなもんです。
謎解きは時間の無駄です。


なんとも言えませんが、「ファイルが無いは」実行している場所が違うか、スペル違いだけです。
慣れないうちは、ファイルを実行する前に
ll
を実行して現状のフォルダに a.outがあるかどうか必ず確認することが必要。これが原因ってことはよくあります。

今回の場合、最後に重大なヒントがあります
error: can't open camera: 0
これが原因。ならかんたん
これは母艦にカメラがつながってないか、カメラを認識してないかどちらかです。
カメラがつながっていたら
ll /dev
を実行してみて video0 が最後の方に表示されているかどうか。表示されていれば
でなければvideo1かなんかになってませんか?
そして
lsusb
で出てきた接続機器の中にカメラがあるかどうかです。
カメラによっては認識されない場合があります。マイクロソフトのカメラなどはLinuxでは上手く動作しません。

なので、せめてOpenCVのプログラムをいっぱいコンパイルして実行してみると、プログラムを動かすこつが分かってきます。
また今回表示された内容は エラー以外ソースに書いてあるはずです。ソースに書いてあると言うことはプログラムは正常に動いていること。
で、 表示されたメッセージは実行オプションの指定です。
例えば ./a.out —camera 0
とかでカメラ番号を指定できて、他のオプションはhogの計数指定方法です。
つまりhogの実行はいろんなオプション指定が可能で様々な実験が出来ます。

この際だからOpenCVのソースを片っ端からコンパイルしてみたら? こつがつかめます。
一度はこういったことをやらないとダメッス。

Arduino IDEやXCODEのコンパイルは全部自動でやってくれるので、めんどくさいMake などが見えないだけで内部ではかなりのことをしています。
母艦にArduinoやiPhoneと同じ環境をつくって(CPUがちがうのに!!)そこでコンパイルしたバイナリファイルをUSBで送ってます。

Make ファイルと言うのは一種のバッチファイルで、普通Cをコンパイルする時、長大なオプション命令や、一旦コンパイルしたライブラリ群を付けないと満足に動きません。
この長大でやっかいな部分を自動化しようというものです。Linuxと言うのはiPhoneやArduinoなど特定の機種相手ではない無いため、こうなるのが必然なんでしょうね。
makeの仕方は多様すぎてなんだか分かりません。その場その場で作者の癖を掴むしかないんです。

makeを要求するソースがあった場合、ごく普通には
make だけでコンパイルできます。
make -j8   って言うのはCPUの8コアを全部使ってコンパイルすることで、コンパイル時間が一挙に短くなります
     TX2は-j6,Xabierは -j8、まで 母艦は4コアですが -j8まで可能です。
make all を要求される場合もあります(caffe など)コレはシステムにライブラリをインストールする場合とかに要求されます。たしかOpenCVもでしたよね。
そのほかにcmakeってのがあって、こちらはシステムが持っているライブラリを勝手に探しだして、それに合ったライブラリを自動でインストール出来ます。コレもOpenCVインストールの時に実行したと思います。
今のところはmakeは覚えなくて良いと思います。

ただmakeが要求されたときに覚えておいた方が良いのは2つだけ!!
-j4のオプション(早い方がいいので)
make clean  一旦makeした物が間違っていた場合、よけいなファイルが邪魔をする場合がある為文字通りクリーニングすると言う事
です。make cleanがプログラムによっては効かない場合もあります。

Opencvの場合はコンパイルオプションが複雑な為に、makeの代わりに、この前メールで書いた簡略化コンパイル手法を使います。内部で自動化されているのでmakeを意識する必要無しです。何故って?作者が決めたからで従わざるをえません。

OpenCVの挙動を試すのが今必要な事なので、面白いものから試すのがベターです 顔認証とか…。 ただ最初のうちは顔認証がまともに実行出来るまで1日以上かかったと思います。
(ファイル指定とか、カメラ指定とか要求されるので)
顔認証はcpu版、python版、GPU版3種類が入っていたと思います。これができればだいたいのOpenCVのサンプルが実行出来るようになったと記憶してます。
なので、何度も書きますがmakeは現段階では覚えなくても良いものの1つです。何をやってるのかわかる程度で良いと思います。

あとOpenCVのコンパイルですが、 -o オプション+スペース+実行ファイル名 でa.out でなく自分の好きな実行ファイル名を付けられます。
例:例の簡略化コンパイルコマンドを入力し、最後に -o TEST とか付け加えると TEST っていう実行ファイルが出来ます(a.outを後からリネームしても良いけどね)

2018年9月26日水曜日

太陽光関係の展示会(Linuxコマンド忘備録含む)

9月26日
今週の展示会がつまらないとの話なので感じたままを書きます。

ブームが過ぎ従来と同じ方向の展示は段々と魅力が無くなっています。
それは展示会場に来場しているほとんどの人が感じている様に思います。
展示している側はより多くの利益を生むサービスや機器を全面に出している様ですが
その事自体がマンネリ化しているのも、ほとんどの出店者も感じているとも思います。

これ面白い! といったモノを生み出せればと思っています。その商品の説明の仕方や見せる方法も重要だと経験しました。今はその為の準備中です。
ただ基礎的な部分なので時間がまだまだ掛かります。申し訳ありません。

今回の内容はどうしても退屈な内容になります。よく理解していないコマンド操作を試行錯誤しながら覚えていく事を重点的に実践しているので教科書をなぞるより理解が進むと思っています。

Linuxのコマンド操作も何かの本で習得する必要がありますが、下記ポイントを押さえるのが先なようです。

ポイント①
Linuxの下記コマンドを理解し丸暗記

user@host:~/opencv-3.3.1/build$ sudo rm -r*
sudo: unable to resolve host wiwao
rm: invalid option -- '*'
Try 'rm --help' for more information.

”あのですね。ちょっとキツいようですが、
buildの中身をすべて消せば良いんです。
これをコマンドで実行してるだけ。
手っ取り早く言えばUbuntuのエクスプローラでbuildの中身を消すのと同じことです。

OpenCVインストールの前に、以下の内容程度は分かってないとAIには進めません。”


sudosudoでない場合の挙動
sudoでファイルやディレクトリを作ってしまったとき、 sudoでない場合はファイルを修正できなくなる
rm  単独ファイルを消す方法とディレクトリまるごと消す方法
cp ファイルをコピーする方法。ディレクトリまるごとと、単独ファイルではオプションが違う
mkdir フォルダを作る方法
cd  ディレクトリの移動
ls         ファイルを表示させるオプションがあるのでどんな挙動になるのか
cat      テキストファイルの中身を表示
ll   lsと同じですが機種に依存する。lsより便利
nano   テキストファイルの修正
ssh     Macで普通に使えるまで何度も…. $ ssh user.local
lsusb  USBに何がつながっているか
ifconfig 今どこのWiFiにつながってて、自分のipは認識してるか、またWIFIと有線の接続状況はどうか
ls /dev ってのは何なのか。例えばWEBカメラをつなぐとどこが変わるのか
top  今マルチタスクで何が動いているのか
kill  topで動いているプログラムを停止する方法 (Macの強制終了)
df  外部記憶装置で今一体どの程度までファイルが占用してるか(特にTX2ZAVIELでは大事 内部eMMC32Gしかないから。apt install でアプリをインストールすればするほどeMMCの容量が無くなる。80%以上なら危険)
sudo apt install      フリーソフトをインストールする
sudo apt remove インストール済みのアプリを消す
pythonを使いたいなら pipってなんなのか
PythonPythonソースを実行する方法


/home にある .bashrc って何なのか

ポイント②ファイルが無い!
なんとも言えませんが、「ファイルが無いは」実行している場所が違うか、スペル違いだけです。
慣れないうちは、ファイルを実行する前に
ll
を実行して現状のフォルダに a.outがあるかどうか必ず確認することが必要。これが原因ってことはよくあります。

今回の場合、最後に重大なヒントがあります
error: can't open camera: 0
これが原因。ならかんたん
これは母艦にカメラがつながってないか、カメラを認識してないかどちらかです。
カメラがつながっていたら
ll /dev
を実行してみて video0 が最後の方に表示されているかどうか。表示されていれば
でなければvideo1かなんかになってませんか?
そして
lsusb
で出てきた接続機器の中にカメラがあるかどうかです。
カメラによっては認識されない場合があります。マイクロソフトのカメラなどはLinuxでは上手く動作しません。

なので、せめてOpenCVのプログラムをいっぱいコンパイルして実行してみると、プログラムを動かすこつが分かってきます。
また今回表示された内容は エラー以外ソースに書いてあるはずです。ソースに書いてあると言うことはプログラムは正常に動いていること。
で、 表示されたメッセージは実行オプションの指定です。
例えば ./a.out —camera 0
とかでカメラ番号を指定できて、他のオプションはhogの計数指定方法です。
つまりhogの実行はいろんなオプション指定が可能で様々な実験が出来ます。

この際だからOpenCVのソースを片っ端からコンパイルしてみたら? こつがつかめます。

一度はこういったことをやらないとダメッス。

このまま記録して永久保存にします。

上記指摘された内容を考えながら進めた結果下記の通り実行できました。







wiwao@wiwao:~/opencv-3.3.1/samples/gpu$ ./a.out
Histogram of Oriented Gradients descriptor and detector sample.

Usage: hog
  (<image>|--video <vide>|--camera <camera_id>) # frames source
  or  (--folder <folder_path>) # load images from folder
  [--svm <file> # load svm file  [--make_gray <true/false>] # convert image to gray one or not
  [--resize_src <true/false>] # do resize of the source image or not
  [--width <int>] # resized image width
  [--height <int>] # resized image height
  [--hit_threshold <double>] # classifying plane distance threshold (0.0 usually)
  [--scale <double>] # HOG window scale factor
  [--nlevels <int>] # max number of HOG window scales
  [--win_width <int>] # width of the window
  [--win_stride_width <int>] # distance by OX axis between neighbour wins
  [--win_stride_height <int>] # distance by OY axis between neighbour wins
  [--block_width <int>] # width of the block
  [--block_stride_width <int>] # distance by 0X axis between neighbour blocks
  [--block_stride_height <int>] # distance by 0Y axis between neighbour blocks
  [--cell_width <int>] # width of the cell
  [--nbins <int>] # number of bins
  [--gr_threshold <int>] # merging similar rects constant
  [--gamma_correct <int>] # do gamma correction or not
  [--write_video <bool>] # write video or not
  [--dst_video <path>] # output video path
  [--dst_video_fps <double>] # output video fps
Device 0:  "GeForce GTX 1080"  8116Mb, sm_61, Driver/Runtime ver.9.20/9.20

Controls:
ESC - exit
m - change mode GPU <-> CPU
g - convert image to gray or not
1/q - increase/decrease HOG scale
2/w - increase/decrease levels count
3/e - increase/decrease HOG group threshold
4/r - increase/decrease hit threshold

Scale: 1.05
Group threshold: 8
Levels number: 13
Win size: (48, 96)
Win stride: (8, 8)
Block size: (16, 16)
Block stride: (8, 8)
Cell size: (8, 8)
Bins number: 9
Hit threshold: 1.4
Gamma correction: 1

gpusvmDescriptorSize : 1980
cpusvmDescriptorSize : 1980





この調子で残りのサンプルをビルドしながら進めます。一つのサンプルの実行に1日掛かっていますが、お許し下さい。

面白い内容になるのはまだ先になります。

2018年9月21日金曜日

FLIR開発者公式ページに作品が掲載される!と赤外線ドローンのその後

FLIR開発者公式ページに作品が掲載される!

余談ですが、
昨年室生の自社発電所でテストしたワイヤレスサーモグラフィードローンですが、電波干渉の問題で一年以上引き続きテスト改善を繰り返しています。
有線で風や電波による弊害を少なく出来る方法をテストしては改良を繰り返す開発で作業はマイペースになりました。
ユーチューブ等から時々引き合いがあり部品組立品(下記ページで委託販売中)としてお譲りした方々が独自にテストして頂いて色々テストしてこんな感じになっています。みなさん熱心で色々な事を独自に試して頂いてその為の改良や改善もして来ました。この部品を買って半田付けしてソフトを書きこんで、アプリをダウンロードしてをDIYでこのお値段です。勿論センサー等が高額で失敗しても自己責任ですが...

今はそれぞれ有名なドローンメーカーDJIのMAVIC PROが京都と名古屋でお二人、phantom4の東京の方とMAVIC AIRは神奈川の人がそれぞれ太陽光パネル等で試しています。それも自己責任です。私としては危険性と法的な問題の説明はした上で事故等にならない様にいつもお伝えしています。

皆さんドローンでメンテナンスしたい気持ちが強いようです。条件によっては有線の方法が良い事は理解されていますが、”ドローンを使った!”という響がキャッチーなのだと思います。なので有線でも可能ですが、ドローンを安全に安価に使えると言うのがメンテナンス会社に必要な条件なのだと思います。なにせ問い合わせは多いと思うので。。。


https://youtu.be/JOBF_AcM4b4

サーモグラフィーの画面の揺れを抑えるともっと観察がしやすいのでサーボモーターを使った軽量ジンバルを開発中です。ソフトもハードもほぼ完成で調整中です。時間が無いのと失敗するとバラバラになるのが怖くて。。。
完成すれば弊社製作で日本メンテナンス協会謹製ドーロンとして販売すればいい感じ。

このサーモカメラの技術を応用したプロトタイプを応用して最近開発したサーモグラフィーステレオカメラをアメリカ本国のFLIRの開発マネージャーに紹介したら気に入って頂いて本国以外の開発で初めてメーカーのブログに載せて頂きました。元々は今年6月のFLIR MakerChallenge2018(入賞者は最終発表会場への航空券付き!)を公募した際に応募したらアメリカ国民のみの参加コンペでお断りされたのですが、その内容が斬新でブログに載せて良いかと先方から問合せがありました。
今年10月からは全世界の開発者向けのメーカーズチャレンジ(商品のみ)のお誘いも頂きました。時間が許せば挑戦してみようか?やる事いっぱいです。
https://lepton.flir.com/community-showcase-items/thermal-stereo-cam/

とてもモチベーション上がります。
苦労して改良してマニアックなシステムでメーカー公認といった感じになりました。
ドローンに搭載とか太陽光発電所のメンテナンス程度は普通にあるので過去FPGAを使ったステレオサーモゴーグル(サーモグラフィーステレオカメラと同じ物)で2年前にアメリカで開発人がいます。showcase projectsのこんなの、
https://lepton.flir.com/community-showcase/lepton-stereoscopic-goggles/
これだと他の人が再現出来ない特殊な基板と部品を実装なんて出来る分けないです。

なのでFLIR開発部長のカルさん気に入ってくれたのでしょうか?

2018年9月20日木曜日

cudaとcuDNNのテスト

9月19日,20日
nvidia GPUドライバーであるcudaとcuDNNをインストールしたので軽くサンプルで動作確認をしてみます。
有名なシミュレーションsmockParticlesから、煙の粒子とその影を(重力等の外力を考慮した動きと点光源の影を同時にシミュレーション)結果を表示します。

このプログラムはGPUの負荷テストに使われます。
60FPS(1秒間に60フレーム)は良い結果とされています。
あとは小さな玉の積み重ねたものを崩すシミュレーションと海面のシミュレーション。



インターネットを光の工事でルーターが対応していなかったりとインターネットはパソコンから直接PPPoEで接続中で作業が上手く進みませんが、回線は早くなりました。
早い回線に機器が対応しないと十分な速度が出ない事が改めて理解出来ました。

本題に戻ります。次はopenCVです。Open source computer libraryというソフトでこれはintelが開発した画像を処理するソフトです。

GPUを使ったりそのドライバーやソフトをインストールしていますが、ゲームをする訳ではありません。グラフィックはゲームが進化を加速しました。より早いリアルな体験の為に処理能力は飛躍的に進化しました。その進化の過程でAIに応用されて一部は人間の判断能力を超え初めています。将棋やチェスでAIがプロを負かすまでになりました。

さて人口知能と3Dは良く似た性質があります。AIは添付のイラストの様に重みを伝播していきそれが多次元(イラストは3次元)に連なります。(著作権の関係でイラストが使えないので自分でイラスト作りました。結構な力作です。)
このイラストでお判りの様にコンピュータでの処理は3Dと同じようになります。つまり今インストールしている関係はAIの作業の為でもあります。

文章は短いですが濃い内容です。

2018年9月19日水曜日

cuDNNをインストールしてOpenCVのインストール。。。

ここから比較的上手く行った様でしたが、最後に嵌りました。
インストールファイル名に書き換えて下記インストールを進めて、エラーメッセージ通りに進めて行きました。適当に終わらせてサンプルが動いたので次のインストールで躓くはめに。





cuDNNのダウンロードサイト(https://developer.nvidia.com/rdp/cudnn-download) から以下の3つをダウンロード
(下記3つは現在の最新バージョンに読み替えてください)
  1. cuDNN v7.2.1 Runtime Library for Ubuntu16.04 (Deb)
  2. cuDNN v7.2.1 Developer Library for Ubuntu16.04 (Deb)
  3. cuDNN v7.2.1 Code Samples and User Guide for Ubuntu16.04 (Deb)
ダウンロードしたファイルを以下のコマンドを実行してcuDNNのインストールを開始します
$ sudo dpkg -i libcudnn7_7.2.1.38-1+cuda9.2_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.2.1.38-1+cuda9.2_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.2.1.38-1+cuda9.2_amd64.deb
bashrcを編集$ nano ~/.bashrc




Before
# NVIDIA CUDA Toolkit
export PATH=/usr/local/cuda-7.5/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
After
編集して保存
# NVIDIA CUDA Toolkit
export PATH=/usr/local/cuda-9.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-9.2/lib64:$LD_LIBRARY_PATH
再読み込み
$ source ~/.bashrc
PATHの確認
$ echo $PATH
cuda-9.0発見
/usr/local/cuda-9.2/bin
バージョンを確認
$ nvcc -V
Hello, CUDA 9.0!
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148

2018年9月15日土曜日

第2回AIビジネス創出アイデアコンテスト ~アイデア募集~

9月15日
現在設定中のデスクトップは今後は母艦 = Linux Host computer(今後このUbuntuのデスクトップはIoT機器の設定やインストールに使うので母艦と呼ぶ方が理解しやすい?)とします。

母艦の設定は粛々と進めます。

早速ご提案があったので詳細を確認して、大阪商工会議所のアイデアコンテストで出来る事がないか調べています。

度々出てくるAI(人工知能)とは機械学習深層学習(Deep leaning)等を含む総称に使われているようで曖昧な感じがあるので整理します。

人工知能と呼ばれる所以は機械で学習させて認識させる。これまでのコンピューターの記憶や計算から発展したものです。とはいえ結局は膨大なデータを計算して判断させているだけです。膨大なデータ=ビックデータになります。ここでビックデーターとAIがつながりました。

例えると子供にレモンを覚えさせてレモンを認識させるようなものです。

これをコンピューターを使ってする場合、まず画面に映るレモンがどれかを学習させます。具体的には色々な背景、色々な形のレモンを学習させます。それぞれの条件で色々な角度から撮影したレモンをその部分を囲ってタグ(レモン)と一緒にコンピューターに覚えさせます。そうする事で学習に使用した画像以外の画像を新たにコンピューターに入力するとレモンと認識してテニスボールはレモンと認識しません。で青いレモンの画像を入力認識出来ない場合は青いレモンで学習させなかった為なので学習が不足している事になりますが、レモンの形や状況によっては認識する場合があります。それはコンピューターが学習の結果推論で判断しています。認識出来ない場合は学習が足らなかったか学習アルゴリズム不備だった事になります。その推論で重要な部分が重み(正誤の確率)黄色くはないがそれまで学習して来た形が極めてレモンに似ていると推論した?若しくはそれまで全て黄色いレモンだった為レモンではないと推論した。
この過程が深層学習(Deep leaning)と呼ばれています。また何千、何万枚の画像をコンピューターに学習させるので機械学習と言う事になり、深層学習(Deep leaning)と機械学習がAIと繋がったでしょうか?
この学習方法は脳の神経伝達の仕組みをコンピューターに応用しているのですが、条件を絞れば人より優れた結果を出すまでハードやソフトが進化しています。
下記イメージ


*シグモイド関数のイラストは著作権の関係がはっきりしないので、
 自分でシミュレーション出来れば掲載します。


例えば
  1. コンピューターが音声を聞いて言葉の意味を理解するには言葉の音声や文脈を学習して認識。
  2. ロボットが立って歩く事を学習して移動する。
  3. ビックデータから目的なあった学習をさせて異常や推論を導く
等々

で学習して認識させて何をさせるか若しくはするか?
今最大の問題は学習させるデータを作るのがアナログ作業でレモンの例で説明すると様々なレモンの画像を抽出する事が重要で同じ様な画像だと認識が悪くなる(過学習=学習データと同じ様なものは認識するが新たなレモンの画像認識が悪くなる。)
ネットで出てくる画像は典型的な画像ばかりで過学習になる可能性が多い。google等はその為の子会社が学習データを用意するのですが、その地道な作業に膨大な時間が掛かっており今後はそこを自動化しようとしていますがどうなるか?
*教師あり学習に限ります。(下記参照)
人工知能アルゴリズム

  • 機械学習
  1. 教師あり学習
  2. 教師なし学習
  3. 強化学習
  • 最適化
詳細はおいおい。。。

次はフレームワーク(AIエンジンと思って頂ければと思います。)代表的なもの
TensorFlow(Google開発で世界人口が一番ですが中級以上)
Caffe(バークレイ大学)
Chainer(日本)
Keras
Pytorch(Facebook)
darknet(yolo)比較的新しく流行っている?
CNTK(マイクロソフト)

駆け足ですがこれでもAIとは何なのかの体系を説明しているだけです。本題はまだまだこれからです。

今設定している母艦はAIの為ですが、実装するまでもう少し時間が掛かります。
参加してみようと思うのは下記テーマが適当な感じがします。

第2回AIビジネス創出アイデアコンテスト
(2)応募テーマ
② テーマ提案部門
B:「AI活用IoTデバイスの活用方法」

で何か出来ないかを考えています。12月7日の提出に間に合うか。。。
この場合は強化学習の分野になることまでわかった。

では。。。

2018年9月13日木曜日

Linux 操作

9月13日8:30ー18:00
社長はプログラミングをするので、その辺りも補足しながら書いて行こうと思います。

C言語はマスターしている訳ではないので平行してすすめますが、今からの言語はpythonが便利です。C言語と似ていますが、違いはスクリプト言語であると言う事。(インタープリターと言った方が社長には理解しやすい、#includeもサブルーチンと説明した方が分かりやすいかも。)
リナックスでは結構下記単語が出ます。
  • ビルド
ビルドっていうのはこのコンパイルとリンクをまとめもの。
ソースコードをそれぞれ翻訳するのがコンパイルで、コンパイルされたファイル達を1つの実行ファイルにまとめてあげるのがリンク
  • デプロイ
ビルドしてできた実行ファイルを、実行する環境に合わせて、実際に実行できるようにすること。
要はプログラムを実行する若しくは実行出来る様にする事。

C、C++とpythonをマスターしたら最強かも?結構アッセンブラーも組込(IoT)をするなら知識は必要ですが、面倒だけどレジストリ等は意識しながらプログラム出来るかできないかで違いが出ます。センスの問題か?

ここから今日の本題、Linuxのコマンド操作とディレクトリー操作。
windowsはインストーラーをダブルクリックしてsoftwareをインストールするので特に意識することはありませんが、linuxはhomeディレクトリーでインストールしないとソフトが動きませんもしくはファイルやヘッダー(サブルーチン)が見つからないと怒られます。
ここ結構嵌りました。使い慣れている人の常識がwindowsやMacで慣れていると原因が分からず袋小路に迷い込みます。

でコマンド操作(CLIコマンドラインインターフェイス=黒い画面に文字入力で操作)に慣れないと進めません。ブログに操作の指示がある場合もそれを理解していないと上記の様に迷って分からなくなります。とわいえ昔はそれが当たり前でGUI=グラフィカルユーザーインタフェイス(マウスでクリック操作)が主流になってパソコンを操作する人は飛躍的に増えました。今やっていることは開発なのでソフトの操作は全て文字入力で間違えると動きません。
先ずはファイル操作ですがこれだけで今日は終わりそうです。

こうして改めて書いてみると頭の中の曖昧な部分が整理出来るし、人にわかる様に自分の言葉で書くことはこんなに良いとは思わなかった。