[論文メモ] ConvMLP: Hierarchical Convolutional MLPs for Vision

arxiv.org
個人的なメモレベル

概要

最近流行り始めているMLP-basedなアーキテクチャは固定サイズの入力とFC層による高計算コストでobject detection等にしても使いにくい。
提案するConvMLPは軽量でステージに分割(ダウンサンプリングをする)といった畳み込みに近いMLPアーキテクチャ
f:id:Ninhydrin:20210917100945p:plain

導入

画像といえばCNNという感じだったが最近ではNLP系のTransformerが画像タスクに参入(ViT)。
MLPMLP-Mixer、gMLP、ResMLPなどCNNやViTに肉薄する精度を出し始めた。
しかし、MLP-basedな手法は固定長の入力という制約がありobject detectionなどの多様な画像サイズを受け取るタスクには利用できない。
またobject detection等のマルチスケールな特徴が有効なタスクでは(ViTなどもそうだが)シングルステージモデル(計算途中でも解像度が変化しないモデル)は有効ではないし、MLP-basedな手法はパラメータ数・計算コストともに大きく、Transformer系と同等以上のパフォーマンスを出すにはより多くのパラメータと計算コストを必要とする。

本論文では
1) 固定長入力の制約を取り除く
2) 軽量化
を目的としている。

手法

アーキテクチャ全体図は図2を参照
f:id:Ninhydrin:20210917093043p:plain
大まかに、Tokenizer、convolution stage、Conv-MLP stageの3つに分かれる。

Tokenizer

多様な入力サイズに対応するためにconvolutionで設計。
3x3のconv、BN、ReLUとmax poolingから成る。

Convolution Stage

空間方向での接続を強くするためにfully convolutionを挟む。
1x1と3x3のconvから成る。

Conv-MLP Stage

固定長入力の制約をなくすため全てのspatial MLP(空間方向のMLP)をchannle MLP(チャンネル方向のMLP)に。
重みの共有はチャンネル方向のみで空間方向の相互作用がなくなるのでそこは初期のステージでconvolution layerを挟むことで解決。

Swin-Transformerに倣いダウンサンプリングを導入。ただし、Swinのpatch mergingではなく3x3convをstride2で適用することでダウンサンプリングする。
少しパラメータが増えるがaccuracyが向上。

また3x3のDepth-Wise Convをchannel MLP とchannel MLPの間に挿入。
これによりspatial MLPがなくても空間方向の相互作用ができパフォーマンスも大幅に向上。

実験

詳しくは省略するので論文を参照。
スケール違いで3つのConvMLPを使ったアーキテクチャを作成(表1)。
f:id:Ninhydrin:20210917094729p:plain

まずはablation study。各モジュールの有効性をチェック。結果は表2を参照。epoch数が異なるのが気にはなる。
f:id:Ninhydrin:20210917094842p:plain

ImageNet-1k、CIFAR、Flowers-102、MS COCO、ADE20Kなども実験。
表3がImageNet-1k。モデルサイズごとに分けて比較。軽量でSOTAレベルとは言えそう(だが少し届かない)。
f:id:Ninhydrin:20210917095057p:plain


表4がImageNet-1kで事前学習してから各タスクでファインチューニング。
図3はConvMLPをバックボーンとして利用してMS COCOでのobject detectionとADE30Kでのsemantic segmentationの実験結果。
f:id:Ninhydrin:20210917095146p:plain

所感

純粋なMLPのみではなくconvolutionとの併用でMLP-basedといって良いのかちょっと微妙。MLPで達成したいのか、軽量なモデルを目指しているのか等目的がわからなくなってくる。結果としては軽量さとaccuracyのトレードオフといった感じで場合によってはありという感じ。
個人的にはMLPにこだわりはなく軽量で計算コストも低く、学習しやすい(過学習しない・データ数少)なら何でもあり。別にconvolutionやattentionを駆逐する必要はないと思っている。

[論文メモ] Sparse MLP for Image Recognition: Is Self-Attention Really Necessary?

arxiv.org
あくまで個人的メモレベル

概要

ViTのように近年ではTransformerのCV分野への応用が活発だが、画像認識においてself-attentionが高パフォーマンスを得るための鍵なのか調査し、最近また再燃しているMLPモデルを改良したattention-freeなsMLPNetを提案。

導入

ViTやDeiTなど、適切な事前学習をしたtransformer系のビジョンモデルは画像認識でSOTAを達成した。
DeiTなどの畳み込みのないViTは2つの固定観念的なものを生み出した
1) グローバルな依存関係のモデリングが重要で、畳み込みのようなローカルな依存関係を置き換えられる
2) self-attentionが重要

