Exemple #1
0
    def __init__(self, base_dir=None, split='train', affine_augmenter=None, image_augmenter=None, 
            target_size=224, filename=None, use_bined=False, n_class=4, debug=False):
        self.base_dir = base_dir
        self.base_dir = Path(base_dir)
        self.split = split
        self.use_bined = use_bined
        self.n_class = n_class
        self.debug = debug

        self.img_paths = []
        self.bbox = []
        self.labels = []
        self.euler_binned = []

        with open(self.base_dir / filename) as f:
            for i, line in enumerate(f.readlines()):
                ls = line.strip()

                mat_path = self.base_dir / ls.replace('.jpg', '.mat')
                bbox, pose = get_pt_ypr_from_mat(mat_path, pt3d=True)

                if True and (abs(pose[0])>99 or abs(pose[1])>99 or abs(pose[2])>99):
                    continue

                if use_bined:
                    yaw_pitch_bins = np.array([-60, -40, -20, 20, 40, 60])
                    roll_bins = np.array(range(-81, 82, 9))
                    self.euler_binned.append([np.digitize(pose[0], yaw_pitch_bins),np.digitize(pose[1], yaw_pitch_bins),np.digitize(pose[2], roll_bins)])

                self.labels.append(np.array(pose))
                self.bbox.append(bbox)
                self.img_paths.append(ls)

        self.labels_sort_idx = np.argsort(-np.mean(np.abs(self.labels), axis=1))
        

        if 'train' in self.split:
            self.resizer = albu.Compose([albu.SmallestMaxSize(target_size, p=1.),
                                        albu.RandomScale(scale_limit=(-0.2, 0.2), p=0.1),
                                        albu.PadIfNeeded(min_height=target_size, min_width=target_size, value=0, p=1),
                                        albu.RandomCrop(target_size, target_size, p=1.)])
        else:
            # self.resizer = albu.Compose([albu.Resize(target_size[0], target_size[1], p=1.)])
            self.resizer = albu.Compose([albu.SmallestMaxSize(target_size, p=1.),
                                        albu.CenterCrop(target_size, target_size, p=1.)])

        self.affine_augmenter = affine_augmenter
        self.image_augmenter = image_augmenter
    def __init__(self,
                 base_dir=None,
                 filename=None,
                 n_class=3,
                 target_size=224,
                 affine_augmenter=None,
                 image_augmenter=None,
                 debug=False):
        print("[INFO] Initing ALFW2000Dataset.")
        self.base_dir = Path(base_dir)
        self.n_class = n_class
        self.target_size = target_size
        self.affine_augmenter = affine_augmenter
        self.image_augmenter = image_augmenter
        self.debug = debug

        self.img_paths = []
        self.bboxs = []
        self.labels = []

        # Read img, bbox, pose
        with open(self.base_dir / filename) as f:
            for i, line in enumerate(f.readlines()):
                ls = line.strip()

                mat_path = self.base_dir / ls.replace('.jpg', '.mat')
                bbox, pose = get_pt_ypr_from_mat(mat_path, pt3d=True)

                if True and (abs(pose[0]) > 99 or abs(pose[1]) > 99
                             or abs(pose[2]) > 99):
                    continue

                self.labels.append(np.array(pose))
                self.bboxs.append(bbox)
                self.img_paths.append(ls)

        # labels_sort_idx is created by the magnitude of 3 args (yall, pitch, row)
        self.labels_sort_idx = np.argsort(
            -np.mean(np.abs(self.labels), axis=1))
        self.resizer = albu.Compose([
            albu.SmallestMaxSize(target_size, p=1.),
            albu.CenterCrop(target_size, target_size, p=1.)
        ])
    def __init__(self,
                 base_dir=None,
                 split='train',
                 affine_augmenter=None,
                 image_augmenter=None,
                 target_size=224,
                 filename=None,
                 use_bined=False,
                 n_class=3,
                 debug=False):
        self.base_dir = base_dir
        self.base_dir = Path(base_dir)
        self.split = split
        self.use_bined = use_bined
        self.debug = debug
        self.n_class = n_class

        self.ids = []
        self.bboxs = []
        self.labels = []
        self.ids_index = []
        self.euler_binned = []

        with open(self.base_dir / filename) as f:
            for i, line in enumerate(f.readlines()):
                ls = line.strip()

                id_index = []
                bboxs = []
                labels = []
                euler_binned = []
                for j in range(100):
                    img_path = self.base_dir / (ls + '_%d.jpg' % j)
                    if not os.path.exists(img_path):
                        break

                    mat_path = str(img_path).replace('.jpg', '.mat')
                    bbox, pose = get_pt_ypr_from_mat(mat_path)

                    if False and (abs(pose[1]) > 99 or abs(pose[0]) > 99
                                  or abs(pose[2]) > 99):
                        continue

                    if use_bined:
                        yaw_pitch_bins = np.array([-60, -40, -20, 20, 40, 60])
                        roll_bins = np.array(range(-81, 82, 9))
                        euler_binned.append([
                            np.digitize(pose[0], yaw_pitch_bins),
                            np.digitize(pose[1], yaw_pitch_bins),
                            np.digitize(pose[2], roll_bins)
                        ])

                    id_index.append(j)
                    bboxs.append(bbox)
                    labels.append(np.array(pose))

                self.labels.append(labels)
                self.bboxs.append(bboxs)
                self.ids.append(ls)
                self.ids_index.append(id_index)
                if use_bined:
                    self.euler_binned.append(np.array(euler_binned))

        if 'train' in self.split:
            self.resizer = albu.Compose([
                albu.RandomScale((-0.5, 0), p=0.01),
                albu.SmallestMaxSize(int(target_size * 1.1), p=1.),
                albu.RandomScale(scale_limit=(-0.1, 0.1), p=1),
                albu.PadIfNeeded(min_height=target_size,
                                 min_width=target_size,
                                 value=0,
                                 p=1),
                albu.RandomCrop(target_size, target_size, p=1.)
            ])
        else:
            # self.resizer = albu.Compose([albu.Resize(target_size[0], target_size[1], p=1.)])
            self.resizer = albu.Compose([
                albu.SmallestMaxSize(target_size, p=1.),
                albu.CenterCrop(target_size, target_size, p=1.)
            ])

        self.affine_augmenter = affine_augmenter
        self.image_augmenter = image_augmenter
