FC2ブログ
活動報告 No.152 今年もありがとうございました! & 'C'と'CUDA'で自作ディープラーニング!!
カテゴリ: 通常

どうもおはこんばんにちは!
1週間の間にC&CUDAとJavaScriptとPythonでそれぞれ違うプロジェクトの為にプログラミングをしていた2年のマエダです。


〜〜〜

今年も残すところあと1日ほどとなってしまいましたねぇ〜。このヒュー研ブログの今年初めての記事は、1月5日の「活動報告No113 (近藤科学の)サーボホーンの話」という記事ですね。この記事は私の1つ上の学年の先輩の記事です。記事内でサーボホーンを持った骨(ボーン)が登場するのですが、ダジャレかと思ったら最初はそんなつもりなかったそうな。


んで、そのあと1月15日のが今年初の私の記事です。(活動報告No114 Webサイトを作ってみよう 1/3 ~学習編~)
懐かしいなあ。。結局ヒュー研の公式ホームページはこのようになりましたが、当時の私はコーディングスキルはあってもユーザビリティの概念が欠如していたので、なんとも幼稚なページを作成していた頃です。


現在は表向きのページは特にいじっていなくて、ヒュー研主催の関東学生2足歩行ロボットの初開催にむけての準備が進んできたら、そのページを新規で作ろうかなって思っているところです。


定期的に自分からWEB制作の案件というかその類をボランティアでやってWEBコーディングの技術を損なわないように努力してきたのですが、最近はまぁディープラーニングの方でCとCUDAばかり触っていることもあり、コーダーとしての自信を失いつつあります(笑)。来年の3月くらいに特に使用用途もないWEBサイト作ってみようかなと思っています。どこかから依頼があればそっちやりますが。


〜〜〜

話がWEBの方に行ってしまいましたが、今年はWEB系だけでなく、部活動を通して面白い体験などしました。後続にディープラーニングの記事が控えているので端的にまとめますが、去年と比べて大会や講演会等のイベントで多くの人とお話する機会がありました。ま、こういう言い方すると語弊がありますが、去年はそんな機会がなかったのではなく自分から作りに行ってなかっただけなんです。。


多くの人の中には何年もロボット製作に関わっている人であったり、最近始めた学生さん、ロボットをパートナーとした芸人さん、起業したエンジニアの方、研究室の先生などなど、、いち大学生としても、部の広報としても有意義な交流ができたんじゃないかと思いました。(だから他の部員たちも名刺作ろう)


〜〜〜

そういえば今年私が書いた記事はこれで23個目ですっ!来年も元気していたらちゃんとブログ書くはずなので、来年もどうぞよろしくお願いします!


それでは、良いお年を!(^∇^)ノ






なんかもう完全に締めな雰囲気ですが、ここからは興味のある人はどうぞご覧になってください。


今からやることは、以下の 画像1 に対して、ディープラーニングを用いて 画像2 のようにロボットを検出してもらおう!というプロジェクトです。



robo.jpeg 

画像 1



robo.jpg 

画像 2





今回作成したニューラルネットのコードは、擬似乱数生成のxorshift方式(論文はコチラ)以外は全て自分で書きました。

使用した言語はC言語とCUDAです。CUDAはNVIDIAのグラフィックボードを並列演算機として動作させるためのプログラムです。

C言語では標準で擬似乱数生成関数がありますし、より高品質と言われるメイセンヌツイスタも選択肢としてあった中でxorshiftをあえて選んだ理由は特にないです、ハイ。。計算が排他的論理和とビットシフトだけで「これだけ?」と思えるコードで十分実用的な擬似乱数を吐き出してくれるのを見て何か使いたいなあと思っただけです。


ニューラルネットはもちろん物体検出用のです。全体構造は完全畳み込みNNで出力テンソルが画像のグリッドに相当し、同層の各チャンネルがそれぞれグリッドの相対中心座標、画像全体の相対サイズ、物体の有無を表す信頼度、そして分類表示を持っています。知っている人は知っていますが、YOLOですね。ただ、私の作ったNNは完全なYOLOではなく、収束や精度に関する少々複雑な構造を取っ払ったシンプルなものです。そのため収束遅いし精度そんなよくないです。


