关键点翻转 数据增强踩坑
目录
关键点翻转逻辑和示例:
下面是翻转增强的例子,不是真实情况
关键点翻转逻辑和示例:
1. 图像左右翻转
2. X 坐标翻转:x' = image_width - 1 - x
3. 对称结构(如左眼、右眼),要做索引重排。
镜像映射表 (mirror_mapping):
这个数组定义了翻转后关键点的新顺序。
对于常见的 68 点或 5 点人脸标注,有固定的映射表,可以根据你使用的模型进行设置。
下面是翻转增强的例子,不是真实情况
import cv2
import numpy as np
import matplotlib.pyplot as plt# 示例人脸关键点(以 68 点为例,假设已对齐到图片上)
# 注意:这些点是假设的测试用数据
landmarks = np.array([[30, 50], [35, 48], [40, 47], [45, 48], [50, 50], # 鼻子线中点示意[20, 40], [25, 38], [55, 38], [60, 40], # 左右眼角示意[28, 60], [32, 62], [48, 62], [52, 60], # 嘴角示意
])# 显示原始图像和关键点
def show_image_with_landmarks(img, landmarks, title="Image"):plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.scatter(landmarks[:, 0], landmarks[:, 1], c='r')plt.title(title)plt.axis('off')plt.show()# 创建一个示例图像(白底+假人脸框)
img = np.full((100, 80, 3), 255, dtype=np.uint8)
cv2.rectangle(img, (10, 30), (70, 80), (200, 200, 200), 2)# 1. 水平翻转图像
flipped_img = cv2.flip(img, 1)
h, w = img.shape[:2]# 2. 翻转关键点 x 坐标(w - 1 - x)
flipped_landmarks = landmarks.copy()
flipped_landmarks[:, 0] = w - 1 - landmarks[:, 0]# 3. 调整左右对称点的顺序(关键)
# 例如对于68点模型,要将左眼和右眼、左嘴角和右嘴角等对调
# 示例中我们假设第5和第0对调,6和3对调,7和2对调,等等(按你模型具体定义调整)
mirror_mapping = [4, 3, 2, 1, 0, 8, 7, 6, 5, 13, 12, 11, 10, 9] # index映射(这里只处理了14个点)
flipped_landmarks = flipped_landmarks[mirror_mapping]# 显示原图和翻转图
show_image_with_landmarks(img, landmarks, "Original")
show_image_with_landmarks(flipped_img, flipped_landmarks, "Flipped")