ココアのお勉強ブログ

理工学研究科の大学院1年生です。主に深層学習を中心に勉強/研究しています。まだまだ初心者なので優しくしてくれると嬉しいです。きまぐれでイラストも描きます。イラスト : https://hotcocoagallery.jimdosite.com/

Erasing Integrated Learning : A Simple yet Effective Approach for Weakly Supervised Object Localization 自分用まとめ

論文リンク

http://openaccess.thecvf.com/content_CVPR_2020/html/Mai_Erasing_Integrated_Learning_A_Simple_Yet_Effective_Approach_for_Weakly_CVPR_2020_paper.html

どんな論文?

CVPR2020採択論文。Weakly supervised object localization (WSOL)をするための手法。WSOLとはセグメンターションラベルのようなラベルではなく、単純にクラスラベル程度の簡単なラベル情報だけで物体の位置、大きさ(要は簡単なセグメンテーションみたいなもの)を得ようというものである。

VGGみたいな一般的な分類モデルに基づいた方法は対象物全体ではなく、もっとも識別根拠の高い部分だけを強調してしまうという。逆に全体的な範囲に向けると今度は画像分類の精度が落ちるという。 この論文の結果を見れば分かるかもしれないが、要は下図の真ん中の行のように鳥の顔部分しか得られていない状態が「もっとも識別根拠の高い部分だけを強調してしまう」ということである。一番下のように鳥全体を覆うような感じにしたい。
そのため本手法ではErasing Integrated Learning「EIL」と呼ばれるシンプルでより良い手法を提案した。 CUB-200-2011とILSVRC 2016のベンチマークにおいて、ともに新たな大幅な改善を確認した。

関連論文、先行研究では得られたCAMや特徴マップの結果を、入力画像にマスクしたり、特徴マップにマスクしたりすることで重要な部分を順次隠しつつ、重要だと思われる他の部分どんどん追っていこうみたいなアプローチ。 当然のことながら、入力画像をマスクしたりすれば、重要な部分が隠されるわけなので精度は下がるという事態が起きかねない(というか起きると考えるのが当然)。

手法のキモ

全体図

EILの全体図を以下に示す。 ここでは論文のように、VGG16が以下の図のように使われてるとします。
f:id:hotcocoastudy:20200619121304p:plain
下の部分だけだと一般の学習法であることが分かります。

学習手順

まずはconv11~pool4まで通します。 チャンネルごとの平均プーリングを用いて平均マップM_{avg}を得ます。 適当な閾値γ用いて2値画像M_eにします。 得られた2値画像とconv11~pool4から出力される特徴マップをかけ合わします。 conv51~conv53→GAP(Global Average Pooling)を通します。
それぞれCrossEntorpyを計算し、L=L_u+σL_eを全体の損失関数とします。
以上のアルゴリズムをまとめると以下のようになります。
実際にこの設定で学習を進めてめると以下の図のようになるらしい。
また分岐する地点を増やしたMultiple EIL(MEIL)を使うとより効果的であった。

結果

感想

シンプルな方法なので、試すのはそこまで難しくないかも。
何か間違ってたら教えてください。マジでお願いします。

Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild 自分用メモ

論文リンク

https://arxiv.org/abs/1911.11130

注意

3Dの知識全くなく、もちろん3D画像生成の論文自体初めて読んだので信憑性がかなり低いかもしれないので過信しないで下さい。

どんな論文?

CVPR2020 Best Paper Award
(3D情報が一切ない)単一の画像の学習データから3次元変形可能なオブジェクトの生成を学習する手法の提案をしている。
入力画像をDepth、Albedo、Viewpoint、 Illumination(light)に分解するAutoEncoderを用いている。
これらの要素を教師なしで分解するために、入力画像が対称構造を持っているという前提事実を利用している。
本手法を用いることで、人の顔、猫の顔、車の3次元形状を、教師なしで正確に生成できることを示した。
教師ありで用いる他の手法と比較して、優れた精度を確認している。

3Dの知識が一切ないので調べて理解した程度だが