1番目について、多くの研究者はローカルな依存関係のモデリングをなくし、わざわざself-attentionにローカルな依存関係を学習させようとしてきた。
確かにself-attetnionは強力だが計算コストが高く高解像度画像への適用の欠点とされている。Swin-Transformerはピラミッド構造・ローカルな依存関係が明示的に構造に入っており高いパフォーマンスを示している。

2番目について、近年ではself-attention freeなMLPモデルで画像認識をしようとしている研究者が出てきている。MLP-MixerはViTのように画像をパッチに分けて入力し、spatial mixingとchannel mixingをするというのが特徴。ただ、パラメータが多い分過学習しやすい。
MLP-MixerとSOTAモデルとの精度の差は大きいがこれがself-attentionの有無ということにはならない。

提案するsMLPNetはこの2つを否定する。

手法

CNNの重要なデザインアイディアを保ちつつ、Transformerから着想を得た新しいモジュールを導入する。
ただし、
1) ViTやMLP-Mixerと公平な比較のため、それらと似た構造にする
2) 明示的にローカルバイアスを導入する
3) self-attentionを使用しないでもグローバルな依存関係を得られるか調査
4) ピラミッド構造によるマルチステージの処理

全体像

f:id:Ninhydrin:20210915094335p:plain
ViTやMLP-Mixerとかと同様に画像をパッチに分割して入力する。パッチサイズは4x4と小さめ(MLP-Mixerは16x16)。
同じ画像サイズのとき計算コストはMLP-Mixerの16倍であまりに入力が多いとMLP-Mixerでは学習が破綻する。
4つのステージに別れ、1ステージ目はパッチの埋め込みになっているが、他ではパッチを統合し解像度を1/2倍にしチャンネルを2倍するSwinのブロックを導入。
実装は周辺の2x2のバッチをconcatしてLinear Layerに通す。
図2(b)はtoken-mixing moduleでdepth-wise convによりローカルバイアスを導入。パラメータも少ないし低コストで提案するsMLPにも導入。
channel-mixing moduleはMLP-Mxierと同じfeed-forward network。

Sparse MLP(sMLP)

MLPの2つ問題点、1)パラメータが多く過学習しやすい、 2)計算コストが高い(特に入力が高次元)を解決する。
そのためにsMLPでは重みの共有を行う(図1)。全てのトークンではなく、同じ行と列のトークンのみと相互作用する。
f:id:Ninhydrin:20210915101031p:plain
仕組みとしてはH x W x Cを(HC) x W or (WC) x HにしてFCレイヤーに入れるだけ。それぞれで得られた特徴を X_H X_Wとする。もとのHxWxCの入力を XとしてsMLPの出力[X^{out}]は[X^{out}=FC(concat(X_H, X_W, X))]となる(図3)。pytorchの擬似コードもある。
f:id:Ninhydrin:20210915101620p:plain
f:id:Ninhydrin:20210915101659p:plain

パラメータは H^2+W^2+3C^2MLP 2\alpha (HW)^2 \alphaは拡大率で4が多い。入力が224x224、 C=80とすると3000xほどのパラメータ削減になる。
計算コストは
sMLP)  \Omega(sMLP)=HWC(H+W)+3HWC^2
MLP-Mixer)  \Omega(MLP)=2\alpha (HW)^2C

アーキテクチャの設定

サイズ違いで3種類のモデルを用意
f:id:Ninhydrin:20210915102158p:plain

実験

実験は一部省略

Ablation Study

Local and global modeling

DWConvがローカルの情報、sMLPがグローバルの情報を担当しているがこれらが必要なのかを確認(表1)。
まずはsMLPのみ。DWConvは軽量のため取り除いても0.1MB程度しかモデルサイズは変わらないそう(FLOPsは0.1B程度)。しかしaccuracyは0.7%程度も変わる。
次はDWConvのみ。sMLPは重めのモジュールなのでモデルサイズ、FLOPsをベースモデルに揃えるためにチャンネルサイズを80から112にしたがsMLPのみとほとんど変わらないaccuracy。
f:id:Ninhydrin:20210916090022p:plain

次にステージ毎のsMLPモジュールの役割について調査。ベースはsMLPNet-B。結果は表2を参照。1行目がベースモデルそのまま。
sMLPを取り除くごとに徐々にaccuracyが落ちていくが、特にステージ3からを取り除いたときに大きく落ち込んだ。
ステージ3は一番レイヤー数が多く、FCのサイズも大きいためパラメータも多いし計算コストも高い。
ステージ1~3のsMLPを取り除いたモデルのモデルサイズ的にsMLPNet-S(accuracyは83.1%)と同じ。しかしaccuracyでは劣るので入力の早い段階でグローバル情報を扱うのが重要。
f:id:Ninhydrin:20210916091048p:plain

