欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

2025/4/19 6:41:04 来源:https://blog.csdn.net/u012365585/article/details/147325744  浏览:    关键词:利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类

一、需求背景

在农业现代化进程中,作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一,其种植面积广泛,产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃薯叶片的健康状况,能够及时发现病害并采取相应防治措施,有效减少病害对产量的影响,降低农药使用量,促进农业可持续发展。

然而,传统的人工鉴别马铃薯叶片健康状况的方式,不仅耗费大量人力、时间,而且主观性强,容易出现误判。随着人工智能技术的飞速发展,利用图像识别技术实现马铃薯叶片健康状况的自动鉴别成为了可能。客户希望通过自定义微调模型,达成上传马铃薯叶片后迅速鉴别其健康状况的目标。该模型的运行机制是对输入的叶片进行特征抽取,并完成输入数据的多分类任务。

我们的工作核心聚焦于模型可行性验证,主要包含以下方面:

1、依托客户提供的数据,训练并构建图像分类模型,让模型能够快速且精准地依据输入图片的特征,预测出对应的类别标签。

2、需要在实现成本(涵盖训练与推理成本)和模型精准度之间,对多个视觉微调模型展开比对,从而满足客户在不同场景和架构设计下的多样化需求。

3、使用大语言模型协同给出防治建议的效率与效果,确保在满足成本与精度要求的前提下,为用户提供最优质的病害检测与防治建议一体化服务。

二、方案概述

近年来,多模态 AI 模型取得了令人瞩目的进展,这类模型具备同时处理文本和图像的能力,极大地拓展了人工智能的应用边界。像商业模型 GPT-4o、Claude3.5,它们的多模态能力十分强大,在图片分类任务中展现出了不错的表现,能够快速对图像内容进行识别和分类。

然而,当将这些多模态模型应用于马铃薯叶片健康检测这类大规模实际场景时,仍暴露出诸多局限性。一方面,模型在面对如马铃薯叶片早疫病、健康、晚疫病这种自定义标签分类场景时,为了提升精度,需要投入大量精力进行提示词工程的优化工作;另一方面,模型的升级换代可能导致之前积累的有效提示词不再适用,从而需要重新开展大量的调试工作。此外,这类模型的推理成本较高,在大规模处理马铃薯叶片图像数据时,高昂的计算成本使得其在实际应用中受到限制。

鉴于多模态模型在实际应用中的不足,本地部署微调视觉模型成为了更具可行性的方案。在图像分类领域,Yolov11、ResNet50 和 MobileNetV3 等模型有着各自独特的优势。接下来,将深入探讨这些模型在马铃薯叶片健康检测中的应用潜力与价值。

1、常见模型的优势

  • Yolov11:作为 YOLO 系列最新版本,Yolov11 基于卷积神经网络原理,采用单阶段检测器(SSD)结构,将目标检测转化为回归问题,一次前向传播即可预测目标类别与位置。相比传统 CNN,它引入高效的特征金字塔网络(FPN)变体,融合多尺度特征图,提升对不同大小目标的检测能力;数据增强上运用 Mosaic、CutMix 技术,增加数据多样性,提高模型泛化能力。在马铃薯叶片健康检测中,面对大量图像数据,Yolov11 卓越的检测速度能满足实时检测需求,改进的网络结构与数据增强技术也保证了一定精度。

  • ResNet50:基于 CNN 基本原理,ResNet50 通过引入残差模块解决深层网络训练的梯度消失问题。其残差连接允许网络学习输入输出间的残差,得以构建更深网络结构,学习高级抽象特征。在马铃薯叶片疾病检测中,其深度结构能够捕捉叶片细微纹理和形状变化等复杂特征,有效提高分类准确性,例如精准识别早期病斑的细微纹理。

  • MobileNetV3:基于 CNN 原理,MobileNetV3 采用轻量级深度可分离卷积,将标准卷积分解为深度卷积和逐点卷积,大幅减少计算量与参数量。相较于早期版本,它进一步优化网络结构,引入 h-swish 激活函数替代 ReLU,在提升性能的同时降低计算成本,适合在资源受限的移动设备或边缘计算设备上运行,满足农业监测场景中实时检测需求。

  • 自定义 CNN 模型:该模型根据具体任务定制化设计。针对马铃薯叶片疾病检测,依据叶片病症的纹理、形状和颜色特征,专门设计卷积层和池化层结构。例如,针对病害特定纹理设计小尺寸卷积核捕捉细节,根据病害区域分布调整池化步长和区域大小,更精准提取关键特征,有效提升对不同健康状况叶片的识别能力,满足多样化检测需求。

