智慧城市旨在利用大数据、物联网(IoT)、人工智能和5G等数字技术,提高政府公共服务水平、社会治理效能,推动经济增长,不断增强人民群众的获得感、安全感和幸福感。自十四五规划以来,国家和各大主要城市一直加速推进新型智慧城市分级分类建设,但在实施的过程中也遇到了一些问题和困难。

在智慧城市AI部署落地中,常见的问题有边缘设备硬件不统一、跨平台开发成本高和模型推理速度优化难度大等。聚焦到AI系统的使用者本身,智慧城市的落地也有很多阻碍,比如环境工程师在户外采集数据时,如果要做到实时采集实时分析存储入库,必须要背上配有显卡的工作站到户外,同时还要带上XXXXL号移动电源解决供电问题。其重量对环境工程师而言无疑是超负荷的。

为了解决软件工程师开发难度大的问题,本方案演示了FastDeploy (OpenVINO) + 轻量化模型的AI工作流模式,希望能为使用者提供更轻便、简单和高效的解决方案。

本项目利用无人机控制端自带的实时消息传输协议(RTMP)将低空无人机的实时图像传输到推理硬件设备,通过模型推理计算绿化覆盖率、建筑率、车辆数量、人群数量等指标,可用于城市大规模环境监测、国土低空遥感、道路交通巡检和无人机低空安防等领域。

本任务是对无人机图像数据流的实时推理,对推理速度有极高的要求。同时为了减少开发难度和迁移成本,我们采用了X86 CPU架构的英特尔NUC迷你电脑套件作为推理硬件,软件选择了FastDeploy推理部署工具箱快速开发后端OpenVINO推理引擎,加速AI模型推理。此外,在AI模型选择上,我们分别选择了飞桨PP-LiteSeg和飞桨PP-YOLO Tiny两个轻量化模型来完成语义分割和目标检测任务。

项目整体流程

如上图所示,首先需要在NUC上架设RTMP推流服务,无人机APP客户端连接内网RTMP服务器,实现无人机的图像实时通过路由器向NUC设备传输。NUC设备端获得图像后,渲染至PySide前端的显示窗口,同时FastDeploy线程执行语义分割和目标检测的推理任务,并把结果和可视化图像实时渲染至前端窗口。

开发环境准备

核心软硬件

英特尔NUC迷你电脑套件

(型号:NUC8i5BEH)

FastDeploy >= 0.2.1

PaddleDetection >= 2.5

PaddleSeg >= 2.6

PySide6 >= 6.3.2

可选软硬件(户外实时采集时用)

大疆系列无人机及DJI Fly APP

路由器(用于内网RTMP传输)

英特尔NUC迷你电脑硬件

无人机实时图传

RTMP (Real-Time Messaging Protocol,实时消息传送协议)是一个设计用来实时数据通信的网络协议,现多用于直播设备与支持RTMP协议的服务器之间进行音视频和数据通信。本项目无人机和推理硬件设备之间的实时图传环节利用的是大疆控制端APP的RTMP推流服务,为了最大限度地减少图传时间延迟,我们直接在英特尔NUC上利用Nginx搭建RTMP服务。

英特尔NUC预装的操作系统是Windows10,所以可以直接下载带RTMP模块的Nginx。

  • 下载链接

http://nginx-win.ecsds.eu/download/nginx%201.7.11.3%20Gryphon.zip

下载到本地后解压,在nginx/conf目录下新建一个文件,命名为nginx.conf,输入内容如下。

worker_processes  1;events {    worker_connections  1024;}rtmp {    server {        listen 8899;        chunk_size 4000;        application live {             live on;             allow publish all;             allow play all;        }    }}

然后打开cmd命令行窗口,进入到Nginx的目录下,输入nginx启动Nginx服务,如图所示即为启动成功。

此时,我们需要在cmd命令行输入ipconfig命令查询NUC设备的内网IPv4地址。

打开DJI Fly APP,找到RTMP直播推流,填入推流地址:rtmp://192.168.31.246:8899/live

APP推流配置完成之后,可以在NUC设备端调用OpenCV的API进行拉流操作以获取无人机实时画面,Python实现代码如下。

import cv2rtmpUrl = 'rtmp://192.168.31.246:8899/live'vid = cv2.VideoCapture(rtmpUrl)while vid.isOpened():    ret,frame = vid.read()    cv2.imshow('RTMP Test',frame)    if cv2.waitKey(1) & 0xFF == ord('q'):        breakvid.release()cv2.destroyAllWindows()

