Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【第二章】p.89 Dbox 出力部分の実装に関しての質問 #42

Closed
tabasoon opened this issue Oct 23, 2019 · 7 comments
Closed

Comments

@tabasoon
Copy link

初めまして。表題の件に関しまして、二点ほど質問がございます。

  1. default box のサイズ S_k に関してですが、原著論文の方をあたってみますと、

S_k = S_min + (S_max - S_min)*(k-1) / (m-1)
(m; 特徴マップの数、k は1~mの整数、S_min = 0.2, S_max = 0.9)

と書かれていて、画像サイズ (300*300) に対する相対座標系で全て記述できるように思います。
一方、本書の実装では、予め min_size と max_size を規定した上で画像サイズ 300 で割るという実装になっていますが、これには何か意図がございますか?
また、DBox の中心座標に関しても、f_k として feature_size の値をそのまま採用すれば特徴量マップの各pixelの中心座標がとれ、原著論文もそのような記述であるように思うのですが、同様の実装になっている点も併せてご回答いただけると幸いです。

  1. 本書自体の内容とは直接関係がないかもしれませんが、アスペクト比 1 の DBox のサイズに関して、k = 6 の時、

S'k = sqrt(S_k*S(k+1))

これが定義できないように思うのですが、これに関してご教授いただけると幸いです。原著論文にも何も書かれておりませんので。。。

以上、よろしくお願いいたします。

@YutaroOgawa
Copy link
Owner

@tabasoon さま

ご質問ありがとうございます。

  1. 実装時に画像サイズで割って規格化している点について
    ディープラーニングなどにおいて、論文と実際の実装が異なるケースは多々あります。
    このような規格化はDeepLearningにおいてはSSDのこの部分だけでなく多くのケースで出現します。

理由は、画像サイズをそのまま使用していると、ネットワークの重みで画像サイズや画像サイズの変化に対応・吸収する必要があるからです。

例えば、画像サイズ300の場合は、画像サイズ1のときと比べ、同じ出力を出すには重みは1/300である必要があります。
また画像サイズが600で新たに学習からやってみようと思った場合には、ネットワークの重みは1/600になる必要があります。

基本的にPyTorchの場合は入力は平均0、標準偏差1の分布に近いものを想定し、それに対応して重みパラメータの初期値を自動的に初期化しています。

そのため、例えばネットワークの途中でもバッチノーマライゼーションを実施して層への入力を規格化します。バッチノーマライゼーションはネットワークの伝搬の途中の話ですが、今回の規格化はネットワークの最初で同じ規格化をしている、そういうイメージになります。

ディープラーニングの回帰ではどうように、入出力は0~1になるように規格化し、それになんらかの値をかけ算して、本来求めたい物理量を計算する、という手順をとることが一般的です(と私は認識しております)。

  1. 原著の
    S_k = S_min + (S_max - S_min)*(k-1) / (m-1)
    (m; 特徴マップの数、k は1~mの整数、S_min = 0.2, S_max = 0.9) 

S'k = sqrt(S_k*S(k+1))
において、アスペクト比 1 の DBox のサイズに関して、k = 6 の時、定義できないように思うのですが、ですが、
私が質問の意図をきちんと理解できておりません。

申し訳ございませんが、「このような計算式になったときに、ここで計算が破綻する(0除算?)などになるのでは?」の具体的な例をいただけますでしょうか?

お時間のある時に、ご返信いただければ幸いです。

ご質問いただき、誠にありがとうございます。
どうぞよろしくお願いいたします。

@tabasoon
Copy link
Author

ご回答ありがとうございました

  1. 「規格化していること」自体が疑問なのではなくて、「その規格化をわざわざ画像サイズ依存のパラメータを外から代入することで行っているのはなぜか」というのが質問の意図でした。
    Dbox を求める部分は、例えば

