TensorFlow 2.4中'tensor_shape'属性缺失错误的解决咨询
问题解决:TensorFlow提取边缘图时的AttributeError错误
错误原因
tf.make_ndarray() 是用来将TensorProto对象(TensorFlow的序列化张量格式)转换为numpy数组的,但你传入的是普通的tf.Tensor对象,自然会触发tensor_shape属性不存在的错误。
解决方法
直接把tf.Tensor转换成numpy数组即可,替换掉tf.make_ndarray(image)这一行,有两种常用方式:
方式1:使用.numpy()方法(推荐)
TensorFlow 2.x默认开启Eager Execution,tf.Tensor对象可以直接调用.numpy()方法转成numpy数组:
image_GT = [image_GT] aperture_size = 7 t_lower = 0 # Lower Threshold t_upper = 1 print("image_GT[0].shape: ", image_GT[0].shape) image = image_GT[0][0] print("type(image): ", type(image)) print("image.shape: ", image.shape) # 替换原tf.make_ndarray行 image = image.numpy() image = cv2.Canny(image, t_lower, t_upper, apertureSize=aperture_size)
方式2:兼容Graph Execution的转换方式
如果处于Graph Execution模式下,可以先用tf.convert_to_tensor确保张量有效性,再转numpy:
image = tf.convert_to_tensor(image).numpy()
额外提示
- 确保张量数值类型是cv2支持的格式(比如uint8或float32),如果是float类型且数值不在0-255范围,建议先做归一化或缩放,否则Canny边缘检测效果会异常。
- 你设置的
t_lower=0和t_upper=1阈值过低,大概率会检测出大量噪声边缘,建议根据图像实际情况调整阈值(比如常用范围50-150)。
内容的提问来源于stack exchange,提问作者sanjay gupta
相关产品推荐
相关产品推荐

