Giter VIP home page Giter VIP logo

Comments (7)

tabasoon avatar tabasoon commented on June 24, 2024 1

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

  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を算出していいのか判断がつかなかった、という内容になります。

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

from pytorch_advanced.

tabasoon avatar tabasoon commented on June 24, 2024 1

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

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

from pytorch_advanced.

tabasoon avatar tabasoon commented on June 24, 2024 1

改めて 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]

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

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

from pytorch_advanced.

YutaroOgawa avatar YutaroOgawa commented on June 24, 2024

@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除算?)などになるのでは?」の具体的な例をいただけますでしょうか?

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

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

from pytorch_advanced.

YutaroOgawa avatar YutaroOgawa commented on June 24, 2024

@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で与えているのだと思います)

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

from pytorch_advanced.

YutaroOgawa avatar YutaroOgawa commented on June 24, 2024

@tabasoon さん

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

小川雄太郎

from pytorch_advanced.

YutaroOgawa avatar YutaroOgawa commented on June 24, 2024

@tabasoon さん

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

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

from pytorch_advanced.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.