[五粮春杯二等奖作品]YOLOv3-基于Python的高空监控识别与目标检测系统|我在参加五粮春杯作品类竞赛的历程

恭喜,本项目荣获四川大学第四届“五粮春杯”科技创新大赛作品类二等奖!

初生牛犊不怕虎,初入川大,听闻电子信息学院各类竞赛繁多,跃跃欲试。其中五粮春杯作品类竞赛第一题引起了我的兴趣:

我国经济的发展,带来机动车辆不断增多,国家国民安全需求不断增加,加之其他种种因素导致监控信息爆炸般增长,给人为监控带来诸多困难。加之无人机技术不断发展,利用无人机从高空采集视频信息已经成为常见的事情,在可见的未来,利用人工智能算法识别监控航拍图像成为可能。

本题目旨在利用深度学习的目标检测算法对航拍图像信息进行处理,输出图像将关注目标框选出来(关注目标如车辆、机场飞机、油罐等中大型物体),并对不同目标进行类别标注。

基本要求:

(1)通过目标检测的算法将航拍图像中的关注目标全部框选出来;
(2)能够准确地对全部框选出来的目标进行类别标注;

(3)监控识别不同类别物体的平均准确率达到60%以上。

(4)基于嵌入式平台(NVIDIA Jetson

TX2)和Python语言设计App进行检测可视化窗口,也可以用摄像头在PC端实现所需要求,平台要求不限。

(5)利用深度神经网络,用深度学习的方法进行物体标注。

发挥部分:

(1)能够实时的监控检测航拍视频,框选出关注目标并标注,检测速度至少为10帧每秒。

(2)一个深度神经网络模型能够准确框选标注的目标类别尽可能多(甚至可以标注不同种类的汽车如卡车、轿车等)。

看了所有的题目后,就觉得这道题难度还算适中:一是因为一些目标检测算法已经相当成熟,二是因为此题似乎不需要什么电子方面的专业知识。大家都说EE、CS不分家,看来是真的不分家呀,大家都说在电子对计算机的要求仅次于计院,对数学的要求仅次于数学学院,对物理的要求仅次于物理学院,同样的学费多学一堆简直血赚有没有!

先给本项目取个高大上的名字:DroneObjectDetection,名字十分切合题目要求。我深知此项目技术难度甚至达不到计院本科生毕设水准,还请各位看官轻喷。以下大部分来自我为此项目撰写的报告,具体部署过程从略叙述。还请各位肯赏脸给个star,作为对大一萌新AIer一点小小的鼓励:https://github.com/MrZilinXiao/DroneObjectDetection

作为刚刚摸到C的门槛的萌新,选C作为技术栈无异于自寻死路,人生苦短,我用Python。

大一学业繁重(为了做这个期中线代原地爆炸……唉不说了),对与开发环境不同的技术问题不予回答,请多谅解。

懒癌患者,在Github上写了英文说明,就懒得翻译了,大家自取吧,没什么要特别设置的地方。

Installation Instrction

Before using,please configure settings.py first.

To get the source code files, run:

git pull https://github.com/MrZilinXiao/VisualObjectDetection.git

Before run main.py, please run:

pip install -r main.py.packages.txt

If pip packages installation raised errors or you didn't use Anaconda environment,please install these packages manually.

then run

python main.py --help

to see what functions main.py have.

Functions Introduction

python main.py --help

usage: main.py [-h] [--image] [--input [INPUT]] [--output [OUTPUT]]
               [--cam [CAM]] [--web [WEB]] [--online [ONLINE]] [--rtsp [RTSP]]

optional arguments:
  -h, --help         show this help message and exit
  --image            Image detection mode, will ignore all positional
                     arguments, press Ctrl+C to stop.
  --input [INPUT]    [Optional] Video input path
  --output [OUTPUT]  [Optional] Video output path
  --cam [CAM]        [Optional] Using camera,by default using built-in camera
                     of laptop,press Esc to stop.
  --web [WEB]        [Optional] Using web server,press Ctrl+C to stop.
  --online [ONLINE]  [Optional] Using a C/S structure system, will start a
                     video stream detecting client. Please run remote.py on
                     the device with a camera and configure ip and port in
                     settings.py first. Press Esc to stop.
  --rtsp [RTSP]      [Optional] Detect video stream from an IP camera or
                     something else. Need rtsp address as an argument.

remote_server.py can start an online streaming server which sends local camera's video stream to client.

Performance Test

With little time ,energy and money to test its performance, further tests are welcomed for this project and you can merge your test results branch into mine in any time.

Training Instrction

