我想调整输入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()。
答案 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)
我希望这会有所帮助。