Exemplo n.º 1
0
def load_data_val_gray(data,
                       pathX,
                       img_rows=224,
                       img_cols=224,
                       channels=4,
                       file_name_suffix=None,
                       standardize=False,
                       normalize=True,
                       contrast=False,
                       equalize=False,
                       stretch_img=False,
                       data_augmentation=False,
                       angle_norm_method=1,
                       max_angle=90.0):

    X = np.zeros((len(data), channels, img_rows, img_cols))
    Y = np.zeros((len(data), 3))

    last_id = 0
    last_frame = 0
    ridx = 0
    for i, d in enumerate(data):
        folder = "%02d/" % d['id'] + "/"
        if file_name_suffix is None:
            file = "frame_" + d['frame'] + "_face_gray.png"
        else:
            file = "frame_" + d['frame'] + file_name_suffix + ".png"

        if channels > 1:
            img = cv2.imread(pathX + folder + file, 1)
        else:
            img = cv2.imread(pathX + folder + file, 0)

        if img is None:
            continue

        if data_augmentation:
            if last_id == int(d['id']) and last_frame == int(d['frame']):
                ridx += 1
            else:
                ridx = 0
            rdim = 14

            if ridx == 1:
                img = img[:img.shape[0] - rdim, :img.shape[1] - rdim]
            elif ridx == 2:
                img = img[:img.shape[0] - rdim, rdim:img.shape[1]]
            elif ridx == 3:
                img = img[rdim:img.shape[0], :img.shape[1] - rdim]
            elif ridx == 4:
                img = img[rdim:img.shape[0], rdim:img.shape[1]]
            elif ridx == 5:
                img = img[int(rdim / 2):img.shape[0] - int(rdim / 2),
                          int(rdim / 2):img.shape[1] - int(rdim / 2)]

        if stretch_img:
            img = stretch(img, 190)

        if equalize:
            cv2.equalizeHist(img.astype(np.uint8), img)

        if contrast:
            img = img.astype(np.float32)
            if channels > 1:
                for i_ch in range(channels):
                    img[..., i_ch] = exposure.rescale_intensity(
                        img[..., i_ch].astype('float'), out_range=(0, 1))
            else:
                img = exposure.rescale_intensity(img.astype('float'),
                                                 out_range=(0, 1))

        if standardize:
            img = img.astype(np.float32)
            if channels > 1:
                for i_ch in range(channels):
                    img[...,
                        i_ch] = preprocessing.scale(img[...,
                                                        i_ch].astype('float'))
            else:
                img = preprocessing.scale(img.astype('float'))

        img = img.astype(np.float32)

        if img.shape[1] != img_cols or img.shape[0] != img_rows:
            img = cv2.resize(img, (img_cols, img_rows))

        if channels == 1:
            img = np.expand_dims(img, axis=0)
        else:
            img = np.reshape(img, (img.shape[2], img.shape[0], img.shape[1]))

        X[i] = img

        if angle_norm_method == 1:
            Y[i, 0] = (d['angle1'] + max_angle) / (2.0 * max_angle)
            Y[i, 1] = (d['angle2'] + max_angle) / (2.0 * max_angle)
            Y[i, 2] = (d['angle3'] + max_angle) / (2.0 * max_angle)
        elif angle_norm_method == 0:
            Y[i, 0] = (d['angle1'])
            Y[i, 1] = (d['angle2'])
            Y[i, 2] = (d['angle3'])
        elif angle_norm_method == -1:
            Y[i, 0] = d['angle1'] / float(max_angle)
            Y[i, 1] = d['angle2'] / float(max_angle)
            Y[i, 2] = d['angle3'] / float(max_angle)
        else:
            raise ValueError('Flag: "angle_norm_method" is out of range.')

        last_id = int(d['id'])
        last_frame = int(d['frame'])

    return X, Y
