数据清洗
自己做的图像很容易存在坏数据(比如灰度图,比如出现CV2读不出数据,没有shape)。下面直接上代码:
import os
import tensorflow as tf
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import cv2
import shutil
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
cwd='F:/TFdata/train'
all_path = []
for root, dirs, files in os.walk(cwd):
for file in files:
if "jpg" in file:
all_path.append(os.path.join(root, file))
bad_image= []
bad_path = 'F:/TFdata/bad'
for i in range(len(all_path)):
org = all_path[i]
try:
img = cv2.imread(org)
ss = img.shape
except:
bad_image.append(all_path[i])
shutil.move(all_path[i],bad_path)
continue
print('共有%s张脏图'%(len(bad_image)))
数据增强
在深度学习中数据量很重要,但受限于实际情况很难达到几万张,几十万张。数据量不够会导致val_loss和val_accuracy基本不变但很差,基本30%-40%就不动了,所以需要进行数据增强,利用原有数据丰富输入数据。数据增强有多种,这里就只用imgaug(强大的图片数据增强的库)。它支持广泛的增强技术,允许轻松组合这些技术并以随机顺序或在多个CPU内核上执行它们,具有简单而强大的随机接口,不仅可以增强图像,还可以增强关键点/地标,边界框,热图和分割图。详细可以学习imgaug document
1.安装
pip install imgaug
2.使用
该数据增强库需要输入一个四维的图像数据组 images(N,height,weidth,channels)就是图像数量,图像高度,图像宽度,图像的通道(RGB为channels=3,grid为channels=1)。数据必须是uint8类型,大小在0到255之间。
第一种,在程序中(batch)直接使用 增强序列seq(裁剪 + 水平翻转 + 高斯模糊)用来存放要进行的所有增强操作。在脚本开始时定义一次,然后加载和扩充许多批次,然后用于训练。
“图像”应为4D numpy形状数组(N、高度、宽度、通道)或三维numpy阵列列表,每个阵列具有形状(高度、宽度、通道)。灰度图像必须具有每个形状(高度、宽度、1)。所有图像必须具有numpy的数据类型uint8,值应在范围0-255。 下面是使用imgaug自带的quokka(短尾矮袋鼠)来进行的试验
import numpy as np
import imgaug as ia
import imgaug.augmenters as iaa
import matplotlib.pyplot as plt
ia.seed(1)
quo=ia.quokka(size=(224,224))
plt.imshow(quo)
plt.axis("off")
plt.show()
出现结果,短尾袋鼠的原图: 再看一下把一张图做成一个batch_size=32的一个四维数组(就是一个batch)的代码和结果:
images = np.array(
[ia.quokka(size=(224, 224)) for _ in range(32)],
dtype=np.uint8
)
for index in range(32):
plt.subplot(4, 8, index + 1)
plt.imshow(images[index])
plt.axis("off")
plt.show()
一个batch的原始图片,展示: 然后,按照介绍里的添加增强序列。包含裁剪和仿射变换,水平翻转一些图像,添加一些噪点和模糊,还可以更改对比度和亮度。
seq = iaa.Sequential([
iaa.Fliplr(0.5),
iaa.Crop(percent=(0, 0.1)),
iaa.Sometimes(
0.5,
iaa.GaussianBlur(sigma=(0, 0.5))
),
iaa.LinearContrast((0.75, 1.5)),
iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-25, 25),
shear=(-8, 8)
)
], random_order=True)
images_aug = seq(images=images)
for index in range(32):
plt.subplot(4, 8, index + 1)
plt.imshow(images_aug[index])
plt.axis("off")
plt.show()
数据增强后该batch的情况,可以看到已经进行了水平翻转,裁剪,高斯模糊,对比度改变,颜色改变。剩下就是改变增强序列(seq)中的函数来增加想要的增强方式就行。更加强烈的增强可以查看imgaug的官方英文介绍 第二种,将增强的图片保存到本地文件然后打乱所有的文件从而利用上次(随笔一)中的方法建立新的TFRecord。上代码
import numpy as np
import cv2
from imgaug import augmenters as iaa
import matplotlib.pyplot as plt
from PIL import Image
seq = iaa.Sequential([
iaa.PiecewiseAffine(scale=(0.01, 0.05)),
iaa.CoarseDropout((0.03, 0.15), size_percent=(0.02, 0.05),per_channel=0.2),
iaa.DirectedEdgeDetect(alpha=(0, 0.7), direction=(0.0, 1.0)),
iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)),
iaa.Superpixels(p_replace=(0, 1.0),n_segments=(20, 200)),
iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)),
iaa.Crop(px=(1, 16)),
iaa.Fliplr(0.5),
iaa.GaussianBlur(sigma=(0, 3.0))
])
img = cv2.imread('C:/Users/Administrator/Desktop/quokka.jpg')
def augment_image(number,img,fn):
for i in range(number):
images_aug=seq.augment_image(image=img)
plt.imshow(images_aug)
plt.axis('off')
string='image'+ str(i) + '.jpg'
plt.savefig(fn+string)
number=64
fn='F:/TFdata/aug'
augment_image(number,img,fn)
|