一个AI蒸汽除草机器人,本质上就是把几项已经成熟的技术拼在一起:摄像头采集田间图像,AI模型识别出杂草的像素位置,控制器再把坐标换算成蒸汽喷嘴的开关信号。项目标题里提到的明尼苏达发明家方案,宣传点是“无化学除草”和“环保高效”。换成工程语言,这就是一条标准的“感知-决策-执行”链路。要真正理解这类设备,不能只盯着“能不能识别出杂草”,因为从识别到触发的链路里,任何一个环节慢了或者错了,机器人都可能把旁边的作物烫坏,也可能漏掉一整片杂草。
这篇文章从开发者角度,把AI蒸汽除草机器人里最容易在普通电脑上复现的视觉识别子模块讲透。你可以用一台普通电脑、一个USB摄像头和一个开源目标检测框架,在Ubuntu系统上跑通“摄像头识别杂草并生成执行信号”的最小闭环。文中的代码和配置按学习环境设计,不需要真实的下地机器人。硬件执行部分,我会给出接口思路和必须注意的安全边界,但不会教你自建高压蒸汽设备。学完后,你至少能独立完成图像采集、数据标注、模型训练、实时推理和日志回放这套流程。
1. 先拆解AI蒸汽除草机器人的完整工作链路
1.1 蒸汽除草解决什么问题
除草是农业生产里最耗人工的环节之一。传统化学除草剂效率高,成本低,但长期使用会带来两方面的压力:一是药剂残留对土壤和水源的影响在环保要求高的地区越来越难被接受;二是杂草不断产生抗药性,农户只能加大剂量或换更贵的药剂。
蒸汽除草不是新概念。高温蒸汽接触到杂草茎叶后,会让植物细胞内的蛋白质变性和细胞膜破裂,水分快速蒸发,杂草在几秒内就会失去支撑并萎缩。相比化学除草剂,它的优势是基本无化学残留,也更能应对抗药性杂草。缺点是能耗高、作业速度慢、热辐射需要防护。如果对整块地无差别喷蒸汽,耗能将非常夸张,高温也会伤到作物。所以必须用AI视觉把杂草从作物中间挑出来,尽量只对杂草位置喷射。这就是这一整类项目把摄像头、Ubuntu、人工智能放在一起的根本原因。
1.2 从摄像头到蒸汽喷头的五级链路
一个完整AI蒸汽除草机器人的工作流程可以拆成五级:
- 图像采集:摄像头获取地面图像,常见的是USB摄像头或工业相机,输出RGB帧。
- 模型推理:目标检测模型在帧里找出杂草外接框,并输出类别和置信度。
- 坐标映射:把图像上的像素坐标换算成机器人的执行器坐标,常见做法是横向比例换算。
- 决策判断:只凭单帧识别结果直接触发动作很容易造成误喷,需要加入置信度阈值和连续帧确认。
- 执行动作:控制器根据决策结果打开对应喷嘴、移动云台或调整底盘位置。
各级之间都要控制延迟。假设机器人以低速在田间行进,从画面中出现杂草到蒸汽喷出,整个链路最好控制在几百毫秒以内。如果识别部分花了1秒,机器人已经开过去了,后续执行再准确也没有意义。这也是为什么这种项目很少把超大规模模型直接塞进移动设备,推理速度和精度必须一起权衡。
1.3 为什么先做视觉子模块
第一次接触这类项目的人,最容易把注意力放在蒸汽喷嘴、底盘和供电上。这些部分确实重要,但调试成本非常高,需要机械加工、电气布线和安全防护,不适合初学者在普通实验室里复现。
视觉子模块是整台机器人里风险最低、最能在桌面上跑通的部分。它需要的资源只是一个Linux环境、一个摄像头和一些Python依赖。先跑通视觉子模块有实打实的好处:你会得到一批真实田间图像,知道模型在不同光照下表现如何;你会了解识别结果需要多精确,执行器才能对准;你还能积累一套训练数据和日志回放流程,这些是后续工程化最值钱的资产。
注意:在桌面上跑通的视觉识别,不代表在田里就能用。光照、抖动、土壤颜色、杂草密度都会显著改变模型表现,必须用真实场景数据做验证。
2. Ubuntu与摄像头环境准备:先让电脑看见田间图像
2.1 Ubuntu安装方式怎么选
视觉识别部分选择Ubuntu,主要是因为AI开源生态对Ubuntu支持最好。当前常见的LTS版本,例如22.04或24.04,都能满足本文需要。安装方式通常有三种:
| 安装方式 | 适合场景 | 局限 |
|---|---|---|
| 物理机安装 | 长期开发、接USB摄像头 | 需要一台空闲电脑 |
| 虚拟机安装(VMware等) | 熟悉Linux命令、跑通训练流程 | USB透传不稳,实时推理帧率低 |
| 边缘设备 | 后续部署到机器人本体 | 初期调试不如普通电脑方便 |
如果手边只有Windows电脑,用VMware安装Ubuntu先跑通训练流程是可行的,但实时摄像头推理建议放到物理机上。虚拟机里USB摄像头的带宽和延迟不稳定,可能出现“摄像头识别到了,但画面明显卡顿”的情况。
开发期还有一个折中办法:先用手机或相机录制一段田间视频,把视频文件拷贝到Ubuntu里,用cv2.VideoCapture("field.mp4")代替实时摄像头。这样能先把模型、日志、执行逻辑跑通,等这些环节稳定后再切换到实时摄像头调试。
2.2 安装Python与依赖
Ubuntu桌面版一般自带Python 3,但为了避免污染系统Python,建议创建一个虚拟环境。以下命令在终端中执行:
sudo apt update sudo apt install -y python3 python3-venv python3-pip \ v4l-utils git libgl1 libglib2.0-0 mkdir -p ~/weeder && cd ~/weeder python3 -m venv venv source venv/bin/activate pip install --upgrade pip pip install ultralytics opencv-python numpy这里的libgl1和libglib2.0-0是OpenCV在部分Ubuntu系统上运行所需的底层库,缺少时通常会出现 “libGL.so.1: cannot open shared object file” 这类报错。v4l-utils用来查看摄像头的Video4Linux设备信息,排错时很有用。
安装完成后,确认虚拟环境已经激活。命令提示符前面会出现(venv),后续所有训练和推理操作都在这个环境内执行。
2.3 验证摄像头被系统识别
先把USB摄像头插到电脑上,然后执行:
ls /dev/video* v4l2-ctl --list-devices正常情况下会看到/dev/video0或更多编号,以及摄像头名称。如果看不到设备,优先检查USB接口、虚拟机USB直通设置和线缆。
权限问题也很常见。Ubuntu下访问摄像头需要用户处于video组,执行:
sudo usermod -aG video $USER添加后需要注销并重新登录才生效。用OpenCV做一次最小验证:
import cv2 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("Camera 0 cannot be opened") exit(1) while True: ret, frame = cap.read() if not ret: break cv2.imshow("camera", frame) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows()如果这一步能弹出画面,摄像头环境就算通了一半。注意VideoCapture(0)里的0是设备索引,如果你的系统里摄像头不是video0,改成对应编号。还有一类低分辨率CMOS摄像头模块,例如OV7670,需要单片机采集之后再转发,通常不适合直接接到Ubuntu上跑深度学习模型,采集链路过长且分辨率有限,建议选择支持UVC协议的USB摄像头。
3. 数据是关键:采集和标注杂草样本的正确姿势
3.1 数据从哪来:自采优先,公开数据集辅助
目标检测模型的训练效果,高度依赖训练数据是否贴近实际使用场景。公开的杂草检测数据集可以在Roboflow Universe、Kaggle等平台检索“weed detection”找到,使用前要确认图像拍摄环境与你的目标田块是否接近。如果公开图像的相机高度、光照、土壤颜色都和你的田块差太远,直接拿来训练,到现场往往会失效。
自采数据时要注意三个细节:
- 不同时间采集:早晨、中午、傍晚的光照方向不同,模型需要适应不同光线。
- 相机高度固定:镜头距离地面的高度要和实际安装高度一致。训练时看到的是高清俯视图,实际安装在机器人上却变成低角度斜视,模型很难泛化。
- 覆盖多种背景:干燥土壤、湿润土壤、有地膜覆盖、有秸秆残留,这些背景都会干扰模型。
起步阶段不需要追求海量数据。几百张图像手工标注后,用数据增强先跑通训练流程,比一开始就收集几千张但标注质量参差不齐更有价值。
3.2 用LabelImg标注数据
数据标注建议使用LabelImg,安装和使用都很简单:
pip install labelimg labelimg打开LabelImg后,先把标注格式切换成YOLO格式。然后用矩形框分别框住作物和杂草。类别建议只保留两个:crop和weed。不要一上来把杂草分成七八个细类,样本量会被摊薄,模型反而学不好。
标注完成后,每张图像都会对应一个同名txt文件。YOLO格式的每行内容是:
class x_center y_center width height这些坐标值都归一化到0到1之间。class的编号从0开始,因此你需要在data.yaml里固定类别顺序:
nc: 2 names: 0: crop 1: weed3.3 标注质量比数量更重要
标注阶段最怕的是“看着像就行了”。如果矩形框把杂草旁边的泥土、碎石也框进去,模型会学成“带土块特征的东西就是杂草”,到真实场景里就会出现大量误报。反过来,如果框太小,只框住了半片叶子,模型就学不到完整的叶片形态。
推荐目录结构如下:
~/weeder/dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yaml训练集和验证集的划分不建议随机抽,而是按地块或视频段划分。比如甲地拍摄的图像全部进训练集,乙地拍摄的图像全部进验证集。如果同一段视频相邻帧被拆到训练集和验证集,模型其实已经“见过”这些图像,验证指标的参考价值会大打折扣。
另一个容易被忽略的问题是类别不平衡。如果杂草样本有500张,作物样本只有50张,模型会严重偏向杂草。建议先做数量对齐,再考虑训练。必要时可以把没有杂草的图像作为负样本放进去,帮助模型学会“什么都不喷”的状态。
4. 用YOLOv8训练杂草检测模型,并从指标判断是否可用
4.1 为什么选YOLO系列目标检测
YOLO系列目标检测模型是通过矩形框直接定位物体位置的。相比图像分类,检测框能直接给出杂草在画面中的坐标,这正是蒸汽执行器所需要的信息。相比实例分割,检测框的计算量更小,部署更容易,对初版样机来说性价比更高。如果后续发现杂草重叠严重、需要更精确的喷射中心点,再考虑YOLOv8的seg分割任务也不迟。这里的代码以yolo detect train为例。
当前常用的YOLO系实现都有成熟的开源训练工具。以YOLOv8为例,它同时支持检测、分割、分类任务,而且用起来非常简单。其他较新的YOLO版本在API上高度相似,本文中的思路可以直接迁移。
4.2 准备data.yaml
在数据集目录下手写一个data.yaml:
path: /home/你的用户名/weeder/dataset train: images/train val: images/val nc: 2 names: 0: crop 1: weedpath建议写成绝对路径,避免训练脚本找不到文件。train和val是相对于path的路径,YOLO会自动拼接。这里要注意,Ultralytics要求images和labels目录放在同一父目录下,并且除了扩展名不同之外,文件名要完全一致,否则训练时会提示找不到标签文件。
4.3 训练命令与关键参数
在~/weeder目录下执行:
yolo detect train \ data=/home/你的用户名/weeder/dataset/data.yaml \ model=yolov8n.pt \ epochs=50 \ imgsz=640 \ batch=8如果你的电脑有NVIDIA GPU,可以在命令末尾加上device=0。没有GPU时,直接使用CPU训练,只是时间会长一些。对于几百张图的小数据集,CPU训练完全能跑通。
几个关键参数的理解:
| 参数 | 含义 | 学习环境建议 | 参数调整的影响 |
|---|---|---|---|
| epochs | 训练轮数 | 50起步 | 太少欠拟合,太多可能过拟合 |
| imgsz | 输入图像分辨率 | 640 | 越大精度可能越高,但推理速度越慢 |
| batch | 每批样本数 | 8 | 显存不足时报错,需要调小 |
| device | 训练设备 | 无GPU时留空 | 使用GPU可显著加速 |
| workers | 数据加载进程数 | 默认即可 | 过高会导致内存不足 |
训练结束后,结果会保存在runs/detect/train/目录下。其中weights/best.pt是在验证集上表现最好的权重,后续推理都应该使用这个文件,而不是最后的last.pt。
4.4 怎么读Precision、Recall和mAP
训练过程会输出一组评估指标,常见的有:
| 指标 | 含义 | 在这个项目里的意义 |
|---|---|---|
| Precision | 模型预测出的所有杂草框中,真杂草的比例 | Precision低,误喷多,可能把作物烫坏 |
| Recall | 图像中真正的杂草里,模型找到的比例 | Recall低,漏喷多,除草不干净 |
| mAP50 | IoU阈值为0.5时各类别平均精度 | 综合反映检测能力,适合快速对比 |
| mAP50-95 | 不同IoU阈值下的平均精度 | 更严格,也受边框精确度影响 |
对除草场景,建议优先看Recall。漏喷的杂草会继续生长,后续必须人工补处理;而误喷只要不是持续发生,至少还能靠连续帧确认兜底。如果你的验证集上Recall明显偏低,不要急着调算法,先回到数据层面:是不是杂草样本太少、是不是标注边界不准确、是不是验证集和训练集的地块光照差异太大。
5. 把识别坐标转成蒸汽执行逻辑:从像素到喷头的通路
5.1 从YOLO结果里取出目标框
推理时,用训练好的权重加载模型,然后对每一帧做预测:
from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") results = model(frame, conf=0.40) for r in results: for box, cls, conf in zip(r.boxes.xyxy, r.boxes.cls, r.boxes.conf): x1, y1, x2, y2 = [int(v) for v in box.tolist()] label = int(cls) confidence = float(conf) print(label, confidence, x1, y1, x2, y2)box.xyxy是检测框的左上角和右下角坐标,单位是像素。这些坐标可以直接用来计算杂草在画面中的中心点。需要注意的是conf=0.40是一个后处理阈值,高于它的框才会被保留。阈值太高会漏检,太低会增加误检,需要结合你训练时的验证集结果来定。
5.2 用连续帧确认避免瞬时误检
单帧检测结果不能直接用来触发蒸汽。因为摄像头抖动、光线反射、运动模糊都可能让某一帧产生误检。推荐使用一个简单的“连续帧投票器”:
from collections import deque class WeedVoter: def __init__(self, min_hits=3, window=10): self.min_hits = min_hits self.history = deque(maxlen=window) def update(self, detected): self.history.append(1 if detected else 0) return sum(self.history) >= self.min_hits逻辑是:在最近10帧中,如果有3帧以上都检测到杂草,才认为目标稳定出现。这个策略能显著降低瞬时误检导致的误喷。实际操作时,可以只对同一位置的检测目标做投票,比如中心点坐标偏移不超过图像宽度20%的目标才视为同一个目标。
5.3 通过串口输出执行信号
在样机上,视觉模块与蒸汽执行器通常通过串口通信。为了让协议简单可靠,建议只发送横向位置比例,而不是整个坐标数组:
import serial ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=0.1) def send_fire(center_x: int, frame_width: int): ratio = center_x / frame_width msg = f"WEED:{ratio:.2f}\n" ser.write(msg.encode()) print(msg)执行器收到WEED:0.31这样的消息后,负责把对应喷嘴或云台转到横向31%的位置。协议越简单,现场越容易排查。如果设备用的是GPIO而不是串口,那么这一步就替换成GPIO的电平信号,但决策逻辑仍然相同。
5.4 蒸汽系统安全的边界问题
AI视觉子模块只负责给执行器发一个触发信号,真正的高温蒸汽系统不在Linux开发范围内。但软件侧有责任把安全边界设计清楚:
- 默认状态必须是没有检测到杂草时阀门关闭。
- 控制器进程崩溃或异常退出时,系统必须能自动进入关阀状态,不能停留在“保持上次输出”。
- 蒸汽装置要由有压力容器经验的人设计,需要温度传感器、压力传感器、泄压阀、隔热管路和物理急停按钮。
- AI信号不能直接驱动大功率执行机构,中间必须有具备超时保护和互锁逻辑的控制层。
这里要特别提醒:蒸汽除草涉及高温高压,普通软件开发者不要在没有压力容器安全知识的情况下自制蒸汽发生装置。软件侧能做的是把控制逻辑和急停边界设计清楚。
6. 实时运行验证与调试:不要只看画面里有没有框
6.1 开发期用视频文件回放
直接下地测试成本很高。开发期建议先用视频文件回放。用手机拍一段田间的视频,拷到Ubuntu里,然后让推理循环读取这个文件:
import cv2 from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") cap = cv2.VideoCapture("field_sample.mp4") while True: ret, frame = cap.read() if not ret: break results = model(frame, conf=0.40) for r in results: for box, cls, conf in zip(r.boxes.xyxy, r.boxes.cls, r.boxes.conf): if int(cls) == 1: x1, y1, x2, y2 = [int(v) for v in box.tolist()] cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(frame, f"weed {float(conf):.2f}", (x1, y1 - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.imshow("weed detector", frame) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows()这个阶段只验证“模型在视频上能不能持续稳定地框出杂草”。如果画面里的框跳来跳去,说明需要降低帧率、提高置信度,或者增加连续帧投票。
6.2 用日志把每次触发记录成可追溯的数据
验证执行逻辑时,每一个触发动作都必须能回放。推荐把检测结果写入CSV:
import csv import datetime import cv2 from ultralytics import YOLO model = YOLO("runs/detect/train/weights/best.pt") cap = cv2.VideoCapture(0) log = open("weed_log.csv", "w", newline="") writer = csv.writer(log) writer.writerow(["ts", "frame_id", "cls", "conf", "x1", "y1", "x2", "y2"]) frame_id = 0 while True: ret, frame = cap.read() if not ret: break results = model(frame, conf=0.40, verbose=False) for r in results: for box, cls, conf in zip(r.boxes.xyxy, r.boxes.cls, r.boxes.conf): x1, y1, x2, y2 = [int(v) for v in box.tolist()] writer.writerow([ datetime.datetime.now().isoformat(), frame_id, int(cls), round(float(conf), 4), x1, y1, x2, y2 ]) frame_id += 1 if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows() log.close()日志里有时间戳、帧号、类别、置信度和坐标。这样当执行器出现问题,或者某一垄地漏喷严重时,你可以拿着日志和视频逐帧比对,而不是靠“感觉”。
6.3 常见问题排查表
| 问题现象 | 可能原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 摄像头打开黑屏 | 设备索引不对、被其他进程占用 | v4l2-ctl --list-devices | 换VideoCapture(1),关闭占用进程 |
| 识别框延迟严重 | CPU推理太慢、图像太大 | 观察画面帧率、CPU占用 | 换yolov8n、降低imgsz=416、导出ONNX |
| 只有近处杂草被识别 | 相机高度与训练数据不一致 | 回看训练图像的拍摄角度 | 在实际安装高度补采数据再重训 |
| 作物频繁被误判为杂草 | 类别不平衡、背景相似、阈值太低 | 查看bad case并统计类别比例 | 增加作物样本,提高conf,训练集对齐 |
| 串口发送失败 | 端口名错、无权限 | ls -l /dev/ttyUSB0 | 将用户加入dialout组并重新登录 |
| 日志里有检测结果但执行器不动作 | 协议不匹配、线序错误 | 用串口工具先发固定消息 | 统一协议并先做回环测试 |
6.4 性能瓶颈定位
如果实时推理帧率不达标,按照“采集、推理、后处理、串口发送”的顺序逐段排查。先看摄像头原始帧率是多少,再看模型推理一帧耗时多少,后处理和串口发送通常只占几毫秒。绝大多数瓶颈出在模型推理阶段。
一个常用的优化方式是改用更小的输入分辨率。imgsz=640如果在边缘设备上跑不动,可以降到imgsz=416,代价是检测精度略有下降。另一个方向是把权重导出为ONNX或TensorRT格式:
yolo export model=best.pt format=onnx imgsz=640导出后的ONNX可以在Jetson、OpenVINO等推理后端上运行,往往比直接调用Ultralytics的PyTorch推理更快。
7. 从桌面原型到田间机器人:工程化、安全与部署
7.1 部署侧:从电脑切换到边缘设备
桌面原型跑通后,下一步是把视觉模块装到机器人本体上。常见选择是NVIDIA Jetson系列或低功耗工控机。这类设备同样可以跑Ubuntu,训练好的模型需要先导出成ONNX,再转换为对应推理后端支持的格式。
部署时不要直接把训练代码原样搬到设备上。训练代码里有大量数据加载、增强和日志逻辑,会浪费边缘设备的计算资源。生产上应该拆出一个精简的推理服务:读取图像、推理、输出结构化结果、发送给控制器。每个环节都要有超时和异常处理。
7.2 控制侧:让视觉模块与执行器解耦
真实机器人的执行器通常不只是单个喷嘴,可能包含底盘运动、云台转向、多路喷嘴选择。这种情况下,不适合让视觉代码直接操作机械动作。推荐的做法是让视觉模块输出结构化事件:
{"event": "weed_detected", "timestamp": "2025-01-01T08:00:00", "center_ratio": 0.31, "confidence": 0.82}机器人主控订阅这些事件,根据当前速度、位置和执行器能力决定怎么动作。视觉模块只对“我看到什么”负责,控制模块对“我该做什么”负责。这种拆分在后期扩展功能时非常有用,比如把蒸汽换成精准喷头,或者把除草改成施肥,视觉部分基本不用动。
7.3 数据回流:让模型越跑越准
田间跑一圈之后,一定会产生两类问题帧:一类是模型漏检的杂草,一类是模型误检的作物或土块。工程化团队通常会把这类问题帧自动保存下来,定期人工筛选后加入训练集,再重训模型。
为保证可复现,每次重训都要固定三样东西:训练数据版本的快照、data.yaml配置、训练超参数。可以把它们记录在一个模型说明文件里,至少包含训练日期、样本数量、评价指标、导出格式。否则三个月后再想复现当时的效果,会非常困难。
7.4 发布前检查清单
下表可以作为样机软硬件联调前的最低检查标准:
| 检查项 | 具体要求 |
|---|---|
| Ubuntu环境 | 摄像头权限正常、Python依赖安装无缺漏 |
| 数据集 | 训练/验证划分合理、类别平衡、无同源泄漏 |
| 模型指标 | Recall达到目标值、bad case已人工确认 |
| 推理性能 | 设备上实测帧率满足执行器延迟预算 |
| 控制协议 | 串口两端消息格式一致,回环测试通过 |
| 安全边界 | 急停可用、默认关阀、异常进程进入安全态 |
| 日志 | 时间戳、帧号、置信度、坐标、触发记录齐全 |
| 回滚 | 旧模型权重、部署脚本、依赖版本有备份 |
8. 这类项目最容易超出预期的三处边界
8.1 技术边界:视觉识别只是眼睛,不是大脑
很多人在跑通YOLO之后,会误以为机器人已经完成了80%。实际上,视觉识别只解决了“看到杂草”这一步。真正的难点是看到之后能否在正确的时间和位置完成动作。执行机构的延迟、云台对准误差、底盘震动、喷嘴响应时间都会影响最终除草效果。视觉部分做到“稳定识别”之后,剩下的功夫更多在控制策略和机械结构上。
8.2 安全边界:高温高压部件必须交给专业领域
蒸汽设备的安全风险不能因为“AI很聪明”就被忽略。AI识别即使再准,也只是触发源之一,它不是安全机制。压力容器、蒸汽管路、温度控制都需要由具备专业资质的人设计。软件侧的正确做法是预留物理急停、互锁信号和异常关阀逻辑,让系统在任何情况下都能回到安全状态,而不是用软件去承担本应由硬件完成的安全责任。
8.3 数据边界:换一块田,模型不一定能直接用
杂草种类、土壤颜色、光照角度和作物形态在不同地区差异很大。在一个田块上训练的模型,到了另一个田块可能表现明显下降。这不是模型问题,而是数据分布问题。跨田块使用时,需要先采集新地块的图像做验证,必要时做小样本微调。持续收集数据并迭代模型,是这类AI农业设备能长期工作的前提。
如果打算从本文的视觉原型继续往下做,最值得投入的下一步不是马上做大底盘,而是把连续帧确认、日志回放、模型迭代这套闭环跑稳。这个闭环一旦稳定,后续换成蒸汽喷嘴、精准喷头或者其他执行机构,都只是替换最后的输出接口而已。