Keras ImageDataGenerator validate_split

时间:2019-03-14 01:42:04

标签: python image-processing keras

我正在尝试从视频的一系列帧中训练用于面部关键点检测的模型。由于这些帧在关键点上的位置几乎相同,因此该模型对于我放入进行预测的每个图像都产生相同的输出。我试图使用ImageDataGenerator旋转图像以使它们彼此不同,但是,我似乎无法使其正常工作。

最初,我在模型上调用fit时,可以选择将训练数据分为训练和验证,但是我不知道如何在{{1 }}。有人可以解释如何使用它,或者建议我使用此类的方法吗?

现在,我有一个validation_split大小的张量及其对应的ImageDataGenerator。如何使用[total_images, width, height, channels]旋转图像,并将它们分成训练和验证数据?

1 个答案:

答案 0 :(得分:0)

结果证明,我可以使用转换矩阵自行创建此文件。为了在OpenCV中正确旋转图像,我使用了以下代码(修改了转换矩阵,以在旋转时保留图像的所有角)

代码积分:Cristian Perez Brokate,您可以找到此实现背后的数学解释。 rotate_bound与我发现的完全相同,rotate_pointsrotate_box的修改版本

def rotate_bound(image, angle):
    # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)

    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    # perform the actual rotation and return the image
    return cv2.warpAffine(image, M, (nW, nH))

然后使用以下代码来旋转点的坐标:

def rotate_points(image, points, angle):
        # grab the dimensions of the image and then determine the
    # center
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)

    # grab the rotation matrix (applying the negative of the
    # angle to rotate clockwise), then grab the sine and cosine
    # (i.e., the rotation components of the matrix)
    M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])

    # compute the new bounding dimensions of the image
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    # adjust the rotation matrix to take into account translation
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    v = np.ones((points.shape[0], points.shape[1] + 1))
    v[:,:-1] = points
    return np.dot(M, v.T).T