SiamRPNコード分析:テスト

記事のディレクトリ


序文

  この記事は、SiamRPNコード分析の最後のテストです。コードはinitとunpate(追跡)から分析されます。


1、init

  initの主なタスクは、上部ブランチの特徴マップと後続のフレームの特徴マップの間の相互相関を取得することです。127x127x3サイズのターゲットテンプレート画像を取得した後、それにディメンションを追加して、ネットワークに入ります。返される分類畳み込みカーネルと回帰畳み込みコアの形状は[10,256,4,4]と[20,256,4,4]です。ここでの名前は、2つのコアを直接返すのではなく、それらを自己に格納します(SiamRPNTrackerクラス)。 、最初にアーキテクチャの分析を見ることができます。次に、initは現在のターゲット位置、高さと幅なども取得する必要があり、その後の更新ではそれを更新する必要があります。これは、新しいターゲット位置とターゲットを予測することです。サイズ。

#初始帧
    def init(self, frame, bbox):
        #[l,t,w,h]->[center_x,center_y,w,h]
        self.bbox = np.array([bbox[0]-1 + (bbox[2]-1) / 2 , bbox[1]-1 + (bbox[3]-1) / 2 , bbox[2], bbox[3]])
        #获取目标中心点[c_x,c_y]以便后续使用
        self.pos = np.array([bbox[0]-1 + (bbox[2]-1) / 2 , bbox[1]-1 + (bbox[3]-1) / 2])
        #获取目标宽高[w,h]以便后续使用
        self.target_sz = np.array([bbox[2], bbox[3]])
        #获取目标宽高[w,h]以便后续使用
        self.origin_target_sz = np.array([bbox[2], bbox[3]])
        #获取需要图像R/G/B均值   img_mean.shape=(1,1,3)
        self.img_mean = np.mean(frame, axis=(0, 1))
        #获取模板图像
        #返回127x127x3大小的图像
        exemplar_img = get_exemplar_image(frame, self.bbox,config.exemplar_size, config.context_amount, self.img_mean)
        #增加一个batch维度再输入网络
        exemplar_img = self.transforms(exemplar_img)[None, :, :, :]
        self.model.track_init(exemplar_img.cuda())

2、更新(追跡)

  更新プロセスまたはコードプロセスに従って分析します

    def update(self, frame):
        #传入上一帧的bbox,以及保持初始帧的img_mean不变来填充后续所有帧
        #返回271x271x3大小的图片、缩放因子是271/(上下文信息x271/127)
        instance_img_np, _, _, scale_x = get_instance_image(frame, self.bbox, config.exemplar_size,config.instance_size, config.context_amount, self.img_mean)
        """————————————————得到分类分数和回归参数————————————"""
        #增加一个batch维度再送入网络
        instance_img = self.transforms(instance_img_np)[None, :, :, :]
        #返回score.shape=[1,10,19,19],regression.shape=[1,20,19,19]
        pred_score, pred_regression = self.model.track_update(instance_img.cuda())
        #[1,10,19,19]->[1,2,5*19*19]->[1,1805,2] conf即置信度
        pred_conf = pred_score.reshape(-1, 2, config.anchor_num * config.score_size * config.score_size).permute(0,2,1)
        #[1,20,19,19]->[1,4,5*19*19]->[1,1805,4] offset即位移,对anchor微调
        pred_offset = pred_regression.reshape(-1, 4,config.anchor_num * config.score_size * config.score_size).permute(0,2,1)

最初に271x271x3サイズの検出画像を取得し、次元を拡張してネットワークに入力し、相互相関入力を取得します。次に、track_updateメソッドを呼び出して分類スコアと回帰パラメーターを取得し、次に2つの形状変換を行って後で使用します。

	    #传入的anchor(1805,4) delta(1805,4),delta是回归参数,对anchor进行调整,返回调整后的anchor,即pre_box(1805,4)
        box_pred = box_transform_inv(self.anchors, delta)
        #pred_conf=[1,1805,2]
        #score_pred.shape=torch.Size([1805]) 取1,表示取正样本
        score_pred = F.softmax(pred_conf, dim=2)[0, :, 1].cpu().detach().numpy()#计算预测分类得分

1805回帰パラメーターを1805アンカーに適用して位置情報をより正確にし、分類スコアの前景値に対してソフトマックス処理を実行して、合計が1の1805番号を取得し、に対応する最大番号を見つけます。アンカー予測ボックスです。

		#尺度惩罚 一个>1的数
        s_c = change(sz(box_pred[:, 2], box_pred[:, 3]) / (sz_wh(self.target_sz * scale_x)))
        #比例惩罚 一个>1的数
        r_c = change((self.target_sz[0] / self.target_sz[1]) / (box_pred[:, 2] / box_pred[:, 3]))
        # 尺度惩罚和比例惩罚 penalty_k=0.22,penalty最大为1,即不惩罚
        penalty = np.exp(-(r_c * s_c - 1.) * config.penalty_k)
        pscore = penalty * score_pred#对每一个anchors的正样本分类预测分数×惩罚因子
        pscore = pscore * (1 - config.window_influence) + self.window * config.window_influence #再乘以余弦窗
        max_pscore_id= np.argmax(pscore) #返回最大得分的索引id

ペナルティの前提は、隣接するフレームでターゲットのサイズ(スケールと高さ対幅の比率)が変化することを前提としているため、スケールと比率のペナルティ項目が2つ追加され、ターゲットの位置が想定されます。隣接するフレームではあまり変化しないので、コサインウィンドウを使用して大きな変位を抑制します。論文にあるように、ペナルティペナルティを使用します。P E N L個のTのY抑制大規模スケールの変化、および抑制大きな変位に余弦ウィンドウに。コードのペナルティペナルティp e n a l t y式で、アンカーのサイズと比率が前のフレームに近い場合、s_cとr_cの2つの値は両方とも1であり、ペナルティペナルティp e n a l t y = e ^ 0 = 1、つまりペナルティなし。パスペナルティペナルティp e n a l t yとコサインウィンドウの後、最大の前景スコアインデックスが取得され、max_pscore_idとして記録されます。
ここに画像の説明を挿入
  max_pscore_idが取得された後、前景スコアが最大のアンカーが予測フレームとして検出されることを意味します。上記では微調整されているため、取得されたアンカーが最終予測フレームになります。次のステップは、新しい予測ボックスの中心位置とサイズを取得して、ターゲットの状態を分析せずに更新することです。
  もう1つ忘れてしまったのは、テストプロセスではnms操作が使用されておらず、最終的な境界ボックスを取得するにはnmsを使用する必要があるとのことですが、私の個人的な理解はあまり意味がないようです。追跡プロセスのみ最大の見込みスコアを見つける必要があります。値は十分であり、nmsは必要ありません。nmsは重複するアンカーを排除するために使用され、最大の前景スコアを取得することはアンカーの重複する関係を含みません。nmsはの非常に重要なステップです。検出タスク。
ここに画像の説明を挿入
見てくれてありがとう!

おすすめ

転載: blog.csdn.net/qq_41831753/article/details/113930169