HOG特征变换报错:仅支持二维空间图像,指定channel_axis仍未解决
解决HOG变换中的ValueError问题
报错信息
ValueError: Only images with two spatial dimensions are supported. If using with color/multichannel images, specify
channel_axis
相关代码
def hog_transform(x): fd = hog(x.numpy() * 255, orientations=self.orientations, pixels_per_cell=self.pixels_per_cell, cells_per_block=(1, 1), channel_axis=-1) return fd.astype(np.float32) hog_features = tf.py_function(hog_transform, [inputs], Tout=tf.float32) hog_features.set_shape([None, 7 * 7 * self.orientations]) return hog_features
问题分析与解决方案
你已经指定了channel_axis=-1但报错依旧,核心原因是输入张量带批量维度:tf.py_function会把整个批量张量(形状通常为(batch_size, height, width, channels))传入hog_transform,而hog函数默认只处理单张图片(形状(height, width, channels)),无法直接识别批量维度。
按以下步骤修改:
逐个处理批量中的单张图片
修改hog_transform,遍历批量内的每个样本单独计算HOG特征:def hog_transform(x): fd_list = [] # 遍历批量中的每张图片 for img in x.numpy(): fd = hog(img * 255, orientations=self.orientations, pixels_per_cell=self.pixels_per_cell, cells_per_block=(1, 1), channel_axis=-1) fd_list.append(fd) # 把所有样本的特征堆叠成批量张量 return np.stack(fd_list).astype(np.float32)确认通道维度位置
先打印x.numpy().shape查看实际维度:- 如果通道在第一维(如
(batch_size, channels, height, width)),需把channel_axis改为0 - 如果通道在最后一维(如
(batch_size, height, width, channels)),保持channel_axis=-1即可
- 如果通道在第一维(如
校验特征维度匹配
确认7 * 7 * self.orientations和实际计算出的特征维度一致:比如输入图片尺寸、pixels_per_cell参数会影响特征的空间网格数,若计算出的是8*8*orientations,则需同步修改set_shape中的对应值。
内容的提问来源于stack exchange,提问作者TechwithVidya
相关产品推荐
相关产品推荐

