Я хочу применить фильтр к изображениям после операции свертки в модели Keras. Вот мой код.
import cv2
import glob
import numpy as np
from keras.layers import Conv2D, Input, Lambda
from keras.models import Model
images = [cv2.resize(cv2.imread(file), (256,256)) for file in glob.glob('/content/mydrive/MyDrive/*.png')]
images = np.asarray(images)
labls = np.ones(images.shape) ## here all labeles are set to ones, just to test the code.
def apply_filter(img):
filters = []
ksize = 31
for theta in np.arange(0, np.pi, np.pi/16):
kern = cv2.getGaborKernel((ksize, ksize), 4.0, theta, 10.0, 0.5, 0, ktype=cv2.CV_32F)
kern /= 1.5*kern.sum()
filters.append(kern)
accum = np.zeros_like(img)
for kern in filters:
fimg = cv2.filter2D(img, cv2.CV_8UC3, kern)
np.maximum(accum, fimg, accum)
return accum
res1=[]
for ig in images:
res1.append(apply_filter(ig))
res1 = np.asarray(res1)
print(res1.shape)
inpt = Input((256,256,3))
c1 = Conv2D(filters = 3, kernel_size=(1,1),strides = (1,1), padding = 'same')(inpt)
c1 = Lambda(apply_filter(np.float32(c1)))
model = Model(inputs=inpt, outputs=c1)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(images,labls, epochs=5)
Код для применения фильтра (def apply_filters) работает независимо без каких-либо ошибок. Однако, когда я вызываю функцию как настраиваемый слой лямбда, она выдает ошибку, как показано ниже. пожалуйста, помогите мне исправить проблему. спасибо
TypeError Traceback (most recent call last)
<ipython-input-26-cb9df2f129a2> in <module>()
5 inpt = Input((256,256,3))
6 c1 = Conv2D(filters = 3, kernel_size=(1,1),strides = (1,1), padding = 'same')(inpt)
----> 7 c1 = Lambda(apply_filter(np.float32(c1)))
8 model = Model(inputs=inpt, outputs=c1)
9 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
TypeError: __array__() takes 1 positional argument but 2 were given