ネットワークは以下の通りです。

層種 入力サイズ 入力チャンネル フィルタサイズ 出力サイズ 出力チャンネル
Conv 416 3(RGB) 3 416 32
MaxPool 416 32 2 208 32
Conv 208 32 3 208 64
MaxPool 208 64 2 104 64
Conv 104 64 3 104 128
MaxPool 104 128 2 52 128
Conv 52 128 3 52 256
MaxPool 52 256 2 26 256
Conv 26 256 3 26 512
MaxPool 26 512 2 13 512
Conv 13 512 3 13 1024
Conv 13 1024 3 13 12(BOX*5 + CLASS)

たったの12層しかないNNなので、計算量削減のための1x1畳み込み層は使っていません。あと、最大値プーリングの後でチャンネル数を倍にしています。

畳み込み層のストライドは1、最大値プーリング層のストライドは2です。各グリッドの持つアンカーボックスは2つとし、2クラス分類を考えるので、2*5+2=12が出力層のチャンネル数になります。


各畳み込み層の流れは以下の通りです。


順伝播データ

畳み込み

Leaky ReLU (slope=0.05)

バッチ正規化

addバイアス



各最大値プーリングのアップサンプリングは、順伝播時に記憶した最大値の場所を元に、誤差データをその場所に配置して、他は全て0になる方法を使いました。ちなみに本家YOLO(Darknet)はより正確な検出精度を出すために下層の誤差データを用いた(多分独自の)アップサンプリングをしています。


畳み込みとバイアスの更新および誤差データの算出はともかく、バッチ正規化の逆伝播が気になりますよね!(ますよね!)


別に私が解説する訳ではないですが、計算グラフを使って解いている人がいたので、そちらを見るとわかりやすいかと。めっちゃ丁寧に解説してくれていて好きです。


Bacth Normalization Backpropagation:

https://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html


上記のサイトではPythonとその強力なライブラリであるNumpyを用いて実装されています。記述量見ているとやっぱPythonいいよなぁ。PythonとPython用の機械学習ライブラリをそのままVHDLとかに落とし込めれば最高なのに。たまに変数がリストなのか何なのかわからなくなりますが(笑)。



じゃ、構造のあらかた提示したところでアノテーションを作っていきましょう。

アノテーションはDarknet方式とします。私は以前にDarknet専用のアノテーション作成補助ツールをGitHubにて公開したので、そちらを使います。


BB-Engine-forDarknet:

https://github.com/ShimizuMizu/BB-Engine-forDarknet


しかし今回はC言語で画像をリサイズする機能を実装していないので、アノテーション作成時に補助ツールがリサイズするようにします。また、読み込み形式はBMP形式です。BMP形式は素直にBGR値を保持しているので、データ容量が大きいというデメリットを除けば初心者には扱いやすい画像形式です!


任意にリサイズして保存するには、BB-Engine-forDarknet.pyの261行目を書き換えます。


# 変更前
shutil.copy(annotation_img_path, self.w_folder + "/" + annotation_img)

# 変更後
img = Image.open(annotation_img_path)
img_resize = img.resize((416, 416), Image.LANCZOS)
img_resize.save(write_img_path, 'bmp')



今回学習に使う画像データは冒頭に載せた、千葉工SKKさんのささペロリン(左)とヒュー研のテオ(右)の画像です。



tk_001.jpg tk_002.jpg


アノテーションは以下のように無事生成されました。


annotations_004.jpg robo-txt.jpg

ro.png 


ちゃんと画像が416x416にリサイズされました。今回はささペロリンを0番、テオを1番にラベル付けしました。

そして、今回は0番にラベル付けされた、ささペロリンのみを学習、検出しようと思います。



それじゃ早速...


教師データ_006 

教師データを書き込んで...


繧ソ繝シ繝溘リ繝ォ CMakeでMakefile生成してmakeでビルドして、いざ実行!!



言い忘れましたが、損失関数は残差平方和です。物体の大きさ、中心座標で一つの残差平方和を共有し、物体の有無に関する信頼は単体で、そして分類は全分類で一つの関数を共有しています。分類は収束を考えてsoftmax関数だか交差エントロピー誤差だかを使った方がいいのかもですね。


