画像認識の有名なCNN

python

像認識を行うことを目的とした代表的なCNNのメモ。これをキーワードにググる。ほうぼう調べた内容のメモなので内容は薄い。

ちなみに有名なモデルは学習済みのデータも含めて公開されているので気軽に試すことができる。

AlexNet

2012年のILSVRという画像認識のコンペティションで1位を取り、CNNブームのきっかけとなったネットワーク。畳み込み層が5層その後全結合で3層。活性化関数はReLU(それ以前はsigmoid、tanhがメジャーだった。のかな?)。

VGG-Net

層数を増やしてどこまで精度が出るかを考えて作られたモデル。VGG16とかVGG19とかが有名でこのあたりが最適とされている。畳み込み層が3×3の小さいフィルタで数回直列、その後プーリング層でサイズダウン、コレの繰り返し。

GoogLeNet Inception

これまで層の深さで精度を上げていたが、このネットワークは横の広がりも使ったものになっている。複数の異なるサイズのフィルタを使った結果を結合することで対象のサイズに対してロバストな認識ができるようになっている。(大きい犬と小さい犬は違うフィルタサイズで見つかる。とか)計算コストを直列で行うよりも小さくできる。異なるサイズのフィルタを並列に用いる。定番の全結合層がない。

ResNet

層を深くすれば精度向上できると言われていたが、勾配消失問題によって、深いモデルでは学習がうまく進まない。(勾配消失:出力層の誤差を入力に向けて伝搬されている間に誤差がなくなっていき、入力層近くでは勾配が消えてしまっていること)ショートカットコネクションを導入することで、この勾配消失問題を解決し、層を深くできている。畳み込んだものとそうでないものの残差を学習するモデル。(出力に対して入力を加算して学習を進める。)層の深さを稼ぐことができResNet-34とか50/101/152がある

WideResNet

ResNetを改良させたもの。ResNetが層の深さを深くすることで精度を上げたが、今度は幅を広げたネットワーク。幅というのはフィルタの数を増やしてチャネル数を増やすこと。層の数を減らしたところでチャネル数が増えるので、パラメータ数はあまり変わらないが並列演算がしやすい。ResNetの一種(パラメータを変更したもの)のように見える。

DenseNet

ResNetを改良したもの。ショートカットコネクション(迂回経路)を多く用い、ResNetに対してパラメータあたりの精度を3倍程度向上させている。ResNetではresidual block。DenseNetではdense blockと言い分けている。入力をその後ろに続くすべての層の出力とつなげている。ResNetでは迂回させた入力を出力に加算していますが、DenseNetではそうではない。なので残差学習とはならない。各層はBottleneckと呼ばれる作りになっている。3×3の畳み込みを全入力チャネルに対して行い、複数のフィルタを使うと計算量が半端ないのでその対策らしい。

MobileNets

エッジAIを想定した軽量なネットワーク。他の画像認識用の軽量モデルには、ShuffleNetや、MnasNetなどもある。MbileNetsにはいろいろなバージョンがあるらしい。バージョンが上がる毎に性能も向上している。v1で導入された考え方がDepthwise Separable Convolutionという仕組み。1段目では入力チャネルに対して1つの3×3フィルタをかけ、ReLUして、1×1フィルタ(要はゲイン)を出力チャネル数だけかけてReLUる。とかそんな方法チャネル数を増やす工程では1×1を使う。ってことかな。計算量が減る。

v2ではResNetのようにスキップコネクション入れて、残差学習にしてReLUやめてLinerにしたようです。これでまた少し精度向上したらしい。あとReLUもReLU6とか頭打ちさせたReLUを使っているようです。

v3ではSqueeeze-and-Excitationってのを使ったり、h-swishって活性化関数を使ったりしてさらに性能が向上したらしい。

EfficientNet

CNNのスケールアップをさせるときにどのパラメータをいじると一番効率が良いか考察したモデル。各層のチャネル数(特徴マップの数)、層の数、画像のサイズの3つをどのようにするのが一番精度が高いんだろう?というのを考察したらしい。

NAS(Neural Architecture Search)という層の構造設計すらニューラルネットワークに任せるという考え方もある。

物体検出

 これまではそれしか写っていない写真からの認識タスクでしたが、よくある画像から特定の領域を切り出して、これは何だ!って返してくれるあれです。「何」だけでなく「どこ」も含めて見つけてくれるものです。

R-CNN

