Udostępnij przez


Wykrywanie obiektów przy użyciu szybszej sieci R-CNN

Spis treści

Podsumowanie

obraz obrazu

Poniżej przedstawiono przykłady obrazów i adnotacji obiektów dla zestawu danych Sklep spożywczy (po lewej) i zestawu danych Pascal VOC (po prawej) używanego w tym samouczku.

Szybszy R-CNN to algorytm wykrywania obiektów proponowany przez Shaoqing Ren, Kaiming He, Ross Girshick i Jian Sun w 2015 roku. Dokument badawczy nosi tytuł "Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks" (Szybszy R-CNN: w kierunku wykrywania obiektów Real-Time za pomocą sieci propozycji regionów) i jest archiwizowany pod adresem https://arxiv.org/abs/1506.01497. Szybsza sieć R-CNN opiera się na poprzedniej pracy w celu wydajnego klasyfikowania propozycji obiektów przy użyciu głębokich sieci splotowych. W porównaniu z poprzednią pracą szybsze sieci R-CNN zatrudnia sieć propozycji regionu i nie wymaga metody zewnętrznej dla propozycji regionu kandydata.

Ten samouczek ma strukturę trzech głównych sekcji. Pierwsza sekcja zawiera zwięzły opis sposobu uruchamiania szybszej nazwy R-CNN w cnTK w podanym przykładowym zestawie danych. Druga sekcja zawiera szczegółowe informacje na temat wszystkich kroków, w tym konfiguracji i parametryzacji szybszej sieci R-CNN. W ostatniej sekcji omówiono szczegóły techniczne algorytmu i sieci propozycji regionu, odczytywanie i rozszerzanie danych wejściowych, a także różne opcje trenowania dla szybszej sieci R-CNN.

Szybki start

W tej sekcji założono, że masz skonfigurowany system do korzystania z interfejsu API języka Python CNTK. Ponadto założono, że używasz języka Python 3.5 w systemie Windows lub 3.5/3.6 w systemie Linux. Aby zapoznać się ze szczegółowym przewodnikiem, zapoznaj się z instrukcjami krok po kroku. Aby uruchomić szybszą wersję R-CNN, zainstaluj następujące dodatkowe pakiety w środowisku języka Python cntk

pip install opencv-python easydict pyyaml

Uruchamianie przykładu z toy

Używamy zestawu danych toy obrazów przechwyconych z lodówki, aby zademonstrować Szybsze R-CNN (tak samo jak w przypadku przykładu Fast R-CNN). Zarówno zestaw danych, jak i wstępnie wytrenowany model AlexNet można pobrać, uruchamiając następujące polecenie języka Python z folderu Examples/Image/Detection/FastRCNN:

python install_data_and_model.py

Po uruchomieniu skryptu zestaw danych z toy zostanie zainstalowany w folderze Examples/Image/DataSets/Grocery . Model AlexNet zostanie pobrany do PretrainedModels folderu . Zalecamy przechowywanie pobranych danych w odpowiednim folderze, ponieważ pliki konfiguracji zakładają, że lokalizacja jest domyślnie ustawiona.

Aby wytrenować i ocenić szybsze uruchomienie sieci R-CNN

python run_faster_rcnn.py

Wyniki kompleksowego szkolenia na temat artykułów spożywczych przy użyciu usługi AlexNet jako modelu podstawowego powinny wyglądać podobnie do następujących:

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

Aby zwizualizować przewidywane pola ograniczenia i etykiety na obrazach otwarte FasterRCNN_config.py z FasterRCNN folderu i ustaw

__C.VISUALIZE_RESULTS = True

Obrazy zostaną zapisane w folderze po uruchomieniu FasterRCNN/Output/Grocery/ polecenia python run_faster_rcnn.py.

Instrukcje krok po kroku

Konfigurowanie

Aby uruchomić kod w tym przykładzie, potrzebujesz środowiska języka Python CNTK (zobacz tutaj , aby uzyskać pomoc dotyczącą konfiguracji). Zainstaluj następujące dodatkowe pakiety w środowisku języka Python cntk

pip install opencv-python easydict pyyaml

Wstępnie skompilowane pliki binarne na potrzeby regresji pola ograniczenia i braku maksymalnego pomijania

