博客
关于我
数据增强--对于目标检测(边框、图像)
阅读量:559 次
发布时间:2019-03-09

本文共 6607 字,大约阅读时间需要 22 分钟。

import torchfrom PIL import Image, ImageFont, ImageDrawfrom functools import reduceimport scipy.io as sciofrom PIL import Imageimport cv2 as cvimport numpy as npimport randomimport imutilsfrom imgaug import augmenters as iaadef horisontal_flip(images, targets):    images = torch.flip(images, [-1])    targets[:, 2] = 1 - targets[:, 2]    return images, targetsdef compose(*funcs):    """Compose arbitrarily many functions, evaluated left to right.    Reference: https://mathieularose.com/function-composition-in-python/    """    # return lambda x: reduce(lambda v, f: f(v), funcs, x)    if funcs:        return reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs)    else:        raise ValueError('Composition of empty sequence not supported.')def letterbox_image(image, size):    '''resize image with unchanged aspect ratio using padding'''    iw, ih = image.size    w, h = size    scale = min(w / iw, h / ih)    nw = int(iw * scale)    nh = int(ih * scale)    image = image.resize((nw, nh), Image.BICUBIC)    new_image = Image.new('RGB', size, (128, 128, 128))    new_image.paste(image, ((w - nw) // 2, (h - nh) // 2))    return new_imagedef rand(a=0, b=1):    return np.random.rand() * (b - a) + adef resize_3D_data(ima, size=(416, 416)):    dat = np.zeros([416, 416, 15])    for i in range(15):        slice = np.squeeze(ima[:, :, i])        re_slice = cv.resize(slice.astype('uint8'), size, interpolation=cv.INTER_AREA)        dat[:, :, i] = re_slice    return datdef random_crop(cell, boxes):    dx = random.randint(15, 20)    dy = random.randint(15, 20)    shape = cell.shape    nx = shape[0]    ny = shape[1]    boxes[:, [0, 2]] = boxes[:, [0, 2]] - dx    boxes[:, [1, 3]] = boxes[:, [1, 3]] - dy    new_cell = np.zeros_like(cell)    new_cell[0:int(nx - dx), 0:int(ny - dy)] = cell[dx:, dy:]    new_cell = Image.fromarray(new_cell.astype('uint8')).convert('RGB')    new_cell = cv.cvtColor(np.asarray(new_cell), cv.COLOR_RGB2BGR)    boxes = np.where(boxes < 0, 0, boxes)    return new_cell, boxesdef random_noise(cell, boxes):    image = Image.fromarray(cell.astype('uint8')).convert('RGB')    image = cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)    seq = iaa.Sequential(        [            iaa.AdditiveGaussianNoise(scale=0.05 * 255),            iaa.LinearContrast((0.75, 1.5)),            iaa.GaussianBlur(sigma=(0, 4.0)),            iaa.Dropout(p=(0, 0.2)),            iaa.CoarseDropout(0.02, size_percent=0.5)        ], random_order=True    )    images_aug = seq.augment_images([image])[0]    new_cell = Image.fromarray(cv.cvtColor(images_aug, cv.COLOR_BGR2RGB))    return new_cell, boxesdef gray_level_crop(cell, boxes):    max_val = random.randint(80, 255) / 255    new_cell = cell * max_val    new_cell = Image.fromarray(new_cell.astype('uint8')).convert('RGB')    new_cell = cv.cvtColor(np.asarray(new_cell), cv.COLOR_RGB2BGR)    return new_cell, boxesdef rotate_box(box, M, shape):    # print(box)    y1, x1, y2, x2 = box    p1 = np.array([x1, y1, 1]).reshape((3, 1))    p2 = np.array([x1, y2, 1]).reshape((3, 1))    p3 = np.array([x2, y2, 1]).reshape((3, 1))    p4 = np.array([x2, y1, 1]).reshape((3, 1))    p1 = np.matmul(M, p1)    p2 = np.matmul(M, p2)    p3 = np.matmul(M, p3)    p4 = np.matmul(M, p4)    x1 = np.min([p1[0, 0], p2[0, 0], p3[0, 0], p4[0, 0]])    x2 = np.max([p1[0, 0], p2[0, 0], p3[0, 0], p4[0, 0]])    y1 = np.min([p1[1, 0], p2[1, 0], p3[1, 0], p4[1, 0]])    y2 = np.max([p1[1, 0], p2[1, 0], p3[1, 0], p4[1, 0]])    if x1 < 0:        x1 = 0    if x1 > shape[1]:        x1 = shape[1] - 1    if x2 < 0:        x2 = 0    if x2 > shape[1]:        x2 = shape[1] - 1    if y1 < 0:        y1 = 0    if y1 > shape[0]:        y1 = shape[0] - 1    if y2 < 0:        y2 = 0    if y2 > shape[0]:        y2 = shape[0] - 1    box = [y1, x1, y2, x2]    # print(box)    # print('--------------')    return boxdef random_rotate(cell, boxes, angle=45):    (h, w) = cell.shape    (cX, cY) = (w // 2, h // 2)    new_cell = imutils.rotate_bound(cell.astype('uint8'), angle)    M = cv.getRotationMatrix2D((cX, cY), -angle, 1.0)    cos = np.abs(M[0, 0])    sin = np.abs(M[0, 1])    # compute the new bounding dimensions of the image    nW = int((h * sin) + (w * cos))    nH = int((h * cos) + (w * sin))    # adjust the rotation matrix to take into account translation    M[0, 2] += (nW / 2) - cX    M[1, 2] += (nH / 2) - cY    new_boxes = []    for i in range(len(boxes)):        new_boxes.append(rotate_box(boxes[i], M, new_cell.shape))    if len(new_boxes) > 0:        new_boxes = np.array(new_boxes)    new_cell = Image.fromarray(new_cell.astype('uint8')).convert('RGB')    new_cell = cv.cvtColor(np.asarray(new_cell), cv.COLOR_RGB2BGR)    return new_cell, new_boxesdef random_argument(data, cell, boxes):    # crop region ...    if rand() < .5:        cell, boxes = random_crop(cell, boxes)    # add noise ...    if rand() < .5:        cell, boxes = random_noise(cell, boxes)    # add noise ...    if rand() < .5:        cell, boxes = gray_level_crop(cell, boxes)    # rotate ...    if rand() < .5:       cell, boxes = random_rotate(cell, boxes, random.randint(0, 90))    return cell, boxesdef pad_to_square(img, pad_value):    h, w, c = img.shape    dim_diff = np.abs(h - w)    # (upper / left) padding and (lower / right) padding    pad1, pad2 = dim_diff // 2, dim_diff - dim_diff // 2    # Determine padding    pad = ((0, 0), (pad1, pad2), (0, 0)) if w <= h else ((pad1, pad2), (0, 0), (0, 0))    # Add padding    img = np.pad(img, pad, "constant", constant_values=pad_value)    return img, padif __name__ == '__main__':    dat = scio.loadmat(        '/home/xuxu/Data/CTC_Signal_Datasets/Processed/20200616_cell_signalmark_39frames/Green/653802_650142_0_675.mat')    cell = dat['signal'].astype('uint8')    boxe = dat['rects']    print('boxe', boxe)    # image = Image.fromarray(cell.astype('uint8')).convert('RGB')    # image = cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)    # for x1, y1, x2, y2 in boxes:    #     cv.rectangle(image, (y1, x1), (y2, x2), (255, 255, 255), thickness=1)    # cv.imwrite('1.jpg', image)    new_cell, new_boxes = random_rotate(cell, boxe)    # new_cell, new_boxes = gray_level_crop(cell, boxe)    # print('new_boxes', new_boxes)    # new_boxes = np.where(new_boxes < 0, 0, new_boxes)    # print('new_boxes', new_boxes)    # image = Image.fromarray(new_cell.astype('uint8')).convert('RGB')    # image = cv.cvtColor(np.asarray(image), cv.COLOR_RGB2BGR)    for x1, y1, x2, y2 in new_boxes:        cv.rectangle(new_cell, (int(y1), int(x1)), (int(y2), int(x2)), (255, 255, 255), thickness=1)    cv.imwrite('1.jpg', new_cell)

其中图像加噪使用的是imgaug库

转载地址:http://ewhsz.baihongyu.com/

你可能感兴趣的文章
mt-datetime-picker type="date" 时间格式 bug
查看>>
myeclipse的新建severlet不见解决方法
查看>>
MyEclipse设置当前行背景颜色、选中单词前景色、背景色
查看>>
Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
查看>>
myeclipse配置springmvc教程
查看>>
MyEclipse配置SVN
查看>>
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
MySQL
查看>>
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>