博客
关于我
数据增强--对于目标检测(边框、图像)
阅读量: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/

你可能感兴趣的文章
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>
Mysql 笔记
查看>>
MySQL 精选 60 道面试题(含答案)
查看>>
mysql 索引
查看>>
MySQL 索引失效的 15 种场景!
查看>>
MySQL 索引深入解析及优化策略
查看>>
MySQL 索引的面试题总结
查看>>
mysql 索引类型以及创建
查看>>
MySQL 索引连环问题,你能答对几个?
查看>>
Mysql 索引问题集锦
查看>>