基于深度学习的图像识别与分类系统(Torch + PyQt5界面) 本项目适用于所有图像分类或者识别任务。 项目包括UI界面设计文件 所有源码均提供 项目简单易懂,方便小白使用 深度学习 图像分类 图像识别 作物分类 病虫害识别 PyQt5

啪嗒一声双击exe,你的摄像头突然变成了懂农业的专家。随便拖张玉米叶子的照片进去,三秒后它告诉你:"叶斑病中期,建议喷洒苯醚甲环唑"。这套基于PyQt5和Torch的图形化工具,把深度学习从实验室拽进了田间地头。

![系统界面截图]

(假装这里有张带着文件选择框、预测按钮和病害诊断结果的界面截图)

界面怎么玩

PyQt5的布局就像搭积木。咱们用20行代码就能拼出核心功能区:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('田间诊断专家')
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.img_label = QLabel('拖入图片开始检测')
        self.result_text = QTextEdit()
        self.btn_load = QPushButton('选择图片')
        self.btn_cam = QPushButton('实时检测')
        
        # 网格布局大法好
        layout = QGridLayout()
        layout.addWidget(self.btn_load, 0, 0)
        layout.addWidget(self.btn_cam, 0, 1) 
        layout.addWidget(self.img_label, 1, 0, 1, 2)
        layout.addWidget(self.result_text, 2, 0, 1, 2)
        self.central_widget.setLayout(layout)
        
        # 按钮要干活得连线
        self.btn_load.clicked.connect(self.load_image)

这段代码生成的界面就像个听话的实习生——左上角两个按钮排排坐,中间放图,底下出诊断报告。clicked.connect这操作相当于给按钮装了个开关,一点就触发摄像头唤醒或者文件选择器弹窗。

模型怎么转

Torch模型在Python环境里跑得欢,但打包成exe时经常闹脾气。咱们用这个技巧把模型冻成冰块:

# 加载预训练模型
model = torchvision.models.mobilenet_v2(pretrained=True)
model.classifier[1] = nn.Linear(1280, 5)  # 改成5分类

# 重要!冻结时要把模型调成验证模式
model.eval()

# 示例输入用来骗编译器
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "crop_model.onnx", 
                  input_names=['input'], output_names=['output'])

这种转ONNX的操作相当于给模型拍快照,在部署时不需要原始训练环境也能跑。注意那个dummy_input的尺寸要和实际输入一致,不然就像把大象塞进冰箱——门都关不上。

实战走一个

假设现在要识别水稻的三种病害,数据放在如下结构的文件夹里:

dataset/
    train/
        稻瘟病/*.jpg
        纹枯病/*.jpg
        白叶枯病/*.jpg
    val/
        ...

用这个数据增强配方能让小样本数据量翻倍:

train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(p=0.6),
    transforms.ColorJitter(brightness=0.3),  # 模拟光照变化
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

注意那个p=0.6的水平翻转概率——别设成0.5这种中庸值,稍微来点偏差反而能让模型记住真正的特征而不是对称性。

当模型开始预测时,记得把输出转成人话:

class_names = ['健康', '稻瘟病', '纹枯病', '白叶枯病', '缺素症']
probs = torch.nn.functional.softmax(output, dim=1)
top3_idx = torch.topk(probs, 3).indices.tolist()[0]

result = []
for i in top3_idx:
    result.append(f"{class_names[i]}:{probs[0][i]*100:.1f}%")
self.result_text.setText('\n'.join(result))

这里取概率前三的类别展示,比直接抛个最高分结果更靠谱——毕竟叶子上的斑点可能同时存在多种问题。

整套代码在GitHub上已经跑通小麦锈病的识别(项目里附带了一个演示用的200张小型数据集)。想换成其他作物?把dataset文件夹里的图片按类别摆好,改改class_names列表就能上岗,连模型结构都不用动——迁移学习就是这么任性。

下次下地别急着带放大镜,先让这个带界面的AI助手扫一圈。它可能比老农更早发现藏在叶子背面的蚜虫军团,毕竟机器不会得干眼症。

更多推荐