Fusion in sMLP

sMLPは特徴をFCに入れてsumしているが他の軽量な方法ではどうなのか調査。
sum) 単純に足し合わせる。
weighted sum) 学習可能パラメータで乗算して足し合わせる
比較対象のベースモデルはsMLPNet-S。結果が表3。
smuもweighted sumもパラメータ数、計算コストともに下がったがaccuracyも低下した。より軽量でconcat + FCのsMLPNet-Tと比べてもaccuracyが落ちている。
パラメータ数・計算コストとaccuracyのトレードオフを考えたとき、concat + FCの方が優れていそう
f:id:Ninhydrin:20210916092551p:plain

Branches in sMLP

sMLPモジュールでは3つのブランチをconcatしているが他についても調査。2つのパターンの組み合わせ。

  • ベースと同じ並列処理と順次処理( X^{out}=FC(X_H) or  X^{out} = FC(X_W)的な。どちらもほぼ同じaccuracyだったらしい)
  • Identity mapping(入力を足し合わせる)

これらのある無しで4通りを実験。結果が表4。同じ行で比較(並列 or 順次)だと並列のが良く、同じ列で比較(identityありなし)だとありが良い。
f:id:Ninhydrin:20210916093733p:plain

Multi-stage processing in pyramid structure

ローカル情報とグローバル情報を組み合わせるときにピラミッド構造は有効そうだが、実際にピラミッド構造が有効なのか調査の必要がある。
MLPのモデルでシングルステージとマルチステージの比較をした。ただし、ベースはsMLPNetでsMLPブロックを調整する。
小さいsMLPNetを構築し、ステージ1のsMLPブロックをDWConvに置き換えステージ2~4のsMLPブロックをMLPブロックに置き換えた。これがマルチステージのMLPモデル。
結果が表5。マルチステージのほうが少ないパラメータでより良いaccuracyとなった。
f:id:Ninhydrin:20210916094735p:plain

Comparison with state-of-the-art

SOTAモデルとの比較。データセットはImageNet-1K。入力は224x224で結果は表6。
注目はsMLPNet-BでSwin-Bに対してより小さいパラメータ数、FLOPsで同じaccuracyを達成した。過学習も見られない。
attention-freeでもSOTAと並ぶパフォーマンスを出すことができ、attentionが最高パフォーマンスを出すのに必ずしも必要では無いことが示せた。
なおtransformer-basedなモデルでCSwinがあるそうでこちらは84.2%のtop-1を叩き出しているが、あくまでattention-freeでSOTAレベルのパフォーマンスを示すのが目的なので、CSwinの結果がこの結果に影響はしないとのこと。
f:id:Ninhydrin:20210916095507p:plain

所感

attention-freeでもSOTAレベルのaccuracyを獲得できたのはすごいと思うが、Convolutionのようなバイアスや制約をモデルに課す必要がありうーんといった感じ。
学術的には面白いと思うが、実際に適用するときにMLPモデルを採用するかは微妙。
ただ、解きたい問題・ドメインにあった帰納バイアスを持つアーキテクチャを選ぶ・設計することの重要性を再認識させられた。
MLPという自由度の高いモデルで如何に精度を出すかはこの手の改良が必要で非常に参考になる。
そういう意味でも、今後もMLP系のモデルの発展に注目していきたい。

[論文メモ] Panoptic SegFormer

arxiv.org

transformerを使ってPanoptic Segmentation(PSと略す)を行った論文。テクニカルレポート。
PAはSemantic Segmentation(画像中の全てのピクセルをクラス分類. SSと略す)とInstance Segmentation(物体毎に領域分割しインスタンスを区別する. ISと略す)の複合。

PSでは画像内の物体をthingsとstuffに分ける。
Things ) 人や車など可算な物体でユニークなidで他の同じ種類の物体と区別できる
Stuff ) 空や雪など不可算な物体でidで区別できない

このthingsとstuffは予測する際にも影響する。PAの既存手法はthings -> IS、stuff -> SSとPAをSSとISに分離して解くことが多い。
だが、これだとモデルが複雑になりアーティファクト等も起こる。
最近ではFCN構造でtop-downとbottom-upを組み合わせる手法もある。

またViT系の物体検出としてDETRがあり、これはクエリ特徴がRoI特徴のような役割をするらしい。

