Centernet の個人的な理解メモ

1.CenternetバックボーンネットワークのDLASeg
ここに画像の説明を挿入します

1. DLA34 ベースの構造
ここに画像の説明を挿入します
コード ブロック:

self.level0 = self._make_conv_level(
            channels[0], channels[0], levels[0])
self.level1 = self._make_conv_level(
            channels[0], channels[1], levels[1], stride=2)
self.level2 = Tree(levels[2], block, channels[1], channels[2], 2,
                           level_root=False,
                           root_residual=residual_root)
self.level3 = Tree(levels[3], block, channels[2], channels[3], 2,
                           level_root=True, root_residual=residual_root)
self.level4 = Tree(levels[4], block, channels[3], channels[4], 2,
                           level_root=True, root_residual=residual_root)
self.level5 = Tree(levels[5], block, channels[4], channels[5], 2,
                           level_root=True, root_residual=residual_root)

このうち、level0 は上図の最初のブラック ボックス、level1 は上図の 2 番目のブラック ボックス、level2 から level5 は上図の左から右への 4 つの赤いボックスで、level=[1,2, 4 つの木の 2,1 ]。
1) ブラック ボックス (conv ブロック)
コード ブロック:

def _make_conv_level(self, inplanes, planes, convs, stride=1, dilation=1):
        modules = []
        for i in range(convs):
            modules.extend([
                nn.Conv2d(inplanes, planes, kernel_size=3,
                          stride=stride if i == 0 else 1,
                          padding=dilation, bias=False, dilation=dilation),
                BatchNorm(planes),
                nn.ReLU(inplace=True)])
            inplanes = planes
        return nn.Sequential(*modules)

構造:
ここに画像の説明を挿入します
2) 緑色のボックス (集約ノード)
緑色のボックスは 2 つのツリーを接続するルート ノードです. forward 関数は複数のオブジェクトを受け入れ、複数のレイヤーからの情報を集約して
実装するために使用されます。

class Root(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, residual):
        super(Root, self).__init__()
        self.conv = nn.Conv2d(
            in_channels, out_channels, 1,
            stride=1, bias=False, padding=(kernel_size - 1) // 2)
        self.bn = BatchNorm(out_channels)
        self.relu = nn.ReLU(inplace=True)
        self.residual = residual

    def forward(self, *x):
        children = x
        x = self.conv(torch.cat(x, 1))
        x = self.bn(x)
        if self.residual:
            x += children[0]
        x = self.relu(x)

        return x

2. DLAup の構造
DLAup 自体は、複数の IDAup を組み合わせたものです。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
次に、センターネット損失
ここに画像の説明を挿入します
センターネット モデルの出力は、hm_head、wh_head、reg_head の 3 つの部分で構成されます。したがって、センターネット損失も、予測カテゴリのヒート マップ損失、予測の長さと幅の損失、および予測オフセット損失の 3 つの部分で構成されます。
そして、3種類の損失の重みは異なります。

① hm_loss:
1) 計算式とその原理:

経験値: α = 2 および β = 4
Yxyc はグラウンド True のヒート マップ、つまり heatmap_gt を表します。Yxyc=1 は、ラベリング ボックスの中心点の位置を表します。

ここに画像の説明を挿入します
ここに画像の説明を挿入します
成し遂げる:

def _neg_loss(pred, gt):
    ''' Modified focal loss. Exactly the same as CornerNet.
        Runs faster and costs a little bit more memory
      Arguments:
        pred (batch x c x h x w)
        gt_regr (batch x c x h x w)
    '''
    pos_inds = gt.eq(1).float()    #gt等于1的像素索引,前景
    neg_inds = gt.lt(1).float()    #gt小于1的像素索引,背景

    neg_weights = torch.pow(1 - gt, 4)   #背景loss惩罚式

    loss = 0

    pos_loss = torch.log(pred) * torch.pow(1 - pred, 2) * pos_inds     #前景loss计算
    neg_loss = torch.log(1 - pred) * torch.pow(pred, 2) * neg_weights * neg_inds   #背景loss计算

    num_pos = pos_inds.float().sum()
    pos_loss = pos_loss.sum()
    neg_loss = neg_loss.sum()

    if num_pos == 0:
        loss = loss - neg_loss
    else:
        loss = loss - (pos_loss + neg_loss) / num_pos
    return loss

② reg_loss:
計算式と原理:
ここに画像の説明を挿入します
ここに画像の説明を挿入します
モデルが出力する featmap_pre は、元の画像のサイズの 1/R 倍です。一般に、R は 4 です。そのため、元の画像のアノテーション情報を正規化すると、小規模なオフセットが発生します。サイズを featmap_pre にします。
例: 元の画像のピクセル (10,10) は、4 回ダウンサンプリングした後、2.5 になり、切り捨てられると、featmap_pre の左側は (2,2) になります。これを元の画像に復元すると、は (8,8) に復元されるため、x 方向と y 方向に 2 ピクセルずつオフセットされます。したがって、修正する必要があります。
③wh_loss:
式と原理:
ここに画像の説明を挿入します
クラス k のラベル ボックスが (x1, y1, x2, y2) の場合、Sk = (abs (x2-x1), abs (y2-y1)) となり、ネットワーク出力に対して L1Loss を実行します。

3 番目、ヒートマップ作成
1、ガウス半径の決定:
トレーニング ポイント、ライン、つまりタイプがポイントの場合、デフォルトのガウス半径は 3 です。
トレーニング フレーム、つまりタイプが立方体の場合、ガウス半径は、ターゲット ガウス カーネルの高さと幅によって決定されます
ここに画像の説明を挿入します
。 半径決定の問題の原因:
ここに画像の説明を挿入します
上の図の赤いラベル ボックスと緑の予測ボックスを最大限にオーバーラップさせて、IOU が2 は 0.7 より大きいです。
このとき、2 つのボックスの位置は最大で次の 3 つの状況になります。
ここに画像の説明を挿入します
2. ガウス半径を通じて 2 次元ガウス カーネルを生成する、
3. 現在のボックスに対応するカテゴリに従って、ガウス カーネルをカバーするを対応するボックスの中心に配置し、ヒートマップの位置に対応させます。

おすすめ

転載: blog.csdn.net/jiafeier_555/article/details/111477155