欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中數(shù)據(jù)處理的方法總結(jié)及實現(xiàn)

 更新時間:2022年09月16日 09:38:10   作者:一個熱愛學(xué)習(xí)的深度渣渣  
數(shù)據(jù)增強作為前處理的關(guān)鍵步驟,在整個計算機視覺中有著具足輕重的地位。本文為大家總結(jié)了Python中數(shù)據(jù)處理的方法及實現(xiàn),需要的可以參考一下

背景

數(shù)據(jù)增強作為前處理的關(guān)鍵步驟,在整個計算機視覺中有著具足輕重的地位;

數(shù)據(jù)增強往往是決定數(shù)據(jù)集質(zhì)量的關(guān)鍵,主要用于數(shù)據(jù)增廣,在基于深度學(xué)習(xí)的任務(wù)中,數(shù)據(jù)的多樣性和數(shù)量往往能夠決定模型的上限;

本次記錄主要是對數(shù)據(jù)增強中一些方法的源碼實現(xiàn);

常用數(shù)據(jù)增強方法

首先如果是使用Pytorch框架,其內(nèi)部的torchvision已經(jīng)包裝好了數(shù)據(jù)增強的很多方法;

from torchvision import transforms

data_aug = transforms.Compose[
    transforms.Resize(size=240),
    transforms.RandomHorizontalFlip(0.5),
    transforms.ToTensor()
]

接下來自己實現(xiàn)一些主要的方法;

常見的數(shù)據(jù)增強方法有:Compose、RandomHflip、RandomVflip、Reszie、RandomCrop、Normalize、Rotate、RandomRotate

1、Compose

作用:對多個方法的排序整合,并且依次調(diào)用;

# 排序(compose)
class Compose(object):
    def __init__(self, transforms):
        self.transforms = transforms
    def __call__(self, img):
        for t in self.transforms:
            img = t(img)    # 通過循環(huán)不斷調(diào)用列表中的方法
        return img

2、RandomHflip

作用:隨機水平翻轉(zhuǎn);

# 隨機水平翻轉(zhuǎn)(random h flip)
class RandomHflip(object):
    def __call__(self, image):
        if random.randint(2):
            return cv2.flip(image, 1)
        else:
            return image

通過隨機數(shù)0或1,實現(xiàn)對圖像可能反轉(zhuǎn)或不翻轉(zhuǎn);

3、RandomVflip

作用:隨機垂直翻轉(zhuǎn)

class RandomVflip(object):
    def __call__(self, image):
        if random.randint(2):
            return cv2.flip(image, 0)
        else:
            return image

4、RandomCrop

作用:隨機裁剪;

# 縮放(scale)
def scale_down(src_size, size):
    w, h = size
    sw, sh = src_size
    if sh < h:
        w, h = float(w * sh) / h, sh
    if sw < w:
        w, h = sw, float(h * sw) / w
    return int(w), int(h)
    
# 固定裁剪(fixed crop)
def fixed_crop(src, x0, y0, w, h, size=None):
    out = src[y0:y0 + h, x0:x0 + w]
    if size is not None and (w, h) != size:
        out = cv2.resize(out, (size[0], size[1]), interpolation=cv2.INTER_CUBIC)
    return out

# 隨機裁剪(random crop)
class RandomCrop(object):
    def __init__(self, size):
        self.size = size
    def __call__(self, image):
        h, w, _ = image.shape
        new_w, new_h = scale_down((w, h), self.size)
        if w == new_w:
            x0 = 0
        else:
            x0 = random.randint(0, w - new_w)
        if h == new_h:
            y0 = 0
        else:
            y0 = random.randint(0, h - new_h)

???????        out = fixed_crop(image, x0, y0, new_w, new_h, self.size)
        return out

5、Normalize

作用:對圖像數(shù)據(jù)進行正則化,也就是減均值除方差的作用;

# 正則化(normalize)
class Normalize(object):
    def __init__(self,mean, std):
        '''
        :param mean: RGB order
        :param std:  RGB order
        '''
        self.mean = np.array(mean).reshape(3,1,1)
        self.std = np.array(std).reshape(3,1,1)
    def __call__(self, image):
        '''
        :param image:  (H,W,3)  RGB
        :return:
        '''
        return (image.transpose((2, 0, 1)) / 255. - self.mean) / self.std

6、Rotate

作用:對圖像進行旋轉(zhuǎn);