この論文ではViTを使ったend-to-endのPAフレームワーク、Panoptic SegFormerを提案する。
1) thingsもstuffも均一にするためにstuffは単一のインスタンスIDを持つクエリを設定
2) location decoderはセグメンテーションの質を高めるためthings とstuffのバランスを取る
3) マスク毎のpost processでthigsとstuffのセグメンテーションを結合する
f:id:Ninhydrin:20210914094701p:plain

手法

アーキテクチャの全体像は図2を参照。
バックボーンのマルチスケールの特徴をtransformer encoderに通して各解像度の特徴を得る。それらをFCに通して256次元に揃えflattenして連結し長いシーケンスとする。transformerに通し、その出力をlocation decoderとmask decoderに入れる。
location decoderは物体の位置予測、mask decoderはlocation decoderの出力も受け取り最終的に得たいマスクの生成とクラス分類を行う。

f:id:Ninhydrin:20210910094741p:plain

Transformer Encoder

セグメンテーションタスクにおいて高解像・マルチスケール特徴は重要。
でもmulti-head attentionはコストが高く、既存手法では低解像の特徴で使われているがこれではセグメンテーションのパフォーマンスに影響する。
そこでdeformable attention layer(DAL)を導入。

Location Decoder

位置情報はPSにおいてthingsのidを割り当てる時に重要になる。そこでthinsgとstuffの位置情報を学習可能なクエリにするlocation decoderを作成。
ランダムに初期化されたN個のクエリとtransformer encoderで作られた特徴から位置を認識したN個のクエリを出力。
学習時はMLPヘッドをつけて物体の中心位置とスケールの予測を行いlossを取る。あくまで学習時に使うヘッドなので予測のとき使用せず、セグメンテーションマスクの予測も必要ない。

Mask Decoder

アーキテクチャは図3を参照。
Mask DecoderはLocation Decoderの出力をQuery、Transformer Encoderの出力をKeyとValueとして受け取り物体のマスクとクラス分類を行う。
decoderの最後の出力 \displaystyle Q_{refine} \in \mathbb{R}^{N \times 256}にFCレイヤーをつけてクラス分類を行う。Nはクエリ数。
マスクの予測では、各解像度のAttention map(図3のA)を最大解像度に合わせてアップサンプリング+ concatし1x1の畳み込みで予測する。
マスク予測では完全なattention mapが必要なのでDALではなく一般的なmulti-head attentionを採用。
f:id:Ninhydrin:20210914090559p:plain

Loss Function

よくある感じの重み付き和
 L= \lambda_{cls}L_{cls} + \lambda_{seg}L_{seg} + \lambda_{loc}L_{loc}
 L_{cls}ではFocal Lossを導入。 L_{loc}は式4参照。物体がある時だけ中心座標( \hat{u}_{\sigma(i)})とスケール( \hat{v}_{\sigma(i)})についてL1 lossをとる( f_c(m_i) f_s(m_i)は中心座標とスケールのラベル、 m_iはターゲットのマスク)。
f:id:Ninhydrin:20210914092531p:plain

Mask-Wise Inference

PSでは各ピクセルにクラスラベルとインスタンスidを割り当てる。
一般的なのはヒューリスティックな手法でピクセル毎にargmaxして割り当てる方法だが、外れ値的なピクセルでノイズのある結果になってしまう。
そこでピクセルレベルではなくマスクレベルでのヒューリスティック処理でオーバーラップの無い出力を得る。アルゴリズムはAlgorithm1を参照。
確信度(s)順にソートして、確信度が一定値以下は破棄。あとはマスクとidを割り当てる。m[i]&(SemMsk > 0)でオーバーラップ除去。これはSemMsk==0の間違いでは?SemMsk>0だと出力がオーバーラップのピクセルだけになりそう。
f:id:Ninhydrin:20210914093550p:plain

実験

実験は省略
f:id:Ninhydrin:20210914094543p:plain
f:id:Ninhydrin:20210914094604p:plain

所感

Panoptic Segmentationというものを知らなかった。
なので手法としてのデファクトスタンダードも知らず、既存手法の問題点を聞いても正直なるほどとしかならなかった。
マルチスケールの特徴をTransformer Encoderに通して得られたAttention Mapをconcatとするのはマルチスケール+transformerとしては良さそう。
マルチスケールの特徴を全て連結してTransformer Encoderに通してマルチスケール間でattentionを取るのも面白い。各解像度で協調できそう。
attention mapからマスクを生成しているはなるほどといった感じ。確かにクラス分類などにも使うので物体位置に対して注目してそう。

[論文メモ] Fully Transformer Networks for Semantic Image Segmentation

arxiv.org

図・表は論文から引用しています。

概要

NLPで使われているtransformerがsemantic segmentationでどれだけ有効なのかを調査した論文。
encoder-decoder basedなFully Transformer Networks(FTN)を提案。

