博客
关于我
数据增强--对于目标检测(边框、图像)
阅读量: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 使用sql文件恢复数据库
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
MySQL 内核深度优化
查看>>
mysql 内连接、自然连接、外连接的区别
查看>>
mysql 写入慢优化
查看>>
mysql 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>