运行这段代码后,Python程序会实时获取无人机APP实时推送的RTMP流数据并更新到OpenCV窗口显示,运行效果如下图。

FastDeploy

模型推理部署

打通了无人机图像实时传输的环节之后,我们进入核心的推理部署环节。由以上Python代码可以看出,RTMP数据流经过OpenCV解码后得到图像帧 (frame),因此推理环节的工作本质就是将每一帧图像输入模型然后得到结果并将输出结果可视化。本环节主要分为三个步骤:模型动静转换、推理脚本编写和前端集成。

模型动静转换

首先,我们需要把使用PaddleSeg和PaddleDetection开发套件训练好的动态图模型转换成静态图模型,这一步利用两个套件分别提供的脚本即可简单完成。已经训练好的动态图模型可以在AI Studio项目中获取。

  • 链接

https://aistudio.baidu.com/aistudio/projectdetail/4535658

语义分割目标检测动态图模型和语义分割分别在AI Studio项目中ppyolo_inference_model和output_ppliteseg_stdc1/best_model/目录下,分别调用对应的动静转换脚本将两个动态图模型转换成静态图。

  • PaddleSeg
python PaddleSeg/export.py \       --config ppliteseg_stdc1.yml \ #配置文件路径,根据实际情况修改       --model_path output_ppliteseg_stdc1/best_model/model.pdparams \ # 动态图模型路径,根据实际情况修改       --save_dir inference_ppliteseg_stdc1 \ # 导出目录       --input_shape 1 3 512 1024 #模型输入尺寸
  • PaddleDetection
python PaddleDetection/tools/export_model.py \       -c PaddleDetection/configs/ppyolo/ppyolo_tiny_650e_coco.yml \ # 配置文件路径,根据实际情况修改       --output_dir=./ppyolo_inference_model \ # 保存模型的路径       -o weights=ppyolo_tiny_650e_coco.pdparams # 动态图模型路径

注:模型转换的详细教程可参考

https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.6/docs/model_export_cn.md

https://github.com/PaddlePaddle/PaddleClas/blob/release/2.4/README_ch.md

完成转换之后,我们能分别得到两套model.pdmodel和model.pdiparams文件以及对应的yaml配置文件。

基于FastDeploy开发

OpenVINO推理模块

本项目使用的是英特尔NUC 迷你电脑套件,选择FastDeploy的OpenVINO后端作为推理部署解决方案。以往使用OpenVINO需要下载套件、安装和配置,过程比较繁琐,因此我采用了FastDeploy的部署方案,调用其内置的OpenVINO推理后端进行快速开发、部署。FastDeploy的预编译库安装和使用教程可参考官方Github文档。

  • 链接

https://github.com/PaddlePaddle/FastDeploy

因为考虑到程序的适用性和多种硬件环境兼容,我首先写了Option配置,根据不同的硬件选择不同的推理后端,在CPU环境中,默认使用OpenVINO作为推理后端。

import cv2import numpy as npimport fastdeploy as fdfrom PIL import Imagefrom collections import Counterdef FastdeployOption(device=0):    option = fd.RuntimeOption()    if device == 0:        option.use_gpu()    else:        # 使用OpenVino推理        option.use_openvino_backend()        option.use_cpu()    return option

然后,将语义分割模型推理代码封装成一个类,方便前端快速调用。在init方法中,直接调用了SegModel()函数进行模型初始化(热加载),通过SegModel.predict()完成结果的推理,得到推理结果之后执行postprocess()对结果进行解析,提取建筑和绿地的像素数量,统计图像占比,得到环境要素的占比结果。最后调用FastDeploy内置的vis_segmentation()可视化函数,对推理结果进行可视化。

class SegModel(object):    def __init__(self, device=0) -> None:        self.segModel = fd.vision.segmentation.ppseg.PaddleSegModel(            model_file = 'inference/ppliteseg/model.pdmodel',            params_file = 'inference/ppliteseg/model.pdiparams',            config_file = 'inference/ppliteseg/deploy.yaml',            runtime_option=FastdeployOption(device)        )    def predict(self, img):        segResult = self.segModel.predict(img)        result = self.postprocess(segResult)        visImg = fd.vision.vis_segmentation(img, segResult)        return result, visImg    def postprocess(self, result):        resultShape = result.shape        labelmap = result.label_map        labelmapCount = dict(Counter(labelmap))        pixelTotal = int(resultShape[0] * resultShape[1])        # 统计建筑率和绿地率        buildingRate, greenRate = 0, 0        if 8 in labelmapCount:            buildingRate = round(labelmapCount[8] / pixelTotal* 100, 3)         if 9 in labelmapCount:            greenRate = round(labelmapCount[9] / pixelTotal * 100 , 3)        return {"building": buildingRate, "green": greenRate}