Transformer basedな手法としては3種類ほどある(図1を参照)。
f:id:Ninhydrin:20210906093814p:plain

1)Transformer-CNN architecture(図1(a))
transformerのencoderとCNNのdecoderを使う。画像をパッチに切り出し埋め込みベクトルにして処理していく。ViTに近い。

2) Hybrid-CNN architecture(図1(b))
decoderはCNN。encoderもほとんどがResNetなどのCNNだが、出力に近い低解像度の部分を埋め込みベクトルとしてtransformerのモジュールに入れる。

3) Hybrid-Transformer architecture(図1(c))
Hybrid-CNNのdecoderをtransformerにした。

今回提案するのはすべてをtransformerにしたアーキテクチャ(図1(d))

手法

Pyramid Group Transformer encoderとFeature Pyramid Transformer decoderで構成される(図2)。
f:id:Ninhydrin:20210906094906p:plain

Pyramid Group Transformer(PGT)

PGTはCNNアーキテクチャの様に階層的な特徴を学習する。
PGTの各ステージでは似たような構造をしている。
Patch Transforme Layerでは画像のパッチをN次元に埋め込む。
各ステージではN_i個のPGTブロックがあり、最後のPGTブロックで2x2のオーバーラップなしの結合が行われる(conv? pooling?)。これにより解像度を下げる。
各ステージの出力をdecoder(FPT)に渡してもとの解像度のセグメンテーションを得る。

PGTは徐々に解像度を下げることでCNNで言う受容野を徐々に広げていく。
これはViTが提案した方法だが、これだと画像全体でself-attention(SA)を行うのでコストが高い。なのでグループに分け、その中でSAを行う。
図3を参照。赤い枠がSAを行う範囲で、ViTが画像全体に行うのに対してPGTではグリッドレベルでSAが行われる。
ステージ3, 4はストライド16, 32で、十分にリッチな特徴が得られるので、globalレベルでのSAを適用する。
f:id:Ninhydrin:20210906100335p:plain



l番目のPGTブロックの計算は式1。
f:id:Ninhydrin:20210906100908p:plain
Pyramid Group Multi-Self Attention(PG-MSA)は式2。Hはヘッドの数、iはヘッドのインデックス、Gがグループ数、jがグループのインデックス。
f:id:Ninhydrin:20210906101027p:plain

PGTに関しては4つデザインした。表1を参照。
iはステージ、Pはトークンを減らすファクター、Cはチャンネル、NはPGTブロック数、Gはグループ数、Hはヘッド数、EはMLPでの次元の拡大率。
f:id:Ninhydrin:20210906101512p:plain

Feature Pyramid Transformer(FPT)

PGTの各レベル(解像度)の特徴を集約してsemantic segmentationのマップを出力する(図2を参照)。
CNNベースのFPNを参考に意味情報と空間情報を高解像度なレイヤーに集約していく。
ここで重要な点は2つ
1) トップダウン(低解像の特徴から高解像の特徴)接続は意味情報を直接拡大して高解像に加えているので意味情報が正確にローカライズされている?
2) 各レベルの特徴がspatial reduction transformer blockとbilinearによって徐々にアップサンプリングされてsumされる
これらの2つにより各レベルの各解像度の特徴を扱うことができる。

実験

ImageNet-1Kのクラス分類

同じレベルのパラメータ・GFLOPsのモデルと比較して(RegNetY-4G vs ResNet-50 vs PGT-S)優位。
小さいモデルは特に顕著(PVT-Tiny vs PGT-T)。
大きいモデルではSOTAなSwin-Bにもわずかに勝利(PGT-L)
f:id:Ninhydrin:20210907085336p:plain

Semantic Image Segmentation

PASCAL Context、ADE20K、COCO-Stuffの3つ

PASCAL Context

同じパラメータレベルでの比較は勝利。
Swin-BのUperNetとFTN(PGT-L )を比較して大幅に改善。
ImageNetで事前学習したSwin-LをバックボーンにしたらSOTA。

ADE20K

CNNと比べ少ないパラメータで優位(FTN(PGT-S))。pretrained Swin-Lをバックボーンにすると強い。

COCO-Stuff

Swin transformersより大体改善。pretrained Swin-LバックボーンはSOTA(48.48%)。

f:id:Ninhydrin:20210907085859p:plain

Ablation Strudy

Effectiveness of PGT

PGTの効果を確認するため、segmentationタスクにて ViT、PVT、Swin TransformerにPGTを使ってPASCAL Contextを学習。
大体改善。特にViT-L/16よりパラメータがかなり少ないPGT-Lの方が高精度。
f:id:Ninhydrin:20210907091352p:plain

