다음을 통해 공유


빠른 R-CNN을 사용하여 개체 감지

목차

요약

이미지이미지

위의 예제는 이 자습서에 사용된 식료품 데이터 집합(왼쪽) 및 Pascal VOC 데이터 집합(오른쪽)에 대한 이미지 및 개체 주석입니다.

더 빠른 R-CNNShaoqing Ren, Kaiming He, Ross Girshick 및 Jian Sun 이 2015년에 제안한 개체 감지 알고리즘입니다. 연구 논문의 제목은 '빠른 R-CNN: 지역 제안 네트워크와 Real-Time 개체 감지를 향해', 에 https://arxiv.org/abs/1506.01497보관됩니다. 더 빠른 R-CNN은 심층 나선형 네트워크를 사용하여 개체 제안을 효율적으로 분류하기 위해 이전 작업을 기반으로 합니다. 이전 작업과 비교하여 더 빠른 R-CNN은 지역 제안 네트워크를 사용하며 후보 지역 제안에 대한 외부 방법이 필요하지 않습니다.

이 자습서는 세 가지 주요 섹션으로 구성됩니다. 첫 번째 섹션에서는 제공된 예제 데이터 집합에서 CNTK에서 더 빠른 R-CNN을 실행하는 방법에 대한 간결한 설명을 제공합니다. 두 번째 섹션에서는 빠른 R-CNN의 설정 및 매개 변수화를 포함한 모든 단계에 대한 세부 정보를 제공합니다. 마지막 섹션에서는 알고리즘 및 지역 제안 네트워크의 기술 세부 정보, 입력 데이터 읽기 및 보강, 더 빠른 R-CNN을 위한 다양한 교육 옵션에 대해 설명합니다.

빠른 시작

이 섹션에서는 CNTK Python API를 사용하도록 시스템이 설정되어 있다고 가정합니다. 또한 Windows에서 Python 3.5 또는 Linux에서 3.5/3.6을 사용하고 있다고 가정합니다. 자세한 연습은 단계별 지침을 참조하세요. 더 빠른 R-CNN을 실행하려면 cntk Python 환경에 다음 추가 패키지를 설치하세요.

pip install opencv-python easydict pyyaml

토이 예제 실행

냉장고에서 캡처된 이미지의 토이 데이터 세트를 사용하여 빠른 R-CNN(빠른 R-CNN 예제와 동일)을 보여 줍니다. 예제/이미지/검색/FastRCNN 폴더에서 다음 Python 명령을 실행하여 데이터 세트와 미리 학습된 AlexNet 모델을 모두 다운로드할 수 있습니다.

python install_data_and_model.py

스크립트를 실행하면 폴더 아래에 토이 데이터 세트가 Examples/Image/DataSets/Grocery 설치됩니다. AlexNet 모델이 폴더에 PretrainedModels 다운로드됩니다. 구성 파일에서 기본적으로 해당 위치를 가정하기 때문에 다운로드한 데이터를 해당 폴더에 유지하는 것이 좋습니다.

더 빠른 R-CNN 실행을 학습하고 평가하려면

python run_faster_rcnn.py

기본 모델로 AlexNet을 사용하여 식료품에 대한 엔드투엔드 학습에 대한 결과는 다음과 유사합니다.

AP for          gerkin = 1.0000
AP for          butter = 1.0000
AP for         joghurt = 1.0000
AP for          eggBox = 1.0000
AP for         mustard = 1.0000
AP for       champagne = 1.0000
AP for          orange = 1.0000
AP for           water = 0.5000
AP for         avocado = 1.0000
AP for          tomato = 1.0000
AP for          pepper = 1.0000
AP for         tabasco = 1.0000
AP for           onion = 1.0000
AP for            milk = 1.0000
AP for         ketchup = 0.6667
AP for     orangeJuice = 1.0000
Mean AP = 0.9479

이미지에서 예측된 경계 상자 및 레이블을 시각화하려면 폴더에서 FasterRCNN 열고 FasterRCNN_config.py 설정합니다.

__C.VISUALIZE_RESULTS = True

실행python run_faster_rcnn.py하면 이미지가 폴더에 FasterRCNN/Output/Grocery/ 저장됩니다.

단계별 지침

설치 프로그램

