12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
"""演示22: 数据增强可视化 — 几何变换 / 颜色抖动 / MixUp。
对一张合成图片依次展示: 旋转、翻转、裁剪缩放、颜色抖动, 以及 MixUp 混合。
"""
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from figure_style import figures_dir, configure
configure()
OUT = figures_dir()
os.makedirs(OUT, exist_ok=True)
rng = np.random.default_rng(0)
# 合成图: 数字样式的方块图
img = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(img, (20, 20), (80, 80), (255, 255, 255), -1)
cv2.circle(img, (50, 50), 20, (0, 200, 255), -1)
img[60:90, 10:40] = (200, 100, 50)
def show(name, im):
return name, im
augs = []
rows, cols, _ = img.shape
# 旋转
M = cv2.getRotationMatrix2D((rows / 2, cols / 2), 30, 1.0)
augs.append(show("旋转 30°", cv2.warpAffine(img, M, (cols, rows))))
# 水平翻转
augs.append(show("水平翻转", cv2.flip(img, 1)))
# 裁剪缩放
crop = img[15:85, 15:85]
augs.append(show("随机裁剪", cv2.resize(crop, (cols, rows))))
# 颜色抖动(亮度/对比度)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.float32)
hsv[..., 2] *= 1.3; hsv[..., 2] = np.clip(hsv[..., 2], 0, 255)
augs.append(show("颜色抖动", cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)))
# MixUp: 与另一张随机图线性混合
other = np.roll(img, 20, axis=1)
mix = (0.6 * img + 0.4 * other).astype(np.uint8)
augs.append(show("MixUp (λ=0.6)", mix))
fig, axes = plt.subplots(2, 3, figsize=(11, 7))
axes[0, 0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)); axes[0, 0].set_title("原图"); axes[0, 0].axis("off")
for (name, im), ax in zip(augs, axes.flat[1:]):
ax.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)); ax.set_title(name); ax.axis("off")
fig.suptitle("数据增强: 用变换制造多样本, 抑制过拟合", fontsize=14)
fig.tight_layout(rect=(0, 0, 1, 0.94))
out = os.path.join(OUT, "fig_train_augment.png")
fig.savefig(out, dpi=150)
print(f"-> {out}")
|