上述 Yolov11、ResNet50、MobileNetV3 和自定义 CNN 模型虽都基于卷积神经网络基本原理,但在网络结构、性能和应用场景上存在明显差异与各自改进点。基于这些模型特点,我们计划运用它们实现马铃薯叶片健康状况检测,并对比评测其能力差异。为更好适应检测任务,我们将利用客户提供的数据对模型进行微调,显著提升模型在马铃薯叶片健康检测领域的性能,实现性能达标且成本低廉的图像分类模型。

2、数据准备

高质量的训练数据对于模型性能至关重要,因此需要精心准备训练数据集,具体步骤如下:

  • 数据收集:数据主要来源于客户在多个马铃薯种植区域不同生长周期采集的叶片图像。这些图像涵盖了不同环境条件下,包括不同光照、湿度和土壤状况等,以确保数据的多样性。此外,还从公开的农业图像数据库中补充了部分图像数据,进一步丰富数据集的样本类型。

  • 数据标注:根据叶片的实际健康状况,按照早疫病(early blight )、健康(healthy)、晚疫病(late blight)这三种分类标签,对图像进行标注。为保证标注的准确性和一致性,需要人工进行标注和核实。例如:

early blight 早疫病

healthy 健康

late blight 晚疫病

  • 数据预处理:在收集到图像数据后,首先对图像进行清洗,去除模糊、损坏以及不符合要求的图像。然后,统一所有图像的尺寸,将其调整为适合模型输入的大小,例如 [224*224]。同时,对图像进行归一化处理,将像素值映射到 [0, 1] 区间,以加速模型的训练收敛速度。此外,还运用了图像增强技术,如随机灰度、Mixup、随机翻转、旋转和缩放等,以增加数据的丰富度,提升模型的泛化能力。

以下是数据预处理部分代码:

