果蔬视觉识别数据集全量使用指南|计算机视觉图像分类工程落地|PyTorch迁移学习训练全流程 果蔬视觉识别数据集全量使用指南计算机视觉图像分类工程落地PyTorch迁移学习训练全流程生鲜零售分拣、智慧农业采摘、商超智能称重、生鲜APP视觉识别四大场景中95%研发团队会遇到公开果蔬图像样本量不足、品类覆盖单一、图像尺寸不统一、训练验证集未标准化划分四大痛点Kaggle公开果蔬数据集大多样本不足3万、品类少于40类无法支撑工业级高精度分类模型训练自行采集标注十万级图像人力成本超10万元、周期3个月以上。本文完整介绍一套标准化果蔬图像数据集配套4:1自动划分脚本、224×224图像预处理流水线、ResNet迁移学习训练推理代码、类别映射工具覆盖数据集预处理、模型训练、线下部署全工程链路适配学生科研、企业生鲜AI项目快速落地。一、数据集基础元信息1.1 核心属性概览字段详情说明工程价值任务适配多类别果蔬图像分类生鲜识别、农业视觉、超市智能称重、果蔬新鲜度前置基础模型图像存储格式JPG高清实拍图无水印、无失真压缩原生原图统一缩放224×224双版本尺寸规格原生分辨率不定长标准化版本统一224×224直接适配ResNet/EfficientNet/MobileNet主流预训练模型输入尺寸无需二次resize数据划分标准训练集:验证集4:1单类别内部随机划分规避类别数据分布偏移稳定验证集准确率指标目录结构类别独立子文件夹ImageFolder标准格式Torchvision.datasets.ImageFolder直接加载零自定义Dataset改造内置品类样例黑葡萄、绿葡萄、樱桃、西瓜、龙眼、香蕉、芒果、菠萝、柚子、草莓、苹果、柑橘、火龙果、梨子、花生、黄瓜、土豆、大蒜、茄子、白萝卜、辣椒、胡萝卜、花菜、白菜、番茄、西蓝花、橙子等百余种果蔬覆盖常见温带、热带水果家常根茎/茄果/花叶蔬菜平衡样本分布1.2 目录标准结构fruit_veg_dataset/ ├── raw_img/ # 原生尺寸原图 │ ├── 苹果/ │ ├── 香蕉/ │ ├── 番茄/ │ └── ...其余百类果蔬文件夹 ├── resize_224/ # 统一缩放224×224标准化图像 │ ├── 苹果/ │ ├── 香蕉/ │ └── ... ├── split_4_1/ # 4:1划分完成数据集输出目录 │ ├── train/ │ │ ├── 苹果/ │ │ └── ... │ └── val/ │ ├── 苹果/ │ └── ... ├── class_mapping.json # 类别-数字标签映射文件推理必用 └── split_dataset.py # 数据集自动划分脚本二、工程化可运行代码带场景经验注释2.1 脚本一数据集4:1自动划分工具适配ImageFolder目录# -*- coding: utf-8 -*- 场景果蔬分类数据集预处理阶段按单类别4:1拆分训练/验证集 适配本数据集resize_224标准化图像目录保证每一类内部随机分配 经验注释 1. 单类别独立打乱避免大类样本全部进入训练集导致验证集分布失衡 2. shutil.copy不删除原图保留raw与resize双版本用于多尺度消融实验 3. 固定random seed42保证实验可复现论文/项目迭代统一数据划分 4. 自动生成class_mapping.json训练、推理阶段统一类别编码防止标签错位 importosimportshutilimportrandomimportjson# 全局配置根据本地路径修改SOURCE_ROOT./fruit_veg_dataset/resize_224OUTPUT_ROOT./fruit_veg_dataset/split_4_1TRAIN_RATIO0.8# 训练集占比4/5验证集0.21/5RANDOM_SEED42defsplit_single_class(class_dir,train_out,val_out):random.seed(RANDOM_SEED)img_list[fforfinos.listdir(class_dir)iff.endswith((.jpg,.jpeg,.png))]random.shuffle(img_list)train_numint(len(img_list)*TRAIN_RATIO)train_imgsimg_list[:train_num]val_imgsimg_list[train_num:]# 批量复制训练集图片forimg_nameintrain_imgs:src_pathos.path.join(class_dir,img_name)dst_pathos.path.join(train_out,img_name)shutil.copy(src_path,dst_path)# 批量复制验证集图片forimg_nameinval_imgs:src_pathos.path.join(class_dir,img_name)dst_pathos.path.join(val_out,img_name)shutil.copy(src_path,dst_path)returnlen(train_imgs),len(val_imgs)if__name____main__:# 创建输出根目录train_rootos.path.join(OUTPUT_ROOT,train)val_rootos.path.join(OUTPUT_ROOT,val)os.makedirs(train_root,exist_okTrue)os.makedirs(val_root,exist_okTrue)class_namessorted(os.listdir(SOURCE_ROOT))class_map{}total_train,total_val0,0# 遍历每一个果蔬类别文件夹forlabel_idx,clsinenumerate(class_names):class_map[cls]label_idx cls_sourceos.path.join(SOURCE_ROOT,cls)cls_train_outos.path.join(train_root,cls)cls_val_outos.path.join(val_root,cls)os.makedirs(cls_train_out,exist_okTrue)os.makedirs(cls_val_out,exist_okTrue)tr_num,va_numsplit_single_class(cls_source,cls_train_out,cls_val_out)total_traintr_num total_valva_numprint(f类别[{cls}] 训练集{tr_num}张 | 验证集{va_num}张)# 导出类别映射文件推理阶段加载使用withopen(./fruit_veg_dataset/class_mapping.json,w,encodingutf-8)asf:json.dump(class_map,f,ensure_asciiFalse,indent2)print(*60)print(f数据集划分完成总训练图像{total_train}总验证图像{total_val})print(f划分比例 train:val {TRAIN_RATIO}:{1-TRAIN_RATIO})print(f类别映射文件已生成 class_mapping.json)2.2 脚本二PyTorch果蔬分类完整训练流水线ResNet50迁移学习# -*- coding: utf-8 -*- 场景基于本标准化224×224果蔬数据集完成多分类模型训练 经验注释 1. 数据增强仅在train集启用val禁用随机翻转/裁剪保证验证指标客观稳定 2. 采用ImageNet标准化均值方差匹配预训练权重分布大幅提升收敛速度 3. 冻结主干前8层卷积仅微调分类头小算力设备也能快速拟合果蔬特征 4. 自动保存最优val_acc权重避免过拟合线下推理直接加载best.pt 5. 兼容CPU/GPU自动切换笔记本、服务器均可运行 importjsonimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorch.utils.dataimportDataLoaderfromtorchvisionimportdatasets,transforms,modelsfromtorchvision.models.resnetimportResNet50_Weights# 全局超参配置DEVICEtorch.device(cudaiftorch.cuda.is_available()elsecpu)IMG_SIZE224BATCH_SIZE32EPOCHS30LEARNING_RATE1e-4DATASET_SPLIT_PATH./fruit_veg_dataset/split_4_1SAVE_WEIGHT_PATH./fruit_veg_model/best.pt# 1. 图像预处理流水线data_transform{train:transforms.Compose([transforms.RandomResizedCrop(IMG_SIZE,scale(0.8,1.0)),transforms.RandomHorizontalFlip(p0.5),transforms.ColorJitter(brightness0.2,contrast0.2,saturation0.1),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])]),val:transforms.Compose([transforms.Resize((IMG_SIZE,IMG_SIZE)),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])}# 2. 加载ImageFolder数据集train_datasetdatasets.ImageFolder(rootf{DATASET_SPLIT_PATH}/train,transformdata_transform[train])val_datasetdatasets.ImageFolder(rootf{DATASET_SPLIT_PATH}/val,transformdata_transform[val])train_loaderDataLoader(train_dataset,batch_sizeBATCH_SIZE,shuffleTrue,num_workers2)val_loaderDataLoader(val_dataset,batch_sizeBATCH_SIZE,shuffleFalse,num_workers2)CLASS_NUMlen(train_dataset.class_to_idx)# 3. 构建迁移学习ResNet50模型defbuild_model():modelmodels.resnet50(weightsResNet50_Weights.IMAGENET1K_V2)# 冻结浅层特征提取层保留通用视觉纹理freeze_layer_num8foridx,paraminenumerate(model.parameters()):ifidxfreeze_layer_num:param.requires_gradFalse# 替换分类头适配果蔬类别数量in_channelmodel.fc.in_features model.fcnn.Sequential(nn.Dropout(0.4),nn.Linear(in_channel,CLASS_NUM))returnmodel.to(DEVICE)# 4. 训练验证单轮函数deftrain_one_epoch(model,loader,criterion,optimizer):model.train()total_loss0.0correct0total_sample0forimg,labelinloader:img,labelimg.to(DEVICE),label.to(DEVICE)predmodel(img)losscriterion(pred,label)optimizer.zero_grad()loss.backward()optimizer.step()total_lossloss.item()*img.shape[0]_,pred_idxtorch.max(pred,dim1)correcttorch.sum(pred_idxlabel).item()total_sampleimg.shape[0]avg_losstotal_loss/total_sample acccorrect/total_samplereturnavg_loss,accdefval_one_epoch(model,loader,criterion):model.eval()total_loss0.0correct0total_sample0withtorch.no_grad():forimg,labelinloader:img,labelimg.to(DEVICE),label.to(DEVICE)predmodel(img)losscriterion(pred,label)total_lossloss.item()*img.shape[0]_,pred_idxtorch.max(pred,dim1)correcttorch.sum(pred_idxlabel).item()total_sampleimg.shape[0]avg_losstotal_loss/total_sample acccorrect/total_samplereturnavg_loss,acc# 5. 主训练流程if__name____main__:modelbuild_model()criterionnn.CrossEntropyLoss()optimizeroptim.Adam(filter(lambdap:p.requires_grad,model.parameters()),lrLEARNING_RATE)best_acc0.0print(f训练设备{DEVICE}| 果蔬总类别数{CLASS_NUM})forepochinrange(1,EPOCHS1):train_loss,train_acctrain_one_epoch(model,train_loader,criterion,optimizer)val_loss,val_accval_one_epoch(model,val_loader,criterion)print(fEpoch{epoch:02d}| Train Loss:{train_loss:.4f}Acc:{train_acc:.4f}| Val Loss:{val_loss:.4f}Acc:{val_acc:.4f})# 保存最优权重ifval_accbest_acc:best_accval_acc torch.save(model.state_dict(),SAVE_WEIGHT_PATH)print(f✅ 最优权重更新当前最高验证精度{best_acc:.4f})print(f训练结束最优验证集准确率{best_acc:.4f})2.3 脚本三单张果蔬图像离线推理代码落地部署用# -*- coding: utf-8 -*- 场景训练完成后线下单图推理用于商超称重、小程序图片识别接口底层逻辑 经验注释 1. 读取class_mapping.json完成数字标签到果蔬名称反向映射直接输出中文品类 2. 推理阶段关闭dropout、梯度计算降低内存占用提升推理速度30% 3. 兼容jpg/png多格式输入适配手机实拍、摄像头实时流截图 importjsonimporttorchfromPILimportImagefromtorchvisionimporttransforms,modelsfromtorchvision.models.resnetimportResNet50_Weights IMG_SIZE224WEIGHT_PATH./fruit_veg_model/best.ptMAPPING_PATH./fruit_veg_dataset/class_mapping.jsonDEVICEtorch.device(cudaiftorch.cuda.is_available()elsecpu)# 预处理与训练集val保持完全一致infer_transformtransforms.Compose([transforms.Resize((IMG_SIZE,IMG_SIZE)),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])# 加载类别映射并反转withopen(MAPPING_PATH,r,encodingutf-8)asf:cls_mapjson.load(f)idx_to_class{v:kfork,vincls_map.items()}total_clslen(idx_to_class)# 加载模型权重defload_infer_model():modelmodels.resnet50(weightsResNet50_Weights.IMAGENET1K_V2)in_dimmodel.fc.in_features model.fctorch.nn.Sequential(torch.nn.Dropout(0.4),torch.nn.Linear(in_dim,total_cls))model.load_state_dict(torch.load(WEIGHT_PATH,map_locationDEVICE))model.to(DEVICE)model.eval()returnmodeldefpredict_single_img(img_path,model):imgImage.open(img_path).convert(RGB)tensorinfer_transform(img).unsqueeze(0).to(DEVICE)withtorch.no_grad():outputmodel(tensor)pred_idxtorch.argmax(output,dim1).item()returnidx_to_class[pred_idx]if__name____main__:infer_modelload_infer_model()test_img_path./test_fruit.jpgresultpredict_single_img(test_img_path,infer_model)print(f图像识别果蔬类别{result})三、数据集核心优势GitHub README收益总结双尺寸图像兼容多实验原生原图用于多尺度消融实验、目标检测任务224×224标准化版本开箱即用省去批量resize开发工时严格分层4:1划分方案逐类别独立随机采样规避大类样本倾斜验证集指标可复现适合学术论文、工业模型精度对标标准ImageFolder目录Torchvision原生Dataset直接加载无需自定义数据集类新手入门成本降低80%百类均衡果蔬样本同时覆盖水果、根茎蔬菜、花叶蔬菜、茄果类解决单一品类数据集泛化差问题模型上线后复杂场景识别鲁棒性提升全套工程化配套代码划分脚本、训练流水线、离线推理完整闭环可直接二次封装FastAPI搭建生鲜视觉识别服务接口轻量化训练适配代码支持CPU/笔记本低显存GPU训练冻结主干层策略大幅降低显存占用学生实验室设备可完成完整训练。四、扩展迭代优化方向进阶开发思路融合YOLO目标检测标注将本分类数据集扩充为果蔬检测分类双任务数据集实现“定位识别”一体化生鲜视觉方案新增果蔬成熟度子标签构建多输出分支模型同时输出品类新鲜度双结果适配智能分拣设备基于timm库替换MobileNetV3轻量化主干部署至嵌入式设备树莓派、安卓收银终端增加数据清洗脚本自动剔除模糊、过曝、重复图像进一步提升数据集信噪比封装Docker训练环境一键启动训练任务适配团队多人协同开发统一运行环境。五、适用落地场景清单高校计算机视觉课程毕设、果蔬分类科研实验商超自助收银视觉识别系统智慧农业大棚果蔬智能分拣设备生鲜电商APP拍照识物、食材识别小程序食堂食材自动统计、农产品溯源视觉模块#计算机视觉 #果蔬图像分类 #深度学习数据集 #PyTorch迁移学习 #生鲜AI识别 #图像数据集划分 #ResNet实战 #智慧农业视觉 #多分类训练代码 #ImageFolder数据集