无人机技术在过去的几年中取得了非常显著的发展,并已经在许多领域,包括电影拍摄、农业、建筑、物流等等领域得到了广泛的应用。
使用无人机进行监盘可以高效、无接触地收集信息,比如实时视频和照片,这可以为审计过程提供实时、全视角的视觉信息。既可以提高监盘过程的效率,也能减少人为错误。同时,无人机的使用还能降低一些实地审计带来的风险,例如在危险的环境中进行审计。
目前
无人机技术在审计监盘领域下,我们想到的是:
1、通过无人机拍摄多个角度、多个位置的图片或视频,然后结合相关算法,构建出目标物体或环境的三维模型,利用建好的模型计算监盘目标的面积、体积。
如果追求精度的话,对设备的要求会比较高,比如安装激光雷达可以大幅增加精度,并且需要掌握一定的建模技术,大疆目前是有成套的解决方案,包括带激光雷达的无人机以及建模软件(大疆智图)..当然..得准备好钱
2、在开阔的场所使用无人机配合计算机视觉技术进行计数,适用于大规模的盘点计数工作,比如牧场的动物数量的估计,大规模光伏板盘点等等。
这类场景对设备的要求
相对来
说
会低很多,
只要有一颗高清摄像头就行了,现在几千块的消费级无人机基本都是2-4K摄像头,完全够用了。
3、在仓库中,无人机按规划好的路线对各个库位进行盘点,盘点时扫描每个库位对应包装上的二维码与系统内的数据进行匹配检验,这是一个系统工程,审计监盘咱就别想了..
这次我们选择了第二个场景,计算机视觉方面使用了深度学习领域的YOLO模型,目前YOLO的速度快,基本能适应盘点现场的实时性需求
下面是我们使用无人机在停车场模拟盘点汽车的场景:
设备:大疆mini4Pro、RTX3060的笔记本
这次我们使用了1000多张汽车俯视图作为训练集,整体的识别、跟踪效果还不错,识别到了很多被树木遮挡的车辆;
成功
跟踪到
掉头转向的车辆,没有因为角度被重复计数,
如果
是一个开阔无遮挡的地区效果会更好
。
为确保使用无人机配合计算机视觉技术进行盘点的效果,我们需要在实际操作前做一些准备工作:
1、需要在盘点日前收集好从无人机视角捕捉的俯视图,作为训练集。这样可确保机器学习模型得到充分的训练,从而提高其识别和计数的精确度。
2、需要考虑盘点日的天气状况。如果天气条件恶劣,比如大风或是下雨下雪,无法进行无人机的飞行操作。因此,我们需要在盘点日的前几天密切关注天气预报,必要时将盘点日期进行调整。
3、需要在UOM网站上查询和确认选定盘点地点是否属于允许无人机飞行的适飞空域。
记录一些无人机
实时画面
处理
的细节做备忘吧
1、大疆无人机的画面实时串流到电脑,使用的是rtmp协议,MINI4所使用的RC2手柄也只支持这种协议
2、rtmp需要服务器,由无人机手柄将画面推流至服务器,再由yolo读取流媒体,可以用软件一键在本地开服(MonaServer)。
将电脑和无人机连接到同一个热点,比如手机热点,在同一个局域网内,由电脑开服即可
3、电脑端开启服务器以后,查看局域网地址,无人机手柄输入推流地址"rtmp://电脑的局域网ip地址+端口号/",记得加上后面的"/"
4、yolo直接从
"rtmp://127.0.0.1:1935/"
读取视频画面即可,大致2-3秒延迟,能接受
5、只有CPU的轻薄本,其性能无法实时对无人机的画面进行推理,带显卡的笔记本也需要打开性能模式否则卡到怀疑人生(别问我为什么提了一个户外移动电源...
)
下面是yolo的代码,其实代码比较简单,yolo V8的检测+追踪已经封装的很好了,只是需要自己加一些计数的操作,再画在画面上
推理的代码:
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
model = YOLO("best.pt")
video_path = "rtmp://127.0.0.1:1935/"
cap = cv2.VideoCapture(video_path)
cv2.namedWindow("YOLOv8 Tracking", 0)
track_history = defaultdict(lambda: [])
videoWriter = None
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.track(frame, persist=True,device=0)
annotated_frame = results[0].plot(line_width=1)
if results[0].obb:
boxes = results[0].obb.xywhr.cpu()
if results[0].obb.id is not None:
track_ids = results[0].obb.id.int().cpu().tolist()
cv2.putText(
annotated_frame,
"Count:" + str(max(track_ids)),
(20, 50),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(0, 0, 255),
2,
)
if videoWriter is None:
fourcc = cv2.VideoWriter_fourcc(
'm', 'p', '4', 'v')
fps = int(cap.get(5))
videoWriter = cv2.VideoWriter(
'result3.mp4', fourcc, fps,(frame.shape[1],frame.shape[0]))
videoWriter.write(annotated_frame)
cv2.imshow("YOLOv8 Tracking", annotated_frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
cap.release()
videoWriter.release()
cv2.destroyAllWindows()
其实难的还是选什么模型,
如何准备训练集,
怎么训练...
经过我们的尝试,使用yolov8s-obb作为预训练模型,再此基础上进行微调,在效果和效率上都比较好,这与训练的场景和所使用的设备有关,如果显卡更好,可以使用更强的预训练模型..
更精确的推理性能,意味着更慢的速度..
yolo的链接:
https://github.com/ultralytics/ultralytics
之后再试试使用消费级无人配合免费的建模软件进行3D建模,看看是否能满足精度和实时性的要求..