【发布时间】:2020-05-26 13:37:12
【问题描述】:
我正在尝试通过在训练期间使用 OpenCV 函数计算一些动态值(例如图像的 Hu 矩)来提高 CNN(卷积神经网络)的准确性相位,然后将它们提供给具有展平向量的全连接层,如我的模型图像所示:
我想在数据集中使用 OPENCV 计算每个图像的 Hu 矩,然后在 flatten 操作之后,我想将 Hu 矩的值与 fatten 连接起来向量并将其馈送到全连接层。
这是我正在使用的模型(Tensorflow Keras):
@tf.function
def calc_hu(imagex):
imagex=tf.image.convert_image_dtype(imagex, dtype=tf.uint8)
moments = cv2.UMat(cv2.moments(imagex))
huMoments = cv2.UMat(cv2.HuMoments(moments))
for i in range(0, 7):
huMoments[i] = abs(-1 * math.copysign(1.0, huMoments[i]) * math.log10(abs(huMoments[i])))
huMoments=huMoments.astype(np.uint8)
return huMoments
class HuLayer(tf.keras.layers.Layer):
def call(self, inputs):
return calc_hu(inputs)
layer1 = Conv2D(16, (3, 3),padding="same", activation='relu')(inpx)
layer2 = Conv2D(32, kernel_size=(3, 3),padding="same", activation='relu')(layer1)
layer3 = MaxPooling2D(pool_size=(2, 2))(layer2)
layer4 = Conv2D(64, kernel_size=(5, 5),padding="same", activation='relu')(layer3)
layer5 = Conv2D(128, kernel_size=(5, 5),padding="same", activation='relu')(layer4)
layer6 = MaxPooling2D(pool_size=(2, 2))(layer5)
layer7 = Dropout(0.5)(layer6)
layer8 = Flatten()(layer7)
layer8_ =tf.keras.layers.concatenate([layer8, HuLayer()(tf.keras.layers.Input(shape=np.asarray([1,2,3,4,5,6,7]).shape))(inpx)])
layer9 = Dense(250, activation='sigmoid')(layer8_)
layer10 = Dense(10, activation='softmax')(layer9)
model = Model([inpx], layer10)
model.compile(optimizer=keras.optimizers.Adadelta(),
loss=keras.losses.categorical_crossentropy,
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=500)
score = model.evaluate(x_test, y_test, verbose=0)
但我仍然有这个错误
TypeError: in converted code:
<ipython-input-1-dd21806afc67>:155 call *
return calc_hu(inputs)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/eager/def_function.py:449 __call__
self._initialize(args, kwds, add_initializers_to=initializer_map)
<ipython-input-1-dd21806afc67>:143 calc_hu *
moments = cv2.UMat(cv2.moments(imagex))
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/autograph/impl/api.py:396 converted_call
return py_builtins.overload_of(f)(*args)
TypeError: Expected Ptr<cv::UMat> for argument '%s'
HuLayer 预计会获得 28X28 大小的图像并返回 七个 值的 Hu 矩,以便它们可以与扁平向量连接
我使用的数据集是 MNIST 手写数字。
【问题讨论】:
标签: python opencv tensorflow keras conv-neural-network