Sdílet prostřednictvím


Rozpoznávání objektů pomocí rychlého připojení R-CNN

Obsah

Souhrn

obrázek obrázku

Tento kurz popisuje, jak používat fast R-CNN v rozhraní CNTK Python API. Rychlé R-CNN pomocí BrainScriptu a cnkt.exe je zde popsáno.

Výše uvedené příklady jsou obrázky a poznámky k objektům pro datnou sadu potravin (vlevo) a sadu dat Pascal VOC (vpravo) použitou v tomto kurzu.

Fast R-CNN je algoritmus detekce objektů navržený Rossem Girshickem v roce 2015. Dokument je přijat na ICCV 2015 a archivován na https://arxiv.org/abs/1504.08083adrese . Rychlá síť R-CNN vychází z předchozí práce na efektivní klasifikaci návrhů objektů pomocí hlubokých konvolučních sítí. V porovnání s předchozí prací využívá fast R-CNN oblast schématu sdružování zájmů , která umožňuje opakovaně používat výpočty z konvolučních vrstev.

Nastavení

Pokud chcete kód spustit v tomto příkladu, potřebujete prostředí PYTHONu CNTK (nápovědu k nastavení najdete tady ). Nainstalujte do prostředí Pythonu cntk následující další balíčky.

pip install opencv-python easydict pyyaml dlib

Předkompilované binární soubory pro regresi ohraničujícího rámečku a ne maximální potlačení

Složka Examples\Image\Detection\utils\cython_modules obsahuje předem zkompilované binární soubory, které jsou potřeba pro spuštění fast R-CNN. Verze, které jsou aktuálně obsažené v úložišti, jsou Python 3.5 pro Windows a Python 3.5, 3.6 pro Linux, všechny 64bitové verze. Pokud potřebujete jinou verzi, můžete ji zkompilovat podle kroků popsaných v tématu

Zkopírujte vygenerované cython_bbox a cpu_nms (nebo gpu_nms) binární soubory od $FRCN_ROOT/lib/utils do $CNTK_ROOT/Examples/Image/Detection/utils/cython_modules.

Příklad modelu dat a směrného plánu