Folder Examples\Image\Detection\utils\cython_modules zawiera wstępnie skompilowane pliki binarne, które są wymagane do uruchomienia szybszej sieci R-CNN. Wersje, które są obecnie zawarte w repozytorium, to Python 3.5 dla systemów Windows i Python 3.5, 3.6 dla systemu Linux, wszystkie 64-bitowe. Jeśli potrzebujesz innej wersji, możesz ją skompilować, wykonując kroki opisane w temacie

Skopiuj wygenerowane cython_bbox pliki binarne i cpu_nms (i/lub gpu_nms) z $FRCN_ROOT/lib/utils do .$CNTK_ROOT/Examples/Image/Detection/utils/cython_modules

Przykładowy model danych i linii bazowej

Używamy wstępnie wytrenowanego modelu AlexNet jako podstawy trenowania Faster-R-CNN (w przypadku VGG lub innych modeli podstawowych zobacz Korzystanie z innego modelu podstawowego. Zarówno przykładowy zestaw danych, jak i wstępnie wytrenowany model AlexNet można pobrać, uruchamiając następujące polecenie języka Python z folderu FastRCNN :

python install_data_and_model.py

Konfiguracja i parametry

Parametry są pogrupowane w trzy części:

  • Parametry detektora (zobacz FasterRCNN/FasterRCNN_config.py)
  • Parametry zestawu danych (zobacz na przykład utils/configs/Grocery_config.py)
  • Podstawowe parametry modelu (zobacz na przykład utils/configs/AlexNet_config.py)

Trzy części są ładowane i scalane w metodzie get_configuration() w run_faster_rcnn.pypliku . W tej sekcji omówimy parametry detektora. Parametry zestawu danych są opisane tutaj, podstawowe parametry modelu tutaj. W poniższych krokach przechodzimy przez zawartość od góry FasterRCNN_config.py do dołu. Konfiguracja używa EasyDict pakietu, który umożliwia łatwy dostęp do zagnieżdżonych słowników.

# 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

Pierwszy blok parametrów zawiera instrukcje wyższego poziomu dotyczące procesu trenowania. __C.CNTK.TRAIN_E2E umożliwia wybranie kompleksowego lub 4-etapowego schematu szkoleniowego. Szczegółowe informacje o dwóch schematach szkoleniowych opisano tutaj. __C.CNTK.FAST_MODE = True uruchamia tylko jedną epokę; Warto sprawdzić, czy konfiguracja działa, a wszystkie parametry są poprawne. __C.CNTK.DEBUG_OUTPUT = True Generuje dodatkowy komunikat debugowania w danych wyjściowych konsoli. Przedstawia również wykresy obliczeniowe CNTK dla modeli trenowania i oceny (zwróć uwagę na wymagania dotyczące kreślenia grafów CNTK). Wynikowe wykresy są przechowywane w folderze FasterRCNN/Output . __C.STORE_EVAL_MODEL_WITH_NATIVE_UDF = True Program będzie przechowywać drugi model oceny, który używa tylko kodu natywnego (bez warstw języka Python). Ten model można na przykład załadować i ocenić z języka C++ lub 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]

Drugi blok zawiera parametry uczenia. Są to głównie zwykłe parametry uczenia CNTK. Jedynym wyjątkiem jest __C.CNTK.BIAS_LR_MULT, czyli mnożnik szybkości nauki, który jest używany dla wszystkich uprzedzeń w sieci. Zasadniczo trenuje uprzedzenia z dwukrotnie większą częstotliwością nauki, która jest również wykonywana w oryginalnym kodzie R-CNN. Liczba epok i szybkość nauki na próbkę są określane oddzielnie dla dwóch różnych schematów uczenia (pominięto powyżej 4-etapowe parametry).

# 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 określa maksymalną liczbę adnotacji prawdy podstawowej na obraz. CnTK obecnie wymaga ustawienia maksymalnej liczby. Jeśli istnieje mniej adnotacji, zostaną one wypełnione wewnętrznie. __C.IMAGE_WIDTH i __C.IMAGE_HEIGHT są wymiarami używanymi do zmiany rozmiaru i wypełnienia obrazów wejściowych. __C.RESULTS_NMS_THRESHOLD to próg NMS używany do odrzucania nakładających się przewidywanych pól ograniczenia w ocenie. Niższy próg daje mniej usuwania, a tym samym bardziej przewidywane pola ograniczenia w końcowych danych wyjściowych.

