Keras Layer中的Numpy数组

时间:2017-03-13 04:40:44

标签: python numpy keras

我想调整输入keras模型的输入图像的图像亮度。数据从模拟器提供并实时输入模型,因此我需要一种方法来调整模型本身的图像数据。我目前正在使用自己的openCV层来执行任务,但是我收到了以下错误。

  

文件" /usr/lib/python3/dist-packages/numpy/core/_methods.py" ;,第70行,在_mean       ret = ret.dtype.type(ret / rcount)   AttributeError:' DType'对象没有属性'键入'

该问题似乎与“= gamma = np.median(img)/ 25'和代码试图在一个类' tensorflow.python.framework.ops.Tensor'上进行numpy数学运算。

我的班级代码是

class ImageLayer(Layer):

def __init__(self, **kwargs):
    super(ImageLayer, self).__init__(**kwargs)

def call(self, img, mask=None):

    print(type(img))
    # adjust the image brightness to help normalise dark and light images
    gamma = np.median(img) / 25
    if gamma > 5.:
        gamma = 5
    elif gamma < 0.5:
        gamma = 0.5
    # build a lookup table mapping the pixel values [0, 255] to
    # their adjusted gamma values
    # http://www.pyimagesearch.com/2015/10/05/opencv-gamma-correction/
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255
                      for i in np.arange(0, 256)]).astype("uint8")

    # apply gamma correction using the lookup table
    return cv2.LUT(img, table)

模型从模型中调用类

inputs = Input(shape=(160, 320, 3), dtype='int8')
x = Cropping2D(cropping=((50,0), (0,0)), input_shape=(160, 320, 3), dim_ordering='tf')(inputs)
x = ImageLayer()(x)
x = BatchNormalization(epsilon=0.001, mode=0, axis=2, momentum=0.99)(x)

有可能做我想做的事吗?

是否可以在Keras中执行numpy算术?我知道你可以在Tensorflow中使用.eval()。

1 个答案:

答案 0 :(得分:0)

据我所见,你拍摄一张照片然后1.裁剪2.改变亮度。然后将其输入您的模型。因此,不要定义形状(160, 320, 3)的输入图层,为什么不定义裁剪和改变亮度后将获得的形状之一。然后像往常一样定义模型的其余部分。如果你这样做,那么你只需要编写自己的生成器,而不是编写一个层,你可以使用普通的opencv / python / numpy来改变亮度/裁剪等。例如,请参阅my post了解如何定义一个能够与多个工作者一起工作的多线程生成器。

如果您希望将亮度变化视为可学习参数或将其包含在反向传播中,请不要这样做。换句话说,如果亮度变化是预处理操作并且与您的学习方式无关,请使用上述技术。

下面给出了一个关于MNIST数据的简单生成器(仅与1个工作者一起工作),一次取出32个图像。您可以在阅读图像后立即包括亮度变化操作。仅将此代码视为骨架。我没有定义所有变量,它不会开箱即用。

def myGenerator():  # write the definition of your data generator
    while True:
        count = 0
        for i in range(len(allImgFilenames)):
            if count == 0:
                imgBatch = np.empty((batchSize, 3, 32, 32), dtype=float)
                labelsBatch = np.empty((batchSize,), dtype=int)
            img = cv2.imread(allImgFilenames[i])
            img = cv2.cvtcolor(img, cv2.COLOR_BGR2RGB)  # change the brightness
            img = np.float32(img)/255.
            imgBatch[count, :, :, :] = np.transpose(img, (2,0,1))
            labelsBatch[count] = np.random.randint(0,10,(1,1))
            count += 1
            if count == batchSize:
                count = 0
                yield (imgBatch, labelsBatch)

fit函数中调用生成器,如下所示:

my_generator = myGenerator()
print("Built the generator")

model.fit_generator(my_generator, samples_per_epoch=60000, nb_epoch=10)

<强>测试

您希望实时从模拟器获取数据。为此,您可以用从模拟器获取数据的函数替换cv2.imread()。如果要在模拟图像后立即对图像进行分类,也可以将批量大小更改为1。从生成器获取图像,如下所示:

img, label = my_generator.next()  # this will give you `batchSize` number of samples.
model.predict(img)  # `img` should have 4 dimensions if RGB, img.shape = (1,3,nRows,nCols)

我希望这会有所帮助。