Jako základ pro trénování Fast-R-CNN používáme předem natrénovaný model AlexNet (pro VGG nebo jiné základní modely viz Použití jiného základního modelu. Ukázkovou datovou sadu i předem vytrénovaný model AlexNet si můžete stáhnout spuštěním následujícího příkazu Pythonu ze složky FastRCNN:

python install_data_and_model.py

Spuštění příkladu toy

Trénování a vyhodnocení rychlého spuštění R-CNN

python run_fast_rcnn.py

Výsledky pro trénování s návratností 2000 ROI pro potraviny pomocí AlexNetu by měly vypadat přibližně takto:

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

Vizualizace předpovídané ohraničující rámečky a popisky na obrázcích otevřených FastRCNN_config.py ze FastRCNN složky a nastavení

__C.VISUALIZE_RESULTS = True

Obrázky se uloží do FastRCNN/Output/Grocery/ složky, pokud spustíte python run_fast_rcnn.py.

Train on Pascal VOC

Pokud chcete stáhnout data Pascal a vytvořit soubory poznámek pro Pascal ve formátu CNTK, spusťte následující skripty:

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

dataset_cfg Změna metody get_configuration()run_fast_rcnn.py na

from utils.configs.Pascal_config import cfg as dataset_cfg

Teď jste nastavili trénování dat Pascal VOC 2007 pomocí python run_fast_rcnn.py. Pozor na to, že trénování může chvíli trvat.

Trénování vlastních dat

Příprava vlastní datové sady

Možnost č. 1: Nástroj pro označování vizuálních objektů (doporučeno)

Nástroj VOTT (Visual Object Tagging Tool) je nástroj pro označování videí a obrázků pro označování videí a obrázků pomocí nástroje pro poznámky mezi platformami.

Snímek obrazovky Vott

VOTT poskytuje následující funkce:

  • Označování a sledování objektů ve videích s asistencí počítače pomocí sledovacího algoritmu Camshiftu
  • Export značek a prostředků do formátu CNTK Fast-RCNN pro trénování modelu detekce objektů
  • Spuštění a ověření vytrénovaného modelu detekce objektů CNTK na nových videích za účelem generování silnějších modelů

Jak anotovat pomocí VOTT:

  1. Stažení nejnovější verze
  2. Pokud chcete spustit úlohu označování, postupujte podle readme .
  3. Po označení značky Exportovat značky do adresáře datové sady

Možnost č. 2: Použití skriptů poznámek

Pro trénování modelu CNTK Fast R-CNN ve vaší vlastní sadě dat poskytujeme dva skripty pro přidávání poznámek k obdélníkovým oblastem na obrázcích a přiřazování popisků k těmto oblastem. Skripty uloží poznámky ve správném formátu podle potřeby v prvním kroku spuštění sítě Fast R-CNN (A1_GenerateInputROIs.pyFast R-CNN). Nejprve uložte obrázky do následující struktury složek.

  • <your_image_folder>/negative – obrázky používané pro trénování, které neobsahují žádné objekty
  • <your_image_folder>/positive – obrázky používané pro trénování, které obsahují objekty
  • <your_image_folder>/testImages – obrázky používané k testování, které obsahují objekty

U negativních obrázků nemusíte vytvářet žádné poznámky. Pro ostatní dvě složky použijte poskytnuté skripty:

  • Spuštěním nakreslete C1_DrawBboxesOnImages.py ohraničující rámečky na obrázcích.
    • V sadě imgDir = <your_image_folder> skriptů (/positive nebo /testImages) před spuštěním.
    • Přidejte poznámky pomocí kurzoru myši. Jakmile jsou všechny objekty v obrázku opatřeny poznámkami, stisknutím klávesy n zapíšete soubor .bboxes.txt a pak přejdete k dalšímu obrázku, vrátí se zpět (tj. odebere) poslední obdélník a funkce q nástroj poznámek ukončí.
  • Spusťte C2_AssignLabelsToBboxes.py přiřazení popisků k ohraničujícím polím.
    • V sadě imgDir = <your_image_folder> skriptů (/positive nebo /testImages) před spuštěním...
    • ... a přizpůsobte třídy ve skriptu tak, aby odrážely vaše kategorie objektů, například classes = ("dog", "cat", "octopus").
    • Skript načte tyto ručně anotované obdélníky pro každý obrázek, zobrazí je 1:1 a požádá uživatele, aby zadal třídu objektu kliknutím na příslušné tlačítko vlevo od okna. Uzemněné poznámky pravdy označené jako "nedecidované" nebo "vyloučení" jsou zcela vyloučeny z dalšího zpracování.

Trénování na vlastní datové sadě

Po uložení obrázků do popsané struktury složek a jejich přidávání poznámek spusťte

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

po změně složky v daném skriptu na složku s daty. Nakonec vytvořte MyDataSet_config.py ve utils\configs složce následující existující příklady:

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

Všimněte si, že __C.CNTK.PROPOSAL_LAYER_SCALES se nepoužívá pro fast R-CNN, pouze pro Rychlejší R-CNN.

Trénování a vyhodnocení rychlé sítě R-CNN u dat změní metodu dataset_cfgget_configuration()run_fast_rcnn.py na

from utils.configs.MyDataSet_config import cfg as dataset_cfg

a spusťte python run_fast_rcnn.py.

Technické podrobnosti

Algoritmus Fast R-CNN je vysvětlený v části Podrobnosti algoritmu společně s přehledem o tom, jak se implementuje v rozhraní API Pythonu CNTK. Tato část se zaměřuje na konfiguraci sítě Fast R-CNN a o tom, jak používat různé základní modely.

Parametry

Parametry jsou seskupené do tří částí:

  • Parametry detektoru (viz FastRCNN/FastRCNN_config.py)
  • Parametry sady dat (viz například utils/configs/Grocery_config.py)
  • Parametry základního modelu (viz příklad utils/configs/AlexNet_config.py)

Tři části jsou načteny a sloučeny v get_configuration() metodě v run_fast_rcnn.py. V této části probereme parametry detektoru. Parametry sady dat jsou zde popsány, základní parametry modelu zde. V následujícím příkladu projdeme nejdůležitější parametry v FastRCNN_config.py. Všechny parametry jsou v souboru také komentovány. Konfigurace používá EasyDict balíček, který umožňuje snadný přístup k vnořeným slovníkům.

# Number of regions of interest [ROIs] proposals
__C.NUM_ROI_PROPOSALS = 200 # use 2000 or more for good results
# the minimum IoU (overlap) of a proposal to qualify for training regression targets
__C.BBOX_THRESH = 0.5

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

# 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

Návrhy ROI se počítají za běhu v první epochě pomocí selektivní implementace vyhledávání z dlib balíčku. Počet vygenerovaných návrhů je řízen parametrem __C.NUM_ROI_PROPOSALS . Doporučujeme použít přibližně 2000 návrhů. Regresní hlava je vytrénována pouze na těch ROI, které mají překrývání (IoU) s uzemněnou pravdou alespoň __C.BBOX_THRESH.

__C.INPUT_ROIS_PER_IMAGE určuje maximální počet poznámek základní pravdy na obrázek. CNTK v současné době vyžaduje nastavení maximálního počtu. Pokud existuje méně poznámek, budou interně vycpané. __C.IMAGE_WIDTH a __C.IMAGE_HEIGHT jsou rozměry, které slouží ke změně velikosti a vkládání vstupních obrázků.

__C.TRAIN.USE_FLIPPED = True rozšíří trénovací data tak, že překlopí všechny obrázky každé druhé epochy, tj. první epocha bude mít všechny běžné obrázky, druhý má všechny obrázky překlopené atd. __C.TRAIN_CONV_LAYERS určuje, zda budou konvoluční vrstvy ze vstupu do konvoluční mapy funkcí natrénovány nebo opraveny. Oprava hmotností konvové vrstvy znamená, že váhy ze základního modelu se při trénování neupravují a nemění. (Můžete také určit, kolik konv vrstev chcete trénovat, viz část Použití jiného základního modelu).

# NMS threshold used to discard overlapping predicted bounding boxes
__C.RESULTS_NMS_THRESHOLD = 0.5

# If set to True the following two parameters need to point to the corresponding files that contain the proposals:
# __C.DATA.TRAIN_PRECOMPUTED_PROPOSALS_FILE
# __C.DATA.TEST_PRECOMPUTED_PROPOSALS_FILE
__C.USE_PRECOMPUTED_PROPOSALS = False

__C.RESULTS_NMS_THRESHOLD je prahová hodnota NMS použitá k zahození překrývajícího se predikovaného ohraničujícího rámečku při vyhodnocování. Nižší prahová hodnota přináší méně odebrání a tím více předpovídané ohraničující rámečky v konečném výstupu. Pokud nastavíte __C.USE_PRECOMPUTED_PROPOSALS = True čtečku, přečte předpočítaná roI z textových souborů. Používá se například pro trénování dat Pascal VOC. Názvy souborů __C.DATA.TRAIN_PRECOMPUTED_PROPOSALS_FILE a __C.DATA.TEST_PRECOMPUTED_PROPOSALS_FILE jsou zadány v Examples/Image/Detection/utils/configs/Pascal_config.py.

# The basic segmentation is performed kvals.size() times. The k parameter is set (from, to, step_size)
__C.roi_ss_kvals = (10, 500, 5)
# When doing the basic segmentations prior to any box merging, all
# rectangles that have an area < min_size are discarded. Therefore, all outputs and
# subsequent merged rectangles are built out of rectangles that contain at
# least min_size pixels. Note that setting min_size to a smaller value than
# you might otherwise be interested in using can be useful since it allows a
# larger number of possible merged boxes to be created
__C.roi_ss_min_size = 9
# There are max_merging_iterations rounds of neighboring blob merging.
# Therefore, this parameter has some effect on the number of output rectangles
# you get, with larger values of the parameter giving more output rectangles.
# Hint: set __C.CNTK.DEBUG_OUTPUT=True to see the number of ROIs from selective search
__C.roi_ss_mm_iterations = 30
# image size used for ROI generation
__C.roi_ss_img_size = 200

Výše uvedené parametry konfigurují selektivní vyhledávání knihovny dlib. Podrobnosti najdete na domovské stránce knihovny dlib. Následující další parametry se používají k filtrování generovaných ROI w.r.t. minimální a maximální boční délky, oblasti a poměru stran.

# minimum relative width/height of an ROI
__C.roi_min_side_rel = 0.01
# maximum relative width/height of an ROI
__C.roi_max_side_rel = 1.0
# minimum relative area of an ROI
__C.roi_min_area_rel = 0.0001
# maximum relative area of an ROI
__C.roi_max_area_rel = 0.9
# maximum aspect ratio of an ROI vertically and horizontally
__C.roi_max_aspect_ratio = 4.0
# aspect ratios of ROIs for uniform grid ROIs
__C.roi_grid_aspect_ratios = [1.0, 2.0, 0.5]

Pokud selektivní vyhledávání vrátí více ROI, než je požadováno, jsou náhodně vzorkovány. Pokud se v běžné mřížce vygeneruje méně ROI, vygenerují se další roI pomocí zadaného __C.roi_grid_aspect_ratios.

Použití jiného základního modelu

Chcete-li použít jiný základní model, musíte zvolit jinou konfiguraci modelu v get_configuration() metodě run_fast_rcnn.py. Hned se podporují dva modely:

    # 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

Ke stažení modelu VGG16 použijte skript pro stažení v :<cntkroot>/PretrainedModels

    python download_model.py VGG16_ImageNet_Caffe

Pokud chcete použít jiný základní model, musíte zkopírovat například konfigurační soubor utils/configs/VGG16_config.py a upravit ho podle základního modelu:

# 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

Pokud chcete prozkoumat názvy uzlů základního modelu, můžete použít metodu plot() z cntk.logging.graph. Upozorňujeme, že modely ResNet se v současné době nepodporují, protože sdružování roi v CNTK zatím nepodporuje průměrné sdružování roi.

Podrobnosti o algoritmu

Rychlé R-CNN

R-CNN pro detekci objektů byly poprvé prezentovány v roce 2014 RossEm Girshickem et al., a ukázaly se, že překonaly předchozí nejmodernější přístupy k jednomu z hlavních problémů rozpoznávání objektů v oblasti: Pascal VOC. Od té doby byly publikovány dva následné dokumenty, které obsahují významná vylepšení rychlosti: Fast R-CNN a Faster R-CNN.

Základní myšlenkou sítě R-CNN je vzít hlubokou neurální síť, která byla původně natrénována pro klasifikaci obrázků pomocí milionů obrázků s poznámkami a upravit ji pro účely detekce objektů. Základní myšlenka z prvního dokumentu R-CNN je znázorněna na obrázku níže (převzato z papíru): (1) Při zadání vstupního obrázku (2) v prvním kroku se vygenerují návrhy velkého počtu oblastí. (3) Tyto návrhy oblastí nebo oblasti zájmů (ROI) se pak každý nezávisle odesílá prostřednictvím sítě, která vypíše vektor například 4096 hodnot s plovoucí desetinou čárkou pro každou roI. Nakonec (4) se naučí klasifikátor, který přebírá reprezentaci 4096 float ROI jako vstup a vypíše popisek a spolehlivost každé NÁVRATNOSTI.

Obrázek

I když tento přístup funguje dobře z hlediska přesnosti, je velmi nákladné vypočítat, protože pro každou návratnost dat musí být vyhodnocena neurální síť. Rychlá síť R-CNN tuto nevýhodu řeší pouze vyhodnocením většiny sítě (aby byla specifická: konvoluční vrstvy) na jeden čas na obrázek. Podle autorů to vede k 213násobné zrychlení během testování a 9x zrychlení během trénování bez ztráty přesnosti. Toho dosáhnete pomocí vrstvy fondu ROI, která promítá NÁVRATNOSTI na konvoluční mapu funkcí a provede maximální sdružování, aby se vygenerovala požadovaná výstupní velikost, kterou očekává následující vrstva. V příkladu AlexNetu použitém v tomto kurzu se vrstva sdružování ROI umístí mezi poslední konvoluční vrstvu a první plně propojenou vrstvu. V kódu rozhraní CNTK Python API zobrazeném níže je to realizováno klonováním dvou částí sítě, a conv_layers .fc_layers Vstupní obrázek se pak nejprve normalizuje, prosadí vrstvu conv_layers, vrstvu roipooling a fc_layers nakonec predikci a regresní hlavy se přidají, které predikují popisek třídy a regresní koeficienty na kandidátské ROI.

def create_fast_rcnn_model(features, roi_proposals, label_targets, bbox_targets, bbox_inside_weights, 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)

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

    return detection_losses, pred_error

def create_fast_rcnn_predictor(conv_out, rois, fc_layers, cfg):
    # RCNN
    roi_out = roipooling(conv_out, rois, cntk.MAX_POOLING, (6, 6), spatial_scale=1/16.0)
    fc_out = fc_layers(roi_out)

    # prediction head
    cls_score = plus(times(fc_out, W_pred), b_pred, name='cls_score')

    # regression head
    bbox_pred = plus(times(fc_out, W_regr), b_regr, name='bbox_regr')

    return cls_score, bbox_pred

Původní implementace Caffe použitá v dokumentech R-CNN najdete na GitHubu: RCNN, Fast R-CNN a Faster R-CNN.

Trénování SVM vs. NN

Patrick Buehler poskytuje pokyny, jak vytrénovat SVM na výstupu CNTK Fast R-CNN (pomocí funkcí 4096 z poslední plně připojené vrstvy), stejně jako diskuzi o pros a nevýhody zde.

Selektivní vyhledávání je metoda pro vyhledání velké sady možných umístění objektů na obrázku nezávisle na třídě skutečného objektu. Funguje tak, že seskupí obrazové pixely do segmentů a pak provede hierarchické clusteringy, aby zkombinoval segmenty ze stejného objektu do návrhů objektů.

obrázekobrázku

Abychom doplnili zjištěné návratnosti z selektivního vyhledávání, přidáme roi, které uniformují obrázek v různých měřítkech a poměrech stran. Obrázek vlevo ukazuje příklad výstupu selektivního vyhledávání, kde je každé možné umístění objektu vizualizováno zeleným obdélníkem. ROI, které jsou příliš malé, příliš velké atd. jsou zahozeny (uprostřed) a nakonec roi, které rovnoměrně pokrývají obrázek, se přidají (vpravo). Tyto obdélníky se pak používají jako oblasti zájmu (ROI) v kanálu R-CNN.

Cílem generování ROI je najít malou sadu ROI, které však úzce pokrývají co nejvíce objektů na obrázku. Tento výpočet musí být dostatečně rychlý, zatímco současně vyhledá umístění objektů v různých měřítkech a poměrech stran. Selektivní vyhledávání bylo pro tuto úlohu zobrazeno dobře, s dobrou přesností pro urychlení kompromisů.

NMS (bez maximálního potlačení)

Metody detekce objektů často vypisují více detekcí, které plně nebo částečně pokrývají stejný objekt na obrázku. Tyto návratnosti dat je potřeba sloučit, aby bylo možné spočítat objekty a získat jejich přesná umístění na obrázku. To se tradičně provádí pomocí techniky, která se nazývá Non Maximum Potlačení (NMS). Verze NMS, kterou používáme (a která byla také použita v publikacích R-CNN), nesloučí roI, ale místo toho se snaží identifikovat, které roi nejlépe pokrývají skutečné umístění objektu a zahodí všechny ostatní ROI. To je implementováno iterativním výběrem roI s nejvyšší jistotou a odebráním všech ostatních ROI, které výrazně překrývají tuto NÁVRATNOSTI a jsou klasifikovány jako stejné třídy. Prahovou hodnotu pro překrytí je možné nastavit v PARAMETERS.py (podrobnosti).

Výsledky detekce před (vlevo) a za (vpravo) Bez maximálního potlačení:

obrázek obrázku

mAP (střední průměrná přesnost)

Po vytrénování lze kvalitu modelu měřit pomocí různých kritérií, jako je přesnost, úplnost, přesnost, oblast podkřivení atd. Běžnou metrikou, která se používá pro výzvu rozpoznávání objektů Pascal VOC, je měřit průměrnou přesnost (AP) pro každou třídu. Následující popis průměrné přesnosti je převzat z Everingham et. al. Střední průměrná přesnost (mAP) se vypočítá tak, že převezme průměr nad APS všech tříd.

U daného úkolu a třídy se křivka přesnosti a úplnosti vypočítá z seřazeného výstupu metody. Úplnost je definována jako podíl všech pozitivních příkladů seřazených nad daným pořadím. Přesnost je podíl všech příkladů výše uvedených pořadí, které jsou z kladné třídy. Ap shrnuje tvar křivky přesnosti a úplnosti a je definován jako střední přesnost na sadě rovnoměrně rozmístěných úrovní úplnosti [0,0,1, . . . ,1]:

Obrázek

Přesnost na každé úrovni úplnosti r je interpolována pomocí maximální přesnosti měřené pro metodu, pro kterou odpovídající úplnost překračuje r:

Obrázek

kde p( ̃r) je naměřená přesnost při úplnosti ̃r. Záměrem interpolace křivky přesnosti a úplnosti tímto způsobem je snížit dopad "vlnovek" v křivkě přesnosti a úplnosti způsobené malými variacemi v pořadí příkladů. Je třeba poznamenat, že pokud chcete získat vysoké skóre, musí mít metoda přesnost na všech úrovních úplnosti – tato penalizuje metody, které načítají pouze podmnožinu příkladů s vysokou přesností (např. zobrazení na straně automobilů).