跳到主要内容位置

Linux项目-番茄生长状况智能巡检系统

简介#

这个项目是研究生阶段的第一个嵌入式项目。项目来自于一个横向课题,需求是能够实现远程管理、自动化记录番茄生长周期内的图像、环境数据,用于建立番茄生长状况的时序预测模型,通过番茄早期生长状况预测未来果实的饱满度、个头等。

本项目开发了一套番茄生长智能巡检系统,以轨道和步进电机实现巡视,通过摄像头与舵机云台进行番茄照片采集。STM32 控制步进电机滑轨在大棚内的轨道上移动,控制舵机云台调整摄像头,采集环境温湿度、土壤湿度、光照传感器数据;主控采用树莓派 3B+,负责收集数据,运行 YOLOv5-lite 神经网络模型进行目标检测,寻找番茄位置,下发云台与拍照指令,同时树莓派通过内网穿透部署一个远程 web 网页。系统整体框图如下:

系统整体图

主要工作#

  • 部署 YOLOv5-Lite 神经网络到树莓派 3B+进行番茄、番茄叶的目标识别(Python 开发)
  • STM32 单片机软硬件开发(PCB 设计、FreeRTOS 应用)
  • Web 远程控制与监测系统

(我主要负责前两个开发)

平台与软件#

  • 树莓派 3B+
    • 目标检测算法
    • 舵机两自由度模型与 PID 控制算法
  • STM32F103C8T6
    • 温湿度传感器 DHT11 驱动
    • 光照传感器 BH1750 驱动
    • 步进电机驱动
    • 舵机驱动

实物展示#

实物#

第 1 版:

第 2 版:

大棚内:

web 页面:

功能#

巡检,识别,拍照,远程控制:

硬件介绍#

硬件设计了 STM32F103 的外围电路,24v 降压电路,电机接口,传感器接口等:

PCB:

软件介绍#

软件整体框架如下图所示:

树莓派#

软件框架主要就是树莓派程序和 STM32 程序。核心系统部署在树莓派 3B+上,其中以 Flask 框架提供 Web 服务,使用内网穿透工具“花生壳”进行外网远程访问;同时,后台在树莓派上运行,基于 OpenCV 计算机视觉库调用摄像头以及图像预处理,基于 YOLOv5-Lite 目标识别框架以及 onnx 边缘部署提供番茄目标检测功能。

树莓派的程序流程图如下:

树莓派接收到 Web 请求,表示番茄图像采集任务开始。

首先发送给下位机 STM32 定点位置,等待 STM32 驱动步进电机运动完成,摄像头采集图像,导入 YOLOv5-Lite 模型,推理出番茄目标的 boxes 坐标,计算番茄质心是否在图像中心,并计算出水平和垂直偏差,通过云台两自由度模型计算出水平舵机 pan_steer 和垂直舵机 tilt_steer 的运动角度,调整云台,直至番茄质心位于图像中心,在第 i 个位置重复以上步骤,直至对所有番茄树采集图像完成。

1)目标检测算法#

目标检测算法来自于 YOLOv5 的变种 YOLOv5_Lite,相较于 YOLOv5,Lite 的 Flops 更小,内存占用更低,参数更少,加入 shuffle channel,YOLOv5 head 进行通道裁剪,在 320 的 input_size 至少能在树莓派 3B+上推理速度快 4 倍左右,并且为了更易部署,模型摘除 Focus 层和四次 slice 操作,但模型量化精度下降在可接受范围内1

收集番茄数据集的训练集主要来源于互联网,共 797 张,验证集和测试集来自于舵机云台采集的番茄图像各 100 张。通过 labelme 标注后,使用 python 编写的脚本将 json 格式的标签转换为 yolo 需要的 box 坐标的 txt 格式。完成训练模型后,使用 yolo 自带的 export.py 将 pt 文件转换为部署在树莓派上的模型 onnx,然后在树莓派上部署模型,使用 onnxruntime 推理工具。


1 YOLOv5-Lite: lighter, faster and easier to deploy[OL].https://github.com/ppogg/YOLOv5-Lite

2)舵机两自由度模型与 PID 控制算法#

树莓派采集图像计算调整舵机云台,为达到采集完整番茄图像的目标,对云台进行简单建模,PID 控制,使图像中多个番茄目标的质心位于图像中心。因为此图像采集任务为非快速响应、非即时场景,无需对云台控制有较高的精确度模型,且复杂矩阵的计算过程会消耗 CPU 资源。经过测试,树莓派 3B+的推理速度为 1s,所以云台的调整时间上限为 1s,通过简单模型能够满足完成摄像头的调整,采集到多个番茄目标的质心位于图像中心的照片。

这个地方会有坐标变化和建模过程,详细过程在一般的相机或 OpenCV 教程里面,然后采用增量式的 PID。

PID 参数整定为panpid=PID(p=0.07,i=0,imax=90)pan_{pid}=PID(p=0.07,i=0,imax=90)tiltpid=PID(p=0.05,i=0,imax=90)tilt_{pid}=PID(p=0.05,i=0,imax=90)这里设置微分环节 Kd 默认等于 0,imax 为积分最大值。

相关资源链接#

完整技术论文:

​ 番茄生长状况智能监测系统.pdf ​ 链接:https://pan.baidu.com/s/1QlFbXBct1kxNlsHrHqjonw ​ 提取码:3sph

YOLOv5-Lite:https://github.com/ppogg/YOLOv5-Lite

PID 调试:【9.舵机的 PID 控制】 https://www.bilibili.com/video/BV1KM411e7Kz/?share_source=copy_web&vd_source=d4aa61f841a55d1e2577bb0191ba45eb