Exemplo n.º 2
0
def load_data_gray(data,
                   pathX,
                   img_rows=224,
                   img_cols=224,
                   channels=3,
                   file_name_suffix=None,
                   standardize=False,
                   contrast=False,
                   equalize=False,
                   stretch_img=False,
                   data_augmentation=True,
                   angle_norm_method=1,
                   max_angle=90.0):

    X = np.zeros((len(data), channels, img_rows, img_cols))
    Y = np.zeros((len(data), 3))

    for i, d in enumerate(data):
        folder = "%02d/" % d['id'] + "/"
        if file_name_suffix is None:
            file = "frame_" + d['frame'] + "_face_gray.png"
        else:
            file = "frame_" + d['frame'] + file_name_suffix + ".png"

        if channels > 1:
            img = cv2.imread(pathX + folder + file, 1)
        else:
            img = cv2.imread(pathX + folder + file, 0)

        if img is None:
            continue

        if data_augmentation:
            data_augmentation_idx = d['data_augmentation']
            rdim = random.randrange(1, 15)

            # Corner Top-left
            if data_augmentation_idx == 1:
                img = img[:img.shape[0] - rdim, :img.shape[1] - rdim]
            # Corner Top-right
            elif data_augmentation_idx == 2:
                img = img[:img.shape[0] - rdim, rdim:img.shape[1]]
            # Corner Bottom-left
            elif data_augmentation_idx == 3:
                img = img[rdim:img.shape[0], :img.shape[1] - rdim]
            # Corner bottom-right
            elif data_augmentation_idx == 4:
                img = img[rdim:img.shape[0], rdim:img.shape[1]]
            # Center
            elif data_augmentation_idx == 5:
                img = img[int(rdim / 2):img.shape[0] - int(rdim / 2),
                          int(rdim / 2):img.shape[1] - int(rdim / 2)]
            # Top
            elif data_augmentation_idx == 6:
                img = img[int(rdim / 2):, :]
            # Bottom
            elif data_augmentation_idx == 7:
                img = img[:img.shape[0] - int(rdim / 2), :]
            # Left
            elif data_augmentation_idx == 8:
                img = img[:, int(rdim / 2):]
            # Right
            elif data_augmentation_idx == 9:
                img = img[:, :img.shape[1] - int(rdim / 2)]
            elif data_augmentation_idx == 10:
                noise = np.zeros_like(img, 'float') + np.random.normal(
                    0.0, 5, img.shape)
                img = (img + noise).astype(np.uint8)
                img[img < 0] = 0
                img[img > 255] = 255

        if stretch_img:
            img = stretch(img, 190)

        if equalize:
            cv2.equalizeHist(img.astype(np.uint8), img)

        if contrast:
            img = img.astype(np.float32)
            if channels > 1:
                for i_ch in range(channels):
                    img[..., i_ch] = exposure.rescale_intensity(
                        img[..., i_ch].astype('float'), out_range=(0, 1))
            else:
                img = exposure.rescale_intensity(img.astype('float'),
                                                 out_range=(0, 1))

        if standardize:
            img = img.astype(np.float32)
            if channels > 1:
                for i_ch in range(channels):
                    img[...,
                        i_ch] = preprocessing.scale(img[...,
                                                        i_ch].astype('float'))
            else:
                img = preprocessing.scale(img.astype('float'))

        img = img.astype(np.float32)

        if img.shape[1] != img_cols or img.shape[0] != img_rows:
            img = cv2.resize(img, (img_cols, img_rows))

        if channels == 1:
            img = np.expand_dims(img, axis=0)
        else:
            img = np.reshape(img, (img.shape[2], img.shape[0], img.shape[1]))

        X[i] = img

        if angle_norm_method == 1:
            Y[i, 0] = (d['angle1'] + max_angle) / (2.0 * max_angle)
            Y[i, 1] = (d['angle2'] + max_angle) / (2.0 * max_angle)
            Y[i, 2] = (d['angle3'] + max_angle) / (2.0 * max_angle)
        elif angle_norm_method == 0:
            Y[i, 0] = (d['angle1'])
            Y[i, 1] = (d['angle2'])
            Y[i, 2] = (d['angle3'])
        elif angle_norm_method == -1:
            Y[i, 0] = d['angle1'] / float(max_angle)
            Y[i, 1] = d['angle2'] / float(max_angle)
            Y[i, 2] = d['angle3'] / float(max_angle)
        else:
            raise ValueError('Flag: "angle_norm_method" is out of range.')

    return X, Y