이 예제에서 코드를 실행하려면 CNTK Python 환경이 필요합니다(설치 도움말은 여기 참조). cntk Python 환경에 다음 추가 패키지를 설치하세요.

pip install opencv-python easydict pyyaml

경계 상자 회귀 및 최대값이 아닌 억제를 위해 미리 컴파일된 이진 파일

폴더 Examples\Image\Detection\utils\cython_modules 에는 더 빠른 R-CNN을 실행하는 데 필요한 미리 컴파일된 이진 파일이 포함되어 있습니다. 현재 리포지토리에 포함된 버전은 Windows용 Python 3.5, Linux용 Python 3.5, Linux용 3.6, 모두 64비트입니다. 다른 버전이 필요한 경우 에 설명된 단계에 따라 컴파일할 수 있습니다.

생성된 cython_bbox 이진 파일 및(및 cpu_nms /또는 gpu_nms) 이진 파일을 $FRCN_ROOT/lib/utils 복사합니다 $CNTK_ROOT/Examples/Image/Detection/utils/cython_modules.

예제 데이터 및 기준 모델

미리 학습된 AlexNet 모델을 더 빠른 R-CNN 학습의 기초로 사용합니다(VGG 또는 다른 기본 모델의 경우 다른 기본 모델 사용 참조). FastRCNN 폴더에서 다음 Python 명령을 실행하여 예제 데이터 세트와 미리 학습된 AlexNet 모델을 모두 다운로드할 수 있습니다.

python install_data_and_model.py

구성 및 매개 변수

매개 변수는 다음 세 부분으로 그룹화됩니다.

  • 감지기 매개 변수(참조 FasterRCNN/FasterRCNN_config.py)
  • 데이터 집합 매개 변수(예 utils/configs/Grocery_config.py: 참조)
  • 기본 모델 매개 변수(예 utils/configs/AlexNet_config.py: 참조)

세 부분이 로드되고 메서드의 get_configuration()run_faster_rcnn.py병합됩니다. 이 섹션에서는 감지기 매개 변수를 다룹니다. 데이터 세트 매개 변수는 여기에서 기본 모델 매개 변수에 대해 설명 합니다. 다음에서는 위에서 아래로의 FasterRCNN_config.py 내용을 살펴봅합니다. 구성은 중 EasyDict 첩된 사전에 쉽게 액세스할 수 있는 패키지를 사용합니다.

# If set to 'True' training will be skipped if a trained model exists already
__C.CNTK.MAKE_MODE = False
# E2E or 4-stage training
__C.CNTK.TRAIN_E2E = True
# set to 'True' to use deterministic algorithms
__C.CNTK.FORCE_DETERMINISTIC = False
# set to 'True' to run only a single epoch
__C.CNTK.FAST_MODE = False
# Debug parameters
__C.CNTK.DEBUG_OUTPUT = False
__C.CNTK.GRAPH_TYPE = "png" # "png" or "pdf"
# Set to True if you want to store an eval model with native UDFs (e.g. for inference using C++ or C#)
__C.STORE_EVAL_MODEL_WITH_NATIVE_UDF = False

매개 변수의 첫 번째 블록에는 학습 프로세스에 대한 더 높은 수준의 지침이 포함되어 있습니다. __C.CNTK.TRAIN_E2E 에서는 종단 간 또는 4단계 학습 체계를 선택할 수 있습니다. 두 학습 체계에 대한 자세한 내용은 여기에 설명되어 있습니다. __C.CNTK.FAST_MODE = True 는 단일 epoch만 실행합니다. 설치가 작동하고 모든 매개 변수가 올바른지 여부를 테스트하는 데 유용합니다. __C.CNTK.DEBUG_OUTPUT = True 는 콘솔 출력에 추가 디버그 메시지를 생성합니다. 또한 학습 모델과 eval 모델 모두에 대한 CNTK 계산 그래프를 표시합니다(CNTK 그래프를 그리기 위한 요구 사항 참고). 결과 그래프는 폴더에 FasterRCNN/Output 저장됩니다. __C.STORE_EVAL_MODEL_WITH_NATIVE_UDF = True 는 네이티브 코드(Python 계층 없음)만 사용하는 두 번째 평가 모델을 저장합니다. 예를 들어 C++ 또는 C#에서 이 모델을 로드하고 평가할 수 있습니다.

