小麦虫害分类 小麦虫害识别 分类识别检测 麦长管蚜 麦二叉蚜 燕麦蚜 麦红吸浆虫 小麦红蜘蛛 长腿蜘蛛螨等 农业虫害领域的计算机视觉任务 (1)

📅 2026/7/8 16:47:49
小麦虫害分类 小麦虫害识别 分类识别检测 麦长管蚜 麦二叉蚜 燕麦蚜 麦红吸浆虫 小麦红蜘蛛 长腿蜘蛛螨等 农业虫害领域的计算机视觉任务 (1)
PyTorch来构建小麦虫害分类数据集模型进行小麦虫害分类 分类识别检测 麦长管蚜 麦二叉蚜 燕麦蚜 麦红吸浆虫 小麦红蜘蛛 长腿蜘蛛螨等文章目录一、环境配置二、数据准备创建自定义Dataset类数据增强与加载三、模型构建与训练训练函数开始训练四、模型评估数据集描述小麦虫害分类数据集包括9个类别共3418张图像麦长管蚜english grain aphid、麦二叉蚜green bug、燕麦蚜bird cherry-oataphid、麦红吸浆虫wheat blossom midge、小麦红蜘蛛penthaleus major、长腿蜘蛛螨longlegged spider mite、小麦根皮蓟马wheat phloeothrips、麦叶蜂wheat sawfly、麦黑斑潜叶蝇cerodonta denticornis训练集、验证集、测试集分别有2048、340、1030张小麦虫害分类数据集1小麦虫害分类数据集是一个非常有价值的数据集特别适用于农业领域的计算机视觉任务比如病虫害识别。基于你提供的信息这个数据集包括9个类别共3418张图像已经划分好了训练集、验证集和测试集如何使用深度学习方法以PyTorch为例来构建一个模型进行虫害分类。一、环境配置首先确保你的环境中安装了必要的库pipinstalltorch torchvision torchaudio matplotlib numpy scikit-learn二、数据准备假设同学你的数据集文件夹结构如下wheat_pest_dataset/ ├── train/ │ ├── english_grain_aphid/ │ ├── green_bug/ │ ├── bird_cherry_oataphid/ │ ├── wheat_blossom_midge/ │ ├── penthaleus_major/ │ ├── longlegged_spider_mite/ │ ├── wheat_phloeothrips/ │ ├── wheat_sawfly/ │ └── cerodonta_denticornis/ ├── val/ │ ├── ... (类似train目录) └── test/ ├── ... (类似train目录)创建自定义Dataset类importosfromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransformsfromPILimportImageclassWheatPestDataset(Dataset):def__init__(self,root_dir,transformNone):self.root_dirroot_dir self.transformtransform self.classessorted(os.listdir(root_dir))self.image_paths[]self.labels[]foridx,clsinenumerate(self.classes):cls_diros.path.join(root_dir,cls)forimg_nameinos.listdir(cls_dir):self.image_paths.append(os.path.join(cls_dir,img_name))self.labels.append(idx)def__len__(self):returnlen(self.image_paths)def__getitem__(self,idx):image_pathself.image_paths[idx]labelself.labels[idx]imageImage.open(image_path).convert(RGB)ifself.transform:imageself.transform(image)returnimage,label数据增强与加载transformtransforms.Compose([transforms.Resize((256,256)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean[0.485,0.456,0.406],std[0.229,0.224,0.225])])train_datasetWheatPestDataset(root_dirpath/to/train,transformtransform)val_datasetWheatPestDataset(root_dirpath/to/val,transformtransform)test_datasetWheatPestDataset(root_dirpath/to/test,transformtransform)train_loaderDataLoader(train_dataset,batch_size32,shuffleTrue,num_workers4)val_loaderDataLoader(val_dataset,batch_size32,shuffleFalse,num_workers4)test_loaderDataLoader(test_dataset,batch_size32,shuffleFalse,num_workers4)三、模型构建与训练这里我们使用预训练的ResNet50作为基础模型。importtorch.nnasnnimporttorchvision.modelsasmodelsdefbuild_model(num_classes9):modelmodels.resnet50(pretrainedTrue)num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,num_classes)returnmodel devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelbuild_model().to(device)criterionnn.CrossEntropyLoss()optimizertorch.optim.Adam(model.parameters(),lr1e-4)训练函数fromtqdmimporttqdmdeftrain_model(model,criterion,optimizer,dataloaders,num_epochs25):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,labelsintqdm(dataloaders[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# 可以在这里保存最佳模型权重torch.save(model.state_dict(),best_model.pth)print(fBest val Acc:{best_acc:.4f})开始训练dataloaders{train:train_loader,val:val_loader}train_model(model,criterion,optimizer,dataloaders,num_epochs25)四、模型评估在测试集上评估模型性能。model.load_state_dict(torch.load(best_model.pth))model.eval()correct0total0withtorch.no_grad():forinputs,labelsintest_loader:inputsinputs.to(device)labelslabels.to(device)outputsmodel(inputs)_,predictedtorch.max(outputs.data,1)totallabels.size(0)correct(predictedlabels).sum().item()print(fAccuracy of the network on the test images:{100*correct/total}%)