# 自定义 Mixup 函数
def mixup_data(x, y, alpha=0.2):if alpha > 0:lam = np.random.beta(alpha, alpha)else:lam = 1batch_size = x.size()[0]index = torch.randperm(batch_size)mixed_x = lam * x + (1 - lam) * x[index, :]y_a, y_b = y, y[index]return mixed_x, y_a, y_b, lam
# 自定义 Mixup 损失函数
def mixup_criterion(criterion, pred, y_a, y_b, lam):return lam * criterion(pred, y_a) + (1 - lam) * criterion(pred, y_b)
# 随机灰度化变换
class RandomGrayscale:def __init__(self, p=0.2):self.p = pdef __call__(self, img):if torch.rand(1) < self.p:return transforms.functional.rgb_to_grayscale(img, num_output_channels=3)return img
# 训练数据预处理和增强
train_transform = transforms.Compose([transforms.Resize((224, 224)),RandomGrayscale(p=0.2),transforms.RandomRotation(30),transforms.RandomAffine(degrees=0, translate=(0.3, 0.3), shear=0.3),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 验证数据预处理
val_transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

需要特别注意的是,我们发现在使用图像增强特别对于 MobileNetV3 这样的轻量级模型精准度影响非常大。图像增强前后的模型准确度约提升 30%。

3、模型训练

数据准备完成后,下一步是进行模型微调。我们分别使用 Yolov11、ResNet50、MobileNetV3 和自定义 CNN 模型进行训练。

(1)YOLO:我们使用 Ultralytics 框架来完成 YOLO 模型的训练。Ultralytics 是一款基于 PyTorch 的深度学习框架,专为计算机视觉任务设计,在目标检测、图像分割和分类等领域应用广泛。其对 YOLO 系列算法进行了深度优化,极大提升了模型的训练效率与检测性能。它提供了丰富的工具和模块,比如先进的数据加载器、高效的训练循环以及灵活的超参数调整接口,能帮助我们快速搭建并训练出符合马铃薯叶片健康检测需求的 YOLO 模型。同时,Ultralytics 还支持多 GPU 训练,显著缩短训练时间,并且具备强大的模型评估与可视化功能,方便我们在训练过程中监控模型表现,及时调整优化策略。以下是训练 YOLO 的关键命令:

from ultralytics import YOLO
data_path = '*'
model = YOLO('yolo11n-cls.pt') 
model.train(task='classify', mode='train', data=data_path, epochs=300) 

(2)RestNet50:以下是训练 RestNet 50 的关键参数:

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu") train_dataset = datasets.ImageFolder(root=train_dir, transform=transform)val_dataset = datasets.ImageFolder(root=val_dir, transform=transform)    train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=4)val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False, num_workers=4)    num_classes = len(train_dataset.classes)    model = resnet50(num_classes=num_classes).to(device)    criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=0.0001)scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.1)best_acc = 0.0early_stopping_patience = 5early_stopping_counter = 0

(3)MobileNetV3:以下是训练 MobileNetV3 的关键参数:

BATCH_SIZE = 32
train_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False)
model = mobilenet_v3_small(pretrained=True)
num_ftrs = model.classifier[3].in_features
model.classifier[3] = nn.Linear(num_ftrs, len(train_dataset.classes))
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.0001, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=5, verbose=1)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)
train_losses = []
val_losses = []
train_accuracies = []
val_accuracies = []
best_val_loss = float('inf')
best_model_weights = copy.deepcopy(model.state_dict())
early_stopping_counter = 0

(4)自定义 CNN 模型:以下是训练自定义 CNN 模型的关键参数:

EPOCHS = 300
BATCH_SIZE = 32
model = Sequential([Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),MaxPooling2D(2, 2),Conv2D(64, (3, 3), activation='relu'),MaxPooling2D(2, 2),Conv2D(128, (3, 3), activation='relu'),Conv2D(128, (3, 3), activation='relu'),MaxPooling2D(2, 2),Flatten(),Dense(256, activation='relu'),  Dropout(0.5),Dense(128, activation='relu'), Dropout(0.5),Dense(3, activation='softmax')
])
model.compile(loss='categorical_crossentropy',optimizer=RMSprop(learning_rate=0.0001),metrics=['accuracy'])
history = model.fit(train_generator,steps_per_epoch=len(train_generator.filenames) epochs=EPOCHS,validation_data=validation_generator,validation_steps=len(validation_generator.filenames) callbacks=callbacks,verbose=1
)
model.save_weights(MODEL_WEIGHTS_FILE)
model.save(MODEL_FILE)   

4、分类任务测试集验证

模型微调步骤结束后,我们加载微调模型在测试数据集上进行推理测试。

以下是加载微调模型在测试集上进行推理预测的代码:

for class_folder in os.listdir(test_folder):class_folder_path = os.path.join(test_folder, class_folder)if os.path.isdir(class_folder_path):ground_truth_class = class_folder  print(f"Processing class folder (Ground Truth): {ground_truth_class}")image_files = [os.path.join(class_folder_path, img) for img in os.listdir(class_folder_path) if img.endswith(('.jpg', '.jpeg', '.png'))]for img_path in image_files:results = model.predict(img_path, conf=0.50)for result in results:predicted_class_index = result.probs.top1              predicted_class = result.names[predicted_class_index] confidence = result.probs.top1conf                    print(f"Image: {img_path}")print(f"Ground Truth: {ground_truth_class}, Predicted class: {predicted_class}, Confidence: {confidence:.2f}")