# Learning parameters
__C.CNTK.L2_REG_WEIGHT = 0.0005
__C.CNTK.MOMENTUM_PER_MB = 0.9
# The learning rate multiplier for all bias weights
__C.CNTK.BIAS_LR_MULT = 2.0

# E2E learning parameters
__C.CNTK.E2E_MAX_EPOCHS = 20
__C.CNTK.E2E_LR_PER_SAMPLE = [0.001] * 10 + [0.0001] * 10 + [0.00001]

두 번째 블록에는 학습 매개 변수가 포함됩니다. 이러한 매개 변수는 대부분 일반 CNTK 학습 매개 변수입니다. 유일한 예외는 __C.CNTK.BIAS_LR_MULT네트워크의 모든 바이어스에 사용되는 학습 속도 승수입니다. 그것은 본질적으로 원래 빠른 R-CNN 코드에서 수행되는 현재의 학습 속도의 두 배로 편견을 훈련. 샘플당 epoch 수와 학습 속도는 두 가지 학습 체계(위에서 생략된 4단계 매개 변수)에 대해 별도로 지정됩니다.

# Maximum number of ground truth annotations per image
__C.INPUT_ROIS_PER_IMAGE = 50
__C.IMAGE_WIDTH = 850
__C.IMAGE_HEIGHT = 850

# Sigma parameter for smooth L1 loss in the RPN and the detector (DET)
__C.SIGMA_RPN_L1 = 3.0
__C.SIGMA_DET_L1 = 1.0

# NMS threshold used to discard overlapping predicted bounding boxes
__C.RESULTS_NMS_THRESHOLD = 0.5
# all bounding boxes with a score lower than this threshold will be considered background
__C.RESULTS_NMS_CONF_THRESHOLD = 0.0

# Enable plotting of results generally / also plot background boxes / also plot unregressed boxes
__C.VISUALIZE_RESULTS = False
__C.DRAW_NEGATIVE_ROIS = False
__C.DRAW_UNREGRESSED_ROIS = False
# only for plotting results: boxes with a score lower than this threshold will be considered background
__C.RESULTS_BGR_PLOT_THRESHOLD = 0.1

__C.INPUT_ROIS_PER_IMAGE 는 이미지당 최대 접지 진리 주석 수를 지정합니다. CNTK는 현재 최대 수를 설정해야 합니다. 주석이 적으면 내부적으로 패딩됩니다. __C.IMAGE_WIDTH 입력 __C.IMAGE_HEIGHT 이미지의 크기를 조정하고 패딩하는 데 사용되는 차원입니다. __C.RESULTS_NMS_THRESHOLD 는 평가에서 겹치는 예측 경계 상자를 삭제하는 데 사용되는 NMS 임계값입니다. 임계값이 낮을수록 제거가 줄어들므로 최종 출력에서 더 많은 예측 경계 상자가 생성됩니다.

# Use horizontally-flipped images during training?
__C.TRAIN.USE_FLIPPED = True
# If set to 'True' conv layers weights from the base model will be trained, too
__C.TRAIN_CONV_LAYERS = True

# RPN parameters
# IOU >= thresh: positive example
__C.TRAIN.RPN_POSITIVE_OVERLAP = 0.7
# IOU < thresh: negative example
__C.TRAIN.RPN_NEGATIVE_OVERLAP = 0.3
# If an anchor statisfied by positive and negative conditions set to negative
__C.TRAIN.RPN_CLOBBER_POSITIVES = False
# Max number of foreground examples
__C.TRAIN.RPN_FG_FRACTION = 0.5
# Total number of examples
__C.TRAIN.RPN_BATCHSIZE = 256
# NMS threshold used on RPN proposals
__C.TRAIN.RPN_NMS_THRESH = 0.7
# Number of top scoring boxes to keep before apply NMS to RPN proposals
__C.TRAIN.RPN_PRE_NMS_TOP_N = 12000
# Number of top scoring boxes to keep after applying NMS to RPN proposals
__C.TRAIN.RPN_POST_NMS_TOP_N = 2000
# Proposal height and width both need to be greater than RPN_MIN_SIZE (at orig image scale)
__C.TRAIN.RPN_MIN_SIZE = 16

