使用Xception模型提取CNN特征触发TypeError错误该如何解决?
报错根源
os.walk() 遍历目标文件夹时,每次迭代返回的是(当前遍历目录路径, 当前目录下的子目录列表, 当前目录下的文件列表)三元组,你直接把这个三元组当成图片文件名和字符串拼接,自然触发类型错误。
修复代码
如果你的所有图片都直接存放在目标目录的根路径下,没有嵌套子文件夹,用os.listdir()替代os.walk()是最简单的方案,修改后代码如下:
import os import numpy as np from PIL import Image from tqdm import tqdm from tensorflow.keras.applications.xception import Xception from pickle import dump def extract_features(directory): model = Xception(include_top=False, pooling='avg') features = {} # 改用os.listdir遍历目录下的所有文件 for img_name in tqdm(os.listdir(directory)): # 用os.path.join拼接路径,自动适配不同操作系统的路径分隔符 filename = os.path.join(directory, img_name) # 过滤非文件,避免把子文件夹当成图片处理 if not os.path.isfile(filename): continue # 可选:过滤常见图片后缀,避免读取无关文件 if not img_name.lower().endswith(('.png', '.jpg', '.jpeg')): continue image = Image.open(filename).convert('RGB') # 加convert('RGB')避免灰度图/透明图格式报错 image = image.resize((299,299)) image = np.expand_dims(image, axis=0) image = image/127.5 image = image - 1.0 feature = model.predict(image, verbose=0) # 加verbose=0关闭predict的输出,和tqdm进度条兼容 features[img_name] = feature return features #2048 feature vector features = extract_features(dataset_images) dump(features, open("features.p","wb"))
额外调整说明
- 增加了文件类型校验,跳过子文件夹和非图片文件,避免后续读取图片时报错
- 新增
convert('RGB')强制把图片转为三通道RGB格式,避免数据集中的灰度图、带透明通道的PNG图传入模型时触发维度不匹配报错 model.predict增加verbose=0参数,关闭预测过程的默认输出,避免和tqdm的进度条输出冲突导致界面混乱- 用
os.path.join拼接路径,适配Windows、Linux等不同系统的路径分隔符规则,不会出现斜杠写反的问题
如果你的数据集是按子文件夹分类存放的,需要正确解析os.walk的返回值,修改遍历逻辑即可:
for root, dirs, img_names in tqdm(os.walk(directory)): for img_name in img_names: filename = os.path.join(root, img_name) # 后面的图片处理逻辑和上面一致
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