5、调用 DeepSeek-R1 模型

微调模型给出上传叶片的健康检测分类结果之后,我们调用 DeepSeek-R1 模型(以蒸馏版 14B 为例)对马铃薯健康状况进行进一步、给出防治建议。

以下是调用 DeepSeek-R1 整理模型进行推理的代码:

def deepseek_r1_response(history, msg):messages = []for chat in history:messages.append({"role": "user", "content": chat[0]})messages.append({"role": "assistant", "content": chat[1]})messages.append({"role": "user", "content": msg})openai_api_key = "123"openai_api_base = "http://localhost:8000/v1"client = OpenAI(api_key=openai_api_key,base_url=openai_api_base,http_client=httpx.Client(timeout=1800),)completion = client.chat.completions.create(model="deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",messages=messages,temperature=0.7,top_p=0.85,extra_body={"repetition_penalty": 1.05,},stream=True,)history.append([msg, ""])for chunk in completion:for choice in chunk.choices:content = choice.delta.contentif content:history[-1][1] = history[-1][1] + contenttime.sleep(0.05)yield history

6、亚马逊云科技参考架构图

马铃薯叶片疾病识别训练及推理执行过程说明:

1、数据上传与存储

(1)用户上传训练和推理数据到 Amazon S3 存储桶;

(2)S3 存储桶用于存储中间结果和模型文件,按照不同前缀对文件进行区分。

2、数据处理:在 Amazon SageMaker Notebook 实例上使用 Pre-Process 脚本对数据进行预处理。

3、模型训练:在 SageMaker 中进行模型训练,训练完成后模型存储在 S3 存储桶中。

4、模型推理:使用训练好的模型在 SageMaker Notebook 本地进行推理;实际应用中,也可将模型部署到 SageMaker 推理端点。

5、大模型建议:微调模型推理完成后,大模型拿到推理结果,生成马铃薯叶片病虫害防治相关建议;大模型建议与推理结果一并保存到 S3 存储桶;

6、任务结果通知:使用 Amazon SNS 通知将推理任务结果和大模型生成的建议通过 Email 发送给用户。

三、总结与展望

以下表格是微调模型后的测试结果总结。将测试集准确度 95%、验证集准确度 95% 设为合格线,5 个模型综合表现如下:

YOLO11n-cls、ResNet50 以及 MobileNet 均基于 CNN 架构在不同维度进行了创新优化,以契合多样化的任务需求与应用场景,且在马铃薯叶片健康检测任务中,表现均优于自定义 CNN 模型。其中,YOLO11n-cls 在准确度、训练与推理成本以及用户友好度等多方面展现出显著优势。同时,ResNet50 和 MobileNet 可依据实际场景,如对计算资源、检测精度的不同要求,灵活作为备选方案,为不同条件下的马铃薯叶片健康检测提供了多元选择。

然而,当前工作仍存在一定局限。目前训练数据量相对较少,尽管微调后的模型在测试集上取得了较好效果,但模型可能存在泛化能力不足的问题,在面对复杂多变的实际场景时,稳定性和准确性可能受到影响。

未来工作重点主要聚焦于以下两个方面:一是拓展模型能力,使其能够支持更多样化的图片类别以及更为复杂的场景。通过引入迁移学习、多模态融合等先进技术,提升模型对不同环境、不同生长阶段马铃薯叶片的识别能力,进一步增强模型的鲁棒性和适应性。二是积极利用经市场验证的高质量数据集,持续优化模型性能。一方面,通过扩充数据集规模和多样性,减少模型过拟合风险,提升泛化能力;另一方面,运用更高效的模型训练算法和优化策略,如自适应学习率调整、正则化技术等,在保证模型准确性的同时,降低训练与推理成本,推动马铃薯叶片健康检测模型向更高效、更智能的方向发展。

*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

本篇作者

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词