Selective Searchという方法で物体候補領域を見つけ、その領域に対してCNNを使って特徴量検出し、最後にSVMを使って分類、その後回帰モデルを使って位置を検出。という流れ。Selective SearchってのはAIでもなんでもなく、クラシックな画像処理。pip install selectivesearchで入れられちゃいます。物体検出でCNNを使った最初のモデル。物体候補領域を見つけてその領域をCNNで分類しSVMで何かを判断する。領域毎にCNNを使うので遅い。

SPPnet

R-CNNでは固定サイズの画像を受け取るしかなく、縦横比が狂ったリサイズ画像を処理する必要がありました。その代わりにSPP層(Spatial Pyramid Pooling)というアイディアを導入して、 CNNで畳み込んだ最終層の特徴マップを縦横可変サイズで取り扱えるようにしました。通常全結合層の手間に来るプーリング層を特定のバウンディングボックスに対するSPPに置き換えることでネットワークを構成しています。またR-CNNでは候補領域毎にCNNするのに対して、SPPnetでは画像全体にCNNを適用し、候補領域をベクトル化するのでCNNの回数が少なく高速に動作します。Spatial Pyramid Poolingを使うことで検出対象のサイズや形の制約が少ない。R-CNNに対してCNNの回数が少なく高速。

Fast-R-CNN

これもR-CNNの高速版になります。こいつもSPPnetと同様に画像全体に対してCNNを実行し、注目領域に合わせてPoolingしてやります。これもやはりSPPnet同様に画像全体をCNNすることで、重複する領域の計算が省けるので高速化が図れるというわけです。SPPネットとの違いがイマイチ判りませんが。SPP層とは違うやり方なのだと思います。SPP層よりシンプルなつくりのようです。SPPnetではCNN、分類器の学習、バンディングボックスの回帰と複数のステップをとるのに対して、このそれぞれの学習を一気にやってしまうのがこのモデルの特徴になります。損失関数をクラス分類とバウンディングボックス回帰両方の目的で使えるようにすることでこの一気学習ができるように工夫されています。複数ステップにわたる学習を一気に行う。R-CNNに対してCNNの回数が少なく高速。SPPnetよりも高速。

Faster-R-CNN

さらに高速。物体候補領域の計算もCNNを使ってやろうというアイディア。これまでは事前に候補領域をいくつか見繕っておく(Selective Search)必要がありましたが、Region Proposal Network(RPN)と呼ばれるネットワークで、CNNを使って物体候補領域をみつけてやります。「物体か否か」を学習し、その後物体候補として出力された位置情報を、Fast-R-CNNと同じように矩形ごとに切り出して「その物体が何なのか」を学習します。Selective SearchまでもCNN化することで、精度・速度ともに改善したようです。Fast-R-CNNよりさらに高速

Mask R-CNN

Faster-R-CNNをもとに改良したもの。注目領域に合わせてPoolingするところをバイリニアによる縮小にしたらしい。また物体領域のマスクの推定という機能を追加して、バウンディングボックスをさらに細かい領域の分類(セグメンテーション)を実現させたらしい。このマスクの推定にはFully Convolutional Networkを使っているらしい。

YOLO(You Only Look Once)

候補領域を見つけるという行為をあきらめて、画像をグリッドに分割して、それぞれの領域を学習する。というやり方です。それぞれの領域に何がいるか?を出してあげて、それを後でマージすればどこに何がある。を判定できるというわけです。ただ弱点としてそれぞれの領域には2つの物体があるという制約を入れることで高速化しているので、一つの領域に複数の物体が含まれるような場合にはうまくいきません。精度もFaster-R-CNNには及ばないとされています。ただ高速です。Faster-R-CNNよりさらに高速

SSD

YOLOよりさらに高速。どんどん早くなりますね。精度面でもFaster-R-CNN並みまで伸びるようです。YOLOもバージョンアップされているらしいのでどちらがいいかはその時の状況次第のようですが。YOLOではグリッドに分けてそれぞれ学習させていましたが、SSDでは複数スケールの畳み込みを行うことで、学習を進めています。SSDでもYOLO同様物体とその領域をいっぺんに判定するEnd-to-Endを実現しています。複数スケールで畳み込み。YOLOよりさらに高速・高精度

Fully Convolutional One-Stage Object Detection(FCOS)

よくわからないのでキーワードだけ

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

バウンディングボックスとかではなく、画素単位に分類を行うモデル。上述のMask R-CNNもこれだと思う。

FCN(Fully Convolutional Network)

画素単位に推論処理を行うモデル。一番シンプルで単純な方法。上述のMask R-CNNでもこれを使ってセグメンテーションしているようだ。

SegNet

キーワードだけ

pythonメモ
スポンサーリンク
キャンプ工学

コメント

タイトルとURLをコピーしました