LoginSignup
6
6

More than 3 years have passed since last update.

今夜はFastFCNの学習を回して寝よう

Posted at

Semantic Segmentation の最近の動向をあまり追っていなかったのですが、
つくりながら学ぶ!PyTorchによる発展ディープラーニング という本を買い、
PSPNet というものがあることを知りました。
実装までしっかり書いてあってめちゃくちゃわかりやすいのでおすすめです。
自分は今までTensorFlow を主に使っていましたが、Pytorch の使い方を学びながら新しい技術についても学べます。

上述の本でPSPNetを実装している際に、FastFCNという最新のネットワークの存在を知ったので、
実際に動かしてみました。
論文の要点が以下の記事にまとまっています。
自分はまだ論文を読んでいないので、この記事を参考に読み進めていこうと思っています。
https://qiita.com/kamata1729/items/1b495658a63d76904ac3

その記事の中で、このレポジトリにリンクがはられていました。
https://github.com/wuhuikai/FastFCN

今回の記事では、このレポジトリのコードを実際に動かす手順を書いていこうと思います。
ちょこちょこハマるところもあったので悲

環境

host

メモリ 32GB
GPU GTX1080Ti

docker

Dockerfile は、以下に置きました。
もしかしたら、ちょこちょこ追加したpackage があるかもしれません。
追って、検証していきたいと思います。
https://gist.github.com/gorogoroyasu/47d5ab6bd3b97b016ca1c8cca8435c6a

git clone

レポジトリをcloneします。
README.md に色々書いてありますが、GPU1台で実行する場合下記のコード変更を先に行う必要があります。

環境に依存するコードの変更

今回一番言いたかったことはこれです。
https://github.com/wuhuikai/FastFCN/issues/12
何箇所かコードを変更する必要があります。

encoding/models/encnet.py

https://github.com/wuhuikai/FastFCN/blob/097e7130f77a15eeca12f37a0afcf2f8f7f90439/encoding/models/encnet.py#L53
ここを、 nn.BatchNorm1d(ncodes), に変更します。

experiments/segmentation/train.py

https://github.com/wuhuikai/FastFCN/blob/097e7130f77a15eeca12f37a0afcf2f8f7f90439/experiments/segmentation/train.py#L54
ここを se_loss = args.se_loss, norm_layer = torch.nn.BatchNorm2dに変更します。

https://github.com/wuhuikai/FastFCN/blob/097e7130f77a15eeca12f37a0afcf2f8f7f90439/experiments/segmentation/train.py#L111
ここを loss = self.criterion(*outputs, target)
に変更します。

https://github.com/wuhuikai/FastFCN/blob/097e7130f77a15eeca12f37a0afcf2f8f7f90439/experiments/segmentation/train.py#L132
この行を削除します。

インストール

この変更を行ったあと、
sh
PATH=.:$PATH
python setup.py install

を実行します。

データのダウンロード

あとは README.mdに従ってデータをダウンロードして学習を実行すればよいです。
自分は、ADE20Kをダウンロードしました。

python scripts/prepare_ade20k.py

結構時間がかかるので、寝る前にここまで完成させて、実行して寝ましょうw

データのダウンロードが完了したら、

cd experiments/segmentation
CUDA_VISIBLE_DEVICES=0 python train.py --dataset ade20k --model encnet --jpu --aux --se-loss --backbone resnet50 --checkname encnet_res50_ade20k_train

を実行すればトレーニングが開始されます。

ちなみに、自分のGPUでは、デフォルトのバッチサイズが大きすぎたので、

--batch-size 2

を追加しました。
たぶん、デフォルトは4だと思います。

とてつもなく時間がかかりそうで怖いですが、家に帰ってきた頃には数epoch 学習が進んでいると思うので、
その結果を見て一喜一憂しようと思います。

終わりに

SOTA だと信じて疑わなかったFastFCN ですが、
この記事を書いている途中にSOTA が更新されていることに気が付きました悲
https://paperswithcode.com/paper/high-resolution-representations-for-labeling

high-resolution-representations-for-labeling
についても調べていこうと思います。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6