# 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 Rozszerzy dane treningowe przez przerzucanie wszystkich obrazów co drugą epokę, tj. pierwsza epoka ma wszystkie zwykłe obrazy, drugi ma przerzucane obrazy itd. __C.TRAIN_CONV_LAYERS określa, czy warstwy konwolucyjne, od danych wejściowych do mapy funkcji splotowych, zostaną wytrenowane lub naprawione. Naprawianie wagi warstw konwowych oznacza, że wagi z modelu podstawowego są pobierane i nie są modyfikowane podczas trenowania. (Możesz również określić liczbę warstw konwerowych, które chcesz wytrenować, zobacz sekcję Using a different base model (Korzystanie z innego modelu bazowego). W przypadku parametrów rpn zapoznaj się z komentarzami obok ich definicji lub zapoznaj się z oryginalnym dokumentem badawczym, aby uzyskać więcej szczegółów. Ponadto dla następujących parametrów detektora:

# 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)

Uruchamianie szybszego R-CNN na pascal VOC

Aby pobrać dane Pascal i utworzyć pliki adnotacji dla Pascal w formacie CNTK, uruchom następujące skrypty:

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

dataset_cfg Zmień metodę w metodzie run_faster_rcnn.py na get_configuration()

from utils.configs.Pascal_config import cfg as dataset_cfg

Teraz masz ustawioną opcję trenowania na danych Pascal VOC 2007 przy użyciu polecenia python run_faster_rcnn.py. Uważaj, że szkolenie może trochę potrwać.

Uruchamianie szybszej sieci R-CNN na własnych danych

Przygotowywanie własnych danych i dodawanie adnotacji do pól granic prawdy naziemnej zostało opisane w temacie Wykrywanie obiektów przy użyciu szybkiej sieci R-CNN. Po zapisaniu obrazów w opisanej strukturze folderów i dodawaniu do nich adnotacji uruchom polecenie

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

po zmianie folderu w tym skrycie na folder danych. Na koniec utwórz element MyDataSet_config.py w utils\configs folderze poniżej istniejących przykładów, tak jak w tym fragmencie kodu:

...

# 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 jest używany w programie generate_anchors() (zobacz utils/rpn/generate_anchors.py). Począwszy od podstawowego rozmiaru 16 trzech kotwic z współczynnikami proporcji 0.5, 1.0 i 2.0 są tworzone w wyniku (8 x 24, 16 x 16, 24 x 8). Są one mnożone przy użyciu każdej skali warstwy propozycji, co powoduje dziewięć kotwic (64 x 192... , 768 x 256). Są to współrzędne bezwzględne pikseli w.r.t. obrazu wejściowego. Wszystkie kotwice są stosowane w każdej pozycji przestrzennej mapy funkcji splotu w celu wygenerowania interesujących ich regionów. Dostosuj te warstwy propozycji do skalowania zgodnie z rozmiarami obiektów w zestawie danych i rozmiarem obrazu wejściowego, którego używasz. Na przykład w przypadku zestawu danych spożywczych używamy __C.DATA.PROPOSAL_LAYER_SCALES = [4, 8, 12] i rozmiaru 850 x 850 obrazu wejściowego (zobacz utils/configs/Grocery_config.py).

Aby wytrenować i ocenić szybciej R-CNN na danych, zmień metodę dataset_cfg w metodzie get_configuration()run_faster_rcnn.py na

from utils.configs.MyDataSet_config import cfg as dataset_cfg

i uruchom polecenie python run_faster_rcnn.py.

Szczegóły techniczne

Ponieważ większość detektorów obiektów opartych na sieci DNN Szybsze R-CNN korzysta z uczenia transferowego. Rozpoczyna się od modelu podstawowego, który jest modelem wyszkolonym do klasyfikacji obrazów. Model podstawowy jest wycinany na dwie części, a pierwszy to wszystkie warstwy splotowe do (i z wyłączeniem) ostatniej warstwy buforowania, a druga część to pozostała część sieci z (i wykluczenie) ostatniej warstwy buforowania do (ponownie z wyłączeniem) ostatecznej warstwy przewidywania. Dane wyjściowe pierwszej części są czasami nazywane mapą funkcji splotowych. Jest to używane jako dane wejściowe do warstwy puli roi, która wykonuje operację buforowania na części mapy wejściowej odpowiadającej propozycjom regionów na oryginalnym obrazie. Propozycje regionów to drugi wkład w warstwę puli roi. W sekcji Szybsze R-CNN te propozycje są generowane przez małą podsieć o nazwie sieć propozycji regionu (RPN, zobacz następną sekcję).

