小麦成熟度识别 yolo分类数据集图像分类任务,七个阶段成熟度分类数据集 数据集共有12834张
小麦成熟度分类数据集小麦成长过程中七个阶段成熟度分类数据集数据集共有12834张已划分训练集10695张、测试集2139张【小麦成熟度分类数据集】小麦成长过程中七个阶段成熟度分类数据集数据集共有12834张已划分训练集10695张、测试集2139张类别及个数 train/test)Crown Root 冠根期 3057/611Tillering 抽穗期 1389/278Mid Vegetative Phase 中生长期 689/138Booting 出穗期 1721/343Heading 开花期 1092/218Anthesis 花粉散落期 421/84Milking 结实期 2335/467好的你提供的小麦成熟度分类数据集包含12834张图片并且已经划分了训练集和测试集。类别为七个阶段冠根期、抽穗期、中生长期、出穗期、开花期、花粉散落期和结实期。每个类别的样本数量也已给出。我们将使用这些数据来训练一个图像分类模型。具体来说我们将使用PyTorch框架来进行图像分类任务。以下是详细的步骤和代码示例帮助你开始使用这个数据集进行训练和评估。项目结构wheat_maturity_classification/ ├── main.py ├── train.py ├── evaluate.py ├── infer.py ├── visualize.py ├── datasets/ │ ├── wheat_images/ │ │ ├── train/ │ │ │ ├── Crown_Root/ │ │ │ ├── Tillering/ │ │ │ ├── Mid_Vegetative_Phase/ │ │ │ ├── Booting/ │ │ │ ├── Heading/ │ │ │ ├── Anthesis/ │ │ │ └── Milking/ │ │ └── test/ │ │ ├── Crown_Root/ │ │ ├── Tillering/ │ │ ├── Mid_Vegetative_Phase/ │ │ ├── Booting/ │ │ ├── Heading/ │ │ ├── Anthesis/ │ │ └── Milking/ ├── best_wheat_model.pth ├── requirements.txt └── config.yaml文件内容requirements.txttorch1.9.0cu111 torchvision0.10.0cu111 matplotlib numpy pandas albumentations pyyamlconfig.yaml配置文件用于存储训练参数train:dataset_dir:./datasets/wheat_images/trainbatch_size:32epochs:50learning_rate:0.001img_size:224num_classes:7test:dataset_dir:./datasets/wheat_images/testbatch_size:32img_size:224数据准备确认数据集目录结构:确保你的数据集已经按照上述结构组织好datasets/ └── wheat_images/ ├── train/ │ ├── Crown_Root/ │ ├── Tillering/ │ ├── Mid_Vegetative_Phase/ │ ├── Booting/ │ ├── Heading/ │ ├── Anthesis/ │ └── Milking/ └── test/ ├── Crown_Root/ ├── Tillering/ ├── Mid_Vegetative_Phase/ ├── Booting/ ├── Heading/ ├── Anthesis/ └── Milking/检查config.yaml文件:确认config.yaml文件中的路径和参数正确无误。训练脚本train.pyimporttorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportmodels,transforms,datasetsfromtorch.utils.dataimportDataLoaderimportmatplotlib.pyplotaspltimportyaml# 加载配置文件withopen(config.yaml,r)asf:configyaml.safe_load(f)# 定义数据预处理data_transforms{train:transforms.Compose([transforms.Resize((config[train][img_size],config[train][img_size])),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])]),test:transforms.Compose([transforms.Resize((config[test][img_size],config[test][img_size])),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])}# 加载数据集image_datasets{x:datasets.ImageFolder(rootconfig[x][dataset_dir],transformdata_transforms[x])forxin[train,test]}dataloaders{x:DataLoader(image_datasets[x],batch_sizeconfig[x][batch_size],shuffleTrue,num_workers4)forxin[train,test]}dataset_sizes{x:len(image_datasets[x])forxin[train,test]}class_namesimage_datasets[train].classes# 选择设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)# 加载预训练的ResNet模型modelmodels.resnet18(pretrainedTrue)num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,config[train][num_classes])modelmodel.to(device)# 定义损失函数和优化器criterionnn.CrossEntropyLoss()optimizeroptim.SGD(model.parameters(),lrconfig[train][learning_rate],momentum0.9)# 训练函数deftrain_model(model,criterion,optimizer,num_epochs):forepochinrange(num_epochs):print(fEpoch{epoch}/{num_epochs-1})print(-*10)# 每个周期有两个阶段训练和验证forphasein[train,test]:ifphasetrain:model.train()# 设置模型为训练模式else:model.eval()# 设置模型为评估模式running_loss0.0running_corrects0# 迭代数据forinputs,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/dataset_sizes[phase]epoch_accrunning_corrects.double()/dataset_sizes[phase]print(f{phase}Loss:{epoch_loss:.4f}Acc:{epoch_acc:.4f})print()returnmodel# 训练模型modeltrain_model(model,criterion,optimizer,num_epochsconfig[train][epochs])# 保存最佳模型torch.save(model.state_dict(),best_wheat_model.pth)评估脚本evaluate.pyimporttorchfromtorchvisionimportmodels,transforms,datasetsfromtorch.utils.dataimportDataLoaderimportyamlimportnumpyasnpimportmatplotlib.pyplotasplt# 加载配置文件withopen(config.yaml,r)asf:configyaml.safe_load(f)# 定义数据预处理data_transforms{test:transforms.Compose([transforms.Resize((config[test][img_size],config[test][img_size])),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])}# 加载数据集image_datasets{x:datasets.ImageFolder(rootconfig[x][dataset_dir],transformdata_transforms[x])forxin[test]}dataloaders{x:DataLoader(image_datasets[x],batch_sizeconfig[x][batch_size],shuffleFalse,num_workers4)}dataset_sizes{x:len(image_datasets[x])forxin[test]}class_namesimage_datasets[test].classes# 选择设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)# 加载预训练的ResNet模型并加载权重modelmodels.resnet18(pretrainedFalse)num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,config[train][num_classes])model.load_state_dict(torch.load(best_wheat_model.pth))modelmodel.to(device)# 评估模型defevaluate_model(model):model.eval()# 设置模型为评估模式all_preds[]all_labels[]withtorch.no_grad():forinputs,labelsindataloaders[test]:inputsinputs.to(device)labelslabels.to(device)outputsmodel(inputs)_,predstorch.max(outputs,1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())accuracynp.mean(np.array(all_preds)np.array(all_labels))print(fTest Accuracy:{accuracy:.4f})evaluate_model(model)推理脚本infer.pyimporttorchfromtorchvisionimportmodels,transformsfromPILimportImageimportyamlimportmatplotlib.pyplotasplt# 加载配置文件withopen(config.yaml,r)asf:configyaml.safe_load(f)# 定义数据预处理data_transformstransforms.Compose([transforms.Resize((config[test][img_size],config[test][img_size])),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])# 选择设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)# 加载预训练的ResNet模型并加载权重modelmodels.resnet18(pretrainedFalse)num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,config[train][num_classes])model.load_state_dict(torch.load(best_wheat_model.pth))modelmodel.to(device)model.eval()# 设置模型为评估模式defpredict_image(image_path):imageImage.open(image_path).convert(RGB)input_tensordata_transforms(image)input_batchinput_tensor.unsqueeze(0).to(device)withtorch.no_grad():outputmodel(input_batch)_,predicted_idxtorch.max(output,1)predicted_classclass_names[predicted_idx.item()]plt.imshow(image)plt.title(fPredicted Class:{predicted_class})plt.axis(off)plt.show()if__name____main__:image_pathpath/to/your/image.jpg# 替换为你的图像路径predict_image(image_path)可视化脚本visualize.pyimporttorchfromtorchvisionimportmodels,transforms,datasetsfromtorch.utils.dataimportDataLoaderimportyamlimportnumpyasnpimportmatplotlib.pyplotaspltimportrandom# 加载配置文件withopen(config.yaml,r)asf:configyaml.safe_load(f)# 定义数据预处理data_transforms{test:transforms.Compose([transforms.Resize((config[test][img_size],config[test][img_size])),transforms.ToTensor(),transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])])}# 加载数据集image_datasets{x:datasets.ImageFolder(rootconfig[x][dataset_dir],transformdata_transforms[x])forxin[test]}dataloaders{x:DataLoader(image_datasets[x],batch_sizeconfig[x][batch_size],shuffleFalse,num_workers4)}dataset_sizes{x:len(image_datasets[x])forxin[test]}class_namesimage_datasets[test].classes# 选择设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)# 加载预训练的ResNet模型并加载权重modelmodels.resnet18(pretrainedFalse)num_ftrsmodel.fc.in_features model.fcnn.Linear(num_ftrs,config[train][num_classes])model.load_state_dict(torch.load(best_wheat_model.pth))modelmodel.to(device)model.eval()# 设置模型为评估模式defvisualize_predictions(dataloader,num_samples5):all_preds[]all_labels[]all_images[]withtorch.no_grad():forinputs,labelsindataloader:inputsinputs.to(device)labelslabels.to(device)outputsmodel(inputs)_,predstorch.max(outputs,1)all_preds.extend(preds.cpu().numpy())all_labels.extend(labels.cpu().numpy())all_images.extend(inputs.cpu().numpy())indicesrandom.sample(range(len(all_images)),num_samples)fig,axesplt.subplots(1,num_samples,figsize(15,5))fori,idxinenumerate(indices):axaxes[i]imageall_images[idx].transpose(1,2,0)meannp.array([0.485,0.456,0.406])stdnp.array([0.229,0.224,0.225])imagestd*imagemean imagenp.clip(image,0,1)labelclass_names[all_labels[idx]]predclass_names[all_preds[idx]]ax.imshow(image)ax.set_title(fTrue:{label}\nPred:{pred})ax.axis(off)plt.tight_layout()plt.show()if__name____main__:visualize_predictions(dataloaders[test])运行步骤总结克隆项目仓库如果有的话:gitclone https://github.com/yourusername/wheat_maturity_classification.gitcdwheat_maturity_classification安装依赖项:conda create--namewheat_det_envpython3.8conda activate wheat_det_env pipinstall-rrequirements.txt准备数据集:确保你的数据集已经按照上述结构组织好。确认config.yaml文件中的路径和参数正确无误。训练模型:python train.py评估模型:python evaluate.py运行推理:python infer.py可视化数据集:python visualize.py操作界面选择图片进行检测: 修改infer.py中的image_path变量指向你要检测的图片路径然后运行python infer.py。批量检测: 在visualize.py中设置num_samples参数为你想要可视化的样本数量然后运行python visualize.py。详细解释requirements.txt列出项目所需的所有Python包及其版本。config.yaml配置数据集路径和其他训练参数用于图像分类任务。train.py加载预训练的ResNet模型并使用自定义数据集进行训练。训练完成后打印训练结果并保存最佳模型。evaluate.py加载训练好的ResNet模型并对测试集进行评估打印测试准确率。infer.py对单张图像进行预测并可视化预测结果。visualize.py对测试集中的一些样本进行预测并可视化预测结果。