これら 2 つの損失関数は、記事「F³Net: 顕著なオブジェクト検出のための融合、フィードバック、およびフォーカス」からのもので、顕著性検出 (2 つのセグメンテーション) における小さな。従来の BCE Loss には、次の 3 つの問題があります。
- ターゲット オブジェクトの構造を無視して、各ピクセルの BCE を単純に平均します。
- 小さなターゲットの場合、画像全体の損失は背景クラスによって支配され、前景を学習することが困難になります。
- オブジェクトのエッジ ロクセルは誤分類されやすいため、他のロクセルと同様の重みを与えるべきではありません。
もちろん、解決策は、さまざまな位置のピクセルに重みを付けることです。具体的には、重みが最も高い場所がその場所の端の位置となり、端から離れるほど重みが低くなります。では、この重み付けプロセスを「単純ではなく失礼な」方法で実装するにはどうすればよいでしょうか? 論文加重 BCE 損失の式は次のとおりです。L wbces = − ∑ i = 1 H ∑ j = 1 W ( 1 + γ α ij ) ∑ l = 0 1 1 ( gijs = l ) log P r ( pijs = l ∣ Ψ ) ∑ i = 1 H ∑ j = 1 W γ α ij L_{wbce}^s=-\frac{\sum_{i=1}^H \sum_{j=1}^W\left(1+ \gamma \alpha_{ij}\right) \sum_{l=0}^1 \mathbf{1}\left(g_{ij}^s=l\right) \log \mathbf{P r}\left(p_ {ij }^s=l \mid \Psi\right)}{\sum_{i=1}^H \sum_{j=1}^W \gamma \alpha_{ij}}L西暦_ _s=−∑i = 1H∑j = 1Wc aイジ∑i = 1H∑j = 1W( 1+c aイジ)∑l = 011( gijs=l )ログ_広報( pijs=私∣追伸)。ここでα ij \alpha_{ij}あるイジ(i, j) 位置のピクセルの重みを指します。重み付けされていない場合は、 α ij \alpha_{ij}と同等です。あるイジ常に1。
式の他の部分に関係なく、α ij \alpha_{ij}に注目してください。あるイジ計算方法:α ijs = ∣ ∑ m , n ∈ A ijgmns ∑ m , n ∈ A ij 1 − gijs ∣ \alpha_{ij}^s=\left|\frac{\sum_{m, n \in A_ {ij}} g_{mn}^s}{\sum_{m, n \in A_{ij}} 1}-g_{ij}^s\right|あるijs= ∑m , n ∈ Aイジ1∑m , n ∈ Aイジgんs−gijs 其中 g i j s g_{i j}^s gijs(i, j) 位置の真の値を表します (1 または 0、前景または背景に対応)、A ij A_{ij}あイジ(i, j) の周囲のピクセルを示します。
いくつかの特別な値を取り上げて説明します。gmns g_{mn}^sと仮定します。gんsどちらも 0、gijs g_{ij}^sgijsこれは 1 で、現在のピクセルが前景であり、周囲のピクセルが背景であることを意味します。これはターゲットが小さいため、高い重みを与える必要があります。同様に、gmns g_{mn}^sの場合gんsどちらも 0、gijs g_{ij}^sgijsまた、0 は現在位置と周囲の位置が両方とも背景であることを示し、これは低い重みに対応します。ウェイトは次のように視覚化されます。
ご覧のとおり、エッジに近いウェイトはオーバーウェイト (赤) ですが、エッジから遠いピクセルはゼロになっています。これはエッジ情報の明示的な入力を必要としない境界を意識した手法であることがある程度理解できます。
次に加重 IoU 損失を見てみましょう。IoU の概念は当然ながら小さなターゲットを扱うのに適しているため、IoU Loss の重み付けは単に概念を統一するためであり、その式は次のとおりであることに注意してください。 L wiou s = 1 − ∑ i = 1 H ∑ j = 1 W ( gtijs ∗ pijs ) ∗ ( 1 + γ α ijs ) ∑ i = 1 H ∑ j = 1 W ( gtijs + pijs − gtijs ∗ pijs ) ∗ ( 1 + γ α ijs ) L_{\text {wiou }}^s=1- \frac{\sum_{i=1}^H \sum_{j=1}^W\left(g t_{ij}^s * p_{ij}^s\right) *\ left(1+\gamma \ alpha_{ij}^s\right)}{\sum_{i=1}^H \sum_{j=1}^W\left(g t_{ij}^s+p_{ij }^sg t_{ij} ^s * p_{ij}^s\right) *\left(1+\gamma \alpha_{ij}^s\right)}Lウィオウ s=1−∑i = 1H∑j = 1W( gt _ijs+pijs−gt _ijs∗pijs)∗( 1+c aijs)∑i = 1H∑j = 1W( gt _ijs∗pijs)∗( 1+c aijs)ここで特に注意が必要なのは、分子と分母に( 1 + γ α ijs ) \left(1+\gamma \alpha_{ij}^s\right) があることです。( 1+c aijs) は定数ではなく、(i, j) の変化に応じて変化する値であるため、直接減らすことはできません。上記の式の考え方は、やはりエッジに近いピクセルほど IOU の計算に寄与するということです。
コードは次のように実装されます。
def structure_loss(pred, mask):
weit = 1 + 5*torch.abs(F.avg_pool2d(mask, kernel_size=31, stride=1, padding=15) - mask)
wbce = F.binary_cross_entropy_with_logits(pred, mask, reduce='none')
wbce = (weit*wbce).sum(dim=(2, 3)) / weit.sum(dim=(2, 3))
pred = torch.sigmoid(pred)
inter = ((pred * mask)*weit).sum(dim=(2, 3))
union = ((pred + mask)*weit).sum(dim=(2, 3))
wiou = 1 - (inter + 1)/(union - inter+1)
return (wbce + wiou).mean()
ここでの pred 入力 (つまりネットワークの出力) は、関数内で既にシグモイドが実行されているため、事前にシグモイドで処理する必要はないことに注意してください。これを使用すると、シグモイドが 2 回繰り返される状況を防ぐことができます。
損失関数には 2 つのハイパーパラメータが含まれ、1 つはα ij \alpha_{ij}です。あるイジγ \gammaの重み付けされた値c .c \ガンマγは 0、つまり重み付けがないことを意味します;γ \gammaγが大きいほど、ネットワークはα ij \alpha_{ij}あるイジ異なる位置に重みを付けるには、異なるピクセル位置の重みの差が大きくなります。コードではγ = 5 \gamma=5c=5。
もう 1 つはA ij A_{ij}ですあイジコード内の「周囲のピクセル」の特定の定義では、平均プーリングに F.avg_pool2d が使用されます。