Exemple #4
0
def visualize_AFLW2000(model, base_dir, target_size, filename, save_imgs_path):
    print("[INFO] Initing ALFW2000Dataset.")
    base_dir = Path(base_dir)
    target_size = target_size

    img_paths = []
    bboxs = []
    labels = []
    pred_poses = []


    with open(base_dir / filename) as f:
        for i, line in enumerate(tqdm.tqdm(f.readlines()[:])):
            ls = line.strip()

            mat_path = base_dir / ls.replace('.jpg', '.mat')
            bbox, pose = get_pt_ypr_from_mat(mat_path, pt3d=True)

            if True and (abs(pose[0])>99 or abs(pose[1])>99 or abs(pose[2])>99):
                continue

            labels.append(np.array(pose))
            bboxs.append(bbox)
            img_paths.append(ls)

    resizer = albu.Compose([albu.SmallestMaxSize(target_size, p=1.),
                                        albu.CenterCrop(target_size, target_size, p=1.)])

    for index in tqdm.tqdm(range(0, len(img_paths[:]))):
        img_path = base_dir /  img_paths[index]
        img_name = os.path.basename(img_paths[index])
        # print(img_path)
        bbox = change_bbox(bboxs[index], 2, use_forehead=False)
        # bbox = bboxs[index]
        raw_img = Image.open(img_path)
        img = np.array(raw_img.crop(bbox))
        img = img[:,:,::-1]

        img = resizer(image=img)
        img = preprocess(np.array(img['image']))
        # print(img)
        # Convert to tensor and transform to [-1, 1]
        img = torch.FloatTensor(img).permute(2, 0, 1).unsqueeze_(0)
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
        img.to(device)
        

        pred = model(img)
        pred = pred.cpu().detach().numpy()
        pred_poses.append(pred[0])

        if save_imgs_path:
            # print(bbox)
            # print(pred[0])
            b, g, r = raw_img.split()
            raw_img = Image.merge("RGB", (r, g, b))
            drawed_img = draw_annotates(np.array(raw_img), np.array([bbox]), np.array([pred[0]]))
            cv2.imwrite(os.path.join(save_imgs_path, img_name), drawed_img)

    pred_poses = np.array(pred_poses)  
    labels = np.array(labels)

    delta = np.absolute(labels - pred_poses)
    delta = np.sum(delta, axis=1) / 3
    # print(delta)

    sortted_delta = np.sort(delta)
    # print(sortted_delta)
    index_of_max_delta = [np.where(delta==value_delta) for value_delta in sortted_delta[-5:]]
    index_of_min_delta = [np.where(delta==value_delta) for value_delta in sortted_delta[:5]]

    max_delta_dir = os.path.join(save_imgs_path, "max_delta")
    os.system(f"rm -rf \"{max_delta_dir}\"")

    min_delta_dir = os.path.join(save_imgs_path, "min_delta")
    os.system(f"rm -rf \"{min_delta_dir}\"")

    # print(index_of_max_delta)
    for index in index_of_max_delta:
        # print(index[0][0])
        Path(max_delta_dir).mkdir(parents=True, exist_ok=True)

        img_name = os.path.basename(img_paths[index[0][0]])
        path_drawed_img = os.path.join(save_imgs_path, img_name)

        os.system(f"cp -i \"{path_drawed_img}\" \"{max_delta_dir}\"")

    for index in index_of_min_delta:
        # print(index[0][0])

        Path(min_delta_dir).mkdir(parents=True, exist_ok=True)

        img_name = os.path.basename(img_paths[index[0][0]])
        path_drawed_img = os.path.join(save_imgs_path, img_name)

        os.system(f"cp -i \"{path_drawed_img}\" \"{min_delta_dir}\"")