【问题标题】:Numpy array in Keras LayerKeras 层中的 Numpy 数组
【发布时间】:2017-03-13 04:40:44
【问题描述】:

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

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

问题似乎与“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()。

【问题讨论】:

    标签: python numpy keras


    【解决方案1】:

    据我所知,您拍摄一张图像,然后 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)
    

    我希望这会有所帮助。

    【讨论】:

    • 这有助于训练和验证模型。当我尝试在模拟器中运行保存的模型时它失败了。我知道如果您有测试数据,您可以使用“predict_generator”。有没有办法从模拟器中获取实时数据,然后通过生成器运行它?
    • 是的,你可以。您可以向生成器索取样品,然后使用model.predict()model.predict_on_batch()。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-06-17
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多