def __init__(self): self.convert_RGB_to_HSV = ConvertColor(current='RGB', to='HSV') self.convert_HSV_to_RGB = ConvertColor(current='HSV', to='RGB') self.convert_to_float32 = ConvertDataType(to='float32') self.convert_to_uint8 = ConvertDataType(to='uint8') self.convert_to_3_channels = ConvertTo3Channels() self.random_brightness = RandomBrightness(lower=-32, upper=32, prob=0.5) self.random_contrast = RandomContrast(lower=0.5, upper=1.5, prob=0.5) self.random_saturation = RandomSaturation(lower=0.5, upper=1.5, prob=0.5) self.random_hue = RandomHue(max_delta=18, prob=0.5) self.random_channel_swap = RandomChannelSwap(prob=0.0) self.sequence1 = [ self.convert_to_3_channels, self.convert_to_float32, self.random_brightness, self.random_contrast, self.convert_to_uint8, self.convert_RGB_to_HSV, self.convert_to_float32, self.random_saturation, self.random_hue, self.convert_to_uint8, self.convert_HSV_to_RGB, self.random_channel_swap ] self.sequence2 = [ self.convert_to_3_channels, self.convert_to_float32, self.random_brightness, self.convert_to_uint8, self.convert_RGB_to_HSV, self.convert_to_float32, self.random_saturation, self.random_hue, self.convert_to_uint8, self.convert_HSV_to_RGB, self.convert_to_float32, self.random_contrast, self.convert_to_uint8, self.random_channel_swap ]
def __init__(self, resize_height, resize_width, random_brightness=(-48, 48, 0.5), random_contrast=(0.5, 1.8, 0.5), random_saturation=(0.5, 1.8, 0.5), random_hue=(18, 0.5), random_flip=0.5, random_rotate=([90, 180, 270], 0.5), min_scale=0.3, max_scale=2.0, min_aspect_ratio=0.8, max_aspect_ratio=1.25, n_trials_max=3, clip_boxes=True, overlap_criterion='area', bounds_box_filter=(0.3, 1.0), bounds_validator=(0.5, 1.0), n_boxes_min=1, background=(0, 0, 0), labels_format={ 'class_id': 0, 'xmin': 1, 'ymin': 2, 'xmax': 3, 'ymax': 4 }): self.n_trials_max = n_trials_max self.clip_boxes = clip_boxes self.overlap_criterion = overlap_criterion self.bounds_box_filter = bounds_box_filter self.bounds_validator = bounds_validator self.n_boxes_min = n_boxes_min self.background = background self.labels_format = labels_format # Determines which boxes are kept in an image after the transformations have been applied. self.box_filter_patch = BoxFilter( check_overlap=True, check_min_area=False, check_degenerate=False, overlap_criterion=self.overlap_criterion, overlap_bounds=self.bounds_box_filter, labels_format=self.labels_format) self.box_filter_resize = BoxFilter(check_overlap=False, check_min_area=True, check_degenerate=True, min_area=16, labels_format=self.labels_format) # Determines whether the result of the transformations is a valid training image. self.image_validator = ImageValidator( overlap_criterion=self.overlap_criterion, bounds=self.bounds_validator, n_boxes_min=self.n_boxes_min, labels_format=self.labels_format) # Utility transformations self.convert_to_3_channels = ConvertTo3Channels( ) # Make sure all images end up having 3 channels. self.convert_RGB_to_HSV = ConvertColor(current='RGB', to='HSV') self.convert_HSV_to_RGB = ConvertColor(current='HSV', to='RGB') self.convert_to_float32 = ConvertDataType(to='float32') self.convert_to_uint8 = ConvertDataType(to='uint8') self.resize = Resize(height=resize_height, width=resize_width, box_filter=self.box_filter_resize, labels_format=self.labels_format) # Photometric transformations self.random_brightness = RandomBrightness(lower=random_brightness[0], upper=random_brightness[1], prob=random_brightness[2]) self.random_contrast = RandomContrast(lower=random_contrast[0], upper=random_contrast[1], prob=random_contrast[2]) self.random_saturation = RandomSaturation(lower=random_saturation[0], upper=random_saturation[1], prob=random_saturation[2]) self.random_hue = RandomHue(max_delta=random_hue[0], prob=random_hue[1]) # Geometric transformations self.random_horizontal_flip = RandomFlip( dim='horizontal', prob=random_flip, labels_format=self.labels_format) self.random_vertical_flip = RandomFlip( dim='vertical', prob=random_flip, labels_format=self.labels_format) self.random_rotate = RandomRotate(angles=random_rotate[0], prob=random_rotate[1], labels_format=self.labels_format) self.patch_coord_generator = PatchCoordinateGenerator( must_match='w_ar', min_scale=min_scale, max_scale=max_scale, scale_uniformly=False, min_aspect_ratio=min_aspect_ratio, max_aspect_ratio=max_aspect_ratio) self.random_patch = RandomPatch( patch_coord_generator=self.patch_coord_generator, box_filter=self.box_filter_patch, image_validator=self.image_validator, n_trials_max=self.n_trials_max, clip_boxes=self.clip_boxes, prob=1.0, can_fail=False, labels_format=self.labels_format) # Define the processing chain. self.transformations = [ self.convert_to_3_channels, self.convert_to_float32, self.random_brightness, self.random_contrast, self.convert_to_uint8, self.convert_RGB_to_HSV, self.convert_to_float32, self.random_saturation, self.random_hue, self.convert_to_uint8, self.convert_HSV_to_RGB, self.random_horizontal_flip, self.random_vertical_flip, self.random_rotate, self.random_patch, self.resize ]
model.load_weights(weights_path, by_name=True) # 3: Instantiate an optimizer and the SSD loss function and compile the model. # If you want to follow the original Caffe implementation, use the preset SGD # optimizer, otherwise I'd recommend the commented-out Adam optimizer. #adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) sgd = SGD(lr=0.001, momentum=0.9, decay=0.0, nesterov=False) ssd_loss = SSDLoss(neg_pos_ratio=3, alpha=1.0) model.compile(optimizer=sgd, loss=ssd_loss.compute_loss) val_dataset = DataGenerator(load_images_into_memory=False, hdf5_dataset_path=val_hdf5_path) convert_to_3_channels = ConvertTo3Channels() resize = Resize(height=img_height, width=img_width) predict_generator = val_dataset.generate( batch_size=1, shuffle=True, transformations=[convert_to_3_channels, resize], label_encoder=None, returns={ 'processed_images', 'filenames', 'inverse_transform', 'original_images', 'original_labels' }, keep_images_without_gt=False) batch_images, batch_filenames, batch_inverse_transforms, batch_original_images, batch_original_labels = next( predict_generator) i = 0 # Which batch item to look at
def __init__(self, random_brightness=(-48, 48, 0.5), random_contrast=(0.5, 1.8, 0.5), random_saturation=(0.5, 1.8, 0.5), random_hue=(18, 0.5), random_flip=0.5, random_translate=((0.03, 0.5), (0.03, 0.5), 0.5), random_scale=(0.5, 2.0, 0.5), n_trials_max=3, clip_boxes=True, overlap_criterion='area', bounds_box_filter=(0.3, 1.0), bounds_validator=(0.5, 1.0), n_boxes_min=1, background=(0, 0, 0), labels_format={ 'class_id': 0, 'xmin': 1, 'ymin': 2, 'xmax': 3, 'ymax': 4 }): if (random_scale[0] >= 1) or (random_scale[1] <= 1): raise ValueError( "This sequence of transformations only makes sense if the minimum scaling factor is <1 and the maximum scaling factor is >1." ) self.n_trials_max = n_trials_max self.clip_boxes = clip_boxes self.overlap_criterion = overlap_criterion self.bounds_box_filter = bounds_box_filter self.bounds_validator = bounds_validator self.n_boxes_min = n_boxes_min self.background = background self.labels_format = labels_format # Determines which boxes are kept in an image after the transformations have been applied. self.box_filter = BoxFilter(check_overlap=True, check_min_area=True, check_degenerate=True, overlap_criterion=self.overlap_criterion, overlap_bounds=self.bounds_box_filter, min_area=16, labels_format=self.labels_format) # Determines whether the result of the transformations is a valid training image. self.image_validator = ImageValidator( overlap_criterion=self.overlap_criterion, bounds=self.bounds_validator, n_boxes_min=self.n_boxes_min, labels_format=self.labels_format) # Utility distortions self.convert_RGB_to_HSV = ConvertColor(current='RGB', to='HSV') self.convert_HSV_to_RGB = ConvertColor(current='HSV', to='RGB') self.convert_to_float32 = ConvertDataType(to='float32') self.convert_to_uint8 = ConvertDataType(to='uint8') self.convert_to_3_channels = ConvertTo3Channels( ) # Make sure all images end up having 3 channels. # Photometric transformations self.random_brightness = RandomBrightness(lower=random_brightness[0], upper=random_brightness[1], prob=random_brightness[2]) self.random_contrast = RandomContrast(lower=random_contrast[0], upper=random_contrast[1], prob=random_contrast[2]) self.random_saturation = RandomSaturation(lower=random_saturation[0], upper=random_saturation[1], prob=random_saturation[2]) self.random_hue = RandomHue(max_delta=random_hue[0], prob=random_hue[1]) # Geometric transformations self.random_flip = RandomFlip(dim='horizontal', prob=random_flip, labels_format=self.labels_format) self.random_translate = RandomTranslate( dy_minmax=random_translate[0], dx_minmax=random_translate[1], prob=random_translate[2], clip_boxes=self.clip_boxes, box_filter=self.box_filter, image_validator=self.image_validator, n_trials_max=self.n_trials_max, background=self.background, labels_format=self.labels_format) self.random_zoom_in = RandomScale(min_factor=1.0, max_factor=random_scale[1], prob=random_scale[2], clip_boxes=self.clip_boxes, box_filter=self.box_filter, image_validator=self.image_validator, n_trials_max=self.n_trials_max, background=self.background, labels_format=self.labels_format) self.random_zoom_out = RandomScale( min_factor=random_scale[0], max_factor=1.0, prob=random_scale[2], clip_boxes=self.clip_boxes, box_filter=self.box_filter, image_validator=self.image_validator, n_trials_max=self.n_trials_max, background=self.background, labels_format=self.labels_format) # If we zoom in, do translation before scaling. self.sequence1 = [ self.convert_to_3_channels, self.convert_to_float32, self.random_brightness, self.random_contrast, self.convert_to_uint8, self.convert_RGB_to_HSV, self.convert_to_float32, self.random_saturation, self.random_hue, self.convert_to_uint8, self.convert_HSV_to_RGB, self.random_translate, self.random_zoom_in, self.random_flip ] # If we zoom out, do scaling before translation. self.sequence2 = [ self.convert_to_3_channels, self.convert_to_float32, self.random_brightness, self.convert_to_uint8, self.convert_RGB_to_HSV, self.convert_to_float32, self.random_saturation, self.random_hue, self.convert_to_uint8, self.convert_HSV_to_RGB, self.convert_to_float32, self.random_contrast, self.convert_to_uint8, self.random_zoom_out, self.random_translate, self.random_flip ]