同理,直接调用FastDeploy的PPYOLO()方法完成模型的推理,经过后处理格式化数据之后调用对应的可视化函数vis_detection()进行渲染。

class DetModel(object):    def __init__(self, device=0) -> None:        self.detModel = fd.vision.detection.PPYOLO(            model_file = 'inference/ppyolo/model.pdmodel',            params_file = 'inference/ppyolo/model.pdiparams',            config_file = 'inference/ppyolo/infer_cfg.yml',            runtime_option=FastdeployOption(device)        )        # 阈值设置        self.threshold = 0.3    def predict(self, img):        detResult = self.detModel.predict(img.copy())        result = self.postprocess(detResult)        visImg = fd.vision.vis_detection(img, detResult, self.threshold, 2)        return result, visImg    def postprocess(self, result):        # 得到结果        detIds = result.label_ids        detScores = result.scores        # 统计数量        humanNum, CarNum = 0, 0        for i in range(len(detIds)):            if detIds[i] == 0 and detScores[i] >= self.threshold:                humanNum += 1            if detIds[i] == 2 and detScores[i] >= self.threshold:                CarNum += 1        return {"human": humanNum, "car": CarNum}

把PP-LiteSeg语义分割模型和PP-YOLO Tiny目标检测模型封装成类之后,保存为inferEngine.py文件,以供后续前端代码调用。

结合PySide6

开发可视化GUI界面

前端开发使用的是PySide6,界面源代码可在文章最后的Github项目链接中获取。整体而言开发难度不大,主要的难点在于三个视频播放的组件同时更新导致的程序卡死或者延时问题。

在本项目中应用的解决方法是用多线程,把三个视频播放组件的后端分开三个独立的线程,一个线程(displayThread)把实时视频流原画推送到前端更新,另外两个线程(segThread和detThread)同步完成语义分割和目标检测推理实时视频帧图像并将后处理之后的推理结果图像更新到前端组件上。具体代码如下所示(main.py)。

向下滑动查看所有内容

最后执行python main.py运行程序,查看推理效果。

**

总结**

FastDeploy是一个帮助开发者快速部署深度学习模型的推理部署工具箱,内置了包括OpenVINO、TensorRT、ONNX Runtime、Paddle Inference后端,正在集成Paddle Lite、RKNN等推理后端。并对各后端进行了针对性的优化,很好地兼容了英特尔NUC迷你主机的硬件,无需另外安装OpenVINO套件和配置环境,同时也免去了调优提速的烦恼,降低了开发者的学习成本和部署成本,提高了部署开发效率。目前已经支持包括飞桨等生态60+热门模型。更多AI模型的推理部署,可前往FastDeploy的GitHub了解。

  • 链接

https://github.com/PaddlePaddle/FastDeploy

往期精彩

  • 火箭发动机喷流的“监察队长”:基于飞桨探索火箭发动机真空羽流流场的快速计算

  • FastDeploy秒解模型部署难题,助力智慧农业应用快速落地

关注【飞桨PaddlePaddle】公众号

获取更多技术内容~

