논문: 더 빠른 R-CNN: 지역 제안 네트워크를 통한 실시간 객체 감지를 향하여
1. 전체 네트워크 구조
fast rcnn은 RCNN과 fast RCNN 이후의 또 다른 새로운 연구입니다. 표적 탐지 알고리즘은 He Kaiming과 다른 전문가들이 2015년에 제안했습니다. 이 알고리즘은 2015년 ILSVRV 및 COCO 대회에서 많은 1위를 차지했습니다. 이 알고리즘은 이 분야의 고전입니다. 알고리즘은 반복 연구할 가치가 있음
Faster Rcnn 관련 링크:
표적 탐지를 위한 양성 및 음성 샘플에 대한 자세한 설명
어려운 샘플 마이닝
표적 탐지 - 앵커 생성
Faster_Rcnn 오탐지 솔루션 - 강제 음성 샘플 전략
2. 몇 가지 핵심 구성요소
Faster R-CNN의 구조는 크게 4가지 부분으로 나누어지며,
첫 번째 부분은 특징 추출 부분으로, Backbone과 Neck을 포함하여 특징 추출에 사용됩니다.
두 번째 부분은 후보 영역 생성 네트워크-RPN이고,
세 번째 부분은 RPN에서 선택한 후보 상자를 매핑하는 RoI Pooling이며,
네 번째 부분은 후보 영역에 대한 분류 및 회귀를 수행하는 네트워크 헤드입니다.
2.1 특징 추출
- 특징 추출은 기존 탐지 알고리즘과 유사합니다.BackBone은 VGG, Resnet 및 Mobilenet, ShulffeNet, Xception 등과 같은 일부 경량 네트워크를 선택할 수 있습니다. 특정 선택은 실제 배포의 컴퓨팅 성능 및 정확도 요구 사항을 나타냅니다. Neck 부분은 단일 레이어 출력을 선택하면 FPN 출력의 여러 레이어 도입을 고려할 수도 있습니다.
2.2 RPN(지역 제안 네트워크)
개요:
- RPN의 역할: 입력 이미지가 주어지면 물체가 존재할 수 있는 모든 위치를 찾습니다.
이 단계의 출력은 개체의 가능한 위치에 대한 일련의 경계 상자여야 합니다 . 이를 일반적으로 영역 제안 또는 관심 영역(ROI) 이라고 부르 므로 RPN
네트워크는 영역 제안 문제를 해결합니다. 입력은 이미지의 특징 맵이고 출력은 영역 제안입니다. - RPN은 Faster Rcnn의 주요 혁신으로 주로 후보 상자 생성 방법을 개선하는 데 사용되며 더 이상 외부 영역 제안 알고리즘에 의존하지 않습니다.
- RPN은 기능 맵 [슬라이딩 윈도우 영역]에 적용되는 왼쪽 및 오른쪽 컨벌루션 레이어**(3x3x256 차원) + relu + 2개의 1x1 컨볼루션 레이어(cls 레이어 및 reg 레이어)로 구성된 작은 네트워크임을 이해할 수 있습니다.
- 특징 맵의 각 위치[픽셀]에 서로 다른 길이 대 너비 비율과 서로 다른 면적을 갖는 k(9)개의 앵커[앵커 박스]를 설정하고, 이 앵커를 통해 원본 이미지에 해당하는 영역을 역으로 추론합니다. 이 지역의 크기와 좌표는 알려져 있으며, 이 지역이 우리가 원하는 제안입니다.
- 각 앵커에 대해 RPN은 두 가지를 예측합니다. 첫 번째는 출력 차원이 2k인 cls 레이어에 해당하는 앵커 상자가 특정 타겟 (타겟이 속한 카테고리에 관계없이 전경과 배경만)일 확률입니다. 두 번째 는 대상에 더 잘 맞도록 앵커 상자를 조정하는 데 사용되는 경계 상자 회귀자입니다 (앵커 상자의 위치를 수정하고 지상 실제와 최대한 겹치게 함). 이는 출력의 차원 4k에 해당합니다. reg 레이어. 는 각 앵커 박스에 해당하는 4개의 값을 나타내며, 이는 각각 그루드 진실의 길이와 너비, x 및 y 좌표에 대한 앵커의 예측(오프셋)을 나타냅니다.
RPN 출력 지역 제안 과정
- RPN 설정의 목적은 후속 RCNN에 대한 지역 제안을 제공하는 것이며 대략 프로세스는 다음과 같습니다.
1. 3x3 컨볼루션 레이어를 통과한 후 특징 맵 크기가 40×60이고 총 2400개의 포인트가 있다고 가정하면 각 포인트는 입력 해상도에 설정된 9개의 앵커에 해당하므로 총 40개의 후보 영역 약 20,000개입니다. ×60×9를 얻을 수 있다. , 1-1 cls 레이어를 통해 모든 후보 지역의 예측 점수를 계산하고,
2. 예측 점수에 따라 후보 지역을 정렬하고, 점수가 가장 높은 상위 12,000개의 후보 지역을 선택한다.
3 비최대값 억제[nms]를 사용하고, IOU 임계값을 0.7로 설정하고, 2단계에서 선별한 후보 영역을 추가로 처리한 후 나머지 후보 영역 중 점수가 가장 높은 상위 2000개 후보 영역을 선택한다. 후보 영역 선택 과정
에서 fpn 도입 등 실제 네트워크 구조가 다르므로 몇 가지 추가 작업이 있을 수 있습니다.]
[ 최종적으로 rcnn 단계로 출력되는 후보 영역의 수는 최대 2000개[그 이하일 수 있음]이며, 출력 결과는 입력 해상도에서 각 후보 영역의 좌표입니다.]
위 하이퍼파라미터의 설정은 조정될 수 있습니다.
rpn_proposal=dict(
nms_across_levels=False,
nms_pre=12000, #nms前根据score选取的候选区域数量
nms_post=2000, #nms之后选取的候选区域数量
max_num=2000, #最终选取的最大候选区域数量
nms_thr=0.7, #nms操作的阈值
min_bbox_size=0),
후보지역 생성과정은 Python을 기반으로 구현되었으며, 코드는 다음과 같다.
def get_bboxes_(self,
cls_scores,
bbox_preds,
mlvl_anchors,
img_shape,
scale_factor,
cfg,
rescale=False):
mlvl_proposals = []
for idx in range(len(cls_scores)):#遍历特征图的各层[主要考虑fpn等多层输出的结构]
rpn_cls_score = cls_scores[idx]#cls layer预测的scores
rpn_bbox_pred = bbox_preds[idx]#reg layer预测的bbox
assert rpn_cls_score.size()[-2:] == rpn_bbox_pred.size()[-2:]
rpn_cls_score = rpn_cls_score.permute(1, 2, 0)
if self.use_sigmoid_cls:
rpn_cls_score = rpn_cls_score.reshape(-1)
scores = rpn_cls_score.sigmoid()
else:
rpn_cls_score = rpn_cls_score.reshape(-1, 2)
scores = rpn_cls_score.softmax(dim=1)[:, 1]
rpn_bbox_pred = rpn_bbox_pred.permute(1, 2, 0).reshape(-1, 4)
anchors = mlvl_anchors[idx]#预先设置的anchor坐标
if cfg.nms_pre > 0 and scores.shape[0] > cfg.nms_pre:
_, topk_inds = scores.topk(cfg.nms_pre) #12000
rpn_bbox_pred = rpn_bbox_pred[topk_inds, :]
anchors = anchors[topk_inds, :]
scores = scores[topk_inds]
proposals = delta2bbox(anchors, rpn_bbox_pred, self.target_means,
self.target_stds, img_shape) #映射到训练分辨率的大小上
if cfg.min_bbox_size > 0:#对小于特定尺寸的框进行过滤{默认设置为0}
w = proposals[:, 2] - proposals[:, 0] + 1
h = proposals[:, 3] - proposals[:, 1] + 1
valid_inds = torch.nonzero((w >= cfg.min_bbox_size) &
(h >= cfg.min_bbox_size)).squeeze()
proposals = proposals[valid_inds, :]
scores = scores[valid_inds]
proposals = torch.cat([proposals, scores.unsqueeze(-1)], dim=-1)
proposals, _ = nms(proposals, cfg.nms_thr) #nms操作
proposals = proposals[:cfg.nms_post, :] # 2000
mlvl_proposals.append(proposals)
proposals = torch.cat(mlvl_proposals, 0)
if cfg.nms_across_levels:#对于fpn结构,是否将多层的框放到一起进行nms操作
proposals, _ = nms(proposals, cfg.nms_thr)
# proposals = proposals[:cfg.max_num, :]
scores = proposals[:, 4]
num = min(cfg.max_num, proposals.shape[0])
_, topk_inds = scores.topk(num)
proposals = proposals[topk_inds, :]
else:
scores = proposals[:, 4]
num = min(cfg.max_num, proposals.shape[0])#cfg.max_num=2000
_, topk_inds = scores.topk(num)
proposals = proposals[topk_inds, :]
return proposals #返回得到的bbox坐标也是相对于输入[训练]分辨率
RPN 훈련 과정:
1. 3*3 컨볼루션 레이어를 통과한 후 피처맵 크기가 40×60이고 총 2400개의 포인트가 있다고 가정하면 각 포인트는 입력 해상도에 설정된 9개의 앵커에 해당하므로 총 40×60× 9개 얻을 수 있는 약 20,000개의 후보 영역
2. 생성된 후보 영역을 사전 필터링 : 이미지의 가장자리를 벗어나는 일부 후보 영역을 폐기
3. 필터링된 후보 영역 추가 처리 : 후보 영역이 특정 보정과 중복되는 경우 Area [Ground Truth] 0.7보다 크면 포지티브 샘플로 기록하고, 임의의 교정 구역과의 중첩 비율이 0.3보다 작으면 네거티브 샘플로 기록한다. 나머지 구와 도시는 샘플로 사용되지 않습니다.
4. 훈련을 위해 무작위로 256개의 구역을 선택합니다(긍정 및 부정 샘플 각각 128개). 긍정적 및 부정적 후보 구역의 비율은 1:1입니다. 긍정적 샘플 수가 128개 미만인 경우 부정적인 샘플로 채워집니다. . 일반적으로 양성 샘플의 수는 충분하지 않으며, 채우기 위해 음성 샘플이 필요한 경우가 많습니다. 음성 샘플의 수는 128개를 훨씬 넘는 경우가 많습니다. 이때 온라인 난이도와 같은 음성 샘플을 선택하기 위해 일부 전략을 채택할 수 있습니다. 샘플 마이닝을 통해 네트워크가 난이도에 더 주의를 기울이게 만듭니다. 음성 샘플 학습,
[양성 및 음성 샘플의 정의 및 선별에 대한 참조: 타겟 탐지를 위한 양성 및 음성 샘플에 대한 자세한 설명 ]
5. 편차 계산[상대값 ] 포지티브 샘플과 교정 영역 [지상 진실] 사이에 포지티브 샘플의 위치 라벨을 생성합니다. [음성 샘플에는 카테고리 라벨만 있고 위치 라벨은 없습니다.] 예측된 값과 라벨을 기반으로 모델 매개변수를 반복합니다. 네트워크
위 훈련 과정의 하이퍼파라미터는 조정될 수 있습니다.
rpn=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.7, #正样本阈值
neg_iou_thr=0.3, #负样本阈值
min_pos_iou=0.2, #最小正样本阈值
ignore_iof_thr=0.3),
sampler=dict(
type='RandomSampler',
num=256, #用于训练的正负样本总数
pos_fraction=0.5, #用于训练的正样本比例
neg_pos_ub=-1,
add_gt_as_proposals=False),
),
allowed_border=128,#允许超过的最大边界像素
2.3 RoI 풀링/RoI 정렬
RoI 풀링 의 역할
:
주로 두 가지 작업을 수행합니다.
첫 번째는 각 RoI에 해당하는 기능을 선택하는 것(입력 해상도 영역에서 ROI 기능 레이어 영역으로 매핑)이고 두 번째는
완전 연결의 입력 요구 사항을 충족하는 것입니다. 각 RoI에 해당하는 특징의 차원을 특정 값으로 변환(7-7-512와 같이 고정된 크기의 특징 맵이 출력됨)
RoI Pooling의 입력 및 출력
- 입력: RPN에 의해 출력되는 후보 영역[RoI] 및 해당 RoI Feature Map
RoI Feature Map은 RPN과 동일한 Feature Map을 공유할 수도 있고 RPN을 기반으로 추가 처리를 통해 얻은 Feature Map일 수도 있습니다.
- 출력: 각 후보 영역에 해당하고 크기가 고정된 특징 맵
ROI 풀링 특정 작업
1. 입력 이미지에 따라 ROI를 RoI Feature Map의 해당 위치에 매핑합니다
2. 매핑된 영역을 동일한 크기의 섹션으로 나눕니다(섹션 수는 출력 차원과 동일합니다. 예: 7) 3.
각 섹션 풀링 작업에서 최대값을 수행합니다.
이러한 방식으로 다양한 크기의 상자에서 고정된 크기의 해당 기능 맵을 얻을 수 있습니다. 출력 특징 맵의 크기는 ROI 및 특징 맵 크기에 의존하지 않으며 Roi 풀링은 채널 수를 변경하지 않으므로 출력 채널 수는 여전히 입력 채널 수와 동일합니다. Pooling 작업 예: 8
8 크기가 있다고 가정 2 2 크기의 특징 맵을 출력하려면 특징 맵과 ROI가 필요합니다. 프로세스는 다음과 같습니다.
RoI Align
Faster-RCNN에서 ROI Pooling의 기능은 다음과 같습니다. 미리 선택된 박스의 위치 좌표에 따라 해당 영역을 특징 맵에 모아두는 것인데, 후속 분류 및 후보 프레임 회귀 연산을 위해 고정된 크기의 특징 맵이지만, 일반적으로 후보 프레임의 위치를 구하므로 모델 회귀에 따르면 일반적으로 부동 소수점 숫자(십진수)이며 픽셀은 모두 정수이며 풀링됩니다. 최종 특징 맵에는 고정된 크기가 필요합니다. 따라서 ROI 풀링 작업에는 두 가지 정량화 프로세스가 있습니다.
1. 후보 상자 경계를 특징 맵의 정수점 좌표 값으로 정량화합니다.
2. 양자화된 경계 영역을 kxk 단위(bin)로 균등하게 나누고, 각 단위의 경계를 수량화합니다.
예:
위 그림에서 볼 수 있듯이 컨벌루션 네트워크는 원본 이미지의 32배 다운샘플링을 구현합니다. 원본 이미지에 665x665 크기의 영역 제안이 있다고 가정합니다. 특징 맵에 매핑된 크기는 665/32=20.78, 즉 20.78x20.78입니다. 픽셀이 정수이므로 RoiPool은 반올림 작업을 수행합니다. 계산 중에 소위 1차 수량화, 즉 매핑된 특징 맵 크기가 20x20이고, 풀링 후 특징 맵이 7x7 크기로 고정되었다고 가정하면 위의 특징 맵에 매핑된 20x20 영역 제안은 다음과 같습니다. 49개의 작은 영역을 같은 크기로 나누면, 각각의 작은 영역의 크기는 20/7=2.86(Rol bin), 즉 2.86x2.86이다. 이때 두 번째 양자화가 수행되므로 작은 영역의 크기는 20/7=2.86(Rol bin)이다. 영역은 원래 특징 맵에 매핑된 2x2(Rol bin)가 되며, 20x20 크기의 영역 제안의 경우 편차는 14x14가 되어 원본 이미지의 편차(2.86-2) x32=27.52에 해당합니다.
두 가지 양자화는 Rol과 추출된 특징 사이에 잘못된 정렬을 초래합니다. 이 오류는 분류 작업에 거의 영향을 미치지 않을 수 있지만 위치 지정 및 픽셀 수준 작업에 미치는 영향은 무시할 수 없습니다.
RoiAlign과 Roipooling의 목적은 동일하지만 양자화 오류를 제거하기 위해 구현 방법이 다릅니다. 양자화 작업을 취소하고 쌍선형 보간 방법을 사용하여 좌표가 부동 소수점 숫자인 픽셀 포인트의 이미지 값을 얻습니다.
위 맵의 경우 피처 맵의 크기는 665/32=20.78, 즉 20.78x20.78로 매핑하여 얻습니다. 이때 RoiAlign은 RoiPooling과 같은 반올림 작업을 수행하지 않고 부동 소수점 숫자를 유지합니다. pooling하면 7x7 크기의 feature map으로 고정되므로 feature map에 매핑된 20.78x20.78 지역 제안은 동일한 크기의 49개의 작은 영역으로 나누어지며, 각 작은 영역의 크기는 20.78/7=2.97, 즉 는 2.97x2.97입니다(Rol bin, 2.97x2.97의 각 작은 영역에 대해 (전체)를 취하지 마십시오. 이를 4개의 동일한 부분으로 나누고 각 부분은 중심점의 위치를 취하고 픽셀은 bilinear interpolation 방법을 이용하여 중심점 위치를 계산하며, 이렇게 4개의 점의 픽셀 값은 아래와 같으며, 마지막으로 최대 풀링(maximum pooling) 또는 평균 풀링(average pooling)을 사용하여 7x7 특징 맵을 얻는다.
RoiAlign은 계산된 각 Rol bin을 위 그림의 4개의 빨간색 십자 '×'에 표시된 대로 4개의 부분으로 나눕니다. 이 지점을 원본 이미지의 가상 지점(20.56과 같은 이중선형 보간의 격자점이라고도 함)이라고 합니다. 이 부동 소수점 숫자), 그 값은 주변의 가장 가까운 4개의 실제 픽셀 값으로부터 이중선형 보간법으로 계산됩니다(예: (20.56, 20.56)는 (20,20)(20,21)( 21, 20)(21,21)4개 점의 픽셀을 계산), 얻은 4개 값에 대해 최대 풀링 연산을 수행하여 각 Rol bin의 출력 결과를 얻습니다. 전 과정에서 양자화 연산은 사용되지 않습니다. , 없음 오류가 발생합니다. 즉, 원본 이미지의 픽셀과 특징 맵의 픽셀이 편차 없이 완전히 정렬됩니다.
3. 알고리즘의 장점과 단점
Faster Rcnn은 고전적인 Two-Stage 알고리즘으로 학계와 산업계에서 널리 사용되어 정확도가 입증되었으며 장점은 주로 다음과 같습니다.
1. 모델의 정확도가 높습니다: 두 가지 위치 조정이 있으며 좌표값 예측이 더욱 정교해졌습니다. 2.
양성 샘플과 음성 샘플의 비율이 잘 제어되어 있습니다. rpn을 입력하면 많은 양성 샘플과 음성 샘플이 생성됩니다. , 그러나 실제로 훈련에 사용되는 긍정 및 부정 샘플 샘플 수가 많지 않고 비율도 잘 제어됩니다.
3. RPN 단계에서는 사전 프레임이 많이 생성됩니다. 모델 훈련 초기 단계에서는 많은 무작위로 자른 대상은 추가 데이터 향상 방법인 변장에 추가됩니다.
결점:
1. 1단계 알고리즘에 비해 속도가 느리다 2.
배경 오류 탐지율이 높고 일부 음성 샘플만 훈련에 사용되며 배경 학습이 상대적으로 부족하다.