def next(self): # just grab the next random frame frame = self.source[random.choice(self.frame_ids)] # frame.show_image_with_labels() # get a random crop object crop_objs = filter(lambda x: not self.obj_types or x.obj_type in self.obj_types,frame.get_objects()) # print 'Num crop objs in sample: {0}'.format(len(crop_objs)) crop = random.choice(crop_objs) # print 'crop_box: ' + str(crop.box) # frame.show_image_with_labels() # 1) Randomly perturb crop box (scale and translation) transformed_box = RandomPerturber.perturb_crop_box(crop.box,{}) # 2) Take crop, todo, change to using center crop to preserve aspect ratio # check if the affine is identity within some toleranc, then don't bother applying affine = Affine() scalex = float(self.crop_size[0])/transformed_box.edges()[0] scaley = float(self.crop_size[1])/transformed_box.edges()[1] affine.append(Affine.translation(-transformed_box.xy_min())) affine.append(Affine.scaling((scalex,scaley))) transformed_image = affine.apply_to_image(frame.image,self.crop_size) # transformed_image.visualize(title='transformed image') # 3) Randomly perturb cropped image (rotation only) chw_image = transformed_image.to_order_and_class(Ordering.CHW,ValueClass.FLOAT01) # chw_image.visualize(title='chw_image') sample = AutoEncoderSample([torch.Tensor(chw_image.get_data().astype(float))], [torch.Tensor(chw_image.get_data().astype(float))]) return sample
def load_train(self): frame1, frame2, neg_box, pos_box, anchor_box = None, None, None, None, None # TODO, this should probably break if never find anything for a while while neg_box is None: indices = random.sample(self.frame_ids, 2) frame1, frame2 = [self.source[x] for x in indices] frame1_objs = filter(lambda x: x.obj_type in self.obj_types, frame1.get_objects()) frame2_objs = filter(lambda x: x.obj_type in self.obj_types, frame2.get_objects()) # get random pos boxes pos_box = random.choice(frame1_objs).box anchor_box = random.choice(frame2_objs).box # find random neg crop neg_box = self.find_negative_crop(frame1, frame1_objs) perturbed_pos_box = RandomPerturber.perturb_crop_box( pos_box, self.perturbations) affine_crop0 = crop_image_resize(frame1.image, perturbed_pos_box, self.crop_size) pos_crop = affine_crop0.apply_to_image(frame1.image, self.crop_size) affine_crop1 = crop_image_resize(frame2.image, anchor_box, self.anchor_size) anchor_crop = affine_crop1.apply_to_image(frame2.image, self.anchor_size) affine_crop2 = crop_image_resize(frame1.image, neg_box, self.crop_size) neg_crop = affine_crop2.apply_to_image(frame1.image, self.crop_size) # neg_crop.visualize(display=True,title='neg') # now find all the boxes that intersect with the perturbed_pos_box intersected_boxes = [] for obj in filter(lambda x: x.obj_type in self.obj_types, frame1.get_objects()): if Box.intersection(obj.box, perturbed_pos_box) is not None: intersected_boxes.append(obj.box) intersected_boxes = list( map(lambda x: affine_crop0.apply_to_box(x), intersected_boxes)) # test display # disp_frame = Frame.from_image_and_objects(pos_crop,[Object(box_crop)]) # disp_frame.visualize(display=True,title='pos frame') # pos_crop.visualize(display=True,title='pos crop') pos = torch.Tensor( pos_crop.to_order_and_class( Ordering.CHW, ValueClass.FLOAT01).get_data().astype(float)) neg = torch.Tensor( neg_crop.to_order_and_class( Ordering.CHW, ValueClass.FLOAT01).get_data().astype(float)) anchor = torch.Tensor( anchor_crop.to_order_and_class( Ordering.CHW, ValueClass.FLOAT01).get_data().astype(float)) # pos_map = generate_response_map_from_boxes(pos_crop.get_hw(),intersected_boxes) # PTImage.from_2d_numpy(pos_map).visualize(display=True,title='pos frame') pos_map = torch.Tensor( generate_response_map_from_boxes(pos_crop.get_hw(), intersected_boxes)) neg_map = torch.Tensor( generate_response_map_from_boxes(pos_crop.get_hw())) data = [pos, neg, anchor] target = [pos_map, neg_map, anchor] return TripletDetectionSample(data, target)