__C.TRAIN.USE_FLIPPED = True 는 다른 모든 Epoch의 모든 이미지를 대칭 이동하여 학습 데이터를 보강합니다. 즉, 첫 번째 epoch에는 모든 일반 이미지가 있고, 두 번째 epoch에는 모든 이미지가 대칭 이동됩니다. __C.TRAIN_CONV_LAYERS 는 입력에서 나선형 기능 맵에 이르는 나선형 계층이 학습되거나 수정될지 여부를 결정합니다. conv 계층 가중치를 수정하면 학습 중에 기본 모델의 가중치가 수행되고 수정되지 않습니다. 학습할 conv 계층 수를 지정할 수도 있습니다. 다른 기본 모델 사용 섹션을 참조하세요. rpn 매개 변수의 경우 정의 옆의 의견을 참조하거나 자세한 내용은 원래 연구 논문을 참조하세요. 또한 다음 감지기 매개 변수에 대해서도 다음을 수행합니다.

# Detector parameters
# Minibatch size (number of regions of interest [ROIs]) -- was: __C.TRAIN.BATCH_SIZE = 128
__C.NUM_ROI_PROPOSALS = 128
# Fraction of minibatch that is labeled foreground (i.e. class > 0)
__C.TRAIN.FG_FRACTION = 0.25
# Overlap threshold for an ROI to be considered foreground (if >= FG_THRESH)
__C.TRAIN.FG_THRESH = 0.5
# Overlap threshold for an ROI to be considered background (class = 0 if
# overlap in [LO, HI))
__C.TRAIN.BG_THRESH_HI = 0.5
__C.TRAIN.BG_THRESH_LO = 0.0

# Normalize the targets using "precomputed" (or made up) means and stdevs
__C.BBOX_NORMALIZE_TARGETS = True
__C.BBOX_NORMALIZE_MEANS = (0.0, 0.0, 0.0, 0.0)
__C.BBOX_NORMALIZE_STDS = (0.1, 0.1, 0.2, 0.2)

Pascal VOC에서 더 빠른 R-CNN 실행

Pascal 데이터를 다운로드하고 CNTK 형식으로 Pascal에 대한 주석 파일을 만들려면 다음 스크립트를 실행합니다.

python Examples/Image/DataSets/Pascal/install_pascalvoc.py
python Examples/Image/DataSets/Pascal/mappings/create_mappings.py

dataset_cfg 메서드 run_faster_rcnn.pyget_configuration() 변경합니다.

from utils.configs.Pascal_config import cfg as dataset_cfg

이제 .를 사용하여 python run_faster_rcnn.pyPascal VOC 2007 데이터를 학습하도록 설정되었습니다. 학습에 다소 시간이 걸릴 수 있습니다.

사용자 고유의 데이터에서 더 빠른 R-CNN 실행

빠른 R-CNN을 사용하여 개체 감지에서 사용자 고유의 데이터를 준비하고 접지 진리 경계 상자로 주석을 추가합니다. 설명된 폴더 구조에 이미지를 저장하고 주석을 추가한 후 실행하세요.

python Examples/Image/Detection/utils/annotations/annotations_helper.py

스크립트의 폴더를 데이터 폴더로 변경한 후 마지막으로, 이 코드 조각과 utils\configs 같이 기존 예제에 따라 폴더에 만듭니 MyDataSet_config.py 다.

...

# data set config
__C.DATA.DATASET = "YourDataSet"
__C.DATA.MAP_FILE_PATH = "../../DataSets/YourDataSet"
__C.DATA.CLASS_MAP_FILE = "class_map.txt"
__C.DATA.TRAIN_MAP_FILE = "train_img_file.txt"
__C.DATA.TRAIN_ROI_FILE = "train_roi_file.txt"
__C.DATA.TEST_MAP_FILE = "test_img_file.txt"
__C.DATA.TEST_ROI_FILE = "test_roi_file.txt"
__C.DATA.NUM_TRAIN_IMAGES = 500
__C.DATA.NUM_TEST_IMAGES = 200
__C.DATA.PROPOSAL_LAYER_SCALES = [8, 16, 32]

...