そんで、以下が損失の推移です。


損失の推移 


うん、まぁ。フィルタとバイアスの初期値はさっき紹介したxorshift方式を採用して -0.5〜0.5 の間で擬似乱数を生成していたので、それを考えるとちゃんと勾配を認識してくれたんじゃないかなと思います。


上のグラフからは読み取れないですが、一番最後の損失は 1.633719 でした。でかい!!



ほんじゃもっと詳細に見ていきましょうか。まずは物体の位置に関する出力テンソルです。


物体の存在可能性数値領域 



...とは言ってもこれだけではぱっと見わかりづらいですよね。


という訳で、出力が 0.5以上のマスを黄色 にします。


物体の存在可能性領域_スコア0,5以上 



確かにさっきのささペロリン君の位置に近いですね。


お次は中心グリッドです。


最も数値の大きいセル_物体の中心 


中心グリッドは閾値とかじゃなく、この169マスでもっとも大きな数値を黄色にしました。


さらに上の中心グリッドが保有する中心座標と物体の大きさを一気お見せします。


上_x_下_y 

▲ 上がx座標、下がy座標 ▲


上_width_下_height 

▲ 上が横幅、下が縦幅 ▲




以上の数値を可視化します。



出力可視化 


赤実線枠:物体の大きさ

赤破線枠:物体の中心が含まれているグリッド

赤丸:物体の中心点

黄色領域:物体のグリッド別領域(人間の方から閾値を設定可能)

と、こんな感じで、無事にそれっぽい場所をニューラルネットが予測(というか学習)してくれました。


見てもらった通り、中心座標や閾値で絞り込める領域についてはいい結果を出しているものの、物体の大きさを表す数値がイマイチですね。これはそもそも今回自作したニューラルネットが本家Darknetと比べて簡素化された学習であること、そして、12層しかネットワークを深くしていないことによる損失の収束の遅延が影響しているものと思われます。


人間の画像識別率を超えたというMicrosoft発ディープニューラルネットは156層もの階層構造になっているので、たった12層しかないのに場所と分類まで大まかにできたことを考えると、まあ上出来かなと思います。


この微妙な精度をどうにかするために、ニューラルネットの改善をこれから続けていこうと思います。学習途中には損失だけでなく、逆伝播毎のフィルタ・バイアスの最大・最小誤差の推移を観察していました。データとして残している訳ではありませんが、ちょくちょく見ていて、何となく上位層へ誤差を伝播しきれていない様子でした。上位層に行けば行くほど、誤差が小さいのです。


上位層ほど誤差が少なくなっている原因としては、最大値プーリング層のアップサンプリングに原因があると考えています。サイズ2のストライド2で順伝播をやると、最大値をそのまま返した場合、単純に考えると誤差は4分の1に減少してしまいます。本ニューラルネットでは高解像度の画像から13x13という比較的精細なグリッドに持ちこみ、物体検出をして見たいと思って先に紹介したような12層NNになったので、プーリング層の操作は学習にかなりの影響が出てきます。これについてはプーリング層を平均値プーリングにするか、最大値以外は0以上1未満の定数で商をとって逆伝播するか、と色々対策を考えています。



以上で長い後段の記事は終わりです。


今年中に自作ディープニューラルネットワークの結果報告ができてよかったです。今後はもっとCとCUDAと深層学習の勉強を続けてROBO-ONE autoにでも出てみたいですね!



てなことで、前段と重なりますが、みなさん良いお年を。


ほんじゃ、まったのぉ〜♪(/・ω・)/ ♪


スポンサーサイト
編集 / 2017.12.30 / コメント: 0 / トラックバック: 0 / PageTop↑
コメント
 
Title
 
 
 
 
 
 
Secret 


Pagetop↑
トラックバック
Pagetop↑
プロフィール

ヒュー研の中の人

Author:ヒュー研の人
このブログは東京電機大学理工学部ヒューマノイド研究部の公式ブログです。2012年から部に昇格しました!
その日の活動や大会の記録をできるだけ更新していきたいです!!

☆だいたい金曜日前後に更新します☆

FC2カウンター
カレンダー
08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
リンク
ブロとも申請フォーム
携帯でみるには↓
QR