Files under tool/ are used to train your own dataset. Considering about that different datasets have different formats of annotations, there are only specific training instructions for VOC dataset.For VisDrone2018 Daataset, tools in tool folder will help.

1.Make sure that there is a VOC2007 format dataset folder named VOCdevkit.

2.If classes you need are NOT in pre-trained weights, training without weights is your best choice. For training without pre-trained weights, train_barely.py suits your requirements.Adjust epoch and batch_size according to your hardware situation. Too large batch_size could lead to out of memory and too many epoches cause model you train has no robustness.

3.If classes you need are IN pre-trained weights, please use train.py.

思考与难点剖析

目前在日常生活中,人工智能的应用已经相当广泛。在图像识别方面,目前的人脸识别、车牌识别已经相对成熟,同时开源平台上有许多优质算法供我们选择。但反观题目要求,以下难点亟待解决:

性能:考虑到无人机平台的对功率、热量、重量的严格要求,直接挂载显卡不太现实,因此计算能力成为此项目的一大瓶颈。
识别:在目前的图像识别领域中,之所以日常生活物体识别准确率相当高,部分是因为网络上有庞大的数据集可供训练;而车牌识别则是因为在同一个国家或地区车牌形式类似。但由于[1]航拍目标检测有一个特点:那便是它的视角变化很大,这也带来了一些难点,比如,航拍图像中,视角的变化导致目标的长宽比不一致,角度分散较广;航拍图像的分辨率较低,尤其是星载光学设备获取的图像,分辨率往往在1米以上;许多目标容易引起虚警,如建筑物的外形容易和汽车混淆等;航拍目标的标定耗费巨大的工作量,航拍范围大,目标多,标定困难。

数据集:航拍数据集获取成本很大,再强大的监督式目标检测算法没有大量数据集的支撑,其准确度也令人堪忧。

开发思路

python-opencv可用来打开支持UVC协议的摄像头,因此直接加载模型后将摄像头图片逐帧传入yolo_detect_image,需要注意opencv输出的是ndarray型而yolo需要image型,利用PIL与numpy做相应转换即可。Cv2自带了按键退出,由此可以实现按Esc终止操作。

考虑到无人机、机器人等平台的计算能力,考虑直接获取摄像头数据后逐帧打包用socket方法发送到具有计算能力的本地计算后输出,打包采用struct库。考虑到可能有多台设备同时连入,用多线程方法使得端口可以复用。同时实现双方在传输某帧图像前协调好FPS与分辨率避免UDP的不可靠性带来的麻烦。这是对题目要求的一个低成本实现方案,不需要图形计算能力强大的开发板做支撑。同时,如果远端摄像设备支持RTSP协议,可以直接用opencv打开rtsp视频流,方便快捷。

如果有相应设备,可将本项目直接部署至NVIDIA Jetson TX2,由于其可以安装Ubuntu,部署方式与Win上类似,不再赘述。远端处理完图像后进行回传,减轻了本地的计算压力,同时上述平台功耗不足5W,更加环保。

两项在Darknet的YOLOv3的demo中已经实现,在这里只是调用,其项目文件在/vision/yolo3中,不再介绍。

这个要求在题设中并未提及,但如今类似阿里云、腾讯云、AWS等云计算平台纷纷推出了物体分类、物体识别等人工智能Web API,由一位博主启发,且Python对简单Web请求的处理操作十分友好,遂实现了此功能,方便调试。此功能参考了《Python Web开发实战》(董伟明著)的演示样例。哈哈不过这样的服务器差不多1.5刀一小时,先准备好烧不完的钱再说吧!

最终效果

基本令人满意吧……

01_d.jpg
3d7943f4-ecc2-11e8-a82e-b46bfc3fc0ef.jpg

总结与收获

目标检测是深度学习与计算机视觉领域的重要研究内容,而航拍目标检测似乎尚未得到重视。其实由于航拍的角度较为自由,相比无法移动的监控探头、只能在地面移动的监视车辆,搭载高清摄像头的无人机在人流计数、交通管制、风险分析等方面有着无可比拟的优势。如在高速公路上的测速探头,完全可以由自由飞行的无人机沿路巡逻,通过分析视频流前后帧之间各个目标的相对关系来判断车辆是否有超速、占用应急车道、压线等交通违法行为;又如高空航拍人流密集区域能够更直观地展示人流密度,及时提醒相关部门引导人流,从而避免类似上海外滩踩踏事件的再次发生。

本项目采用了已经成熟的YOLOv3目标检测算法从不同角度实现了题设要求:

1、算法能将航拍图像中的目标框选出来;
2、能对框选出来的目标进行类别标注;
3、对与训练集不重合的验证集小样本平均准确率达到70%;
4、通过多种方式提供了目标检测的入口,其中实现了使用摄像头在PC端实现的相应操作以及在树莓派实时回传摄像头拍摄的数据到本地进行处理,同时还提供了命令行输入图片路径检测、命令行检测视频文件、命令行检测RTSP直播视频流、返回json格式的Web
API等多种检测方式。
5、利用6000+幅符合题意要求的数据集采用深度学习方式得到了准确度令人满意的模型。
6(拓展要求1)、在较低分辨率(720P)下同一帧可识别物体小于20个时能达到每秒10帧的题设要求同时不以准确率作为牺牲,其中每帧处理时间大都小于0.1秒。
7(拓展要求2)、深度神经网络模型能识别轿车、厢型车、卡车、三轮车、巴士、摩托车、民航客机七类目标,并可较为准确地区分轿车、厢型车、卡车等类似的汽车。

完成这个项目可谓让我收获颇丰:虽然之前对信息技术兴趣浓厚,中学时也做过一些小有成就的项目,但这是我第一次接触大名鼎鼎的深度学习领域。早在儿时对IBM的“深蓝”有所耳闻时,我就对深度学习有了一丝好奇。在这开发过程中我首先恶补了GitHub的使用、Python Web开发、Python 网络层开发知识以及各类深度学习框架的部署,然后进一步阅读国内外知名博主的博文,学会了如何在对应框架下训练自己的模型、利用C++、MATLAB和Python完成简单的数据处理,同时还复习了Python的应用、Linux操作,粗略地了解了深度学习的数学基础以及浅显易懂的部分概念……以上都极大地锻炼了我的逻辑思维与自学能力。作为从未接触过深度学习领域的计算机爱好者,我对一位博主的言论十分赞同:“从零学习AI开发,应该用一种Top Down的方式:先抛开晦涩难懂的数学理论,先利用深度学习框架做出自己的Demo,等对深度学习有了具体的认识之后,经过一段时间的摸索,好奇心会自然而然地引导我们去了解这些底层的数学原理。”

反思与改进

由于我对本科通识课程尤其是线性代数知识的欠缺,我难以理解在YOLOv3目标检测算法中“深奥”的数学知识,也对大量的学术论文一知半解,因此难以在算法角度进行微调以便更好契合题目要求,这不得不说是一种遗憾。相信在不久的将来在具备相关的专业知识后,我能更加完善这个项目。

在项目完成后,我在思考:识别的准确率是否能进一步提高?在验证集中识别率高,那在生产环境中识别率能维持吗?在不同地区是否可能由于背景环境的差异而导致识别率的断崖式下降?这些问题的本质都归结于本项目采用的是监督式学习方法:需要大量样本做支撑,拍摄成本、人工标注成本较高,且对与样本极端不相似的图片十分不友好;如果出现样本中从未出现的拍摄角度或方式,识别率也可能不尽人意;神经网络层数多,计算量大,虽然达到10帧每秒的实时性要求,但在人眼看来仍然不连贯。

其实,我们也可以利用少量的标注样本和大量的未标注样本实现弱监督学习:这样极大降低了人工标注的成本,同时在拍摄角度、物体大小、物体间隔上也有充分的鲁棒性。通俗地说,这类似与AlphaGo的训练方法:教会深度学习网络围棋的基本规则,然后通过自我学习的方式完善自己。

同时更加准确的目标检测算法也在出现:2012 年,程明明等人发表的文章中提出,在认知科学与神经科学中,人类能够在识别物体之前对物体有一个预判,人类只会对眼睛中的一小部分图像信息进行处理,而其他的大部分都被忽略。也就是说,人类的视觉机制中有一种快速筛选感兴趣区域的能力,上述机制被称为BING(Binarized Normed Gradients for Objectness)。因此完全能利用这一特征实现计算量更小、识别更精准的算法。当然上述改进措施对我来说尚是纸上谈兵,希望在大学进一步学习能够进一步完善。

Last modification:January 27th, 2019 at 09:36 am
If you think my article is useful to you, please feel free to appreciate

3 comments

  1. MrXiao

    我也测试

  2. david

    整体挺好的,作为大一新生已经非常棒了!! 但train 部分的代码感觉完成比较匆忙,github上的需要修改不少地方才能运行起来,建议以后上传完整且可正常运行的代码,节省其他人的时间与精力,因为github是面向所有人的。

    1. MrXiao
      @david

      感谢您宝贵的意见!我将继续改进!

Leave a Comment