__C.CNTK.PROPOSAL_LAYER_SCALES 가 사용됩니다 generate_anchors() (참조 utils/rpn/generate_anchors.py). 가로 세로 비율을 0.5, 1.02.0 가진 3개의 앵커의 기본 크기 16 부터 시작하여 생성됩니다(8 x 24, 16 x 16, 24 x 8). 이러한 값은 각 제안 계층 배율을 곱하여 9개의 앵커(64 x 192, ... , 768 x 256)를 생성합니다. 이는 입력 이미지와 함께 절대 픽셀 좌표입니다. 모든 앵커는 나선형 기능 맵의 각 공간 위치에 적용되어 관심 있는 후보 영역을 생성합니다. 데이터 집합의 개체 크기 및 사용 중인 입력 이미지 크기에 따라 이러한 제안 계층 크기를 조정합니다. 예를 들어 사용 __C.DATA.PROPOSAL_LAYER_SCALES = [4, 8, 12] 중인 식료품 데이터 집합 및 입력 이미지 크기(참조utils/configs/Grocery_config.py)의 850 x 850 경우입니다.

데이터에 dataset_cfgget_configuration() 대해 더 빠른 R-CNN을 학습시키고 평가하려면 다음 방법에서 run_faster_rcnn.py

from utils.configs.MyDataSet_config import cfg as dataset_cfg

를 실행 python run_faster_rcnn.py합니다.

기술 세부 정보

대부분의 DNN 기반 개체 감지기로 더 빠른 R-CNN은 전송 학습을 사용합니다. 이미지 분류를 위해 학습된 모델인 기본 모델에서 시작합니다. 기본 모델은 두 부분으로 나릅니다. 첫 번째 모델은 마지막 풀링 계층까지(및 제외) 모든 나선형 계층이고 두 번째 부분은 마지막 풀링 계층에서 최종 예측 계층까지(및 제외) 네트워크의 나머지 부분입니다. 첫 번째 부분의 출력을 나선형 기능 맵이라고도 합니다. 이는 원래 이미지의 지역 제안에 해당하는 입력 맵의 일부에서 풀링 작업을 수행하는 roi 풀링 계층에 대한 입력으로 사용됩니다. 지역 제안은 roi 풀링 계층에 대한 두 번째 입력입니다. 빠른 R-CNN에서 이러한 제안은 지역 제안 네트워크(RPN, 다음 섹션 참조)라는 작은 하위 네트워크에 의해 생성됩니다.

roi 풀링 계층의 출력은 모든 입력(나선형 기능 맵 + 지역 제안)을 동일한 출력 크기로 풀링하므로 항상 동일한 고정 크기를 갖습니다. 입력 크기( 즉, 나선형 featute 맵의 크기 및 따라서 입력 이미지 크기)는 임의일 수 있습니다. 학습을 위해 알고리즘은 4개의 손실 함수, RPN에 2개, 탐지기에 2개를 사용합니다(다음 섹션 참조). 다음 메서드는 더 빠른 R-CNN 모델의 상위 수준 생성에 포함되어 FasterRCNN_train.py 있습니다. 전체 코드를 참조 FasterRCNN_train.py 하세요 utils/rpn/rpn_helpers.py .

def create_faster_rcnn_model(features, scaled_gt_boxes, dims_input, cfg):
    # Load the pre-trained classification net and clone layers
    base_model = load_model(cfg['BASE_MODEL_PATH'])
    conv_layers = clone_conv_layers(base_model, cfg)
    fc_layers = clone_model(base_model, [cfg["MODEL"].POOL_NODE_NAME], [cfg["MODEL"].LAST_HIDDEN_NODE_NAME], clone_method=CloneMethod.clone)

    # Normalization and conv layers
    feat_norm = features - Constant([[[v]] for v in cfg["MODEL"].IMG_PAD_COLOR])
    conv_out = conv_layers(feat_norm)

    # RPN and prediction targets
    rpn_rois, rpn_losses = create_rpn(conv_out, scaled_gt_boxes, dims_input, cfg)
    rois, label_targets, bbox_targets, bbox_inside_weights = \
        create_proposal_target_layer(rpn_rois, scaled_gt_boxes, cfg)

    # Fast RCNN and losses
    cls_score, bbox_pred = create_fast_rcnn_predictor(conv_out, rois, fc_layers, cfg)
    detection_losses = create_detection_losses(...)
    loss = rpn_losses + detection_losses
    pred_error = classification_error(cls_score, label_targets, axis=1)

    return loss, pred_error