「深度」は奥行の情報 (図はhttps://solidthinking.com/help/Evolve/2017.3/macosx/ja/depth_of_field.html より)

「Albedo」は光の反射率 (図はhttps://tech.cygames.co.jp/archives/2129/ より)

「view point」はよく分からないけど普通にどの視点から見たオブジェクトかという情報のこと? https://www.eplan.help/help/platform/2.7/ja-JP/help/EPLAN_Help.htm#htm/Glossary_o_3d_blickpunkte.html

「illumination(light)」は多分光源情報のこと。

技術のキモ

以下の図は提案しているPhoto-geometric autoencodingの全体図。

入力画像IをDepth、Albedo、Viewpoint、 Illumination(light)に分解していることが分かる。
confというものが出てくるがこれは画像内で各ピクセルに対して対称的な対応を持つピクセルの確率(信頼度スコア)を表しているという。
同じ入力画像Iから,ネットワークを使用して,2つの信頼度マップσ,、σ'を推定します。
この信頼度マップにより、モデルは入力画像のどの部分が対称ではないかを学習できるらしいです。
例えば図に示すように、人の髪の毛は対称性があまりなく、σ'は、対称性の仮定が満たされていない髪の毛の領域に、高い不確かさを表します。

ネットワーク

ネットワークを見るため著者実装の中を覗いてみる。

# Depth用のAutoEncoder
self.netD = networks.EDDeconv(cin=3, cout=1, nf=64, zdim=256, activation=None)
# Albedo用のAutoEncoder
self.netA = networks.EDDeconv(cin=3, cout=3, nf=64, zdim=256)
# Light用のEncoder
self.netL = networks.Encoder(cin=3, cout=4, nf=32)
# View用のEncoder
self.netV = networks.Encoder(cin=3, cout=6, nf=32)
# conf用のAutoEncoder
self.netC = networks.ConfNet(cin=3, cout=2, nf=64, zdim=128)

行数が半端なくなるので、各ネットワークの構造はhttps://github.com/elliottwu/unsup3d/blob/master/unsup3d/networks.py#L9-L137 を見てください。

流れ

まず入力画像からDepth、Albedo、Viewpoint、 Illumination(light)に分解します。
詳しいことはよく分かりませんが、depthとlightの情報からshadingという立体的な構造(多分3D?)を作成し、albedoの情報を加えることでshadingに顔のテクスチャを情報を貼ったような感じにしたcanonical viewというものを出力します(light(照明)に比べてalbedoは対象であることが多いためテクスチャのように扱うのが良いということが論文のDisscusionに書いてあったような気がする)。
その後viewpoint、depth、canonical view をRendererに通しレンダリングします。
レンダリングって何か知らないけど3Dモデルをイメージとして出力することっぽいです。

この論文のキモである対称性を利用します。
以下の図のようにdepthとalbedoを反転して同じことをします。

最終的な出力は入力した画像の再構成画像になっているべきです。
なので入力画像と出力画像を再構成損失で評価できることになります
また先程説明したconfも再構成損失に適用します。

損失関数

再構成損失は以下で定義される。

そして全体の損失関数は以下で定義される。

ここでI'は反転を入れた時の再構成画像。
論文ではλ=0.5としてある。
L1損失(|\hat{I}-I|)は、ぼやけた画像を再構成にする傾向があるためPerceptual lossという損失関数も追加したという。
論文を読んでもあまり詳しくは分からなかったが、VGG16(pretrain-model)を新しいEncoderとして追加し、encodeしたものを差分の絶対値を求める。
それを以下のperceptual lossに適用する。
kと書いてあるのはk層目の出力を意味している。この論文ではVGG16のrelu3_3の特徴だけで十分な結果が出たという。

これを先の再構成損失に加える。

論文ではλ_p=1としてある。

結果

感想

3Dもうちょっと基礎的なこと勉強してから読めばよかったです。

参考

GitHub - elliottwu/unsup3d: (CVPR'20 Oral) Unsupervised Learning of Probably Symmetric Deformable 3D Objects from Images in the Wild
https://www.youtube.com/watch?v=5rPJyrU-WE4

その他

論文ではレンダラーとして微分可能レンダリング × 深層学習であるNeural 3D mesh rendererを用いていた。
以下の研究動向を見るのが良さそう。
docs.google.com

Auxiliary Training: Towards Accurate and Robust Models 自分用メモ

論文リンク

http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Auxiliary_Training_Towards_Accurate_and_Robust_Models_CVPR_2020_paper.html

アブスト

既存手法のほとんどはモデルの精度と頑健性のトレードオフに陥っている。
回転のような処理があると画像の劣化(破損)が見られ、加えてぼかし、雨、ノイズ等のような要因が増えるとニューラルネットに対して大幅な精度低下を招いてしまう。
つまり、少しでも上記のような変化を画像に加えると精度が落ちてしまうということだ。
モデルの頑健性を高めようとするときによく使用されるのは Data Augmentation だが、劣化させた(Data Augmentation処理を施した)画像を学習データにそのまま加えると、元の綺麗な画像だけで学習した時よりも精度の低下を引き起こす。
また、それぞれ異なる画像処理を施した劣化画像は相互に影響を及ぼしてしまう。
例えばガウスノイズを加える処理をData Augmentationとして用いるとモデルはノイズによる劣化に強くなるが、コントラストや彩度が異なる画像に対しては頑健性が低下する。
綺麗な画像上で精度を低下させることなくモデルの頑健性を高めることが最近の研究のトレンドになっているが難しい。

本研究では、劣化させた学習サンプルに対して補助分類器(auxiliary classifiers)を導入する学習方法を提案する。
学習段階では、主分類器が補助分類器からロバストな情報を学習できるようにするために、入力を意識した自己蒸留(input-aware self distillation)という新しい蒸留法を提案する。
これに伴い、劣化させた画像の負の影響からモデルを守るために、新しい正規化手法である選択的バッチ正規化(selective batch normalization)を提案する。
また主分類器と補助分類器の重みが同一になるように、L2ノルムペナルティを適用する。

技術や手法のキモ

本研究では、2種類の学習サンプルからなるニューラルネットワークの学習フレームワークを提案している。
以下の図は本手法の全体の流れをまとめてある。

まず2種類の学習サンプルについて、
1つ目は劣化処理を行っていない綺麗な画像。
2つ目は綺麗な画像に劣化処理(ノイズ、ぼかし等のような処理)を加えた画像。

特徴抽出層は共有するが、分類層のコピーである補助分類器を主分類器の学習補助として追加する。

第1段階

学習の第1段階では、代表的な特徴を得るために、2種類の画像を同じconv層(特徴抽出層)に入力した後、それぞれ個々の分類器がある種類の劣化からの学習サンプルによってのみ学習される。
難しい言い方をしてしまったが以下の図を例にすると、

  • 綺麗な画像は綺麗な画像用の主分類器に

  • ノイズ劣化画像はノイズ画像用の補助分類器に

  • ぼかし劣化画像はぼかし画像用の補助分類器に

送られるということである。

第2段階

第2段階では、主分類器と補助分類器間の重みが同一の重みになるように、L2ノルム損失を用いてペナルティを与える。
その結果、補助分類器は不要となるので削除し、主分類器のみで良くなる。そのため、元のネットワークの形を変更せずに済む。

さらに、モデルの学習のために、入力を意識した自己蒸留(input-aware self distillation)と選択的バッチ正規化(selective batch normalization)を導入している。

input-aware self distillation

input-aware self distillation では,主分類器をteacher model、補助分類器をstudent modelと見なす。綺麗な画像から劣化した画像へ知識を伝達し、主分類器が補助分類器から頑健な情報を学習できるようにする。

selective batch normalization

selective batch normalization は、綺麗な画像と劣化画像の平均と分散をそれぞれ計算し、綺麗な画像のみでパラメータを更新することで、劣化画像からの負の影響を抑えることができる。
(Zhouらが、batch normalizationを行ったモデルが、batch normalizationを行わないモデルよりも優れた性能を発揮しない可能性があることを示した(特にData Augmentationを利用した場合)。)

※各記号については後述。

batch normってなんだっけ?→Normalization Layers

X_cを学習データセットとする。まだ画像処理を行っていない綺麗な画像である。

Tは画像劣化処理のセット。

X_jは劣化画像を施した学習データセットとする。

綺麗なデータと劣化データを合わせたものをXとする。

f(x;\theta_f)を特徴抽出器の処理出力、g(x;\theta_g)を分類器の処理出力とする。

通常の学習法だと以下のように損失関数を最小化することになる。

今回の学習法だと以下のように損失関数を最小化することになる。

さらにペナルティ関数Ωとして

を追加する。

以上を用いて補助学習(auxiliary training)の損失関数は以下で定義される。

α, λ, γはハイパーパラメータ。
論文では補助学習(auxiliary training)はそこまでハイパーパラメータに敏感ではないと書いてあった。
特にγは以下の補助学習(auxiliary training)のアルゴリズムにもあるように、第1段階ではγ=0、第2段階ではγ=1としている(第2段階でL2ノルム損失を用いてペナルティを与えるため)。

結果

CIFAR100、ImageNetでの実験により、提案した補助学習によって精度と頑健性の両方において改善が確認された。
平均して、補助学習はCIFAR100で従来の学習方法と比較して、精度が2.21%向上し、頑健性が21.64%向上した。

感想

ぶっちゃけるとinput-aware self distillationが何で学習に良いのかよく分からなかった。

Live2D Cubism触ってみた

Live2D Cubismとは

こんな感じで1枚イラストにモーションを加えるようにできるソフトウェア。

www.youtube.com

難しそう...と思うかもしれませんが簡単な動きだったらそこまで難しくなかったです。

チュートリアルなども日本で開発されたものだからか日本語がほとんどなので英語読めない人でも大丈夫です。

使ってみた

今回は CLIP STUDIO PAINT PRO でイラストを描きました。

名前はひとまずkanadeちゃんと名付けました。

f:id:hotcocoastudy:20200225052958j:plain

描いたイラスト

レイヤー構成は公式チュートリアル動画を真似しました。

www.youtube.com

f:id:hotcocoastudy:20200225135454p:plain

イラスト編集画面

基本的に以下のサイトの「基本チュートリアル」の言うことを聞いていきます。分かりやすいです。

Live2D Cubism チュートリアル | Live2D Manuals & Tutorials

f:id:hotcocoastudy:20200225135530p:plain

 

とりあえず
1. , 2. , 3. を読みながら使ってみます。

f:id:hotcocoastudy:20200225135552p:plain

結果

実際にパラメータ調整をチュートリアル通りにやってみた結果です。

drive.google.com

感想

Live2D Cubism自体は難しくない(絵心いらない)。

日本語解説が多くて良い。

イラストを用意する方が難しい。

WSL(Windows Subsystem for Linux)で高速イメージビューアsxivを使うときメモ

sxivとは

malkalech.com

構築

WSLを開いてsxivをインストールする

$ sudo apt install sxiv

で、何か適当な画像(hoge.jpg)を見るため、画像を開くコマンド

$ sxiv hoge.jpg

を実行しようとすると

「sxiv: Error opening X display」

というエラーが出る。

そこで以下のリンクに従って「VcXsrv Windows X Server」を導入する。

orebibou.com

先程と同様に

$ sxiv hoge.jpg

と打つと表示された。

github眺めてて何だこのファイルってなったやつたちメモ(Python)

requirements.txt

note.nkmk.me

pipでPythonのパッケージ(ライブラリ)を管理している場合、設定ファイルrequirements.txtを使って指定のパッケージを指定のバージョンで一括インストールすることができる。

Pipfile、Pipfile.lock

qiita.com

Pythonで開発するときに,プロジェクト毎のパッケージ管理や仮想環境の構築を簡単に自動で行ってくれるツール

ちなみに自分はWSLを使っていてエラーが出て困ったので以下のリンクで対処しました

[python] WSLのpipenv install時になぜかWindows側のpythonが呼ばれる件 - Qiita

Makefile

qiita.com

<変数宣言>

<タスク名>:
<実行したいshell>

みたいに書いて自分が実行したいshellコマンドを組み合わせて自分用のコマンドを作れる...みたいな理解

 

他にも色々あると思いますがとりあえずこの3つ気になってたので調べました。よくみんな知ってますね。

Windows10でVScodeの設定メモ

サーベイ記事でも何でもありません。マジでただの自分のメモ書きです。

多分何も参考にならないと思います。

VScodeダウンロードとpythonの設定

VScodeのダウンロード

qiita.com

pythonで作業するための設定

www.sejuku.net

WSLダウンロード

VScode上でbashを使いたいのでWSLをダウンロード(git bashでもいいと思う)。

qiita.com

Remote-WSLダウンロード

VScodeでWSLを使うためにRemote-WSLという拡張を入れる。

syobon.jp

Remote Development ダウンロード

VScodeを開いてRemote Developmentと呼ばれる拡張を入れる。

これはVScodessh接続するために必要となるのでもしssh接続しないなら入れなくても良いです。

(今回は自分が多段sshをしたかったので入れた)

ここで既に多段sshの設定はできていて、設定ファイルや鍵が「C:/Users/ユーザー名/.ssh」に置いてあるとします。

dev.classmethod.jp

SSHって?

SSHとは?仕組みとSSHサーバーの設定をわかりやすく解説します! | カゴヤのサーバー研究室

多段SSHって?

多段SSHの設定を.ssh/configにまとめる - Qiita

Windowsで生じるエラーによる対処

通常多段sshのconfigは以下のように設定するのが普通です。

Host 踏み台サーバ
HostName 踏み台サーバアドレス
User ユーザー名
IdentityFile 鍵のパス

Host 目的サーバー名
HostName localhost
User ユーザー名
IdentityFile 鍵のパス
ProxyCommand ssh -W %h:%p 踏み台サーバー名

ですがwindows10では「Could not establish connecting to "サーバー名"」みたいなエラーが表示されうまくいかないらしいので、

ProxyCommand ssh -W %h:%p 踏み台サーバー名

の部分を

ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p 踏み台サーバー名

と変更することで接続ができるらしいです。

引用:

Visual Studio Code - vscodeの多段SSHをしたい|teratail

flake8インストール

pythonのエラーチェックをしてくれるモジュールのラッパーのインストール。

qiita.com

 

上記のリンクでうまくflake8を構築できなかったらcornflakes-linterという拡張を入れると良いかもしれません(こっちの方が若干楽)。僕はこちらを採用しました。

f:id:hotcocoastudy:20200216141842p:plain

flake8の使用例

僕は何故かflake8の設定ができてもautopep8の設定ができなかったので、

Python-autopep8」と呼ばれる拡張機能を追加しました。

これは編集中のpythonファイルを開きながらコマンドパレットに「autopep8」と打つと整形してくれる。上記のリンクではautopep8の自動整形の設定まで書いてあるが自分はうまくいかなかったのでこちらを採用(なお会社のPCではうまくできた模様、謎)。

f:id:hotcocoastudy:20200215191440p:plain

なお先程入れたPythonの拡張に保存した際に自動整形する機能がついていたため無理にautopep8を入れなくてもよいかと思います。

その他拡張機能

qiita.com

www.hypertextcandy.com

上記のリンクから自分に良さそうな拡張を探して

などなど入れていきます。ここは完全に自由です。

ポチるだけなので楽しいです。買い物してる気分。

注意

ローカルとリモート間で拡張が共有されるわけではないのでそれぞれで拡張を入れる必要があります。

モジュールを入れ過ぎると補完機能(インテリセンス)が重くなるのがネックかなと思いました。「読み込んでいます...」という画面が出てしまう...みたいな時は補完できるまで4~5分待つと表示されたりします。一度補完されると後はスムーズに出てくると思うので最初だけ待たなきゃいけないような感じになることもあります。今後何とか軽量化したいです。というか解決できる人がいたら教えてほしい...。