imgaug:加载并保存图片

时间:2018-05-24 10:18:51

标签: python image opencv tensorflow scipy

我正在使用Python + Tensorflow在高性能计算集群上进行CNN培训。我正在训练卷积神经网络,但有一个相对较小的数据集。所以我正在实施增强它的技术。现在这是我第一次研究核心计算机视觉问题,所以对它来说相对较新。

随着训练图像数量的增加,需要cv2的imgaug包(https://github.com/aleju/imgaug)似乎是完美的,是一种简单的解决方案,可以增加图像的数量。我使用python 2.7安装了opencv2,所有必需的python包都在本地运行(这里没有使用env / Anaconda / Docker)。

实际上,我正在尝试从here运行此代码:

import os
import imgaug as ia
from imgaug import augmenters as iaa
import scipy
import cv2
import numpy as np
# optional check my hint import scipy.misc import imwrite
# optional check my hint import scipy.misc import imsave

ia.seed(1)

# Example batch of images.
# The array has shape (32, 64, 64, 3) and dtype uint8.
images = np.array(
    [ia.quokka(size=(64, 64)) for _ in range(32)],
    dtype=np.uint8
)

seq = iaa.Sequential([
    iaa.Fliplr(0.5), # horizontal flips
    iaa.Crop(percent=(0, 0.1)), # random crops
    # Small gaussian blur with random sigma between 0 and 0.5.
    # But we only blur about 50% of all images.
    iaa.Sometimes(0.5,
        iaa.GaussianBlur(sigma=(0, 0.5))
    ),
    # Strengthen or weaken the contrast in each image.
    iaa.ContrastNormalization((0.75, 1.5)),
    # Add gaussian noise.
    # For 50% of all images, we sample the noise once per pixel.
    # For the other 50% of all images, we sample the noise per pixel AND
    # channel. This can change the color (not only brightness) of the
    # pixels.
    iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
    # Make some images brighter and some darker.
    # In 20% of all cases, we sample the multiplier once per channel,
    # which can end up changing the color of the images.
    iaa.Multiply((0.8, 1.2), per_channel=0.2),
    # Apply affine transformations to each image.
    # Scale/zoom them, translate/move them, rotate them and shear them.
    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) # apply augmenters in random order

images_aug = seq.augment_images(images)

使用此代码创建.py文件后,我已将此文件复制到50个图像(.jpg)的文件夹中。 代码本身运行完美(没有错误遇到),但似乎.jpg没有加载到.py文件中,即使我设置文件夹路径,它也不会加载图像。此外,没有写入新文件。

问题1:我想我必须将图像作为数组加载到.py或cv2中,但我找不到任何示例如何加载和编写它们,因为我从未做过这样的事情。有帮助吗?

问题2:在此上下文中使用的最佳界面是什么?所有图像都存储在文件夹或.xlsx文件中。

(提示:可能这是一个选项,不幸的是它基于Keras(Link)?或者我找到了这两个选项,但我无法使用它们scipy.ndimage.imread和{{ 3}})

3 个答案:

答案 0 :(得分:2)

images_aug = seq.augment_images(images)

你的代码在" images"不在您的文件上。所以你先读了你的文件内容。 作者在自述文件中也有这些内容。

for batch_idx in range(1000):
    # 'images' should be either a 4D numpy array of shape (N, height, width, channels)
    # or a list of 3D numpy arrays, each having shape (height, width, channels).
    # Grayscale images must have shape (height, width, 1) each.
    # All images must have numpy's dtype uint8. Values are expected to be in
    # range 0-255.
  

问题1:我想我必须将图像作为数组加载到.py或cv2中,但我找不到任何示例如何加载和编写它们,因为我从未做过这样的事情。有什么帮助吗?

只需创建一个大小(N,高度,宽度,通道)的4d数组。然后读取每个图像并将其推入该阵列将起作用。例如

import numpy as np
import cv2
images = np.zeros(N, height, width, channels)
for idx, img_path in enumerate(img_paths):
    img = cv2.imread(img_path, 1)
    images[idx, :, :, :] = img
  

问题2:在此上下文中使用的最佳界面是什么?所有图像都存储在文件夹或.xlsx文件中。

数据论证用于提高训练数据的稳健性。如果您的"界面"意味着深度学习框架,那么任何具有python接口的框架都应该运行良好。

希望有所帮助。

答案 1 :(得分:2)

我已经阅读了imgaug的源代码,方法'ia.quokka'返回(H,W,3)ndarray(dtype uint8的图像数组),因此您可以更改example读取和保存图像。

这是我的用途:

import imgaug as ia
from imgaug import augmenters as iaa
import numpy as np
import imageio

ia.seed(1)

img = imageio.imread("test.jpg") #read you image
images = np.array(
    [img for _ in range(32)], dtype=np.uint8)  # 32 means creat 32 enhanced images using following methods.

seq = iaa.Sequential(
    [
        iaa.Fliplr(0.5),  
        iaa.Crop(percent=(0, 0.1)),            
        iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.5))),        
        iaa.ContrastNormalization((0.75, 1.5)),         
        iaa.AdditiveGaussianNoise(
            loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5),    
        iaa.Multiply((0.8, 1.2), per_channel=0.2),
        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)  # apply augmenters in random order

images_aug = seq.augment_images(images)

for i in range(32):
    imageio.imwrite(str(i)+'new.jpg', images_aug[i])  #write all changed images

答案 2 :(得分:0)

from imgaug import augmenters as iaa

import cv2

seq = iaa.Sequential([
    iaa.Crop(px=(0, 16)),
    iaa.Fliplr(0.5),
    iaa.GaussianBlur(sigma=(0, 3.0))
])

imglist = []

img = cv2.imread('test.jpg')

imglist.append(img)

images_aug = seq.augment_images(imglist)

cv2.imwrite('new.jpg', images_aug[0])