학습 후 네트워크는 평가에 필요하지 않은 모든 부분(예: 손실 함수)을 제거하여 평가 모델로 변환됩니다. 최종 평가 모델에는 3개의 출력이 있습니다(자세한 내용은 참조 create_faster_rcnn_eval_model()FasterRCNN_train.py ).

  • rpn_rois - 후보 rois의 절대 픽셀 좌표
  • cls_pred - 각 ROI에 대한 클래스 확률
  • bbox_regr - 각 ROI에 대한 클래스당 회귀 계수

Python에서 평가 모델을 사용하려면 다음FasterRCNN_eval.pyFasterRCNN_Evaluator 사용할 수 있습니다. 모델을 한 번 로드한 다음, 단일 이미지를 평가할 수 있습니다. 계산기의 메서드는 process_image() 이미지의 경로를 인수로 사용하고, 해당 이미지에서 모델을 평가하고, 결과 ROI에 경계 상자 회귀를 적용합니다. 회귀된 ROI 및 해당 클래스 확률을 반환합니다.

    evaluator = FasterRCNN_Evaluator(model, cfg)
    regressed_rois, cls_probs = evaluator.process_image(img_path)

지역 제안 네트워크

더 빠른 R-CNN은 입력 이미지에 따라 ROI(후보 영역)를 생성하는 소위 지역 제안 RPN( netwrok )을 사용합니다. 이는 외부 소스에서 지역 제안을 제공해야 하는 빠른 R-CNN과 반대됩니다. RPN은 기본적으로 3개의 나선형 계층과 제안 계층이라는 새 계층에 의해 빌드됩니다. 새 계층은 Python 또는 C++에서 UDF(사용자 정의 함수)로 실현됩니다(아래 세부 정보 참조). CNTK에서 RPN을 만드는 Python 코드는 utils/rpn/rpn_helpers.py제안 계층과 같은 새 계층이 모두 폴더에 utils/rpn 있습니다.

RPN에 대한 입력은 ROI 풀링 계층에 대한 입력과 동일한 나선형 기능 맵입니다. 이 입력은 RPN의 첫 번째 나선형 계층에 공급되고 결과는 다른 두 나선형 계층으로 전파됩니다. 후자 중 하나는 각 후보 영역에 대한 클래스 점수를 예측합니다. 즉, 각 공간 위치의 각 앵커에 대해(9 앵커 x 2 점수 x 너비 x 높이) 두 점수는 (softmax 노드 사용) 후보별 개체 점수 로 변환되며, 이는 후보 영역이 포그라운드 개체를 포함할 확률로 해석됩니다. 다른 나선형 계층은 각 후보에 대해 ROI의 실제 위치에 대한 회귀 계수를 다시 예측합니다(9 앵커 x 4 계수 x 너비 x 높이).

회귀 계수 및 개체 점수(전경 및 배경 확률)는 제안 계층으로 공급됩니다. 이 계층은 먼저 생성된 앵커에 회귀 계수를 적용하고, 결과를 이미지 경계에 잘라내고, 너무 작은 후보 영역을 필터링합니다. 그런 다음 전경 확률을 기준으로 후보를 정렬하고, NMS(최대값이 아닌 억제)를 적용하여 후보 수를 줄이고, 마지막으로 출력에 대해 원하는 수의 ROI를 샘플링합니다.

더 빠른 R-CNN 학습 중에 앵커 대상 계층과 제안 대상 계층이라는 두 개의 추가 새 계층이 필요합니다. 앵커 대상 계층은 RPN의 손실 함수에 사용되는 개체 점수 및 RPN 회귀 계수에 대한 대상 값을 생성합니다. 마찬가지로, 제안 대상 계층은 탐지기의 손실 함수에 사용되는 최종 탐지기에 대한 클래스당 대상 회귀 계수 및 ROI에 대한 대상 클래스 레이블을 생성합니다.

