Date: 2020-09-01
隨機模式與確定模式
在圖像領域,隨機模式和確定模式與隨機數的生成相同,即在采用圖像增強時,每次增強產生的圖像是固定的還是變化隨機的。對比與隨機數的生成,就是每次產生的隨機數是固定的還是隨機的。
隨機模式
隨機模式,顧名思義每次利用圖像增強方法中使用的參數都是隨機的,產生的圖像也是不一致的。
1 import numpy as np 2 import imgaug as ia 3 from imgaug import augmenters as iaa 4 import imageio 5 % matplotlib inline 6 ia.seed(8) 7 # 讀取數據 8 image = imageio.imread("./pick1.jpg") 9 images = [[image]*3, [image]*3] # 形成batch 10 11 # 定義變換 12 aug = iaa.Affine(translate_px=(-30, 30), rotate=(-20, 20), cval=255) 13 14 # 隨機模式 15 images_aug = [aug.augment_images(batch) for batch in images] 16 17 # visualize 18 ia.imshow(ia.draw_grid(images_aug[0]+images_aug[1], rows=2, cols=3))
從上述代碼中可以看出,默認使用imageaug中的增強技術並將數據分batch灌入獲得的圖像就是在隨機模式狀態下,從生成的圖像中可以看出,生成的增強圖像是隨機的。
確定模式
確定模式,顧名思義每次圖像利用圖像增強方法得到的圖像都是在同一套參數下進行的,也就是說獲得的增強圖像都是一樣的。
1 ia.seed(8) 2 3 # 讀取圖像 4 image = imageio.imread("./pick1.jpg") 5 images = [[image]*3, [image]*3] 6 7 # 定義運算 8 aug = iaa.Affine(translate_px=(-30, 30), rotate=(-20, 20), cval=255) 9 10 # 將運算更改為確定模式狀態 11 aug_determinisitic = aug.to_deterministic() 12 13 # 將數據分批次輸入 14 image_aug_deterministic = [aug_determinisitic.augment_images(batch) for batch in images] 15 16 # visulization 17 ia.imshow(ia.draw_grid(image_aug_deterministic[0] + 18 image_aug_deterministic[1], rows=2, cols=3))
從代碼中可以看出,確定模式就是將增強變換進行.to_deterministic()轉換為確定模式即可。從輸出的結果中可以看出,輸出的圖像並不是每一張圖像都相同,而是每批次batch中對應序號的圖像是相同的,同一batch的圖像是不同的。
增加關鍵點
增減關鍵點需要用到兩個方法,KeyPointOnImage()和KeyPoint(),前者是生成點圖,具有繪制到圖像上draw_on_image()的方法;后者是點,用於生成關鍵點。
1 image = imageio.imread("./pick1.jpg") 2 3 image_keypoints = ia.KeypointsOnImage([ 4 ia.Keypoint(x=151, y=106), 5 ia.Keypoint(x=247, y=78), 6 ia.Keypoint(x=179, y=140), 7 ia.Keypoint(x=206, y=134) 8 ], shape=image.shape) 9 10 ia.imshow(np.hstack([image, image_keypoints.draw_on_image(image)]))
上述代碼中使用了四個關鍵點,分別處於眼睛和鼻孔處。
關鍵點與隨機模式
將圖像分為幾個batch,將關鍵點和圖像作用於仿射變換,觀察變換前后的區別。
1 import matplotlib.pyplot as plt 2 3 BATCH_SIZE=4 4 5 images = [image] * BATCH_SIZE 6 keypoints = [image_keypoints] * BATCH_SIZE 7 8 # 仿射變換 9 aug = iaa.Affine(rotate=(-40, 40)) 10 11 # 經過3次仿射變換 12 image_aug1 = aug.augment_images(images) 13 keypoints_aug1 = aug.augment_keypoints(keypoints) 14 15 image_aug2 = aug.augment_images(images) 16 keypoints_aug2 = aug.augment_keypoints(keypoints) 17 18 image_aug3 = aug.augment_images(images) 19 keypoints_aug3 = aug.augment_keypoints(keypoints) 20 21 # 將關鍵點與圖像融合函數 22 def draw_and_merge(img, kps): 23 return np.hstack([kp_i.draw_on_image(im_i) for kp_i, im_i in zip(kps, img)]) 24 25 # visualize 26 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(80, 10)) 27 axes[0].imshow(draw_and_merge(image_aug1, keypoints_aug1)) 28 axes[1].imshow(draw_and_merge(image_aug2, keypoints_aug2)) 29 axes[2].imshow(draw_and_merge(image_aug3, keypoints_aug3)) 30 for i in range(3): 31 axes[i].set_title("Batch %d" % (i+1,)) 32 axes[i].axis("off")
通過生成的圖像可以看出,雖然關鍵點和圖像都經過仿射變換,但圖像和關鍵點很少能與標記的位置重合,能重合在一起的都是碰巧。這樣對於關鍵點檢測、目標檢測與分割中,會存在圖像經過增強后難以與真值對應的問題。
確定模式可以解決這一問題!!!
關鍵點與確定模式
隨機模式下可以看出關鍵點與原圖有可能出現不匹配的問題,這也是為什么會有確定模式的原因。
同樣,在進行仿射變換前,我們先將變換轉化成固定模式。然后在固定模式下進行圖像和關鍵點的仿射變換,並顯示。
1 # 仿射變換 2 aug = iaa.Affine(rotate=(-40, 40)) 3 # 轉化為固定模式 4 aug_det = aug.to_deterministic() 5 6 # 經過3次仿射變換 7 image_aug1 = aug_det.augment_images(images) 8 keypoints_aug1 = aug_det.augment_keypoints(keypoints) 9 10 image_aug2 = aug_det.augment_images(images) 11 keypoints_aug2 = aug_det.augment_keypoints(keypoints) 12 13 image_aug3 = aug_det.augment_images(images) 14 keypoints_aug3 = aug_det.augment_keypoints(keypoints) 15 16 # 將關鍵點與圖像融合函數 17 def draw_and_merge(img, kps): 18 return np.hstack([kp_i.draw_on_image(im_i) for kp_i, im_i in zip(kps, img)]) 19 20 # visualize 21 fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(80, 10)) 22 axes[0].imshow(draw_and_merge(image_aug1, keypoints_aug1)) 23 axes[1].imshow(draw_and_merge(image_aug2, keypoints_aug2)) 24 axes[2].imshow(draw_and_merge(image_aug3, keypoints_aug3)) 25 for i in range(3): 26 axes[i].set_title("Batch %d" % (i+1,)) 27 axes[i].axis("off")
通過結果可以看出,在確定模式下,不再存在關鍵點與圖像仿射變換后不匹配的問題。
基於此,在關鍵點檢測、目標檢測與分割中,圖像與真值(points,bbox,featmap)經過仿射變換后,可以一一對應。
整理總結
本節教程主要介紹了imgaug中的兩種模式:隨機模式和確定模式。並通過關鍵點匹配的案例,介紹隨機模式和確定模式的應用。
將隨機模式轉化為確定模式只需要將相關增強方法.to_deterministic()即可。
另外,在使用關鍵點時會用到兩個函數,ia.KeypointsOnImage和ia.Keypoint()。