Effectiveness of FPT

表4の右端の列(Decoder.Transformer.FPT)を参照。僅かな改善量だけど、全てで改善。

Group Choices of PGT

PGTの受容野の大きさはGroupの大きさで調整される。大きいと計算量が多く、小さいと適切にコンテクストを読み取れない。
比較結果が図4
16-4-1-1がベストだけど、メモリコストがかなり大きいので64-16-1-1を採用。
f:id:Ninhydrin:20210907091858p:plain

所感

最近ViT系を読んでいて読んだけど思ったよりシンプルだった。
SAをConvと同じ用にするための制約(ここではGroup)を入れるタイプが多く、クラス分類と違ってImage to ImageのSemantic Segmentation等のタスクでは画像という巨大な時系列を扱う場合メモリや計算量が問題になるようだ。Pixel Shufflerとかを使った事例はあるのかな(Swinのdownsamplingは近いものを感じる)。
ただ、Image to ImageもTransformerでなんとかなりそうにはなってきたが、事前学習や学習速度の問題が実際のところどうなのかが気になる。実用的なのだろうか。

[論文メモ]ConvNets vs. Transformers: Whose Visual Representations are More Transferable?

arxiv.org
ICCV2021 Workshop
画像は論文より引用

あくまでメモ。興味ある人は論文を読んでください。
間違い等の指摘は大歓迎です。

タイトルどおりConvNetとTransformerでどちらがTransfer Learningに適しているのかを調査した論文。

概要

最近ではNLPで良いとされていたTransformerがViT(Visual Transformer)として画像認識分野にも進出してきた。
ConvNetはtransfer learningが可能でそれなりの効果があることが知られているがViT系モデルはどうなのかよくわかっていない。
そこでこの論文は2つのConvNetと3つのViTモデルを15の画像認識タスクで実験することで確認をした。

まずはpre trainingでtransferするためのベースモデルを学習する。その結果が下の表1。
f:id:Ninhydrin:20210814143649p:plain
INはImageNetの略らしくTop 1 Accuracyを表している。ベースモデルに関しては僅かではあるがConvNetのほうが優勢。
ベースモデルのAccuracyはfine tuning後のモデルのAccuracyに影響する。今回は5つのモデルともほぼ同じAccuracyなのでfine tuning後のAccuracyはアーキテクチャの影響が強く出るはず。

実験

実験に関しては個々の詳細についても記載されているがここでは省略する。

Single-task evaluation

まずは10個のsingle taskについて調べる。色々なドメインに関して調べたいので複数のデータセットを用意。3回実験をした平均で比較している。

Fine-grained classification

Flower102, CUB200の2つのデータセット。タスクはクラス分類。
fine-grainedはサブドメインの分類。花や鳥を分類するのではなくそのドメイン内を分類する。例えば花の種類(チューリップや桜など)。
結果は下の表2。ViTの圧勝といえる結果。fine-grainedな分類にはViTはTransferできる。
f:id:Ninhydrin:20210814144729p:plain

Scene recognition

Indoor67, NYU Depth V2の2つ。タスクはIndoor67クラス分類でNYU Depth V2は深度推定とセグメンテーション。
NYU Depth V2についてはタスクが分類ではないのでConvNetとViTともにヘッド部分を取り替えた。
結果は下の表3。これまたViTの圧勝と言えそう。
クラス分類タスクのネットワークをセグメンテーション等に転移するという少々難しめのタスクでもViTは強い。
f:id:Ninhydrin:20210814145729p:plain

Open-domain classification

WikiArt, COVID-19 Image Data Collectionの2つ。
結果は下の表4。
fine-grainedと同じ傾向でViTの圧勝。
今回の2つのデータセットはImageNetに含まれないようなデータだが、ViTはそのデータに転移するアビリティがあるようだ。
そして相変わらずSwin-Bが強い。
f:id:Ninhydrin:20210814150018p:plain

In-domain classification

Caltech101の1つ
結果は下の表5。
今回はConvNetのほうが良い結果になったが、これはCaltech101がImageNetに近いデータセットであり、ベースモデルもConvNetのほうがより良いAccuracyだったのを考えると正しいといえる。fine tuningするデータセットがベースモデルの学習に使ったデータセットと近いなら、ベースモデルのAccuracyが反映される。
f:id:Ninhydrin:20210814150047p:plain

Face recognition

