HOG+SVM行人检测训练报错:TypeError: samples非numpy数组或标量
解决OpenCV SVM训练时的TypeError问题
嘿,我看了你遇到的问题——在运行SVM训练那行代码时一直报TypeError: samples is not a numpy array, neither a scalar,查了很多教程都没解决,确实挺闹心的。我帮你拆解下代码里的核心问题,以及具体的修复步骤:
问题1:你用错了训练数据
你明明已经计算了HOG特征hog_features,但训练时却传入了原始图片列表X_data!OpenCV的SVM训练需要的是一维特征向量(比如HOG提取的fd),而不是二维的图片像素数组。每个原始图片是二维结构(比如形状是(高,宽)),直接把这种二维数组丢给SVM,它根本无法处理,这才会抛出样本格式错误的提示。
问题2:标签格式完全不符合要求
你现在用的是字符串标签'Pedestrian',还把它转成了二维数组np.array([labels1])——但OpenCV的SVM只接受整数类型的一维标签数组:
- 字符串标签不被支持,必须换成整数(比如用1代表行人,后续加负样本时用0);
- 标签数组不能是二维的(你现在的
labels12形状是(1, N)),必须是一维结构(形状为(N,))。
具体修复步骤
1. 修正标签与图片预处理
把训练数据的处理代码改成这样:
files = glob.glob ("new_pos_1/crop*.PNG") for myFile in files: image = cv2.imread(myFile,) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 关键:统一所有图片尺寸!否则HOG特征长度会不一致 image = cv2.resize(image, (128, 64)) # 换成你需要的固定尺寸 X_data.append(image) # 用整数1标记行人(后续加负样本时用0标记非行人) labels1.append(1) # 转成一维int32类型的numpy数组(OpenCV要求的标签类型) labels12 = np.array(labels1, dtype=np.int32) print('labels12 shape:', labels12.shape) # 正常应该是(N,),N是样本数量
2. 用HOG特征训练SVM
把训练行代码改成使用HOG特征的numpy数组:
# 把HOG特征列表转成float32类型的numpy数组(OpenCV要求的特征类型) hog_features_np = np.array(hog_features, dtype=np.float32) print('HOG features shape:', hog_features_np.shape) # 正常应该是(N, D),D是特征维度 # 现在训练就不会报错了 svm.train(hog_features_np, cv2.ml.ROW_SAMPLE, labels12)
额外提醒
- 一定要添加负样本:你现在的训练数据全是行人,SVM根本学不到区分能力,训练出来的模型毫无意义。记得加入非行人的图片(比如背景、车辆等),并给它们标上0标签。
- 严格统一图片尺寸:所有训练图片必须resize到相同大小,否则提取的HOG特征长度不一致,会导致数组形状不匹配,训练时还是会报错。
内容的提问来源于stack exchange,提问作者Zyzzx
相关产品推荐
相关产品推荐

