예제 #1
0
    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
예제 #2
0
    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)