평가 중에는 제안 계층만 필요합니다(손실 함수에 대한 대상이 필요하지 않으므로). CNTK의 제안 계층은 C++뿐만 아니라 Python에서도 사용할 수 있으며, 대상 계층은 현재 Python에서만 사용할 수 있습니다. 따라서 더 빠른 R-CNN 학습은 현재 Python API에서 수행되어야 합니다. 네이티브 제안 계층 구현 집합 __C.STORE_EVAL_MODEL_WITH_NATIVE_UDF = True을 사용하는 학습 후 평가 모델을 저장합니다.

판독기 및 미니배치 원본

데이터 확대를 위해 이미지 크기를 조정하거나 이미지를 대칭 이동하면 동일한 변환을 기본 진리 주석에도 적용해야 합니다. (4단계 교육에서 캐시된 제안에도 대칭 이동이 적용되어야 합니다. 다음 섹션을 참조하세요.) 이미지 및 주석의 조인된 변환은 현재 기본 제공 CNTK 판독기에서 지원되지 않으므로 사용자 지정 Python 판독기 및 UserMinibatchSource 더 빠른 R-CNN을 사용합니다. 이러한 항목은 각각에 utils/od_reader.pyutils/od_mb_source.py 포함됩니다.

E2E 및 4단계 학습

더 빠른 R-CNN 연구 논문은 네트워크를 학습시키는 두 가지 방법을 설명합니다. 종단 간 학습은 4개의 손실 함수(rpn 회귀 손실, rpn 개체 손실, 탐지기 회귀 손실, 탐지기 클래스 손실)를 사용하여 단일 학습으로 전체 네트워크를 학습합니다. 기본적으로 엔드 투 엔드 학습을 사용하며, 그에 따라 FasterRCNN_config.py설정 __C.CNTK.TRAIN_E2E 하여 둘 중에서 선택할 수 있습니다.

4단계 학습 체계는 지역 제안 네트워크만 학습(탐지기 고정 유지)과 탐지기만 학습(RPN 가중치 고정)을 번갈아 가며 진행합니다. 이 학습 체계는 .에서 train_faster_rcnn_alternating()FasterRCNN_train.py구현됩니다. 약간 더 정교하며 모델의 복제 부분을 자주 사용하여 고정 및 학습 가중치를 선택적으로 사용하도록 설정합니다. 또한 4단계 학습에서 RPN의 제안은 1단계와 3단계 후에 버퍼링되고 후속 단계에서 사용됩니다.

다른 기본 모델 사용

다른 기본 모델을 사용하려면 메서드에서 다른 모델 구성을 get_configuration()run_faster_rcnn.py선택해야 합니다. 다음 두 가지 모델이 즉시 지원됩니다.

    # for VGG16 base model use:         from utils.configs.VGG16_config import cfg as network_cfg
    # for AlexNet base model use:       from utils.configs.AlexNet_config import cfg as network_cfg

VGG16 모델을 다운로드하려면 다음의 다운로드 스크립트를 <cntkroot>/PretrainedModels사용하세요.

    python download_model.py VGG16_ImageNet_Caffe

다른 다른 기본 모델을 사용하려면 구성 파일을 utils/configs/VGG16_config.py 복사하고 기본 모델에 따라 수정해야 합니다.

# model config
__C.MODEL.BASE_MODEL = "VGG16"
__C.MODEL.BASE_MODEL_FILE = "VGG16_ImageNet_Caffe.model"
__C.MODEL.IMG_PAD_COLOR = [103, 116, 123]
__C.MODEL.FEATURE_NODE_NAME = "data"
__C.MODEL.LAST_CONV_NODE_NAME = "relu5_3"
__C.MODEL.START_TRAIN_CONV_NODE_NAME = "pool2" # __C.MODEL.FEATURE_NODE_NAME
__C.MODEL.POOL_NODE_NAME = "pool5"
__C.MODEL.LAST_HIDDEN_NODE_NAME = "drop7"
__C.MODEL.FEATURE_STRIDE = 16
__C.MODEL.RPN_NUM_CHANNELS = 512
__C.MODEL.ROI_DIM = 7

기본 모델의 노드 이름을 조사하려면 .에서 cntk.logging.graph메서드를 plot() 사용할 수 있습니다. CNTK의 roi 풀링이 아직 roi 평균 풀링을 지원하지 않으므로 ResNet 모델은 현재 지원되지 않습니다.