【问题标题】:How to concatenate 1d array from OpenCV function with flatten vector in CNN如何将 OpenCV 函数中的一维数组与 CNN 中的扁平向量连接起来
【发布时间】:2020-05-26 13:37:12
【问题描述】:

我正在尝试通过在训练期间使用 OpenCV 函数计算一些动态值(例如图像的 Hu 矩)来提高 CNN(卷积神经网络)的准确性相位,然后将它们提供给具有展平向量的全连接层,如我的模型图像所示:

My model

我想在数据集中使用 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


    【解决方案1】:

    imagex 应该是一个 NumPy 数组。

    imagex = imagex.numpy()
    moments = cv2.UMat(cv2.moments(imagex))
    

    【讨论】:

    • 感谢您的回复。但是我收到了这个错误AttributeError: 'Tensor' object has no attribute 'numpy'
    • 你用的是哪个TF版本?
    • TF 版本 1.15.0
    • 您是否启用了 Eager 模式? tf.compat.v1.enable_eager_execution()
    • 不,我不知道如何在 google colaboratory 上做到这一点
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多