Sony Neural Network Console DNN講座メモ

# Sony Neural Network Console DNN講座メモ

https://www.youtube.com/channel/UCRTV5p4JsXV3YTdYpTJECRA/videos

https://predictionone.sony.biz/
https://dl.sony.com/ja/


## 物体認識

画像分類とは違う。1枚を分類。
物体認識は、複数の物体検出を行う。

入力はＲＧＢ　出力は位置とカテゴリ、サイズなどになる。
物体検出は、物体のカテゴリを確立ＭＡＰで出力させる

![data_judge.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/d73c8a1f-a485-8a4c-f5d4-01dd4c02c7e9.png)


物体の中心ピクセルのみに高い確率が出力されるように学習する。
一つしかない物体が2回検知されない。
周囲と比較して物体認識の確立が高いという閾値を設ける必要がある。

![data_judge2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/e4648557-1cf6-58b4-5451-022567a94885.png)

物体の中心ほど認識が高いというようなheatmapを使うこともある。

![data_judge3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/2ee8058a-dcdb-c114-d0fe-65d008c872b0.png)

出力解像度はどうするか？
ピクセル単位？が必要？　
出力解像度を増やすとＤＮＮの処理が上がる。

出力グリッド内で、どこの座標か、出力するのもあり。

![data_judge4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/5d1cb5f7-621d-32ca-4902-1a65270c6668.png)

確率ＭＡＰ出力と、物体位置出力で、ＤＮＮを途中で分岐させるらしい。
物体が存在しない位置では、誤差逆伝搬させないで学習する。

![data_judge5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/30606b36-e8c2-a869-d9ba-b85321452f1f.png)


画像の位置をグリッドで区切って位置出力させると、制限がある
物体数が限られるのと、同一中心位置にある重なった物体を
両方検知できない。

![data_judge6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/d1a91180-cad8-4d94-19d6-d7ae7735678e.png)

グリッドではなく、アンカーボックスを使う方法。
物体サイズの違う、物体検出結果を５つ出力する。
アンカーの決め方は、数だけ最初に決めて、学習でデータに含まれる
サイズをカテゴリで分けて、それぞれの学習データの大きさを平均化して、アンカーの大きさを決める。

学習させる際には、学習データで最もサイズの近いアンカーボックスとして学習させる。

![data_judge7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/f30d6cda-a810-76d0-1bdd-52e7adb3be92.png)

アンカーボックスでの重複はどうする？
重なりのうち最もスコアの高い検出結果を表示する
NMS (non-maximum suppression)を使う。
Centernet２０１９年　アーキテクチャ　Heatmapを使う。
YOLOやM2_detより良いらしい。

![data_judge8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/482a5e3b-61c1-9565-c71f-7e0883caeb61.png)

そのほか、アルゴリズムの一覧。YOLOなど。
これらも、この基礎をベースにしているとのこと。

![data_judge9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/a4526352-8106-0c24-434e-4b55cf7e9208.png)
![data_judge10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/8db2d3f5-1ccd-83a9-35ea-e416dfd77b17.png)
![data_judge11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/4a7c45e4-46eb-2bf0-6d47-acde0d0b238f.png)





## GAN

DNNと逆の過程
判別結果から、画像を出力するような使い方
大量の正解データをたくさん用意する。
生成した画像の本物らしさを学習することによって高品質なデータ生成

Generator
 データ生成ネットワーク
 本物データ生成

Discriminator
 審議判別ネットワーク(二つの画像を見分けるＤＮＮ)
  偽元データ（generatorで乱数ベクトルで生成）が入力されると、偽物と判定するＤＮＮ
  本物データ（generatorで生成）が入力されると本物と判定するＤＮＮ
 
 最初に入力するのは乱数データで作られた偽物デタラメ画像

![GAN1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/f3377f40-62fb-6565-abb5-f3d0a58c77f2.png)

Discriminatorの出力が本物になるように、乱数ベクトルを調整する。
学習初期のgeneratorは、あまり本物と呼べるような物にならない。
　さらに人間の目で呼べない者は、偽物と判定させて、再学習
 →　より厳しくなる。

 generatorはdiscriminatorをだますように、
 discriminatorは厳しく判定するように学習していく。
 Generative Adversarial Networks (GAN)　敵対的。

