Python+AI 智能害虫识别助手开发实战
介绍使用 Python 和深度学习框架 PyTorch 构建智能害虫识别系统的完整流程。涵盖数据准备、基于 ResNet50 的迁移学习模型搭建、训练评估以及使用 Gradio 部署 Web 应用。通过图像预处理、模型微调及可视化交互界面实现害虫自动识别,为智慧农业提供低成本解决方案。

介绍使用 Python 和深度学习框架 PyTorch 构建智能害虫识别系统的完整流程。涵盖数据准备、基于 ResNet50 的迁移学习模型搭建、训练评估以及使用 Gradio 部署 Web 应用。通过图像预处理、模型微调及可视化交互界面实现害虫自动识别,为智慧农业提供低成本解决方案。

在农业生产中,病虫害是影响作物产量和品质的关键因素。传统的害虫识别依赖人工巡查,耗时耗力且易误判。随着智慧农业的发展,AI 技术成为解决该问题的有效手段。本文介绍使用 Python 从零搭建一个智能害虫识别助手,实现农作物病虫害预警。
智慧农业的核心是精准、高效、低成本,害虫识别是典型场景:
使用公开农业害虫数据集(如 IP102),或自行采集标注。
import cv2
import os
import numpy as np
# 数据预处理函数
def preprocess_image(img_path, target_size=(224, 224)):
# 读取图片
img = cv2.imread(img_path)
# 调整尺寸
img = cv2.resize(img, target_size)
# BGR 转 RGB(PyTorch 默认 RGB)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 归一化
img = img / 255.0
# 转换为张量格式
img = np.transpose(img, (2, 0, 1))
return img
# 遍历数据集文件夹预处理
data_dir = "pest_dataset"
classes = os.listdir(data_dir)
processed_data = []
labels = []
for idx, cls in enumerate(classes):
cls_dir = os.path.join(data_dir, cls)
for img_name in os.listdir(cls_dir):
img_path = os.path.join(cls_dir, img_name)
try:
img = preprocess_image(img_path)
processed_data.append(img)
labels.append(idx)
except:
continue
processed_data = np.array(processed_data)
labels = np.array(labels)
基于预训练的 ResNet50,冻结主干网络参数,替换最后一层分类层。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import models
# 加载预训练的 ResNet50
model = models.resnet50(pretrained=True)
# 冻结主干网络参数
for param in model.parameters():
param.requires_grad = False
# 替换最后一层分类器
num_classes = len(classes)
model.fc = nn.Linear(model.fc.in_features, num_classes)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)
# 设备配置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
将数据转换为 PyTorch DataLoader,进行训练并在验证集上评估精度。
from torch.utils.data import TensorDataset, DataLoader, random_split
# 转换为张量
X = torch.tensor(processed_data, dtype=torch.float32)
y = torch.tensor(labels, dtype=torch.long)
dataset = TensorDataset(X, y)
# 划分训练集和验证集
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])
# 创建 DataLoader
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)
# 训练函数
def train_model(model, train_loader, val_loader, epochs=10):
model.train()
for epoch in range(epochs):
running_loss = 0.0
for inputs, labels in train_loader:
inputs, labels = inputs.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
model.eval()
val_correct = 0
val_total = 0
with torch.no_grad():
for inputs, labels in val_loader:
inputs, labels = inputs.to(device), labels.to(device)
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)
val_total += labels.size(0)
val_correct += (predicted == labels).sum().item()
print(f"Epoch {epoch+1}/{epochs} | Loss: {running_loss/len(train_loader):.4f} | Val Accuracy: {100* val_correct / val_total:.2f}%")
return model
# 开始训练
trained_model = train_model(model, train_loader, val_loader, epochs=15)
# 保存模型
torch.save(trained_model.state_dict(), "pest_recognition_model.pth")
使用 Gradio 搭建可视化页面,上传图片即可识别害虫。
import gradio as gr
# 加载训练好的模型
model.load_state_dict(torch.load("pest_recognition_model.pth"))
model.eval()
# 定义识别函数
def recognize_pest(img):
img = cv2.resize(img, (224, 224))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img / 255.0
img = np.transpose(img, (2, 0, 1))
img = torch.tensor(img, dtype=torch.float32).unsqueeze(0).to(device)
with torch.no_grad():
outputs = model(img)
_, predicted = torch.max(outputs, 1)
pest_name = classes[predicted.item()]
confidence = torch.softmax(outputs, dim=1)[0][predicted.item()].item() * 100
return f"识别结果:{pest_name} | 置信度:{confidence:.2f}%"
# 创建 Gradio 界面
interface = gr.Interface(
fn=recognize_pest,
inputs=gr.Image(type="numpy"),
outputs=gr.Textbox(),
title="智能害虫识别助手",
description="上传农作物害虫图片,自动识别害虫种类"
)
# 启动应用
interface.launch(share=True)
运行代码后生成本地链接,打开即可查看交互界面,上传图片即可显示识别结果。
本项目覆盖 AI 开发核心流程:数据预处理、模型搭建、训练评估、部署应用。通过几行代码将技术落地到具体场景,为智慧农业提供低成本解决方案。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online