# 旋轉(zhuǎn)(rotate)
def rotate_nobound(image, angle, center=None, scale=1.):
    (h, w) = image.shape[:2]
    # if the center is None, initialize it as the center of the image
    if center is None:
        center = (w // 2, h // 2)    # perform the rotation
    M = cv2.getRotationMatrix2D(center, angle, scale)    # 這里是實現(xiàn)得到旋轉(zhuǎn)矩陣
    rotated = cv2.warpAffine(image, M, (w, h))            # 通過矩陣進行仿射變換
    return rotated

7、RandomRotate

作用:隨機旋轉(zhuǎn),廣泛適用于圖像增強;

# 隨機旋轉(zhuǎn)(random rotate)
class FixRandomRotate(object):
	# 這里的隨機旋轉(zhuǎn)是指在0、90、180、270四個角度下的
    def __init__(self, angles=[0,90,180,270], bound=False):
        self.angles = angles
        self.bound = bound

    def __call__(self,img):
        do_rotate = random.randint(0, 4)
        angle=self.angles[do_rotate]
        if self.bound:
            img = rotate_bound(img, angle)
        else:
            img = rotate_nobound(img, angle)
        return img

8、Resize

作用:實現(xiàn)縮放;

# 大小重置(resize)
class Resize(object):
    def __init__(self, size, inter=cv2.INTER_CUBIC):
        self.size = size
        self.inter = inter

    def __call__(self, image):
        return cv2.resize(image, (self.size[0], self.size[0]), interpolation=self.inter)

其他數(shù)據(jù)增強方法

其他一些數(shù)據(jù)增強的方法大部分是特殊的裁剪;

1、中心裁剪

# 中心裁剪(center crop)
def center_crop(src, size):
    h, w = src.shape[0:2]
    new_w, new_h = scale_down((w, h), size)

    x0 = int((w - new_w) / 2)
    y0 = int((h - new_h) / 2)

    out = fixed_crop(src, x0, y0, new_w, new_h, size)
    return out

2、隨機亮度增強

# 隨機亮度增強(random brightness)
class RandomBrightness(object):
    def __init__(self, delta=10):
        assert delta >= 0
        assert delta <= 255
        self.delta = delta

    def __call__(self, image):
        if random.randint(2):
            delta = random.uniform(-self.delta, self.delta)
            image = (image + delta).clip(0.0, 255.0)
            # print('RandomBrightness,delta ',delta)
        return image

3、隨機對比度增強

# 隨機對比度增強(random contrast)
class RandomContrast(object):
    def __init__(self, lower=0.9, upper=1.05):
        self.lower = lower
        self.upper = upper
        assert self.upper >= self.lower, "contrast upper must be >= lower."
        assert self.lower >= 0, "contrast lower must be non-negative."

    # expects float image
    def __call__(self, image):
        if random.randint(2):
            alpha = random.uniform(self.lower, self.upper)
            # print('contrast:', alpha)
            image = (image * alpha).clip(0.0,255.0)
        return image

4、隨機飽和度增強

# 隨機飽和度增強(random saturation)
class RandomSaturation(object):
    def __init__(self, lower=0.8, upper=1.2):
        self.lower = lower
        self.upper = upper
        assert self.upper >= self.lower, "contrast upper must be >= lower."
        assert self.lower >= 0, "contrast lower must be non-negative."

    def __call__(self, image):
        if random.randint(2):
            alpha = random.uniform(self.lower, self.upper)
            image[:, :, 1] *= alpha
            # print('RandomSaturation,alpha',alpha)
        return image

5、邊界擴充

# 邊界擴充(expand border)
class ExpandBorder(object):
    def __init__(self,  mode='constant', value=255, size=(336,336), resize=False):
        self.mode = mode
        self.value = value
        self.resize = resize
        self.size = size

    def __call__(self, image):
        h, w, _ = image.shape
        if h > w:
            pad1 = (h-w)//2
            pad2 = h - w - pad1
            if self.mode == 'constant':
                image = np.pad(image, ((0, 0), (pad1, pad2), (0, 0)),
                               self.mode, constant_values=self.value)
            else:
                image = np.pad(image,((0,0), (pad1, pad2),(0,0)), self.mode)
        elif h < w:
            pad1 = (w-h)//2
            pad2 = w-h - pad1
            if self.mode == 'constant':
                image = np.pad(image, ((pad1, pad2),(0, 0), (0, 0)),
                               self.mode,constant_values=self.value)
            else:
                image = np.pad(image, ((pad1, pad2), (0, 0), (0, 0)),self.mode)
        if self.resize:
            image = cv2.resize(image, (self.size[0], self.size[0]),interpolation=cv2.INTER_LINEAR)
        return image

當然還有很多其他數(shù)據(jù)增強的方式,在這里就不繼續(xù)做說明了;

拓展

除了可以使用Pytorch中自帶的數(shù)據(jù)增強包之外,也可以使用imgaug這個包(一個基于數(shù)據(jù)處理的包、包含大量的數(shù)據(jù)處理方法,并且代碼完全開源)

代碼地址:https://github.com/aleju/imgaug

說明文檔:https://imgaug.readthedocs.io/en/latest/index.html

強烈建議大家看看這個說明文檔,其中的很多數(shù)據(jù)處理方法可以快速的應(yīng)用到實際項目中,也可以加深對圖像處理的理解;

到此這篇關(guān)于詳解Python中數(shù)據(jù)處理的方法總結(jié)及實現(xiàn)的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論