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

如何按文件夹名称而非文件名将图像导入图像分类器?

按文件夹名称识别图像类别的修改方案

没问题,我来帮你把脚本改成根据文件夹名称自动识别图像类别,这样就不用依赖文件名开头的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:20:08