Dane wyjściowe warstwy puli roi zawsze będą miały taki sam stały rozmiar, jak wszystkie dane wejściowe (mapa funkcji konwolucyjnej i propozycja regionu) do tego samego rozmiaru danych wyjściowych. Należy pamiętać, że rozmiar danych wejściowych, tj. rozmiar mapy konwolucyjnej, a tym samym rozmiar obrazu wejściowego, może być dowolny. Do trenowania algorytmu są używane cztery funkcje utraty, dwa dla nazwy RPN i dwa dla detektora (zobacz również następną sekcję). Poniższa metoda jest zawarta w FasterRCNN_train.py pliku i pokazuje wysoką konstrukcję modelu Faster R-CNN. Zapoznaj się z tematem iutils/rpn/rpn_helpers.py, aby FasterRCNN_train.py uzyskać pełny kod.

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

Po wytrenowaniu sieci jest konwertowana na model oceny przez usunięcie wszystkich części, które nie są wymagane do oceny, na przykład funkcji utraty. Końcowy model oceny ma trzy dane wyjściowe (zobacz create_faster_rcnn_eval_model() w FasterRCNN_train.py artykule, aby uzyskać więcej szczegółów):

  • rpn_rois - współrzędne bezwzględne pikseli kandydata rois
  • cls_pred — prawdopodobieństwa klas dla każdego zwrotu z inwestycji
  • bbox_regr - współczynniki regresji na klasę dla każdego zwrotu z inwestycji

Aby użyć modelu oceny w języku Python, możesz użyć elementu z FasterRCNN_eval.pypolecenia FasterRCNN_Evaluator . Model można załadować raz, a następnie ocenić pojedyncze obrazy zgodnie z rzeczywistym użyciem. Metoda process_image() ewaluatora przyjmuje ścieżkę do obrazu jako argument, ocenia model na tym obrazie i stosuje regresję pola ograniczenia do wynikowych zwrotów z inwestycji. Zwraca on regresjowane zwroty z inwestycji i odpowiadające im prawdopodobieństwa klasy:

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

Sieć propozycji regionów

Szybsze R-CNN używa tak zwanej propozycji regionu netwrok (RPN), która generuje wybrane regiony zainteresowania (ROI) na podstawie obrazu wejściowego. Jest to sprzeczne z fast R-CNN, który wymaga, aby propozycje regionów zostały dostarczone przez zewnętrzne źródło. Nazwa RPN jest zasadniczo zbudowana przez trzy warstwy konwolucji i nową warstwę o nazwie warstwa propozycji. Nowe warstwy są realizowane jako funkcja zdefiniowana przez użytkownika (UDF) w języku Python lub C++ (zobacz szczegóły poniżej). Kod języka Python, który tworzy nazwę RPN w pliku CNTK, znajduje się w utils/rpn/rpn_helpers.pysystemie , nowe warstwy, takie jak warstwa propozycji, znajdują się w folderze utils/rpn .

Dane wejściowe do nazwy RPN to mapa funkcji splotu, taka sama, która jest danymi wejściowymi warstwy puli ROI. Te dane wejściowe są przekazywane do pierwszej warstwy splotu nazwy RPN, a wynik jest propagowany do pozostałych dwóch warstw konwolucji. Jeden z tych ostatnich przewiduje wyniki klas dla każdego regionu kandydata, tj. dla każdej kotwicy na każdej pozycji przestrzennej (9 kotwic x 2 wyniki x szerokość x wysokość). Dwa wyniki są konwertowane (przy użyciu węzła softmax) na wyniki obiektów na kandydata, które są interpretowane jako prawdopodobieństwo, że region kandydata zawiera obiekt pierwszego planu lub nie. Druga warstwa splotowa przewiduje współczynniki regresji dla rzeczywistej pozycji roI, ponownie dla każdego kandydata (9 kotwic x 4 współczynniki x szerokość x wysokość).

