2、TensorFlow2.0 实现Yolo2 (2.数据集预处理:图片增强)

1.提取图像信息预处理

上一篇我们进行了XML提取信息。那么现在我们利用XML提取的信息进行处理。

我们训练需要的是图片的内容信息,所以我们需要通过图片路径来读取图片,以获得图片信息。

1.1图片的读取

import tensorflow as tf
import os,glob
import numpy as np
from tensorflow import keras
import matplotlib.pyplot as plt
from matplotlib import patches
from tqdm import tqdm
import time



#读取图片
def preprocess(img, img_boxes):
	#通过parse_annotation(函数)得到
    # img: 图片路径 
    # img_boxes: [b,40,5]
    
    x = tf.io.read_file(img) #通过图片途径读取图片
    # 解码图片信息 jpg格式: _png改为 _jpeg (我们的图片是png格式)
    x = tf.image.decode_png(x, channels=3) 
    #归一化
    x = tf.image.convert_image_dtype(x, tf.float32) # 将数据转化为 =>[0~ 1]

    return x, img_boxes


def get_dataset(img_dir,ann_dir,labels,batch_size):
    # return tf dataset
    # [b] ,boxes [b,40,5]
    
    #调用parse_annotation进行XML解析
    imgs,boxes=parse_annotation(img_dir,ann_dir,labels)
    #tf.data.Dataset.from_tensor_slices将数据加载为tensor张量的形式
    db = tf.data.Dataset.from_tensor_slices((imgs,boxes))
    #随机打乱1000次,并(batch)分批次(repat)重复映射到preprocess函数中进行读取图片
    db = db.shuffle(1000).map(preprocess).batch(batch_size).repeat()
    print('db Images',len(imgs))
    return db

1.2图片增强

  1. 我们将会使用 i m g a u g imgaug imgaug 工具包,进行图片增强
  2. 我们将图片进行垂直、水平翻转。
  3. 改变图片亮度、把图片归一化
  4. 增强边界框
  5. 把数据转成 tensor量
#imgaug 是专门做图片增强的一个工具包,可以去查看文档。总之有点难用
import imgaug as ia    
from imgaug import augmenters as iaa

def augmentation_generator(data_train):
    '''
    Augmented batch generator from a yolo dataset

    Parameters
    ----------
    - data_train

    Returns
    -------
    - augmented batch : tensor (shape : batch_size, IMAGE_W, IMAGE_H, 3)
        batchs : tupple(images, annotations)
        batchs[0] : images : tensor (shape : batch_size, IMAGE_W, IMAGE_H, 3)
        batchs[1] : annotations : tensor (shape : batch_size, max annot, 5)
    '''
    for batch in tqdm(data_train):
        
        print("batch",batch[0].shape)
        # conversion tensor->numpy
        img = batch[0].numpy()
        boxes = batch[1].numpy()
        # conversion bbox numpy->ia object
        ia_boxes = []
        for i in range(img.shape[0]):
        	 # 获取boxes(xmin,ymin,xmax,ymax)
            for bb in boxes[i]:
                
                if (bb[0] + bb[1] +bb[2] + bb[3] > 0):
                     ia_bbs = [ia.BoundingBox(x1=bb[0],y1=bb[1],x2=bb[2],y2=bb[3])]
                
                ia_boxes.append(ia.BoundingBoxesOnImage(ia_bbs, shape=(512, 512)))
            		   
        # 添加序列
        seq = iaa.Sequential([
            iaa.Fliplr(0.8),#horizontal flips  20%  
            iaa.Flipud(0.8), #vertically flips 20% 
            iaa.Multiply((0.3, 1.6)), # change brightness (改变亮度)
            ])
        #加入循环方式,对多张图进行数据增强
        seq_det = seq.to_deterministic() #确定一个数据增强的序列
        img_aug = seq_det.augment_images(img) #将方法应用在原图像上
        img_aug = np.clip(img_aug, 0, 1) #将img_aug作用在0~1
        boxes_aug = seq_det.augment_bounding_boxes(ia_boxes)# 增强边界框
        # conversion ia object -> bbox numpy
        for i in range(img.shape[0]):           
            #修减 boxes x1-y1-x2-y2
            boxes_aug[i] = boxes_aug[i].remove_out_of_image().clip_out_of_image()
            
            for j, bb in enumerate(boxes_aug[i].bounding_boxes):
               
                boxes[i,j,0] = bb.x1
                boxes[i,j,1] = bb.y1
                boxes[i,j,2] = bb.x2
                boxes[i,j,3] = bb.y2
        # conversion numpy->tensor
        batchs = (tf.convert_to_tensor(img_aug), tf.convert_to_tensor(boxes))

        yield batchs 

labels = ('sugarweet','weed') 
batch_size = 16
data_train = get_dataset("img路径","xml路径",labels,batch_size)
aug_train_db = augmentation_generator(data_train)

1.3 显示数据增强后的图片

from matplotlib import pyplot as plt
from matplotlib import patches

def db_visualize(db):
    # imgs: [b,512,512,3]
    # imgs_boxes: [b,40,5]
    

    #因为图片增加后的数据通过yield弹出,
    #则弹出的数据需要next(iter(data)生成可迭代对象
    imgs,imgs_boxes = next(iter(db))  
    
    
    img,img_boxes = imgs[0],imgs_boxes[0]

	#显示1张图片
    f,ax1 = plt.subplots(1,figsize=(10,10))
    # display the image ,[512,512,3]
    ax1.imshow(img)

	#显示边界框 l:标签
    for x1,y1,x2,y2,label in img_boxes: # [40,5]
        x1,y1,x2,y2 = float(x1),float(y1),float(x2),float(y2)
        w = x2-x1  
        h = y2-y1
        if label == 1: # green for sugarweet
            color = (0,1,0)
        elif label ==2: # blu for weed
            color = (0,0,1)
        else: # ignore invalid boxes
            break
        rect = patches.Rectangle((x1,y1),w,h,linewidth=2,edgecolor=color,
        facecolor='none')
        ax1.add_patch(rect)

#aug_train_db 通过augmentation_generator()增强后的数据
db_visualize(aug_train_db)

在这里插入图片描述
到这里,我们前期的预处理基本已经完成了。下一期我们进行选取最佳的anchors(锚点)

参考自:
https://blog.csdn.net/python_LC_nohtyp/article/details/104842099

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值