FG-NETの1つ。
結果は下の表6。
ImageNetには顔画像はそれほど含まれていないので、アーキテクチャのtransferalbeな影響が強いはず。
全体的にはViTのが好成績。面白いことにConvNet、ViTともによりパラメータの少ないモデルのほうが良い結果になった(Swin-Bは別)。
顔認識においては過学習のリスクの低いほうが良いのかもしれない。
f:id:Ninhydrin:20210814150138p:plain

Linear evaluation protocol

ConvNet、ViTを特徴量抽出モデルとして固定し、全結合層を学習するタスク。
データセットはCUB200, Indoor67, WikiArtの3つ。
結果は下の表7。
面白いことに、ConvNetがViTと同等の成績。ViT-B/16とViT-L/16の特徴量はtransfer learningには向かないらしい。
ただ、Swin-Bだけは別でConvNetより良い結果に。feature pyramidは効果的なようだ。
同じデータセットで比べたときに(表2, 3, 4)、Accuracyの伸び具合からViTのほうがfine tuningによる調整が上手そうだ。
f:id:Ninhydrin:20210814150250p:plain

また、もう一つのタスクとして特徴量を利用した画像検索も行った。
データセットはOxford5。
その結果が下の表8。
ConvNetのほうが好成績だが、これはOxford5データセットがImageNetに近いからと考えられる(Caltech101と同じ要因)。
Swin-Bも好成績。feature pyramidはConvNetのような特徴を獲得できるのかもしれない。
少なくともViTの特徴量で画像検索をするならfeature pyramidのような階層的な構造がより良い特徴量を獲得できそう。
f:id:Ninhydrin:20210815101634p:plain

Multi-task evaluation

ここからはMulti-taskについての実験。
単純にConvNetとViTで比較するだけでなく、single-taskのときとも比較する。
ただ注意してほしいのはどのタスクを組み合わせると有効なのかを検証しているのではなくConvNetとViT、どちらがmulti-taskにおいてtranserしやすいのかの検証である。
single-taskのときと同様に3回実験を行った平均で比較する。

Scene segmentation and depth estimation

NYU Depth V2を用いて深度推定とセグメンテーションのmulti-task。
結果は下の表9。
この2つのタスクはmulti-task learningにおいてお互いに効果的(single-taskと比較)。
結果としてはViTのが好成績。
f:id:Ninhydrin:20210814150401p:plain

Scene and in-domain classification

Indoor67とCaltech101の2つの組み合わせ。
結果は下の表10。
結果としてはViTのがよく、Swin-Bがトップ。
この2つのデータセットの組み合わせは効果的ではなさそう。
ViTのほうがAccuracyの減少は少ない。
f:id:Ninhydrin:20210814150433p:plain

Open-domain and in-domain classification

Caltech101とWikiArtの2つ。一つ前の実験におけるIndoor67をWikiArtにした。
結果は下の表11。
ViTのほうが好成績だけど、どちらのモデルもsingle-taskと比較してAccuracyは下がった。
データセットドメインが大きく異り、識別に必要な特徴も異なるのが原因か。
f:id:Ninhydrin:20210814150539p:plain

Scene segmentation with different classification problems

セグメンテーションとクラス分類の組み合わせ。
NYU Depth V2とIndoor67の組み合わせと同じくNYU Depth V2とWiki Artの組み合わせの2セット。
結果は下の表12と表13。
ViTのほうが好成績。
同時に解くクラス分類のデータセットがセグメンテーションのデータセットに近い場合でもmulti-taskは難しいようだ。
ただ、それでもViTのほうが好成績で、未知の組み合わせ等でもViTを使うほうが良さそう。
f:id:Ninhydrin:20210814150644p:plain
f:id:Ninhydrin:20210814150647p:plain

結論

ConvNetに比べViTのほうがtransfer learningには向いている(よりよいアーキテクチャ)。
またmulti-task learningにおいてもよりロバスト
ConvNetに関しても、もとのデータセットに近いデータセットの場合や、画像検索などの特徴量を利用する場合は効果がありそう。ただSwin-Bは侮れない。

所感

ViTというかTransformerの方がよりdomain specificな特徴になっていてtransferしにくいのかなとか思っていたけどそんなことはなかったようだ。
単純にattention部分がうまいこと切り替わって、タスクにうまくフィットするのかもしれない?
そう考えるとConvNetと違って中間の特徴を大きく変化する必要もないのでtransferしやすそうでもある。
Swin-Bについて詳しく知らなかったが読んだ感じただのViTよりも、より画像タスク用にチューニングされた印象を受けた。
そろそろ本当にConvNetはViTに置き換わるのかもしれないな。

VolumioでSambaサーバーをマウントするときError when adding network drive (95): Operation not supported Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)のエラーが出る

タイトルの通り、VolumioでSambaサーバーをマウントするときに「Error when adding network drive (95): Operation not supported Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)」が出て困っている人のために。

