如何合并ResNet50特征与纹理特征并实现图像分类?
特征合并与分类解决方案
你遇到的核心问题是两类特征的样本数量不匹配(98 vs 766),同时特征维度结构差异大,这直接导致拼接失败。解决步骤如下:
第一步:对齐样本数量
必须确保ResNet50特征和纹理特征对应同一批样本,即两个数组的第一个维度(样本数)完全一致。如果是提取特征时的疏漏,需要重新提取对应样本的特征。以下代码假设你已经修正了样本数,统一为N(示例中用98)。
第二步:特征维度统一
把高维特征转换成一维向量,或通过池化压缩维度,保证每个样本的特征为一维结构:
处理ResNet50特征
推荐用**全局平均池化(GAP)**压缩空间维度,既保留核心特征信息又大幅降低维度:
import numpy as np # 模拟ResNet50特征:(98,7,7,2048) resnet_features = np.random.rand(98,7,7,2048) # 对每个样本的7x7空间维度取平均,得到(98,2048)的特征 resnet_gap = np.mean(resnet_features, axis=(1,2)) # 若需更完整保留细节,也可直接扁平化(维度会大幅增加) # resnet_flat = resnet_features.reshape(resnet_features.shape[0], -1) # 形状变为(98, 100352)
处理纹理特征
将224x224的纹理特征扁平化,或通过池化降维减少特征维度:
# 模拟纹理特征:(98,224,224) texture_features = np.random.rand(98,224,224) # 扁平化每个样本的纹理特征,得到(98,50176)的一维向量 texture_flat = texture_features.reshape(texture_features.shape[0], -1) # 若想降低维度,可先做池化再扁平化(比如缩小为14x14) # texture_pooled = np.mean(texture_features.reshape(98,16,14,16,14), axis=(1,3)) # texture_flat = texture_pooled.reshape(98, -1) # 形状变为(98,196)
第三步:拼接特征
当两类特征都转换为(样本数, 特征维度)的形状后,用numpy完成拼接:
# 拼接ResNet GAP特征与扁平化纹理特征 combined_features = np.concatenate([resnet_gap, texture_flat], axis=1) # 此时combined_features形状为(98, 2048+50176)=(98,52224)
第四步:用于分类
用拼接后的联合特征训练分类器,以下是基于sklearn的示例:
from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 模拟样本标签:二分类问题,形状(98,) y = np.random.randint(0, 2, size=98) # 划分训练集与测试集 X_train, X_test, y_train, y_test = train_test_split(combined_features, y, test_size=0.2, random_state=42) # 训练逻辑回归分类器 clf = LogisticRegression(max_iter=1000) clf.fit(X_train, y_train) # 评估分类效果 y_pred = clf.predict(X_test) print(f"分类准确率: {accuracy_score(y_test, y_pred):.2f}")
如果你的样本数确实存在98和766的不匹配,必须先筛选出两类特征共有的样本,确保一一对应,否则无法进行有效的特征融合与分类。
内容的提问来源于stack exchange,提问作者Rezuana Haque
相关产品推荐
相关产品推荐

