You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

skimage HOG提取返回空特征向量问题求助

解决skimage HOG提取空特征向量的问题

核心原因:图像尺寸与HOG默认参数不兼容

skimage.feature.hog的默认参数配置为:

  • cell_size=(8, 8):每个细胞单元的像素尺寸
  • block_size=(2, 2):每个块包含的细胞单元数量
  • 默认无填充(padding=(0,0))

你的正负样本均为16x16的小尺寸图像,刚好等于单个block的像素尺寸(2*8=16)。但skimage 0.19.2中HOG的块需要按cell_size(默认8px)滑动,16x16的图像无法提供足够的滑动空间,导致无法生成有效特征块,最终返回空数组。

排查与解决步骤

1. 先确认图像读取状态与尺寸

先在代码中添加检查,确保图像正确读取并确认实际尺寸:

from skimage.feature import hog
import cv2 as cv

img = cv.imread("<path to image>", cv.IMREAD_GRAYSCALE)
# 检查图像是否读取成功
print(f"图像读取状态:{img is not None}")
# 打印图像尺寸
print(f"图像尺寸:{img.shape}")

if img is not None:
    desc = hog(img)
    print(f"特征向量长度:{len(desc)}")
    print(desc)

2. 调整HOG参数适配小尺寸图像

针对16x16的图像,可通过以下三种方式修改参数:

方式一:减小细胞单元尺寸

将cell_size改为(4,4),这样block的实际尺寸为8x8,16x16的图像可划分出多个有效块:

desc = hog(img, cell_size=(4, 4))

方式二:添加填充

通过padding参数让块可以覆盖图像边界,同时确保输出一维特征向量:

desc = hog(img, padding=(1, 1), feature_vector=True)

方式三:修改块尺寸

将block_size改为(1,1),让每个细胞单元单独作为一个块:

desc = hog(img, block_size=(1, 1))

3. 验证参数有效性

用纯白图像测试,确认调整后的参数能生成有效特征:

import numpy as np
# 创建16x16纯白图像
white_img = np.ones((16,16), dtype=np.uint8)*255
desc = hog(white_img, cell_size=(4,4))
print(f"纯白图像特征长度:{len(desc)}")
print(desc)

训练SVM的额外建议

  • 统一所有正负样本的尺寸,避免因尺寸差异导致特征向量长度不一致
  • 调整HOG参数后,确认正负样本的特征长度完全相同,否则无法用于Linear SVM训练

内容的提问来源于stack exchange,提问作者tintin98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:32:28