Volumioを使って音楽を聞いているが、最近自宅サーバーを新しくしそこに音楽を入れSambaを使って共有している。
raspberry pi 3 Model Bに入れたVolumioからは普通にマウントできるのだが、Intel NUCに入れたVolumioからはエラーが出てマウントがうまくできなかった。raspberry piと全く同じ設定なのになぜマウントできないのかわからなかった。
もしかしたらx86のVolumioはcifs-utilsとかのパッケージが足りないのではと思ったがそんなことはなかった。
調べてマウントオプションに「vers=1.0」を入れると良いとあったのでつけたけど駄目。

よく考えるとSambaプロトコルのバージョンを確認してなかったので確認した。Sambaのプロトコルバージョンは以下のコマンドで確認できる。

sudo smbstatus -b

確認するとSMB3_00であることがわかった。なのでオプションを「vers=3.0」にしたら無事マウントできた。

同じエラーで困っている人がいたらSambaサーバーでプロトコルのバージョンを確認し、オプションで適切なバージョンを指定してマウントしましょう。

HAP-S1のUSBデジタル出力でTopping D90に出力したかった話

現在、自宅のメインのオーディオシステムはraspberry pi(Volumio) -> Topping D90 -> アンプという流れなのだが、Volumioがどうにも繋がりにくい。
VolumioはIPを固定して使用時に電源を入れ使用後は電源を毎回落としている。
起動して少ししてもブラウザからなかなかVolumioに繋がらなくて地味にイライラする。

今回機会がありSony HAP-S1というHDDプレイヤーを手に入れた。

これは500GBのHDDが搭載されたHDDオーディオプレイヤーで、NASのような働きもできるし、スピーカー出力もあるしと結構1台で手軽に色々楽しめるオーディオ機器だ。以前に使用していたこともあり結構お気に入り。上位機種にHAP-Z1ESというのもあるけど、当時はスピーカー出力がほしかったのであえてS1の方を購入した。

このHAP-S1、中ではLinux OSで動いていて利用しているライブラリを公開している。
oss.sony.net
今度色々試してみたいところ。
実際LinuxならなにかいじれないかとSSHとか色々試したけどだめだった。
nmapでポートを調べたら、
139/tcp open netbios-ssn
445/tcp open microsoft-ds
60100/tcp open unknown
60200/tcp open unknown
60300/tcp open unknown
60400/tcp open unknown
137/udp open netbios-ns
1900/udp open upnp
が開放されていた。139、445、137はsamba関係。1900はSSDP用。60000番台はプライベートで、60100~60400を使って専用アプリと通信している様子。
ssdpでの応答を調べる。wiresharkでパケットを調べるとhttp://{IPアドレス}/hap.xmlに通信の仕様が書かれたxmlがあるらしく確認するとリソース等が見えた。
http://{IPアドレス}:60100/HAP.htmlに一応ブラウザからの操作用htmlファイルがあるのがわかる。
バージョンが3つあり最新は2.0の用でHAP-S1をブラウザからコントロールできる。
60200ポートでコントロール用のリクエストを受け取る感じ?基本POSTだけで、一部GETもあった。


関係ない話が長くなったが、今回VolumioをやめてHAP-S1に移行を考えた。
HAP-S1はソフトウェアアップデートでUSBデジタル出力に対応したのでこれをTopping D90に入力すれば特に問題ないかなと思っていたがそんなことはなかった。出力されるのはノイズだけで、かすかに音楽が聞こえるぐらい。明らかにおかしい。
まあ、HAP-S1のデジタル出力はSony製の一部に対応としていたのでこれは仕方のないこと。
調べてみると同じ症状の人が少し見つかる。
どうやらDDコンバーターを噛ませるとよいとのこと。
そこで同じくToppingの安価で評判の良いD10sを購入した。

構成は HAP-S1 -> D10s -> D90 -> アンプ という感じ。半信半疑だったが無事に音楽が再生された。音質に関してはVolumioのときとは雰囲気が違うが劣化している感じはない。できればDDコンバーターを挟まずに構成したかったがそれは難しそうだ。

HAP-S1とTopping D90を使った構成を考えている人の役に立てば幸いである。

めでたしめでたし


それにしてもなぜだめなのか。HAP-S1のUSBデジタル出力をTopping D90に入力するとUSB入力というのは検出できるがサンプリングレートが明らかにおかしくなっている。送信するデータの形式が違ってDSDやPCMのフォーマットを誤認識している?それでもかすかに音楽が聞こえたのでそれは違う?
このあたりに詳しい人に是非お聞きしたいところである。