10.3.6 数据增强
到现在为止,似乎训练损失和验证损失之间存在很大的差距。这主要是因为一些图像非常相似,例如代理车辆在红灯下的帧与其以最高速度行驶时的帧相比基本相同。这个时候,可以考虑通过引入诸如CutOut、CourseDropout等增强来减小帧之间的相似性。
(1)通过引入Albumentations库的别名A,并更改了配置字典中的raster_size和pixel_size,将其设置为[500, 500]和[0.25, 0.25],以便进行更好的可视化。
import albumentations as A
cfg['raster_params']['raster_size'] = [500, 500]
cfg['raster_params']['pixle_size'] = [.25, .25]
(2)定义函数show_images(aug_cfg),该函数接受一个包含数据增强配置的字典aug_cfg。使用l5kit库中的AgentDataset和build_rasterizer函数创建了两个数据集sat_ds和sem_ds,分别对应卫星图像和语义地图。接着,函数从这两个数据集中随机选择一个样本,显示了原始图像以及应用数据增强后的图像。最终,通过matplotlib库在两列中显示了原始和增强后的卫星图像以及语义地图。
def show_images(aug_cfg):
dm = LocalDataManager()
train_zarr = ChunkedDataset(dm.require(cfg["train_data_loader"]["key"])).open()
cfg["raster_params"]["map_type"] = 'py_semantic'
rasterizer = build_rasterizer(cfg, dm)
sem_ds = AgentDataset(cfg, train_zarr, rasterizer)
cfg["raster_params"]["map_type"] = 'py_satellite'
rasterizer = build_rasterizer(cfg, dm)
sat_ds = AgentDataset(cfg, train_zarr, rasterizer)
#get a random sample
random_index = int(np.random.random()*len(AV_ds))
sat_sample = sat_ds[random_index]
sem_sample = sem_ds[random_index]
sat_im = sat_sample["image"].transpose(1, 2, 0)
sat_im = sat_ds.rasterizer.to_rgb(sat_im)
sem_im = sem_sample["image"].transpose(1, 2, 0)
sem_im = sem_ds.rasterizer.to_rgb(sem_im)
fig, ax = plt.subplots(len(aug_cfg), 2, figsize=(15,15))
for i, (key, aug) in enumerate(aug_cfg.items()):
if aug is None:
ax[i, 0].imshow(sat_im[::-1])
ax[i, 0].set_title(key)
else:
sat_im_ = aug(image=sat_im)['image']
ax[i, 0].imshow(sat_im_[::-1])
ax[i, 0].set_title(key)
for i, (key, aug) in enumerate(aug_cfg.items()):
if aug is None:
ax[i, 1].imshow(sem_im[::-1])
ax[i, 1].set_title(key)
else:
sem_im_ = aug(image=sem_im)['image']
ax[i, 1].imshow(sem_im_[::-1])
ax[i, 1].set_title(key)
plt.tight_layout();
(3)创建了一个包含不同数据增强配置的字典aug_dict,其中包括'Original'(原始图像)、'Cutout'(遮挡法)、'CoarseDropout'(粗放法遮挡)和'GridDropout'(网格法遮挡)。然后,通过调用show_images函数,展示了应用这些数据增强配置后的卫星图像和语义地图的效果,如图10-11所示。
aug_dict = {'Original': None,
'Cutout':A.Cutout(num_holes=10, max_h_size=20, max_w_size=20, fill_value=0,
always_apply=False, p=1),
'CoarseDropout': A.CoarseDropout(max_holes=10, max_height=20, max_width=20,
min_holes=None, min_height=None, min_width=None,
fill_value=0, always_apply=False, p=1),
'GridDropout': A.GridDropout(ratio=.4, unit_size_min=None, unit_size_max=None,
holes_number_x=None, holes_number_y=None,
shift_x=0, shift_y=0, p=1)}
show_images(aug_dict)
图10-11 数据增强配置后的图像
(4)使用库albumentations添加一些天气增强效果,包括随机雨、随机雾和随机雪,如图10-12所示。这些增强效果可提高模型在处理栅格图像时的鲁棒性。
aug_dict = {'Original': None,
'RandomRain': A.RandomRain(slant_lower=-10, slant_upper=10, drop_length=20,
drop_width=1,blur_value=7, brightness_coefficient=0.7,
rain_type=None, always_apply=False, p=1),
'RandomFog': A.RandomFog(fog_coef_lower=0.3, fog_coef_upper=1, alpha_coef=0.08,
always_apply=False, p=1),
'RandomSnow': A.RandomSnow(snow_point_lower=0.1, snow_point_upper=0.3,
brightness_coeff=2.5, always_apply=False, p=1)}
show_images(aug_dict)
图10-12 添加天气增强效果