王 磊 ,陈明恩 ,孟凯凯 ,温进化 ,周鹏程
(1. 浙江省水资源管理中心,浙江 杭州 310007;2. 杭州定川信息技术有限公司,浙江 杭州 310020;3. 杭州朗澈科技有限公司,浙江 杭州 311100;4. 浙江省水利河口研究院,浙江 杭州 310020)
水位是河流湖库的基本水文要素之一,也是国家水资源监控能力灌区农业在线计量监测点建设需要采集的关键数据,因此稳定可靠的水位监测数据对于流域水资源管理具有重要意义。当前,水位自动监测方法主要有浮子式、压力式、超声波式和雷达式自动水位计等,以及传统的图像识别方法。这些方法存在自动化程度低、建设运维成本高、易受现场环境影响、适应性较差等问题。
2012 年,Krizhevsky 等人基于深度学习理论搭建的 AlexNet[1]在图像分类比赛 ILSVRC[2]中赢得冠军,不管是分类效果还是速度都表现出绝对的优势。深度学习理论在计算机视觉领域迅速发展,获得 ILSVRC 大赛冠军的 ZFNet[3],VGG-Net[4],GoogleNet[5]和 ResNet[6]均是基于深度学习的图像分类算法,这些算法分类正确率越来越高,训练速度也越来越快。另外,基于深度学习的对象检测算法也日趋成熟,多阶段方式的 R-CNN[7]是第 1 个将深度学习理论有效应用于对象检测任务的算法,随后发展出许多单阶段和多阶段方式的优秀算法[8-13],这些算法不仅在精度上大幅提升,而且在推理速度上不断加快。目前,基于深度学习的计算机视觉技术已成功应用于安防监控、电子医疗、无人驾驶、智能支付等领域。
为解决现有水位监测方法存在的问题,本研究提出了一种基于深度学习算法的实时水位识别方法,并初步应用于国家水资源监控能力项目运行中。
监控视频获取的水尺图像千差万别,水尺往往只占整张图像的很小一部分,直接识别图像刻度信息误差较大。为了提高识别方法适用性和准确性,算法按 2 个步骤识别图像水位信息:1)基于对象检测算法,检测出图像中水尺的位置,并裁剪出水尺图像;2)基于深度学习的图像识别算法识别图像中出现的水尺刻度线数量,并根据水尺总长及刻度线表示的长度,计算出当前水位,流程如图 1 所示。
本方法主要由水尺对象检测和刻度识别算法组成。为满足实际场景中水位识别的准确性和实时性,分别选择 YOLO-v3[14]和 ResNet 网络算法检测水尺对象和识别水尺刻度。
图 1 算法流程
2.2.1 水尺对象检测算法
水尺对象检测算法选用 YOLO-v3 的 105 层版本模型。该模型的骨干网络是 darknet-53 的特征提取网络,除去最后的全连接层,共有 52 个卷积层,由大量的残差模块组成。
该模型采用多尺寸融合的方式做检测。在darknet-53 网络后分别连接 3 个不同的分支,每个分支输出的特征图的大小不一样,而应用在每一个特征图上的候选框的大小也不一样,这样极大地提升了模型对于不同尺寸的目标的检测能力。
该模型由原来的单标签分类提升为多标签分类,即在一些复杂场景中,1 个对象可能属于多个类别,且准确率不会下降。
经验证,YOLO-v3 的 105 层版本仍然可以达到 51 帧/s 的识别速度,可以满足水尺检测对实时性的要求;识别精度高,在 MS COCO(Microsoft Common Objects in Context)测试数据集[15]上可以达到 33 mAP(平均精度均值)。
2.2.2 水尺刻度识别算法
在水尺刻度识别模块,本研究选择 ResNet 网络的 34 层版本。ResNet 网络引入了跳层连接,在每一个残差块里使用跳层连接,由卷积操作、层层堆叠的残差块加上最后的全连接层等组成 ResNet 网络。ResNet 网络解决了随着网络层数的增加,网络学习退化的问题,同时也解决了由网络深度引起的梯度弥散问题。
ResNet 网络输出结果为水尺水面上的刻度线数量 N,根据实际水尺刻度表示的长度,以及水尺总长 Z,得出当前的水位高度 L:
式中:N % 3 为 N 对 3 求余数。
训练数据均来自国家水资源监控能力农业灌区计量监测点所拍摄的现场图片,图片分辨率为 1280×960。模型对采集图片要求:图片分辨率不能小于 800×700,图片中水尺宽度不能小于 30 像素,水面上高度至少有 2 点刻度。水尺刻度清晰可人工读取,不能有树叶或泥巴等遮挡,不能曝光过度或者光线过暗。然后对满足要求的图片进行人工标注,标注图片中的水尺位置及水面上水尺刻度线的数量。
在对象检测阶段,训练集、验证集和测试集分别有标注图片 60 000,10 000 和 10 000 张。每张图片标签为图中水尺的位置,在数据预处理阶段对图片进行了随机翻转、小区域随机裁剪,以及亮度、对比度、透明度随机调整等操作,提高算法的泛化能力。并将图片的分辨率统一调整为 352×352。
在水尺刻度识别阶段,训练集、验证集和测试集分别有 80 000,8 000 和 8 000 张图片,在对算法进行训练之前对图片进行随机翻转、小区域随机裁剪,以及亮度、对比度、透明度随机调整等操作,并将图片的分辨率统一调整为 100×350。
3.2.1 对象检测阶段
在对象检测阶段,首先基于 ImageNet 数据集预训练模型,然后基于该预训练模型在对象检测标注数据集上进行训练。
优化算法选择 Adam 梯度优化算法[16]。和传统的随机梯度下降不同的是,Adam 梯度优化算法通过计算梯度的一阶和二阶矩估计为不同的参数设计独立的自适应性学习率,而传统的随机梯度下降保持单一的学习率更新所有的参数。步长因子 alpha、一阶矩的和二阶矩的指数衰减率 beta1 和 beta2 分别设置为默认值:0.001,0.900 和 0.999。
学习率设置分别采用指数衰减法和自定义模式,开始训练的学习率设置较大,使模型迅速逼近最优解,之后逐渐降低学习率使模型收敛。考虑到对象检测模型是基于 ImageNet 数据集预训练模型的基础上训练的,所以初始学习率设置较小,为0.001。自定义学习率设置多组,如表 1 所示。
表 1 对象检测算法学习率设置表
考虑到内存需求和学习率等,训练 batch size 设置为 32。
3.2.2 水尺刻度识别阶段
在水尺刻度识别阶段,同上阶段优化算法选择Adam 梯度优化算法。
学习率设置分别采用指数衰减法和自定义模式。考虑到训练任务及避免梯度爆炸,初始学习率设置为 0.1。自定义学习率设置多组,如表 2 所示,训练 batch size 设置为 64。
表 2 水尺刻度识别算法学习率设置表
以上 2 个算法训练均在配置有 NVIDIA GTX 1080Ti 显卡的服务器上完成。
1)每秒帧数(FPS,Frame Per Second)。为满足本研究方法在实际应用时的速度要求,使用 FPS测量对象检测模块的速度。FPS,即每秒可以处理的图片数量,越大表明算法检测对象速度越快。
2)交并比(IoU,Intersection over Union)。IoU 表示算法检测的候选框 C 与真实标注的候选框 G 的重叠程度,值越大,表明重叠程度越高,为 1时表示完全重合:
3)召回率(R,Recall Rate)。召回率表示,测试集中所有正样本被预测为正样本的比例。在本对象检测算法中表示,所有真实标注框被预测为候选框的比例。如果预测候选框与真实框的 IoU 大于等于 0.7,即为预测正确。
4)准确率(Acc,Accuracy)。在水尺刻度预测阶段,使用准确率评估水尺刻度预测的效果。水尺刻度预测结果与标注结果相差小于等于 2 cm,即为预测正确。
3.4.1 对象检测阶段
基于 60 000 个训练样本,分别使用学习率的指数衰减法和自定义模式训练模型,损失函数值随着训练 Epoch 增加,变化规律如图 2 所示。经过 170 个Epoch,随着训练迭代次数的增加,损失函数值无限接近于 0,基本不再变化,可判断模型收敛。
图 2 训练过程中不同学习率下损失函数值变化趋势图
由图 2 可以看出,在自定义学习率组 1 模式下,模型收敛时损失函数值最小,该模型学习效果最好。在自定义学习率组 1 模式下,验证集召回率变化如图 3 所示。模型收敛后,在 10 000 个验证样本上进行验证,平均验证召回率为 94.3%。在 10 000 张测试集上测试召回率为 93.2%,FPS 为 35。
图 3 训练过程中验证集召回率随 Epoch 变化趋势图
3.4.2 水尺刻度识别阶段
基于 80 000 个训练样本,分别使用学习率的指数衰减法和自定义模式训练模型,损失函数值随着训练 Epoch 增加,变化规律如图 4 所示。经过 210 个Epoch,随着训练迭代次数的增加,损失函数值无限接近于 0,基本不再变化,可判断模型收敛。
由图 4 可以看出,在自定义学习率组 1 模式下,模型收敛时损失函数值最小,该模型学习效果最好。在自定义学习率组 1 模式下,验证集召回率变化如图 5 所示。在 10 000 个验证样本上进行验证,模型收敛后平均验证召回率为 96.1%。在 8 000 个测试样本上进行测试,测试准确率为 95.7%。
图 4 训练过程中不同学习率下损失函数值变化趋势图
图 5 训练过程中验证集准确率随 Epoch 变化趋势图
文中所有算法均基于谷歌 DistBelief 研发的第 2 代人工智能学习系统 Tensorflow 框架并使用 Python 实现。训练好算法的图信息和参数值以 Tensorflow的二进制格式保存在磁盘中,再使用 Tensorflow 的 Java 接口将预训练的模型封装在智能识别系统中,最后系统以后台独立运行的程序对外提供识别服务。整个系统采用前后端分离架构,从而使得后台接口既可以向前端提供,也可以独立出来向第三方系统提供,提高应用灵活性。水资源监控信息平台只需调用系统的网络接口,向接口传递要预测的水尺图片,接口经过后台推理计算后,将结果返回平台,从而实现水位自动识别。
为了更有效地服务于国家水资源监控能力灌区计量监测点运行管理,水资源监控信息平台开发了水位自动识别功能模块,具备历史预测结果展示、水尺基础信息配置和数据库服务配置等功能,实现了雷达式水位计上报数据与同步图片水位识别数据的自动比对,达到了定期自动对雷达式水位计运行情况进行监控校核的预期目标。以 2019 年 4 月为例,共自动识别水尺图片 6 500 张,识别正确率为 95.3%。
服务配置即数据库配置,需用户提供用户的及用于保存用户信息的 MySQL 数据库的相关信息,MySQL 服务器配置需要提供数据库地址、端口号、数据库名称、用户名和密码等信息,同时可以设置异常图片存储路径,用于保存识别为异常的图片。
完成数据库配置后会出现已有站点列表,需要根据每个点位配置该点位水尺的总长度,智能识别系统将根据水尺总长配置和智能识别的刻度计算得出实际水位值。
历史预测结果展示即展示历史预测结果的详细信息,此设计出于系统可追溯性和可靠性的考虑,后台将每次预测的结果和原图片数据统一保存在系统本地数据库中,方便用户查看历史预测数据和后期系统优化。历史预测结果展示可以展示站点编号、该数据识别的图片、图片采集时间、摄像头编号、水位预测值和预测的水尺状态等信息。
本研究创造性地将深度学习相关算法应用于水尺水位识别,并在国家水资源监控能力灌区监测点运行管理中得到了初步应用。该识别方法具有准确率高、泛化能力强、识别速度快、环境适应能力强等特点,测试识别准确率达 95.7%,实际运行准确率达 95.3%,每张图片识别速度为 200 ms 左右。该识别方法可封装成智能识别系统,利用 Java 接口提供第三方服务,部署应用灵活,适应能力强。
该识别算法具有迭代升级的能力,随着训练样本量的持续增加,预测精度将继续提高,在特定应用场景可直接替代雷达水位计等传统监测手段。同时,可以深度挖掘图像信息,将现场监测干扰因素作为识别目标,实现检测环境异常自动预警,提高计量监测运行维护效率。