简述版本
- 简单介绍下你的大创—基于YOLO v3的城市道路车辆检测系统。
感谢老师的提问,学生参与的这个项目主要作用于城市道路车流量的统计,在识别车辆目标的基础上,通过比较相邻帧之间的车辆坐标位置来完成车辆计数。
首先是通过搭建该算法的初始模型,并融入相邻帧中心匹配策略, 通过调参完成对算法的改进和优化。
然后从网上搜集相关的车辆图片,使用labelImage标注工具来标注车辆目标做成数据集,应用到 yolov3 模型中进行图片训练,取训练最优模型,进行测试。
并最终部署到新大陆开发板进行演示。 - 大创的创新点是什么?详细说下相邻帧中心匹配策略。
最大的创新点是合理的统计模型。采用的相邻帧中心匹配的策略,我们首先通过质心与标线之间的距离运算,然后再加入相邻帧间的运算判定,这样可以有效避免漏计、多计、错计等问题。
相邻帧中心匹配策略也就是指:
首先由yolov3得到所有检测车辆目标及其坐标位置, 并利用重心机制来获取车辆的中心。
我们事先将坐标存入MYSQL数据库,然后在第二帧检测时,如果重心满足存储条件,那就遍历数据库中所有数据,并判断重心相近的数据,不需要计数,否则计数加一。
最后清空表中所有车辆数据,再存入当前帧满足条件的车辆信息,为下一帧检测做准备。重复操作,直至统计完成。 - 什么叫端到端的 yolo v3检测算法?
指在训练时直接输入数据集不需要手工处理数据,全都封装在网络模型中。
测试时,输入图像直接得到检测结果,相当于黑箱操作。 - 具体讲讲你是如何在opencv 中按照帧率的方法提取图像的。
调用库函数:import cv2 as cv import os.path
调了cv2库和numpy库等。
帧数间隔用while()来循环操作,帧率用cap.get()来获取。
文件夹video存放视频,video存放截取的图片,OpenCV videocapture来读取视频帧率获取摄像头数据cv2.videocapture("...");
- 图像之间的距离你是如何来匹配的?
通过欧式距离来匹配图像的:d(x,y)=sqrt((x1-y1)*(x1-y1)+(x2-y2)*(x2-y2))
省级大创
- 项目背景:基于视频分析的智能交通检测系统。
结合现有技术,使用深度学习卷积神经网络的目标检测技术中常用的yolov3算法,首先通过搭建该算法初始模型,并融入相邻帧中心匹配策略,完成对算法的改进和优化。然后从网上搜集相关的车辆图片,标注车辆目标做成数据集,应用到yolov3模型中进行图片训练,取训练最优模型,进行测试。最后部署到新大陆开发板进行演示。 - 项目创新点与特色:
(1)智能检测预警引擎。 将深度学习技术融入到智慧交通建设中去,无需人为设定具体特征,只需进行多图训练,通过逐层迭代即可智能捕获车辆的特征信息。然后根据真实的路况情景信息进行恰当的推理,就可以使得交通管理方式由传统的静态被动模式,升级为以情景信息为依据的动态主动模式。
(2)优异的自更新机制。通过卷积神经网络模型训练样本,在使用的过程中可以实现训练模型的自更新,从而进一步提高识别的正确率。
(3)稳定的识别准确率。采用差分隐私保护卷积神经网络模型,选取多种参数组合,通过超参数调优确定模型参数,提高算法精确度,降低差分隐私噪声扰动对诊断结果正确率的影响。
(4)合理的统计模型。通过质心与标线之间的距离运算,再加入相邻帧间的运算判定,有效避免漏计、多计、错计等问题。
参数调优的目标通常是最小化泛化误差(generalization error),也可以根据具体任务自定义其他优化目标。泛化误差是指预测未知样本得到的误差,通常由验证集得到,调优的方法如网格搜索(grid search)、随机搜索(random search)、贝叶斯优化(bayesian optimization),是比较常用的算法,其他算法如基于梯度的优化(gradient-based optimization)、受启发于生物学的进化算法(evolution strategy)等。
差分隐私根据噪声扰动使用的方式和位置来进行分类:
输入扰动:噪声被加入训练数据。
目标扰动:噪声被加入学习算法的目标函数。
算法扰动:噪声被加入中间值,例如迭代算法中的梯度。
输出扰动:噪声被加入训练后的输出参数。
数据见下表:
| 姓名 | 薪水 |
|-王二-|-5000-|
|-张三-|-6000-|
|-李四-|-7000-|
Python代码的具体实现如下:
import numpy as np # 导入numpy库
def get_noisy_digit(value, epsilon):
# 符合普拉斯分布的噪声
# 数学公式无需完全理解
u = np.random.random() - 0.5
noisy_digit = 0.0 - value/epsilon*np.sign(u)*np.log(1.0-2*np.abs(u))
return np.rint(noisy_digit)
if __name__ == '__main__':
company_salary = {'王二':5000,'张三':6000,'李四':7000} # 真实的人力资源数据
noisy_salary = company_salary.copy() # 新建的人力资源数据
value = 3000 # 薪水最大差距3000
epsilon = 4 # 隐私保护预算,值越小泄露风险越小,噪声越大
for i in company_salary:
noisy_salary[i] = (noisy_salary[i] + get_noisy_digit(value, epsilon)) # 逐个加噪声
print('真实的数据如下:{}'.format(company_salary))
print('差分隐私后的数据如下:{}'.format(noisy_salary))
运行代码后,得到结果如下:
真实的数据如下:{'王二': 5000, '张三': 6000, '李四': 7000}
差分隐私后的数据如下:{'王二': 6052.0, '张三': 6306.0, '李四': 7188.0}
可以看到,薪水数据经过差分隐私技术处理,发生了明显变化,从而有效的保护了薪水隐私。
- 项目研究过程
本系统的工作流程如下图1所示。为实现该系统的检测模型,本项目运用tensorflow库和keras库进行yolov3神经网络模型搭建,通过python3.6进行编译和测试,并在pycharm开发工具上完成代码编写和系统开发。研究的内容主要包括两大模块:车辆检测模块和车流量统计模块。
Keras 是第一个被添加到 TensorFlow 核心中的高级别框架,成为 TensorFlow 的默认 API。
简单来说,Keras就是一个包含各种各样深度学习模型并且方便调用的库,通过接口你便可以构造想要的模型,这也就是定义中高层次的意思:你不需要去深入了解怎么实现,只需要去调用即可。同样,高度封装也就意味着灵活性欠缺,你没法像使用TensorFlow那样深入底层,去修改调整甚至创造属于自己的模型。
图1 车辆检测系统工作流程图
3.1 车辆检测模块
3.1.1 数据集采集
本项目采用的数据集都来源于交通网站,为了提高检测的正确率,所选取的图片都是在相同背景下的训练图。通过python爬虫的方式,**使用request库进行网络请求,**再用xpath结构解析请求网页数据,获取图片的URL,最后请求图片的URL并将图片下载到本地。如图2所示为收集到的车辆数据集。
python爬虫可从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
1、发起请求
使用http库向目标站点发起请求,即发送一个Request
Request包含:请求头、请求体等
Request模块缺陷:不能执行JS 和CSS 代码
2、获取响应内容
如果服务器能正常响应,则会得到一个Response
Response包含:html,json,图片,视频等
3、解析内容
解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
解析json数据:json模块
解析二进制数据:以wb的方式写入文件
4、保存数据
数据库(MySQL,Mongdb、Redis)、文件
图2 车辆数据集
3.1.2 数据集标注
使用labelImage标注工具,将车辆图片中包含车辆目标的部分进行人工标注,标注流程如图3所示。
图3 标注流程图
图片中若存在车辆目标,则用矩形框框出,并命名为car,如果没有车辆目标,则继续处理下一张图片,标注效果如图4所示。完成标注后,最终生成xml文件,存储矩形框位置坐标和类别信息,并保存在指定路径中,便于后期调用到模型中。
图4 标注图片效果图
3.1.3 模型训练
调整yolov3模型中的参数设置,将输入层中训练集图片设置为416x416尺寸,卷积层获取权重计算图像特征,通过前向传播输出结果值,与标注值进行误差比较,再进行反向传播调整权重大小,循环往复,直到误差值小于设定的阈值,找出训练最优的输出模型。
3.1.4车辆目标检测
使用训练好的最优检测模型,利用opencv图像处理库从车辆视频中截取得到一帧图像,作为检测数据的来源,使用模型分析图像中是否含有车辆,如果有,就会用矩形框框出其中的车辆.并得到车辆在图像中的坐标。如果没有车辆目标,则再次检测一帧视频图像。如图5所示为检测到车辆目标的效果图。
图5 检测车辆效果图
3.2 车流量统计模块
实现基于计算机视觉的车流量统计,目前主要采用的方法包括虚拟检测线法、虚拟检测线圈法、基于目标跟踪的车辆计数法等。为满足对检测准确度和精确度的要求,本项目结合这三种方法,在原来yolov3模型的基础上,融入相邻帧匹配策略,进行算法的优化,用于车流量统计。通过在道路上设置检测区域,在识别车辆目标的基础上,通过比较相邻帧之间的车辆坐标位置,从而完成车辆的计数。
3.2.1 相邻帧统计车辆
将相邻帧中心匹配策略和yolov3目标检测相融合,在实现车辆检测的同时,对统计区域进行计数,首先由yolov3得到所有检测车辆目标及其坐标位置,利用重心机制获取车辆的中心,与待统计区域的上界相比较能够减少了存入的次数,当车辆进入统计区时,将坐标存入MYSQL数据库,第二帧检测时,重心满足存储条件时,遍历数据库中所有数据,判断重心相近的数据,不需要计数,否则计数加一。清空表中所有车辆数据,再存入当前帧满足条件的车辆信息,为下一帧检测做准备。重复操作,直至统计完成。通过这样的方式,能够避免车辆数目的错误统计。测试结果表明,增加匹配基准的判定可以有效提高计数结果的准确率。相邻帧统计处理的效果如图6所示。
图6 相邻帧统计效果图
3.2.2 数据库存储车流量数据
利用数据库sql语言的insert语句,进行数据的存储。当检测完成后,系统调用代码中的存储函数,将统计的数据写入数据库,便于后期监管人员及时了解当前车流量的情况。数据库存储详情如图7所示。
图7 数据库存储数据详情
- 研究成果展示
本文的研究成果主要是在实现车辆目标的定位检测的同时,能够实现车流量统计的功能,最后将该项目部署到新大陆开发板上。具体的效果如图8所示,主要是使用网线连接开发板和路由器,在配置好两者ip地址在同一网段后,利用xshell工具连接开发板,通过pycharm中自带的文件传输工具,设定telent协议,将视频检测文件传送到新大陆开发板对应的文件目录中,在客户端运行程序,从而实现服务端和客户端之间的交互,实现最终的效果演示。
图8 演示效果图
5.项目总结与展望
本项目主要研究了在固定场景下,通过交通视频对交通路况信息进行分析,涉及的内容主要包含数据处理、车辆目标检测和车流量统计等方面。最终实现了视频中车辆的统计与分析,具体内容包括:
(1)采用端到端的yolov3检测算法,实现交通道路场景下的目标定位和类型识别。
(2)利用opencv中按照帧率的方法提取图像,有效解决重复计数问题。
(3)将相邻帧中心匹配策略与yolov3模型相结合,通过相邻匹配的方法有效改善重复检测的问题。
(4)融入数据库存储技术,将统计的结果存入数据库中,便于后续进行数据的分析和预测。
鉴于团队成员能力有限,考虑问题不够全面、细致,其中还有许多地方还有更多的提升空间,如:
(1)系统未进行车辆的细致分类,如:大型车、小型车、非机动车等。
(2)检测场景比较固定,不能够应用于太复杂的路况。
(3)对天气、光影等外界因素欠缺考虑,使得结果难免会出现些许偏差。