如何按文件夹名称而非文件名将图像导入图像分类器?
按文件夹名称识别图像类别的修改方案
没问题,我来帮你把脚本改成根据文件夹名称自动识别图像类别,这样就不用依赖文件名开头的cat/dog啦~
核心思路调整
原来的逻辑是从文件名提取类别标签,现在改成从文件夹名称获取:
- 假设你的训练目录结构是这样的:
train/ cats/ cat001.jpg cat002.jpg ... dogs/ dog001.jpg dog002.jpg ... - 每个子文件夹的名字(
cats/dogs)就是对应图像的类别,我们可以把它转换成模型需要的数值标签(比如cats对应0,dogs对应1)。
修改后的完整代码片段
import cv2 # 处理图像(主要是缩放) import numpy as np # 处理数组 import os # 处理目录 from random import shuffle # 打乱数据 # 定义训练数据根目录,改成你自己的实际路径 TRAIN_DIR = './train' # 定义统一的图像大小,可根据你的需求调整 IMG_SIZE = 50 def create_train_data(): training_data = [] # 遍历训练根目录下的所有子文件夹(每个文件夹对应一个类别) for class_folder in os.listdir(TRAIN_DIR): class_path = os.path.join(TRAIN_DIR, class_folder) # 跳过目录里的非文件夹内容(比如临时文件) if not os.path.isdir(class_path): continue # 把文件夹名转换成数值标签:cats→0,dogs→1 label = 0 if class_folder == 'cats' else 1 # 遍历当前类别文件夹里的所有图像文件 for img_name in os.listdir(class_path): try: # 读取图像并转成灰度图(如果需要彩色可以去掉cv2.IMREAD_GRAYSCALE) img_path = os.path.join(class_path, img_name) img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 缩放图像到统一尺寸 img = cv2.resize(img, (IMG_SIZE, IMG_SIZE)) # 将图像数据和对应标签加入训练列表 training_data.append([np.array(img), label]) except Exception as e: # 跳过读取失败的损坏图像,避免脚本崩溃 print(f"读取图像出错: {img_path}, 错误信息: {e}") continue # 打乱训练数据,避免模型学习到顺序规律 shuffle(training_data) # 拆分特征数据和标签,方便后续模型训练 X = np.array([i[0] for i in training_data]).reshape(-1, IMG_SIZE, IMG_SIZE, 1) # 灰度图是单通道,彩色的话改成3 y = np.array([i[1] for i in training_data]) return X, y # 生成训练数据集 X_train, y_train = create_train_data()
关键部分说明
os.listdir(TRAIN_DIR):自动获取训练根目录下的所有类别文件夹,不用手动写死类别名称- 标签转换:用简单的条件判断实现,如果后续要加更多类别,可以改成字典映射(比如
label_map = {'cats':0, 'dogs':1, 'birds':2}) - 异常处理:防止个别损坏的图像导致整个脚本中断
- 数据打乱:保证训练数据的随机性,让模型学得更扎实
这样修改后,你只需要把猫的图像统一放到train/cats文件夹,狗的图像放到train/dogs文件夹,脚本就会自动识别每个图像的类别啦~
内容的提问来源于stack exchange,提问作者SaladSnake
相关产品推荐
相关产品推荐

