我正在尝试从视频的一系列帧中训练用于面部关键点检测的模型。由于这些帧在关键点上的位置几乎相同,因此该模型对于我放入进行预测的每个图像都产生相同的输出。我试图使用ImageDataGenerator
旋转图像以使它们彼此不同,但是,我似乎无法使其正常工作。
最初,我在模型上调用fit
时,可以选择将训练数据分为训练和验证,但是我不知道如何在{{1 }}。有人可以解释如何使用它,或者建议我使用此类的方法吗?
现在,我有一个validation_split
大小的张量及其对应的ImageDataGenerator
。如何使用[total_images, width, height, channels]
旋转图像,并将它们分成训练和验证数据?
答案 0 :(得分:0)
结果证明,我可以使用转换矩阵自行创建此文件。为了在OpenCV中正确旋转图像,我使用了以下代码(修改了转换矩阵,以在旋转时保留图像的所有角)
代码积分:Cristian Perez Brokate,您可以找到此实现背后的数学解释。 rotate_bound
与我发现的完全相同,rotate_points
是rotate_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