Współczynniki regresji i wyniki obiektów (pierwszego planu i prawdopodobieństwa w tle) są wprowadzane do warstwy propozycji. Ta warstwa najpierw stosuje współczynniki regresji do wygenerowanych kotwic, przycina wynik do granic obrazu i filtruje regiony kandydatów, które są zbyt małe. Następnie sortuje kandydatów według prawdopodobieństwa pierwszego planu, stosuje pomijanie nieskonfiguracyjne (NMS), aby zmniejszyć liczbę kandydatów i wreszcie próbkować żądaną liczbę zwrotów z inwestycji dla swoich danych wyjściowych.

Podczas trenowania Szybsze R-CNN wymaga dwóch dodatkowych nowych warstw: warstwy docelowej kotwicy i warstwy docelowej propozycji. Warstwa docelowa zakotwiczenia generuje wartości docelowe dla wyniku obiektu i współczynniki regresji RPN, które są używane w funkcjach utraty nazwy RPN. Podobnie warstwa docelowa propozycji generuje etykiety klas docelowych dla wskaźników ROI i docelowych współczynników regresji na klasę dla końcowego detektora, które są używane w funkcjach utraty detektora.

Podczas oceny wymagana jest tylko warstwa propozycji (ponieważ nie są potrzebne żadne cele dla funkcji utraty). Warstwa propozycji w języku CNTK jest dostępna w języku Python, a także w języku C++, warstwy docelowe są obecnie dostępne tylko w języku Python. W związku z tym trenowanie szybszego protokołu R-CNN musi być obecnie wykonywane z poziomu interfejsu API języka Python. Aby przechowywać model oceny po trenowaniu, który używa natywnego zestawu __C.STORE_EVAL_MODEL_WITH_NATIVE_UDF = Trueimplementacji warstwy propozycji .

Źródło czytnika i minibatch

Podczas skalowania obrazów lub przerzucania obrazów na potrzeby rozszerzania danych musimy również zastosować te same przekształcenia do adnotacji podstawowej prawdy. (Przerzucanie również musi być stosowane do buforowanych propozycji w 4-etapowym szkoleniu, zobacz następną sekcję). Ponieważ te połączone przekształcenia obrazów i adnotacji nie są obecnie obsługiwane przez wbudowanych czytników CNTK, używamy niestandardowego czytnika języka Python i dla UserMinibatchSource szybszego R-CNN. Są one zawarte odpowiednio w utils/od_reader.py i utils/od_mb_source.py .

Trenowanie E2E i 4-etapowe

W dokumencie badawczym Faster R-CNN opisano dwie metody trenowania sieci. Kompleksowe trenowanie trenuje całą sieć w jednym treningu przy użyciu wszystkich czterech funkcji utraty (utrata regresji rpn, utrata obiektów rpn, utrata regresji detektora, utrata klasy detektora). Domyślnie używamy kompleksowego trenowania, można wybrać między nimi, ustawiając odpowiednio w elemecie __C.CNTK.TRAIN_E2EFasterRCNN_config.py.

4-etapowy schemat treningowy alternatywny między trenowaniem tylko sieci propozycji regionu (utrzymanie stałej wykrywacza) i trenowanie tylko detektora (naprawianie wag RPN). Ten schemat trenowania jest implementowany w train_faster_rcnn_alternating() programie .FasterRCNN_train.py Jest nieco bardziej skomplikowany i często wykorzystuje części klonowania modelu, aby umożliwić selektywne zamrażanie i trenowanie wagi. Ponadto w 4-etapowym szkoleniu propozycje z RPN są buforowane po etapach jeden i trzeci i używane w kolejnym etapie.

Korzystanie z innego modelu podstawowego

Aby użyć innego modelu podstawowego, należy wybrać inną konfigurację modelu w get_configuration() metodzie run_faster_rcnn.py. Dwa modele są obsługiwane od razu:

    # 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

Aby pobrać model VGG16, użyj skryptu pobierania w pliku <cntkroot>/PretrainedModels:

    python download_model.py VGG16_ImageNet_Caffe

Jeśli chcesz użyć innego innego modelu podstawowego, musisz skopiować na przykład plik utils/configs/VGG16_config.py konfiguracji i zmodyfikować go zgodnie z modelem podstawowym:

# 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

Aby zbadać nazwy węzłów modelu podstawowego, możesz użyć plot() metody z cntk.logging.graph. Należy pamiętać, że modele ResNet nie są obecnie obsługiwane, ponieważ buforowanie roi w elemencie CNTK nie obsługuje jeszcze średniej puli roi.