FastDeploy+英特尔NUC+大疆无人机梦幻联动!推动智慧城市巡检应用落地相关推荐

  1. 【AI达人创造营三期】Fastdeploy与英特尔NUC推动智慧城市巡检应用落地

    Fastdeploy与英特尔NUC推动智慧城市巡检应用落地 1.项目背景 智慧城市是指利用大数据.物联网(IoT)人工智能和5G等数字技术,提高政府公共服务水平.社会治理效能.推动经济增长和不断增强人 ...

  2. 微型计算机nuc 6i5syk,Intel 英特尔 NUC Kit NUC6i5SYH 紧凑型准系统 开箱(附让人崩溃的系统问题)...

    Intel 英特尔 NUC Kit NUC6i5SYH 紧凑型准系统 开箱(附让人崩溃的系统问题) 2016-03-28 16:20:00 45点赞 229收藏 137评论 追加修改(2016-03- ...

  3. Panoply在2018年太库和英特尔中国国际大数据融合创新·人工智能全球大赛中荣获第一名

    以色列特拉维夫--(美国商业资讯)--Panoply是商业智能的世界唯一智能数据仓库,其最近在2018太库科技和英特尔中国国际大数据融合创新·人工智能全球大赛(特拉维夫分赛区)中荣获第一名.这项全球竞 ...

  4. 英特尔NUC迷你电脑套件安装windows10+ubuntu18.04双系统

    NUC8i3BEH,16G内存,221G磁盘空间 windows操作系统电脑一台(用于下载镜像和制作u盘启动盘,使用linux系统下载镜像和制作u盘启动盘不习惯).如果有两个u盘的话,可以分别作为wi ...

  5. 大疆无人机,包邮送!真香呀~

    牛年牛气祝福又来了~ 你的幸运值刷新了吗? 小礼物 DJI 大疆  Tello 无人机 一台 教育编程 激发教育科学创造力 大疆飞控技术 紧凑机身 停桨保护 赠送规则 本号的读者众多,大家使用下面的二 ...

  6. 三调 图斑地类面积_国土三调攻坚冲刺,大疆无人机为调查举证提供加速度

    第三次全国土地调查(国土三调)已进入实地举证核查的攻坚阶段,大疆无人机解决方案正在辅助各地进行外业图斑举证工作.从导入图斑.自动规划航线,到举证拍摄.成果 DB 包生成.上传国土调查云平台,一体化工作 ...

  7. 大疆口袋云台存储卡_让拍摄更加安心,大疆无人机与口袋相机的存储卡选择:东芝M303E...

    现在的存储制造工艺技术越来越成熟,基本上现在的数码设备都使用存储卡作为数据的存储与传输的媒介之一.市面也有很多便宜的杂牌存储卡,虽然价格很便宜,但是经常会遇到传输速度慢.数据意外丢失等等各种现象,对于 ...

  8. 大疆无人机高程不准_大疆消费级无人机快速倾斜摄影测量实践

    摘要:分别用 RTK两种测量模式测定像控点,用大疆消费级无人机 Phantom4PRO 开展倾斜摄影测量,最后进行成果检验.结果表明:RTK 电台模式(不做坐标校正,精度低).RTK-CORS 网络模 ...

  9. 不够持久?大疆无人机有了新无线充电系统,电力增强+++

    铜灵 编译整理 量子位 出品 | 公众号 QbitAI  太快了. 拿起遥控操纵大疆无人机20分钟,还没来得及炫操作,无人机就没电了. 现在电力增强大法来了.据外媒GeekWire报道,专注于无人 ...

最新文章

  1. 越线人群计数--Crossing-line Crowd Counting with Two-phase Deep Neural Networks
  2. 微型计算机系统采用三级存储器组织结构,微型计算机原理07级试卷B.doc
  3. mysql null排在最后面
  4. easyUI的中文乱码问题
  5. linux网络编程之inet_addr和inet_ntoa使用总结
  6. 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
  7. 【学会如何学习系列】从婴儿到大学——学习的本质从未改变过
  8. vba 修改文本文档 指定行_VBA程序报错,用调试三法宝,bug不存在的
  9. C++ 标准库之cctype
  10. linux 7防火墙删除端口号,centos 7 firewall(防火墙)开放端口/删除端口/查看端口
  11. Spring 学习记录6 BeanFactory(2)
  12. 新版win10卸载Microsoft Edge
  13. overleaf插入参考文献
  14. JavaScript实现开关灯效果
  15. 先正达谋定农化世界竞争格局-丰收节贸易会:座次重排
  16. 金融风险管理 思维导图
  17. %大赛D--链式前向星+SPFA(BFS)+各种数据类型+各种最短路复习
  18. 触动精灵怎么向服务器发送消息,触动精灵 函数说明及使用方法
  19. equest源码分析及其与==的区别
  20. python之API接口调用

热门文章

  1. 互联网女皇Mary Meeker眼中的移动互联网趋势(幻灯片)
  2. unity3d开发鼠标打飞碟游戏(Hit UFO)
  3. keyup常用事件_键盘事件keydown、keypress、keyup随笔整理总结
  4. 一言不合就越狱!盘古团队越狱 iOS 10
  5. Java Enum 浅析
  6. Hardhat工具包3--多条链网络配置、部署
  7. 机器人工程ROS方向应用型本科毕业设计重点课题学生验收成果
  8. 魅族手机安装不上APK问题
  9. ios开发教程入门到精通
  10. OpenHarmony应用开发之如何创建DAYU200预览器