for k, f in enumerate(self.feature_maps): # [38, 19, 10, 5, 3, 1]
for i, j in itertools.prduct(range(f), repeat = 2):
cx = (i+0.5) / f
cy = (j+0.5) / f
s_k = 0.2 + 0.7k/(len(self.feature_maps)-1)
s_k1 = 0.2 + 0.7
(k+1)/(len(self.feature_maps)-1)
s_k_prime = np.sqrt(s_k*s_k1)
...
と、このように原著論文そのままの実装でsteps, min_sizes と max_sizes を画像サイズに合わせて config で明記せずとも全て算出することができます。
仰っている例のように、仮に画像の input size を変えるときには、本書の実装ですとこの config を自分で計算しなおして設定する必要があり、個人的に煩わしさを感じました。本文中でもsteps, min_size と max_size は唐突に出てきた数値、という印象を与えかねないとも思いました。
ですので、steps, min_size と max_size の設定を与えてから規格化・clamp する、という実装に至った理由がもしございましたらご教授ください。

  1. 分かりやすく質問できず申し訳ございません。単純に、S'_6 の定義は

S'_6 = sqrt(S_6 * S_7)

となりますが、S_7 は原著論文では議論されておらず (∵ k is in [1, m (=6)] )、勝手に S_k の式に k=7 を代入してS'_6を算出していいのか判断がつかなかった、という内容になります。

以上、ご確認をよろしくお願いいたします。

@YutaroOgawa
Copy link
Owner

YutaroOgawa commented Oct 27, 2019

@tabasoon さん

ありがとうございます。
質問の意図を取り違えており、申し訳ございません。

今回本書の物体検出の章を書くにあたり、学習済みモデルを
amdegrootさんの

https://github.com/amdegroot/ssd.pytorch
を参考に使用しています。

その関係上、参考先から実装方法を大きくは変更しないようにしています。

参考先ではdefault boxesを、PriorBoxとして以下のように実装しております。
https://github.com/amdegroot/ssd.pytorch/blob/8dd38657a3b1df98df26cf18be9671647905c2a0/layers/functions/prior_box.py

それをある程度流用し、分かりやすいように書き換えたため、というのが回答になります。

ですが、いちいち与えなくても・・・、もどかしい。。。
という気持ちはとても分かります。

また、

S_7 は原著論文では議論されておらず

については、そうですね。
論文側の記述不足だと思います。

私の実装上(というか、amdegrootさん)では、

S'6 = root(264/300 * 315/300)

と実装しており、論文の

S_k = S_min + (S_max - S_min)*(k-1) / (m-1)

で(S_min=0.2、S_max=0.9は論文の指定通りだとすると)

S_6 = 270と計算されます。さらにここで、kに無理やり7を代入すると
S_7 = 312

になります。

現在の実装のconfigureでは、264と315になっており、微妙にずれているのは、
のちのちのconvなどの計算がしやすいように、論文の通りの値に近い値で、
実装上便利なものをamdegrootさんが設定したのだと、私は解釈しています。
(それもあって、直接計算せず、configで与えているのだと思います)

なんだかもどかしい回答しか返せず大変申し訳ございませんが、
どうぞよろしくお願いいたします。

@tabasoon
Copy link
Author

なるほど、了解いたしました。
論文でもデフォルトボックスの定義は open question だと述べられていますし、もしかすると amdegroot さんの実装の方が収束が早い等、なんらかの利点があるのでしょうね…

ご丁寧に回答して頂き、ありがとうございました。

@YutaroOgawa
Copy link
Owner

@tabasoon さん

とても重要な質問とディスカッションをありがとうございます。
論文と照らしながら、本書をご活用いただけ、非常に嬉しいです。
今後ともどうぞ宜しくお願い致します。

小川雄太郎

@tabasoon
Copy link
Author

改めて Dbox 定義の箇所を読んでいて気づいたのですが、本書 p.90 5行目 sample code 中の max_sizes の config 設定の記述に誤植があります。

(p.90 5行目、./utils/ssd_model.py, 465 line) # 'max_sizes': [45, 99, 153, 207, 261, 315]
(p.90 動作確認中で与えている設定) 'max_sizes': [60, 111, 162, 213, 264, 315]

コメントアウトされている箇所なので動作には影響のない箇所ですが、一応指摘させていただきます。

以上、ご確認をよろしくお願いいたします。

@YutaroOgawa
Copy link
Owner

@tabasoon さん

ありがとうございます。
本当に丁寧に読んでいただけていて、とても嬉しいです。

誤植としてissueで他の読者の皆様にお知らせする共に、コードを修正いたします。
ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants