두 가지 방법으로 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가 생성한 절차를 한 번 걷는다.
defgenerate_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 inxrange(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)
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
에서 얻은 것은 면적이 모두 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]를 예로 들면
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)를 중심 좌표로 한다.
defgenerate_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)
본문은 작가가 창작한 것이므로 전재는 출처를 밝혀야 한다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: