项目简介
极术社区的小伙伴们大家好,我叫徐珂靖,是一个骨灰级工科男,很荣幸地成为本期试用活动的第一批用户。
我申请时候也提交过试用计划。填报申请表时,我的试用计划是设计一个用于家庭IoT设备的局域网计算系统,并将其用于智能监控服务器的设计与开发。项目将会用到多种技术,包括视频编码、网络视频流采集、AI物体检测、UDP协议通信、MySQL数据库读写、网页动态数据显示等。项目中涉及到的各种功能将会主要用C、C++、PHP等语言来编程,并尽量使用现成的开源项目的API接口以减小工作量。
今天,我很高兴地宣布,项目提前完成了。
为了表达对极术社区的感谢,我将把所有代码都开源到本人的github上。国内的极术社区的小伙伴们可以去gitee免费下载到我的开源代码,项目地址:https://gitee.com/xukejing/aijishu/tree/master/yunxinAI
yunxinAI这个代号是为了致敬云芯一号开发板。
本项目通过编程实现了以下功能:
A、局域网视频流AI识别服务,检测目标是人。并计算出人相对于摄像机镜头的俯仰角与左右角度位置。以UDP协议把检测结果发送出去
B、图像存储服务。只保存检测到人的图片,节省存储空间。
C、数据库网关服务。把接收到的UDP数据转存MariaDB数据库。
D、检测结果后台显示。通过PHP实现动态读取MariaDB数据库显示到Apache服务的网页上
准备工作
A、按本人的第1篇试用文章https://aijishu.com/a/1060000000136237把剩余的分区挂载到/home/dat,建/home/dat/test文件夹用于项目代码存储,建/home/dat/test/img文件夹用于图像文件存储。
B、去https://gitee.com/xukejing/aijishu/tree/master/yunxinAI下载humanDetec.cpp、udp2mysql.cpp、index.php。
C、去github下载开源的MobileNetSSD的Caffe模型文件放到/home/dat/test文件夹。
D、按本人的第3篇试用文章https://aijishu.com/a/1060000000136747把OpenCV4.2装上。
E、用apt安装MariaDB、PHP、Apache。MariaDB的C语言库也装上。本人说着说着就话痨症发作,一不小心就写出了几千字的《一天精通LAMP开发环境的安装和卸载》。
哎呀呀呀,我怎么能在极术社区里一群运维工程师面前瞎扯这些花拳绣腿的操作呢。此处省略两千字关于开发环境的搭建。
这里直接抓重点说吧,因为本项目需要一台笔记本远程操作云芯一号,所以在开始编程前,我建议对数据库做一些简单的准备,以方便远程调试:
1、数据库服务设置里,取消对127.0.0.1的绑定,如下图所示。这步不做的话,笔记本将连不上云芯1号上的数据库服务。也许你会误以为防火墙拦截,然后浪费至少1个小时排查端口。
2、数据库里建个用户apache,后续的c++和php代码都将通过这个用户连接数据库。apache和root的数据库权限全开,如下图所示。这一步不做,各用户只能本地接入数据库,调试时候会如图隔靴搔痒般非常不爽。建议调通程序以后再关闭远程登录权限。
3、新建数据库和数据表,事先规划好要存哪些东西。数据库、数据表和数据名,在编程时候都是要对应的,请根据下图建立数据表。
4、数据表里随意加点内容。然后把我提供的index.php文件放到/var/www/html目录。笔记本打开浏览器,输入云芯一号的ip,看看检测结果的表格是否正常显示,如下图所示:
代码开源
第一个是humanDetec.cpp。它开启了两个子线程。
一个线程解码来自网络摄像头的RTSP视频流捕获图像存入Mat变量,并显示捕获图像和识别结果图像。
另一个线程对捕获图像做人形物体AI检测,然后根据检测框的像素坐标计算出人相对于摄像机镜头的角度坐标,并把识别后的图像保存,识别结果用udp发送出去。
编译命令:
g++ -ggdb humanDetec.cpp -o humanDetec pkg-config --cflags --libs opencv4 -lpthread
这个代码的链接:
https://gitee.com/xukejing/aijishu/raw/master/yunxinAI/humanDetec.cpp
第二个是udp2mysql.cpp。它也开启了两个子线程。
一个线程接收并解析udp数据。
另一个线程把解析到的数据放入MariaDB数据库。
编译命令:
g++ udp2mysql.cpp -o udp2mysql -I/usr/include/mysql -L/usr/lib/mysql/ -lmysqlclient -lpthread
这个代码的链接:
https://gitee.com/xukejing/aijishu/raw/master/yunxinAI/udp2mysql.cpp
第三个是index.php。动态读取MariaDB里的数据并画表格显示到网页上。
这个代码的链接:
https://gitee.com/xukejing/aijishu/raw/master/yunxinAI/index.php
运行
在云芯一号的本地桌面环境上,先开一个终端,执行./humanDetec
再开一个终端,在新终端执行./udp2mysql
刚运行时候,两个imshow的图像显示窗口应该是叠在一起的,建议拖动各个窗口位置,让窗口位置适合观察。
我拿来了一个手机,手机屏幕上显示了一个人的照片,然后把手机屏幕给摄像头看。下图是云芯一号桌面上的显示。图中,上左1是实时捕获的RTSP视频流图像;上左2是框出人形目标的检测结果图像;上左3是/home/dat/test/img文件夹,上左2的检测结果图像自动存入该文件夹;下左1是CPU内存使用情况监控;下左2是udp2mysql的终端打印输出,下左3是humanDetec的终端打印输出。
下图是RTSP视频流捕获的原始图像和检测结果显示的截屏
下图显示了检测结果照片编号存储到了特定的文件夹,只保存检测到人的照片,节省存储空间。
下图是处理器与内存的占用,内存占得不多,CPU用了91%。
下图是AI目标检测进程的终端打印输出。云芯1号通过MobileNetSSD模型检测一张图像,大约需要耗时0.5到0.6秒。这个成绩有实际应用的意义了,这个延迟并不大,用在门禁或者安防监控上是可以胜任的。
下图是数据库网关进程的终端打印输出,通过网络UDP接收数据然后写入数据库
下图是运行过程中数据库的截图,可以看出数据都正常写入了。前一张图片中终端只显示到第3个时间为20:17:27的数据。而下图的数据库截图因为截得稍晚一些,又多识别了一段时间,所以已经排到第9组数据了。
下图是监控后台的网页显示,与数据库是一致的。
致谢
至此,申请书中约定的计划已被顺利地完成。真的非常感谢极术社区举办了这次有趣的活动;云芯一号微服务器开发板给我留下的非常深刻的印象。为了表达本人的喜悦,本项目代码已全部开源,欢迎大家下载和学习。也希望大家能在这个项目基础上做一些改进,然后再把改进后的项目分享到极术社区。
下一步计划
试用活动还没结束,所以我还会继续做点其他方面的评测,并发帖分享。
我知道还有不少小伙伴的申请没有通过,你们对云芯一号的各项性能都很感兴趣,比如内存读写速度、eMMC读写速度。我已经想到了一种测试内存写入速度的方案,通过c语言新建指针变量接着动态申请内存然后写入数据,测试这个过程的时间差,并比较普通类型变量与volatile类型变量对数据写入耗时的影响。
云芯一号做浮点计算,变量使用单精度或使用双精度,速度会差多少呢?等等问题,都等待我们去测试。
最后,大家想测试什么,可以在云芯一号的活动群里留言。如果有现成的测试代码,也可以共享给我。我测试了以后还会记录并总结,然后发帖给大伙儿看。