本記事の概要
kaggleで2020/07/07現在開催中のSIIM-ISIC Melanoma Classification(画像認識コンペ)に最近注力しています.
画像認識ど素人ですが,以下の2つのモデルが単体のCNN(画像認識に特化したモデル)としては優秀であることまでは把握しました.
- EfficientNet(2019年5月にGoogle Brainから発表されたモデル.)
- ResNet(Microsoft Researchが開発.ILSVRC(画像認識コンペ)2015優勝モデル.)
これらのモデルについてどのような記事を見て理解したのか,また実際にコンペのデータセットに適用した結果はどうだったのかを述べていきます.
本記事の対象読者
- 【条件】CNNに関する基本的な知識(畳み込み層,プーリング層,全結合層についてなど)がある.
- 【モチベ】EfficientNetについてどのように理解したのかを知りたい.
- 【モチベ】ResNetについてどのように理解したのかを知りたい.
- 【モチベ】上記の二つのモデルを実問題に適用した場合の比較結果を知りたい.
ResNetの理解
理解の流れ
以下のような流れで理解しました.
- 解説記事を見て概要を理解する.
- ResNetの要素(BottleNeck)について具体的なパラメータ数を確認して有効性を理解する.
概要の理解
Residual Network(ResNet)の理解とチューニングのベストプラクティスという記事がResNetの概要を理解するうえで一番わかりやすかったです.(原論文を読むのがベストなのですが...)
以下の2点がResNetの特徴かと理解しています.
- より深いCNNを構築できるようにするため,各層の入力情報を出力に加えている.(shortcut Connection)
- 計算量を少なくするため,1×1の畳み込み層でフィルタ数を少なくし,畳み込みが完了した後に再度1×1の畳み込み層でフィルタ数を復元する.(BottoleNeckアーキテクチャ)
BottleNeckによる計算量削減の理解
機械学習エンジニアなら答えられて当然の問題4問 ~畳み込み層編~というサイトの第3問がBottleNeckによる計算量削減を具体的に理解するうえで役に立ちました.
EfficientNetの理解
理解の流れ
EfficientNetもResNetと同様,わかりやすい解説記事をベースに不明な要素を別記事で補完するような流れで理解しました.
- 解説記事を見て概要を理解する.
- EfficientNetを構成する層であるMBConv(MobileNet)について別記事で理解する.
概要の理解
2019年最強の画像認識モデルEfficientNet解説とういう記事を見て概要を把握しました.
解説先の概要にも載っている話ですが,EfficientNetについて以下のように理解しました.
- CNN系モデルの構造を決めるパラメータとして「広さ」,「深さ」,「解像度(=入力画像の大きさ)」の3つに注目する.
- 上記の3つのパラメータをうまく調整する方法を考案し,サイズが小さく精度も良いモデルを構築できた.
- EfficientNetで用いられる層は主にMBConvという層.
MBConvの理解
以下の2つの記事を見て理解しました.
EfficientNetの構成要素であるMobileNetv2のInverted Residual Blockを理解するために,Residual Block(ResNet)とdepthwise separable convolution(MobileNetV1)をそれぞれ理解する必要があります.基本的には如何に少ないパラメータにしつつ,従来の畳み込みのエッセンスを残すかというアイデアがどんどん出てきます.
両記事とも具体的なパラメータを提示し,どれほど削減できたかを伝えているので理解しやすかったです.
両モデルの精度の比較
利用したデータセット
冒頭でも述べましたが,現在黒色腫の皮膚の画像から悪性かどうかを分類するデータ分析コンペに出場しています.与えられた皮膚の画像について2クラス分類するシンプルな画像認識コンペのため,CNN初心者での私でもそれなりに参加できています.
このコンペのデータセットを用いて,ResNetとEfficientNetの比較を行いました.
データセットの特徴
以下の表に示すように,正例(悪性である黒色腫)のデータが極端に少ないデータとなっています.
正例 | 32542 |
---|---|
負例 | 584 |
合計 | 33126 |
モデル構造/パラメータ数の比較
pythonのtensorflow.kerasライブラリに学習済みのResNet50があるため,そちらをfine tuningして今回のタスクに適用させました.ImageNetと呼ばれる数万種類のタグが付与された1400万枚ほどのデータセットで学習されたモデルを用いました.
またefficientnetもtensorflow.keras形式のライブラリが公開されているため,そちらを利用しました.こちらもImageNetで学習済みのモデルをfine tuningしました.
EfficientNetB1とresNet50とを比較すると,EfficientNetB1の方が約1/4のパラメータになっています.
EfficientNetB1 | |
---|---|
ResNet50 |
学習結果の比較
各モデルで10エポックで学習させました.細かい分析条件は割愛しますが,同条件での結果になります.
(もし細かい分析条件を知りたい!という方がいらっしゃいましたらコメントなど頂ければ幸いです(この記事を御覧だけでもありがたいのですが,お手数おかけします).
各モデルの各エポック(X軸)での以下の2つの性能評価結果をplotした図を貼り付けます.
データ数が少し増えているのは,正例のデータに対して水増し処理を行っているためです.
また,earlystopping処理によって両モデルとも6エポックで終了してます.
- 訓練用データ33,000件に対するROC AUC score
- 検証用データ1444件に対するROC AUC score
この結果から,EfficientNetではResNetに比べ早い段階で学習が収束し,またResNetよりも高い精度を出していることが伺えます.
単体のモデルではEfficientNetを利用しておくのが安牌といえそうです.
もちろん,ResNetによる出力もKaggleのデータ分析コンペの終盤によく行われるアンサンブルで活用できるため大事に結果を保存しておきます.
画像認識技術は枯れた技術になりつつ有ると言われたり、社会実装が最も進んでいる分野と言われたりしていますが、まだまだ発展著しい分野ですね。TFやPyTorchで様々なモデルの実装比較をやってみてベンチマークを取ってみると面白いだろうなと思います。