YOLOv3の各層の出力について
YOLOv3について調べていたら気にならることがあったので質問させていただきます。
YOLOv3は三層で検出を行います。
初めに一番小さいサイズで検出を行い、特徴マップを2倍アップサンプリングして大きい層での検出に移ります。
どのサイトを見ても三層の検出に使うfeature mapのサイズはそれぞれ(1/8),(1/16),(1/32)となっています。
これ自体は合ってると思います。
YOLO9000の論文に
YOLO’s convolutional layers downsam- ple the image by a factor of 32 so by using an input image of 416 we get an output feature map of 13 × 13.
とかいてありYOLOv3もこれを引き継いでいると思う。
実際、Keras実装のコードにも
input_shape = (416,416) # multiple of 32, hw
って書いてあるので
YOLOv3の出力サイズ、計算合わなくない?
YOLOv3のネットワークは全てのconv層でpadding=1
とされています。
Daraknet53部分のResidual Block以外のconv層はstride=2
で他はstride=1
になっています。
CNNの出力は
Oh=output
P=padding
Fh=Filter height
S=stride
なので、
(3×3)フィルター、padding=1、stride=1のときサイズは変わらない
でも、
(1×1)フィルター、padding=1、stride=1のときサイズが+2されるはずです
(3×3)フィルター、padding=1、stride=2の層が5層ありこれで大体半分になり
416→208→104→52→26→13
になり、52、26、13がそれぞれ(1/8),(1/16),(1/32)になっています。
しかし、(1×1)フィルター、padding=1、stride=1のたびに+2されていたら52,26,13にならずにずれが生じると思います。
YOLOv3のフィルター
以下がYOLOv3の構造です。
ここで確認しましたがこの図のフィルターはだいたい合ってます。(検出の際の最後のチャネルが違う気がする)
ソースコード
試したこと
調べてみたらそれっぽいサイトを見つけた。
このサイトでは、stride=1
じゃないときに少し削れる場合があるという説明でした。
コード書いて計算してみた。
cpp
1#include<bits/stdc++.h> 2using namespace std; 3 4int culc(int shape,int size,int stride,int pad=1){ 5 6 int ans=(shape+2*pad-size)/stride; 7 ans++; 8 cout << "output:" << ans << endl; 9 return ans; 10} 11 12int main(){ 13 14 int shape=416; 15 int size,stride; 16 while(1){ 17 cout << "size,stride" << endl; 18 cin >> size >> stride; 19 shape=culc(shape,size,stride); 20 } 21 22} 23 24
size,stride 3 1 output:416 size,stride 3 2 output:208 size,stride 1 1 output:210 size,stride 3 1 output:210 size,stride 3 2 output:105 size,stride 1 1 output:107 size,stride 3 1 output:107 size,stride 1 1 output:109 size,stride 3 1 output:109 size,stride 3 2 output:55 size,stride 1 1 output:57 size,stride 3 1 output:57 size,stride 1 1 output:59 size,stride 3 1 output:59 size,stride 1 1 output:61 size,stride 3 1 output:61 size,stride 1 1 output:63 size,stride
(1/8)の層のサイズを計算してみたが63になりました。
52のはずが11もずれました。
なぜなのでしょう?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/12 09:25
2021/02/12 09:56 編集
2021/02/12 11:12
2021/02/12 11:37
2021/02/12 14:03