学習過程

![GAN2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/6f7f1f24-3a6e-577a-6d50-fc6ec8339106.png)

## RNN

Many to Many 入力も出力も時系列　データが入力されるたびに、データを出力する。時系列予測。
機械翻訳　同じ意味を文章
Many to One 文章で、答えを一つを出力するパターン
One to many 画像に対するキャプショニングを行う

## データの水増し

image augmentation　データの水増し　回転やノイズを加えて
Transfer learning（転移学習） 大量のデータから学習したネットワークを再利用
　少数のデータで高い性能を得られる。ようなＤＮＮの事前学習を行う。
Semi-supervised learning　大量のラベル無しデータを活用
　少数のラベル付きデータから高い性能を得る。

## image augmentation

最近は必須の技術。
１０％精度が変わってくるという論文での結論もある。
組合わせて用いることもできる。

毎EPOCH同じ加工をしてしまうと、学習としては良くない。
毎EPOCHで、画像を変えていく。

回転角度をランダムにする。
アスペクト非のランダム化、
ランダムに左右反転　

cutoutという画像の一部を隠す。
ランダムで隠す。
　→　ＮＮＣで可能

mixup　ランダムに画像を2枚取り出して、透明の画像で合成する。
正解データも合成する。 ex 猫50% 犬50%
　→　ＮＮＣで可能

### cutout

ニューラルネットワークコンソールでも組合わせでできる。


## 転移学習
　→　少ないデータ数から、モデルの再利用する
　通常は学習のパラメータ初期値は乱数を用いる。
　データ数が少ないと、十分に学習が進まない。

画像関連であれば、画像の最終層のdenseを除く部分以外の
パラメータを適用する。

データの転移先と、転移元を近い物でないと、難しい。
Sonyの学習済みモデルもたくさんあるので転移学習も可能。

## データの品質

少なくとも人が見てわかるぐらいの画像解像度は必須。

間違ったラベリング
ＧＡＮ、シミュレーションのデータ実データに比べて性能は低下する。
高解像度
画像、音声など複数のモーダルが良い。
匿名化の処理は、データ欠落になる。

基本的に画像の解像度が高いほうがいいが、
メモリやＣＰＵを食う。
認識できるのに十分な範囲で、解像度を落とすほうがいい。

目標性能を最初に決めるべき。
そこでデータを決めていく
数百ぐらいのデータでもそこそこの精度は出る。


## オートエンコーダー

オートエンコーダ(AutoEncoder)
オートエンコーダの核は次元削減である。オートエンコーダはニューラルネットワークの一種で、情報量を小さくした特徴表現を獲得するためにある。

入力と出力を同じデータにして学習することを考えてみよう。もし、各層の入力データが同じ次元になるとしたら、データはただ単に出力層に向かってコピーされればいい。

でも、隠れ層の次元が小さくなっていたらどうだろう？同様のデータを小さな情報量に圧縮する何らかの方法をニューラルネットワークは学習しないといけない。これこそがオートエンコーダのやっていることだ。

図のように、隠れ層1と同じサイズの次元を1つだけ隠れ層にしてオートエンコーダで訓練する。
このようにオートエンコーダを用いてパーセプトロンの重みの初期値を予め推定しておくことを事前学習(pre-training)という。



