강력한 소스 이해 RPN 영역 권장 네트워크

22689 단어 심도 있는 학습

1. Anchor Generation Layer


anchors 생성에 대한 원본 이해는 주로 두 코드에서 나온다
  • RBG 대신의 카페 소스:https://github.com/rbgirshick/py-faster-rcnn
  • Github에서 복원된 pytorch 소스:https://github.com/chenyuntc/simple-faster-rcnn-pytorch

  • 두 가지 방법으로 anchors를 생성하는 기교가 다르기 때문에 따로 토론하고 주로 RBG 대신의 코드를 위주로 anchors의 생성 원리와 생성 기교를 설명한다.

    1.1 Caffe 소스

  • 우선, 중요한 매개 변수 설명
  • base_ize=16, 원도가 권적지화를 거친 후 얻은 특징도는 원도의 16\rac{1}{16}161이므로 샘플링 anchor의 특징도에 사용된cell은 원도의 16에 해당한다× 16 16\times 16 16×16구역.
  • ratios=[0.5,1,2], 고정anchor면적하의 길이비, 즉 [1:2 1:1 2:1] [1:2\quad1:1\quad2:1] [1:21:12:1]
  • scales=[8,16,32], anchors가 확대될 배수, 구체적으로 어디에 쓰일지 뒤에서 상세하게 설명
  • 그 다음에 우리는 RBG 대신의 원본 코드에 따라 anchors가 생성한 절차를 한 번 걷는다.
  • def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
                         scales=2**np.arange(3, 6)):
        """
        Generate anchor (reference) windows by enumerating aspect ratios X
        scales wrt a reference (0, 0, 15, 15) window.
        """
    
        base_anchor = np.array([1, 1, base_size, base_size]) - 1
        ratio_anchors = _ratio_enum(base_anchor, ratios)
        anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
                             for i in xrange(ratio_anchors.shape[0])])
        return anchors
    
  • generate_anchors () 함수는 모든 것의 시작입니다.base를 먼저 정의했습니다anchor, 그림의 좌표가 왼쪽 상단을 원점으로 하고 값(0,0)이 있기 때문에baseanchor의 좌표(xmin,ymin,xmax,ymax)는 (0,0,15,15)이다.
  • 다음, 호출ratio_enum() 함수는 다음과 같다
  • def _ratio_enum(anchor, ratios):
        """
        Enumerate a set of anchors for each aspect ratio wrt an anchor.
        """
    
        w, h, x_ctr, y_ctr = _whctrs(anchor)
        size = w * h
        size_ratios = size / ratios
        ws = np.round(np.sqrt(size_ratios))
        hs = np.round(ws * ratios)
        anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
        return anchors
    
  • w,h,x 를 계산하기 위해ctr, y_ctr, 또 호출whctrs() 함수, 아래와 같다
  • def _whctrs(anchor):
        """
        Return width, height, x center, and y center for an anchor (window).
        """
    
        w = anchor[2] - anchor[0] + 1
        h = anchor[3] - anchor[1] + 1
        x_ctr = anchor[0] + 0.5 * (w - 1)
        y_ctr = anchor[1] + 0.5 * (h - 1)
        return w, h, x_ctr, y_ctr
    
  • _whctrs() 함수의 기능은 전입 매개 변수(왼쪽 상단 x, 왼쪽 상단 y, 오른쪽 상단 x, 오른쪽 상단 y)를 (넓이, 높이, 중심 좌표 x, 중심 좌표 y)
  • 로 변환하는 것이다.
  • 돌아갑시다ratio_enum() 함수
  • 베이스 획득anchor의 (넓이, 높이, 중심 좌표 x, 중심 좌표 y)는 계산값(16, 16, 7.5, 7.5)
  • 을 거쳤다.
  • size = w x h = 16 x 16 = 256
  • size_ratios = 256 [ 0.5 1 2 ]\frac{256}{[0.5\quad 1\quad 2]} [0.512]256​ = [ 512 , 256 , 128 ] [512, 256, 128] [512,256,128]
  • 대sizeratios 루트 번호를 반올림하여 ws=[23,16,11]
  • 획득
  • ws와ratios를 곱하면 hs=[12,16,22]
  • ws와 hs는 사실 같은 면적에서 anchor의 서로 다른 길이와 너비 조건에서 얻은 길이와 너비이다.그러나 반올림으로 인해 wsxhs의 면적치가 반드시 같지 않다
  • 위의 변수 값을 얻은 후 다시 호출하였습니다mkanchors () 함수는 계산된 anchors를 되돌려줍니다. 함수는 다음과 같습니다
  • def _mkanchors(ws, hs, x_ctr, y_ctr):
        """
        Given a vector of widths (ws) and heights (hs) around a center
        (x_ctr, y_ctr), output a set of anchors (windows).
        """
    
        ws = ws[:, np.newaxis]
        hs = hs[:, np.newaxis]
        anchors = np.hstack((x_ctr - 0.5 * (ws - 1),
                             y_ctr - 0.5 * (hs - 1),
                             x_ctr + 0.5 * (ws - 1),
                             y_ctr + 0.5 * (hs - 1)))
        return anchors
    
    
  • 위 코드에 따라다음과 같은 계산 공식 7.5인 1 2 [22 15 10] = [3.50 2.5] 7.5 - {2} {2}\left[\begin {matrix} 22\15 10\10\end {matrix}\right =\left[\begin {matrix} -3.5\2.5\end {matrix}\right] 7.5 {10\10\\10\left[\[\begin {begin {matrix} -3.5 {{\2.5\{matright] 7.5 {7.5 {21 21 21 21 21 21\2121212121212121212121212121 7.5 - 1 2 [12 16 22] = [1.5 0 - 3] 7.5 -\left [\begin {matrix} 12\16\\22\end {matrix}\right] =\left[\begin{matrix} 1.5\\0\\-3\end{matrix}\right] 7.5−21​⎣⎡​121622​⎦⎤​=⎣⎡​1.50−3​⎦⎤​ 7.5 + 1 2 [ 22 15 10 ] = [ 18.5 15 12.5 ] 7.5 +\frac{1}{2}\left[\begin{matrix} 22\\15\\10\end{matrix}\right] =\left[\begin{matrix} 18.5\\15\\12.5\end{matrix}\right] 7.5+21​⎣⎡​221510​⎦⎤​=⎣⎡​18.51512.5​⎦⎤​ 7.5 + 1 2 [ 12 16 22 ] = [ 13 15 18 ] 7.5 +\frac{1}{2}\left[\begin{matrix} 12\\16\\22\end{matrix}\right] =\left[\begin{matrix} 13\\15\\18\end{matrix}\right] 7.5+21​⎣⎡​121622​⎦⎤​=⎣⎡​131518​⎦⎤​
  • 마지막 anchors의 값은 [-3.5 1.5 18.5 13.5 0 15 2.5 - 3 12.5 18]\left[\begin {matrix} -3.5 & 1.5 & 18.5 & 18.5 & 0 & 15 & 15\2.5 & -3 & 12.5 & 18\end {matrix}\right]\\3.502.5 & 13.5 13.5
  • 에서 얻은 것은 면적이 모두 256하이고 (7.5,7.5)를 중심으로 하는 좌표의 길이와 너비의 비례에 따라 anchor 좌표이다.좌표의 계산 공식에 따르면 모두 7.5를 중심으로 좌표의 길이나 넓이를 절반으로 줄이면 새로운 (왼쪽 상단 x, 왼쪽 상단 y, 오른쪽 상단 x, 오른쪽 상단 y) 형식의 좌표값을 얻을 수 있다.왜 좌표가 음수인지, 왼쪽 상단의 좌표가 그림의 범위를 넘어서기 때문에 음수이다.

  • 이상anchors를 획득한 후 우리는generate 로 직접 돌아갑니다anchors () 함수
  • 일련의 함수 호출을 통해 우리는ratioanchors의 값, 즉 [-3.5 1.5 18.5 13.5 0 15 2.5 -3 12.5 18]
  • 마지막 단계, 바로 호출scale_enum () 함수, 서로 다른 scale 아래, 서로 다른 길이와 너비의 anchors를 얻습니다.현재의 scale는 [8, 16, 32]이며, 모든 scale에 대해 호출해야 한다scale_enum() 함수;서로 다른 길이와 너비(7.5,7.5)를 중심 좌표로 하는 anchors(즉ratio anchors의 줄마다)를 전달하고 매번 3조의 척도를 바꾼 anchors를 되돌려주기 때문에 마지막에 9조의 anchors가scale_enum() 함수는 다음과 같다
  • def _scale_enum(anchor, scales):
        """
        Enumerate a set of anchors for each scale wrt an anchor.
        """
    
        w, h, x_ctr, y_ctr = _whctrs(anchor)
        ws = w * scales
        hs = h * scales
        anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
        return anchors
    
  • [-3.5 1.5 18.5 13.5] [-3.5\quad 1.5\quad 18.5\quad 13.5] [-3.5 1.5 18.5 13.5]를 예로 들면
  • 호출whctrs() 함수, 중심 좌표 표시, w,h,xctr, y_ctr = [ 23 12 7.5 7.5 ] [23\quad 12\quad 7.5\quad 7.5] [23127.57.5]
  • w s = 23 × [ 8 16 32 ] = [ 184 368 736 ] ws = 23\times\left[\begin{matrix} 8\\16\\32\end{matrix}\right] =\left[\begin{matrix} 184\\368\\736\end{matrix}\right] ws=23×啊啊 = 啊啊, 사실 너비가 23인 상황에서 너비를 확대하는 값
  • h s = 12 × [ 8 16 32 ] = [ 96 192 384 ] hs = 12\times\left[\begin{matrix} 8\\16\\32\end{matrix}\right] =\left[\begin{matrix} 96\\192\\384\end{matrix}\right] hs=12×𖑠箐 = 啊啊, 사실 길이가 12인 경우 확대 길이의 값
  • 중심 좌표는 모두 (7.5,7.5) 변하지 않지만 넓이와 높은 값이 바뀌었기 때문에 새로 얻은 anchors 좌표는 다시 호출해야 한다mkanchors () 에서 좌표를 조정합니다.새로운 길이와 너비 아래에서도 (7.5, 7.5)를 중심 좌표로 한다.
  • 마지막으로 계산된 anchors 좌표는 [83-83, 39 100 56, 175, 87 104 359, 183 376 200]\left[\begin {matrix}-83 39 100 & 56\-175 & -87 & 192 & 104\-359 &-1859 & 183 & 183 & 183 & 183 & 183 & 376 & 200\end {matrix}\right]\right [begigin {matrightt]\83 83 83 83 - 8383 187 & 187 & 1927 1927 192 & 104\-359 -359 & 186 & 186 & 186 & 200200 {end {19266161616124

  • 이로써 RBG 대신이 Anchors를 생성하는 방법을 소개합니다
  • 1.2 Pytorch 소스

  • Pytorch 버전은 상세하게 설명하지 않고 코드에 직접 올리면 간단하고 알기 쉽다
    def generate_anchor_base(base_size=16, ratios=[0.5, 1, 2],
                             anchor_scales=[8, 16, 32]):
        """
        Returns:
            ~numpy.ndarray:
            An array of shape :math:`(R, 4)`.
            Each element is a set of coordinates of a bounding box.
            The second axis corresponds to
            :math:`(y_{min}, x_{min}, y_{max}, x_{max})` of a bounding box.
        """
        py = base_size / 2.
        px = base_size / 2.
    
        anchor_base = np.zeros((len(ratios) * len(anchor_scales), 4),
                               dtype=np.float32)
        for i in six.moves.range(len(ratios)):
            for j in six.moves.range(len(anchor_scales)):
                h = base_size * anchor_scales[j] * np.sqrt(ratios[i])
                w = base_size * anchor_scales[j] * np.sqrt(1. / ratios[i])
    
                index = i * len(anchor_scales) + j
                anchor_base[index, 0] = py - h / 2.
                anchor_base[index, 1] = px - w / 2.
                anchor_base[index, 2] = py + h / 2.
                anchor_base[index, 3] = px + w / 2.
        return anchor_base
    
  • 매개 변수와caffee가 일치하는데, 차이점은 anchor 를 계산하는 데 있다.base 방식
  • 여기 앙코르베이스 없음 - 1
  • 두 개의 순환을 호출했다. 즉, 9번을 반복해서 anchors의 좌표를 받을 때마다
  • 계산된 공식은 매우 이상하다. 왜ratios에 루트를 붙이는지 이상한 변환 공식이 있어야 한다
  • 마지막으로 anchor 를 직접 구합니다베이스의 모든 좌표, 중심 좌표를 기준으로 계산(ymin, xmin, ymax, xmax)

  • 본문은 작가가 창작한 것이므로 전재는 출처를 밝혀야 한다!

    좋은 웹페이지 즐겨찾기