睿智的目標檢測-番外篇——數據增強在目標檢測中的應用(數據增強代碼的參數解讀)

睿智的目標檢測-番外篇——數據增強在目標檢測中的應用(數據增強代碼的參數解讀)

學習前言

數據增強是非常重要的提高目標檢測算法魯棒性的手段,學習一下對身體有好處!
在這裏插入圖片描述

數據增強做了什麼

數據增強其實就是讓圖片變得更加多樣。比如說原圖是一個電腦
在這裏插入圖片描述
如果不使用數據增強的話這個電腦就只是一個電腦,每次訓練的電腦都是這樣的樣子的,但是我們實際生活中電腦是多樣的。

因此我們可以通過改變亮度,圖像扭曲等方式使得圖像變得更加多種多樣,如下圖所示,儘管亮度,形態發生了細微改變,但本質上,這些東西都依然是電腦。
在這裏插入圖片描述
改變後的圖片放入神經網絡進行訓練可以提高網絡的魯棒性,降低各方面額外因素對識別的影響。

目標檢測中的圖像增強

在目標檢測中如果要增強數據,並不是直接增強圖片就好了,還要考慮到圖片扭曲後框的位置。

也就是框的位置要跟着圖片的位置進行改變。

如果大家對我的目標檢測代碼有少許研究的話,應該都可以看到。我特別喜歡用這個數據增強代碼:

def get_random_data(annotation_line, input_shape, random=True, max_boxes=20, jitter=.5, hue=.1, sat=1.5, val=1.5, proc_img=True):
    '''random preprocessing for real-time data augmentation'''
    line = annotation_line.split()
    image = Image.open(line[0])
    iw, ih = image.size
    h, w = input_shape
    box = np.array([np.array(list(map(int,box.split(',')))) for box in line[1:]])

    # 對圖像進行縮放並且進行長和寬的扭曲
    new_ar = w/h * rand(1-jitter,1+jitter)/rand(1-jitter,1+jitter)
    scale = rand(.25, 2)
    if new_ar < 1:
        nh = int(scale*h)
        nw = int(nh*new_ar)
    else:
        nw = int(scale*w)
        nh = int(nw/new_ar)
    image = image.resize((nw,nh), Image.BICUBIC)

    # 將圖像多餘的部分加上灰條
    dx = int(rand(0, w-nw))
    dy = int(rand(0, h-nh))
    new_image = Image.new('RGB', (w,h), (128,128,128))
    new_image.paste(image, (dx, dy))
    image = new_image

    # 翻轉圖像
    flip = rand()<.5
    if flip: image = image.transpose(Image.FLIP_LEFT_RIGHT)

    # 色域扭曲
    hue = rand(-hue, hue)
    sat = rand(1, sat) if rand()<.5 else 1/rand(1, sat)
    val = rand(1, val) if rand()<.5 else 1/rand(1, val)
    x = rgb_to_hsv(np.array(image)/255.)
    x[..., 0] += hue
    x[..., 0][x[..., 0]>1] -= 1
    x[..., 0][x[..., 0]<0] += 1
    x[..., 1] *= sat
    x[..., 2] *= val
    x[x>1] = 1
    x[x<0] = 0
    image_data = hsv_to_rgb(x) # numpy array, 0 to 1

    # 將box進行調整
    box_data = np.zeros((max_boxes,5))
    if len(box)>0:
        np.random.shuffle(box)
        box[:, [0,2]] = box[:, [0,2]]*nw/iw + dx
        box[:, [1,3]] = box[:, [1,3]]*nh/ih + dy
        if flip: box[:, [0,2]] = w - box[:, [2,0]]
        box[:, 0:2][box[:, 0:2]<0] = 0
        box[:, 2][box[:, 2]>w] = w
        box[:, 3][box[:, 3]>h] = h
        box_w = box[:, 2] - box[:, 0]
        box_h = box[:, 3] - box[:, 1]
        box = box[np.logical_and(box_w>1, box_h>1)] # discard invalid box
        if len(box)>max_boxes: box = box[:max_boxes]
        box_data[:len(box)] = box
    
    return image_data, box_data

裏面有一些比較重要的參數如:
scale = rand(.25, 2)
jitter=.5;
hue=.1;
sat=1.5;
val=1.5;

其中:
1、scale代表原圖片的縮放比率,rand(.25, 2)表示在0.25到2之間縮放。
2、jitter代表原圖片的寬高的扭曲比率,jitter=.5表示在0.5到1.5之間扭曲。
3、hue=.1,sat=1.5,val=1.5;分別代表hsv色域中三個通道的扭曲,分別是:色調(H),飽和度(S),明度(V)。

實際效果如下:
原圖:
在這裏插入圖片描述
增強後:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章