多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

水果蔬菜分类图像分类 智慧化农业蔬菜水果分类数据集 果蔬分类数据集的应用 智慧农业数据集 生鲜识别 超市自动结算 AI营养分析 移动端果蔬识别APP

水果蔬菜分类图像分类 智慧化农业蔬菜水果分类数据集 果蔬分类数据集的应用 智慧农业数据集 生鲜识别 超市自动结算 AI营养分析 移动端果蔬识别APP 水果蔬菜分类图像分类 智慧化农业蔬菜水果分类数据集 果蔬分类数据集的应用 智慧农业数据集 生鲜识别 超市自动结算 AI营养分析 移动端果蔬识别APP智慧化-果蔬数据集chuntu此数据集包含以下果蔬的图像水果香蕉苹果梨葡萄橙子猕猴桃西瓜石榴菠萝芒果。蔬菜黄瓜、胡萝卜、辣椒、洋葱、土豆、柠檬、西红柿、raddish、甜菜根、卷心菜、生菜、菠菜、大豆、花椰菜、甜椒、辣椒、萝卜、玉米、甜玉米、红薯、辣椒、辣椒酱、生姜、大蒜、豌豆、茄子。数据集包含三个文件夹训练集每个类别文件夹包含100张图片测试集每个类别文件夹包含10张图像验证集每个类别文件夹包含10张图像以上每个文件夹都包含不同水果和蔬菜的子文件夹其中显示了相应类别的图像11以下是果蔬数据集Chuntu的详细表格化描述 一、数据集总体信息项目描述数据集名称Chuntu 果蔬图像数据集任务类型图像分类Image Classification类别总数36 类10 种水果 26 种蔬菜图像总数4,320 张图像格式通常为.jpg或.png未明确说明但按常规推断应用场景智慧农业、生鲜识别、超市自动结算、AI营养分析、移动端果蔬识别APP 二、类别列表与分类统计✅ 水果类10 类序号中文名英文名1香蕉Banana2苹果Apple3梨Pear4葡萄Grape5橙子Orange6猕猴桃Kiwi7西瓜Watermelon8石榴Pomegranate9菠萝Pineapple10芒果Mango✅ 蔬菜类26 类⚠️ 注意原始描述中“辣椒”重复出现多次“辣椒酱”可能为异常项非生鲜食材此处按字面保留但建议使用时核查。序号中文名英文名备注11黄瓜Cucumber—12胡萝卜Carrot—13辣椒Chili Pepper可能指新鲜辣椒14洋葱Onion—15土豆Potato—16柠檬Lemon常归为水果此处列在蔬菜中17西红柿Tomato植物学为水果烹饪归蔬菜18萝卜raddishRadish拼写应为 radish19甜菜根Beetroot—20卷心菜Cabbage—21生菜Lettuce—22菠菜Spinach—23大豆Soybean可能指鲜豆荚24花椰菜Cauliflower—25甜椒Bell Pepper—26辣椒Chili Pepper重复项可能指不同品种27萝卜Radish与第18项重复拼写差异28玉米Corn—29甜玉米Sweet Corn可能与玉米重复30红薯Sweet Potato—31辣椒酱Chili Sauce❗非生鲜图像建议剔除或单独处理32生姜Ginger—33大蒜Garlic—34豌豆Peas—35茄子Eggplant—36待确认—若“辣椒”“萝卜”等去重后不足26类可能存在命名误差类别去重建议实际有效类别可能为32–34 类因存在重复如“辣椒”出现3次、“萝卜”2次及异常项“辣椒酱”。建议检查原始文件夹数量以确认真实类别数。 三、数据划分详情按当前描述子集每类图像数类别数总图像数训练集train100 张/类3636 × 100 3,600 张验证集val10 张/类3636 × 10 360 张测试集test10 张/类3636 × 10 360 张总计——4,320 张✅ 文件结构示例chuntu_dataset/ ├── train/ │ ├── banana/ │ ├── apple/ │ └── ... (36 folders) ├── val/ │ ├── banana/ │ └── ... └── test/ ├── banana/ └── ...⚙️ 四、适用模型与框架任务推荐模型框架图像分类ResNet50, EfficientNet-B0, MobileNetV3, ViT-TinyPyTorch / TensorFlow / Keras轻量化部署MobileNetV2 TensorFlow LiteAndroid/iOS APP迁移学习使用 ImageNet 预训练权重微调Hugging Face Transformers, timm⚠️ 五、使用注意事项类别重复问题“辣椒”“萝卜”多次出现需确认是否为不同品种如青椒/红椒、白萝卜/胡萝卜否则应合并。异常类别“辣椒酱”为加工品与其他生鲜类别不一致建议单独处理或移除。柠檬归类柠檬通常视为水果若用于烹饪场景可保留于蔬菜但需注意标签一致性。数据平衡性每类样本量均衡100/10/10有利于公平训练但总量偏少建议结合数据增强。以下是基于果蔬数据集Chuntu使用PyTorch进行图像分类的完整训练代码示例。该代码包括数据加载、模型定义、训练、验证和测试过程。 一、项目结构建议chuntu_pytorch/ ├── dataset.py# 数据集加载与预处理├── model.py# 模型定义├── train.py# 主训练脚本├── predict_demo.py# 推理演示└── data/ ├── train/# 训练集├── val/# 验证集└── test/# 测试集 二、数据集加载与预处理dataset.py# dataset.pyimportosfromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransformsfromPILimportImageclassFruitVegetableDataset(Dataset):def__init__(self,root_dir,transformNone):self.root_dirroot_dir self.transformtransform self.classessorted(os.listdir(root_dir))self.class_to_idx{cls_name:idxforidx,cls_nameinenumerate(self.classes)}self.image_paths[]self.labels[]forcls_nameinself.classes:cls_diros.path.join(root_dir,cls_name)ifnotos.path.isdir(cls_dir):continueforimg_nameinos.listdir(cls_dir):ifimg_name.lower().endswith((png,jpg,jpeg)):self.image_paths.append(os.path.join(cls_dir,img_name))self.labels.append(self.class_to_idx[cls_name])def__len__(self):returnlen(self.image_paths)def__getitem__(self,idx):img_pathself.image_paths[idx]labelself.labels[idx]imageImage.open(img_path).convert(RGB)ifself.transform:imageself.transform(image)returnimage,labeldefget_loader(root_dir,batch_size32,num_workers4):transformtransforms.Compose([transforms.Resize((224,224)),# 统一尺寸transforms.RandomHorizontalFlip(),# 数据增强transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])# ImageNet均值方差])datasetFruitVegetableDataset(root_dirroot_dir,transformtransform)loaderDataLoader(dataset,batch_sizebatch_size,shuffleTrue,num_workersnum_workers)returnloader,dataset.classes 三、模型定义model.py# model.pyimporttorchimporttorch.nnasnnimporttorchvision.modelsasmodelsdefget_model(num_classes):modelmodels.resnet50(pretrainedTrue)# 使用ImageNet预训练权重num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,num_classes)returnmodeldeftrain_model(model,dataloaders,criterion,optimizer,num_epochs25,devicecuda):best_model_wtsmodel.state_dict()best_acc0.0forepochinrange(num_epochs):print(fEpoch{epoch}/{num_epochs-1})print(-*10)forphasein[train,val]:ifphasetrain:model.train()else:model.eval()running_loss0.0running_corrects0forinputs,labelsindataloaders[phase]:inputsinputs.to(device)labelslabels.to(device)optimizer.zero_grad()withtorch.set_grad_enabled(phasetrain):outputsmodel(inputs)_,predstorch.max(outputs,1)losscriterion(outputs,labels)ifphasetrain:loss.backward()optimizer.step()running_lossloss.item()*inputs.size(0)running_correctstorch.sum(predslabels.data)epoch_lossrunning_loss/len(dataloaders[phase].dataset)epoch_accrunning_corrects.double()/len(dataloaders[phase].dataset)print(f{phase}Loss:{epoch_loss:.4f}Acc:{epoch_acc:.4f})ifphasevalandepoch_accbest_acc:best_accepoch_acc best_model_wtsmodel.state_dict()print(fBest val Acc:{best_acc:4f})model.load_state_dict(best_model_wts)returnmodel 四、主训练脚本train.py# train.pyimporttorchimporttorch.optimasoptimfromtorch.utils.tensorboardimportSummaryWriterfrommodelimportget_model,train_modelfromdatasetimportget_loaderdefmain():# 设备配置devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)print(f 使用设备:{device})# 加载数据train_loader,classesget_loader(data/train)val_loader,_get_loader(data/val)dataloaders{train:train_loader,val:val_loader}# 定义模型modelget_model(num_classeslen(classes)).to(device)# 定义损失函数和优化器criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 开始训练trained_modeltrain_model(model,dataloaders,criterion,optimizer,num_epochs25,devicedevice)# 保存最佳模型torch.save(trained_model.state_dict(),best_model.pth)if__name____main__:main() 五、推理演示predict_demo.py# predict_demo.pyfrommodelimportget_modelfromdatasetimportFruitVegetableDataset,transformsfromPILimportImageimporttorchdefmain():# 加载模型modelget_model(num_classes36)# 根据实际类别数调整model.load_state_dict(torch.load(best_model.pth))model.eval()# 类别映射class_names[香蕉,苹果,梨,葡萄,橙子,猕猴桃,西瓜,石榴,菠萝,芒果,黄瓜,胡萝卜,辣椒,洋葱,土豆,柠檬,西红柿,萝卜,甜菜根,卷心菜,生菜,菠菜,大豆,花椰菜,甜椒,玉米,甜玉米,红薯,生姜,大蒜,豌豆,茄子]# 图像预处理transformtransforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])# 推理单张图像image_pathsample_image.jpgimageImage.open(image_path).convert(RGB)tensor_imagetransform(image).unsqueeze(0)withtorch.no_grad():outputmodel(tensor_image)_,predictedtorch.max(output,1)predicted_classclass_names[predicted.item()]print(f预测结果:{predicted_class})if__name____main__:main()⚙️ 六、训练优化建议问题解决方案过拟合增加正则化项如 L2 正则化、使用 Dropout 层、减少模型复杂度如改用 EfficientNet-B0类别不平衡对少数类进行过采样或对多数类欠采样使用加权交叉熵损失函数CrossEntropyLoss(weight...)小样本问题利用迁移学习冻结预训练模型的部分层增加数据增强策略旋转、缩放、颜色抖动等
返回列表