Package: ttach
TTAchImage Test Time Augmentation with PyTorch!Similar to what Data Augmentation is doing to the training set, the purpose of Test Time Augmentation is to perform random modifications to the test images. Thus, instead of showing the regular, “clean” images, only once to the trained model, we will show it the augmented images several times. We will then average the predictions of each corresponding image and take that as our final guess [1].Input
             |           # input batch of images 
        / / /|\ \ \      # apply augmentations (flips, rotation, scale, etc.)
       | | | | | | |     # pass augmented batches through model
       | | | | | | |     # reverse transformations for each batch of masks/labels
        \ \ \ / / /      # merge predictions (mean, max, gmean, etc.)
             |           # output batch of masks/labels
           OutputTable of ContentsQuick StartTransformsAliasesMerge modesInstallationQuick startSegmentation model wrapping:importttachasttatta_model=tta.SegmentationTTAWrapper(model,tta.aliases.d4_transform(),merge_mode='mean')Classification model wrapping:tta_model=tta.ClassificationTTAWrapper(model,tta.aliases.five_crop_transform())Keypoints model wrapping:tta_model=tta.KeypointsTTAWrapper(model,tta.aliases.flip_transform(),scaled=True)Note: the model must return keypoints in the formattorch([x1, y1, ..., xn, yn])Advanced ExamplesCustom transform:# defined 2 * 2 * 3 * 3 = 36 augmentations !transforms=tta.Compose([tta.HorizontalFlip(),tta.Rotate90(angles=[0,180]),tta.Scale(scales=[1,2,4]),tta.Multiply(factors=[0.9,1,1.1]),])tta_model=tta.SegmentationTTAWrapper(model,transforms)Custom model (multi-input / multi-output)# Example how to process ONE batch on images with TTA# Here `image`/`mask` are 4D tensors (B, C, H, W), `label` is 2D tensor (B, N)fortransformerintransforms:# custom transforms or e.g. tta.aliases.d4_transform()# augment imageaugmented_image=transformer.augment_image(image)# pass to modelmodel_output=model(augmented_image,another_input_data)# reverse augmentation for mask and labeldeaug_mask=transformer.deaugment_mask(model_output['mask'])deaug_label=transformer.deaugment_label(model_output['label'])# save resultslabels.append(deaug_mask)masks.append(deaug_label)# reduce results as you want, e.g mean/max/minlabel=mean(labels)mask=mean(masks)TransformsTransformParametersValuesHorizontalFlip--VerticalFlip--Rotate90anglesList[0, 90, 180, 270]ScalescalesinterpolationList[float]"nearest"/"linear"Resizesizesoriginal_sizeinterpolationList[Tuple[int, int]]Tuple[int,int]"nearest"/"linear"AddvaluesList[float]MultiplyfactorsList[float]FiveCropscrop_heightcrop_widthintintAliasesflip_transform (horizontal + vertical flips)hflip_transform (horizontal flip)d4_transform (flips + rotation 0, 90, 180, 270)multiscale_transform (scale transform, take scales as input parameter)five_crop_transform (corner crops + center crop)ten_crop_transform (five crops + five crops on horizontal flip)Merge modesmeangmean (geometric mean)summaxmintsharpen (temperature sharpenwith t=0.5)InstallationPyPI:$pipinstallttachSource:$pipinstallgit+https://github.com/qubvel/ttachRun testsdockerbuild-fDockerfile.dev-tttach:dev.&&dockerrun--rmttach:devpytest-pno:cacheprovider