跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python + AI:构建智能害虫识别系统实战

智能害虫识别系统利用深度学习技术解决农业病虫害监测难题。项目基于 Python 与 PyTorch 框架,采用迁移学习策略优化 ResNet50 模型,结合 OpenCV 进行图像预处理,并通过 Gradio 快速部署 Web 交互界面。流程涵盖数据清洗、模型训练、评估及部署,适用于智慧农业场景下的自动化识别需求。

开源信徒发布于 2026/3/28更新于 2026/6/923 浏览
Python + AI:构建智能害虫识别系统实战

Python + AI:构建智能害虫识别系统实战

智能害虫识别演示

在农业生产中,病虫害是影响作物产量和品质的关键因素。传统的识别方式依赖人工巡查,效率低且容易受经验限制。随着智慧农业的发展,利用 AI 技术实现自动化识别已成为趋势。本文将基于 Python 从零搭建一个智能害虫识别助手,涵盖从数据处理到模型部署的全流程。

项目核心技术栈

本项目选用主流且易上手的技术组合:

  • 编程语言:Python(3.8+),生态完善
  • 深度学习框架:PyTorch,结构清晰,便于调试
  • 图像处理:OpenCV(预处理)、Pandas(数据管理)
  • 模型策略:迁移学习(基于 ResNet50),降低训练成本
  • 交互部署:Gradio,快速构建 Web 界面

实战步骤:从数据到部署

1. 数据准备与预处理

数据是模型的基础。我们可以使用公开的农业害虫数据集(如 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
    # 转换为张量格式 (C, H, W)
    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 (classes):
    cls_dir = os.path.join(data_dir, cls)
     img_name  os.listdir(cls_dir):
        img_path = os.path.join(cls_dir, img_name)
        :
            img = preprocess_image(img_path)
            processed_data.append(img)
            labels.append(idx)
        :
            


processed_data = np.array(processed_data)
labels = np.array(labels)
enumerate
for
in
try
except
continue
# 转换为数组
2. 搭建 CNN 模型(迁移学习版)

从零训练 CNN 需要大量算力,我们采用迁移学习策略。加载预训练的 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)
3. 训练与评估模型

将数据封装为 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")
4. 用 Gradio 部署成 Web 应用

训练完成后,使用 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)

运行代码后,浏览器会打开本地链接。上传害虫图片,系统将在几秒内返回识别结果及置信度。

进阶优化方向

若需进一步提升效果,可考虑以下方向:

  1. 数据增强:使用 torchvision.transforms 进行旋转、翻转等操作,提升泛化能力。
  2. 调参优化:调整学习率、批次大小,或尝试 SGD 等优化器。
  3. 多标签识别:修改输出层支持单张图片包含多种害虫的情况。
  4. 部署优化:使用 ONNX 转换模型,或部署至云服务器实现远程访问。

总结

该项目覆盖了 AI 开发的核心流程:数据预处理、模型搭建、训练评估及部署。对于初学者而言,这是一个完整的实战案例;对于农业场景,它能提供有效的自动化监测方案。通过 Python 与 AI 的结合,技术能够切实落地解决具体问题。

目录

  1. Python + AI:构建智能害虫识别系统实战
  2. 项目核心技术栈
  3. 实战步骤:从数据到部署
  4. 1. 数据准备与预处理
  5. 数据预处理函数
  6. 遍历数据集文件夹预处理
  7. 转换为数组
  8. 2. 搭建 CNN 模型(迁移学习版)
  9. 加载预训练的 ResNet50
  10. 冻结主干网络参数
  11. 替换最后一层分类器
  12. 定义损失函数和优化器
  13. 设备配置
  14. 3. 训练与评估模型
  15. 转换为张量
  16. 划分训练集和验证集
  17. 创建 DataLoader
  18. 训练函数
  19. 开始训练
  20. 保存模型
  21. 4. 用 Gradio 部署成 Web 应用
  22. 加载训练好的模型
  23. 定义识别函数
  24. 创建 Gradio 界面
  25. 启动应用
  26. 进阶优化方向
  27. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Oracle 11g 自动收集统计信息导致 IO 过高优化方案
  • C++ 视觉开发:ONNX Runtime(ORT)使用指南
  • 自然语言处理在医疗领域的应用与实战
  • 汇川 RobotLab 软件常用操作指南
  • AI 时代普通人如何建立商业认知并实现变现
  • AI 时代普通人如何脱颖而出:商业认知与行动策略
  • OpenClaw 集成微信实现 AI 自动回复配置指南
  • Cursor IDE 配置 Java SpringBoot 开发环境
  • 普通人如何靠提问和评论参与 AI 创作?
  • HDFS 核心组件深度解析:分布式文件系统架构基石
  • 从零实现基于管道的 Linux 进程池
  • Whisper-WebUI 语音转文字工具实战指南
  • Chrome 扩展:一键转换网页图片格式为 PNG/JPG/WebP
  • C++ 与 Linux 基础:深入理解虚拟文件系统 VFS
  • 修复 Linux 无法开机 VFS Unable to mount root fs on unknown-block 错误
  • ToDesk、顺网云、青椒云云电脑 AIGC 性能实测与对比
  • 免费获取 AI 大模型 API KEY 教程:硅基流动与 Deepseek 实践
  • AIGC 产品经理转行核心能力与岗位要求分析
  • KWDB 运维实战:用 SQL 打通 Metrics 与 CMDB
  • C++ Qt 窗口框架与菜单栏 QMenuBar 详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online