![オートエンコーダー](https://deepage.net/img/deeplearning_autoencoder/autoencoder.jpg)

![Alt text](https://deepage.net/img/deeplearning_autoencoder/stacked1.jpg)

下記のようなオートエンコーダーを使うと、画像が補正される

![AutoEncoder](AutoEncoder.PNG)

学習に使っていないデータは復元できない。
大量の正常データのみを学習させる。
元通りに復元できないデータほど、正常データから離れていると、学習させる。
例えば、入力画像と復元画像の平均2乗誤差で判断する。


![AutoEncoder2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/da97cd9e-819c-70e6-a135-4d2d58b052a6.png)

![AutoEncoder3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/4db1af59-d2d3-544a-dbfe-6a173ba3a426.png)

もう今では実用的な用途としてはめったに使われてないと書かれている。オートエンコーダは画像のノイズ除去や可視化程度でしか利用目的がないとされている。



## ベクトルの分類

ＳＰＡＭフィルタなど
メールの単語の登場頻度から、ＳＰＡＭかどうかの判別
・線形判別、決定木、ＳＶＭなど

iris Flower dataset
150点。3種類の花を、額の幅、長さから判別を行う。

## セマンティックセグメンテーション

画素ごとに、分類をする。
すべてdenseではなく、ＣＮＮで結合させる。　入力画像の解像度は保たれる。
最後にcategoryを出す事を行う。

ＣＮＮとはフィルタ処理のようなもの。
512*512の画像としては、5*5で100層も繰り返さないと、
現実的な大きさの判別ができない。

少ないメモリ、ＣＰＵで判別にするには？
max poolingで画像の解像度を下げることで、メモリ、ＣＰＵを稼ぐ。

ダウンサンプリングを行って、解像度を下げながら、広い参照範囲を両立するには
unploolingというアップサンプリングをするのは一つ。

U-net　よく使われる手法
Skip connectionが追加される。

Dilated covolution　穴あきでＣＮＮをかける。
広い範囲を、少ないコンピュテーションパワーで参照できる。

## 信号処理フィルタ

DNNで。ex.ボケた画像からはっきりさせた画像を出力
　　　ノイズ除去、手振れ、欠損補完
今までは、個別にやってきたが、ＤＮＮのほうが良い

入力と出力を大量に用意するのが理想。
どのように？

劣化信号を復元したい。
良い画像を劣化させることで　学習データを作る。
例えば縮小させる。

jpgの圧縮ノイズも。
ADDACのノイズなども。

semantic segmentationと同じようなＣＮＮだけの構造。

でかい画像は、メモリにすべてを食わせるのは無理なので、
細かい領域にして、ＣＮＮで食わせる。

![filter1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/a2af8f7f-2614-9a34-e270-43b2acbdbeb5.png)

## DNNで予測

one hot encoding

日付の入力の仕方
　月、日付、時刻で　分けると、　２３と0時が不連続、１２、１が不連続など問題がある。

時刻のように周期性を持つ情報をsin, cosで表現する。日付では定番のテクニック。

![estimation1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/5b256c6b-29e5-c98f-4ab4-8dbfba9b04cb.png)
　
出力のデータが来客数の場合、例えばlogを取った来客数を
出力の学習データとすることで、
対数分布であった、分布がガウス分布に近づけられる。

もしくは離散化するのもテクニック。
例えばワンホット化。　こちらのほうが高い予測精度になる。
分布が均等になるように区切る

![estimation2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/39b08f9c-64ab-478c-1a1e-abd29a469bea.png)

画像データと、例えば日時情報、天気情報なども含めて学習可能。
ＣＮＮ層と、dense層をどこで、結合させるかは難しい。

並列に時系列のデータをすべて入力に並べることもできるが、
ＲＮＮがやはり、常套手段。


## ラベリング

効率的なラベリングツールの開発
ラベリングをＤＮＮにする。

初期値を、初期の学習データでラベリングしてしまい、
間違っているものだけ、人の手で変えていく。

エッジの認識をするＤＮＮで、
エッジの座標指定する。

## 量子化

https://www.youtube.com/watch?v=exfQbpGBXYI

基本的に16bitのintであればほとんど性能劣化は起こらない
ＤＮＮの出力に近い層であれば8bitでも性能劣化は起こらない

という実験結果がある。

量子化関数の微分は、back propagationで更新できなくなる可能性あり。
重みやパラメータを動的に量子化することが大事。

![quantize1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215525/ce9199a1-1b46-cec6-a2e5-804e2dbafed4.png)

推論時は、量子化されたパラメータで行う。

## Sony Neural Network Console　機能

構造自動探索機能がある。ニューロンの数、新しい層
活性化関数などを、
停止操作を行うまで、延々と計算ができる。
データセットはcsvで、アップロードする。



## 用語

・アンプーリング
・リーキーRELU