孙英豪,丁 勇,李登华,谢东辉
(1. 南京理工大学 理学院,江苏 南京 210094; 2. 南京水利科学研究院 水利部土石坝破坏机理与防控技术重点试验室,江苏 南京 210029; 3. 宁波原水集团有限公司 皎口水库分公司,浙江 宁波 315000)
水位是水文观测的重要数据,实时获取水位数据对防洪防汛和保护人民生命财产安全有重大意义。当前,通过人工读取水位标尺仍是获取水位数据的主要方式,效率低且难以实现全天候监测;自动化水位测量包括基于浮子的方式[1]、基于压力的方式[2]、基于超声波、雷达波的方式[3-5]及光纤式水位计[6]等,但存在安装成本高、运维难度大、环境适应性差等问题。近年来,基于图像处理的水位监测是水位监测技术领域的一个新热点,国内外已经取得颇多成果。鲍江等[7]利用Harr 特征算子对水位图像的边界分段计算识别水位线,该方法虽能快速识别不规则水位线,但精度较低;仲志远[8]通过实时截取包含水尺的水位视频图像,对其进行灰度转换、中值滤波、边缘检测、K-means 聚类得到刻度线后计算水位,该方法虽满足精度要求,但抗环境干扰能力还有待提高;张振等[9]利用标准双色水尺设计模板图像,通过建立感兴趣区域和模板图像间的透视投影关系,将水尺图像配准到正射坐标系下,最终在二值图像中识别水位线,并根据其坐标换算水位,该方法识别水位线设定阈值的普适性不高;周衡等[10]采用图像差分法提取水位变化区域,根据水位标尺相机标定的结果直接计算得到实际水位,该方法测量精度虽然较高,但当水尺或相机位置发生变动,对测量结果影响很大;聂鼎等[11]通过设置标识物在图像中的坐标位置及空间几何尺寸等参数,基于透视原理对坝坡图像进行透视变换,采用带标记分水岭分割算法,自动识别大坝上游面水位线,最后根据几何相似原理推导出水位计算公式,该方法虽可以实现水位连续性监测,但对夜晚及水库坝坡不平整等工况还缺乏充分分析;刘铭辉等[12]通过二值化水尺图像使用方差均值阈值法检测水位线位置,利用投影关系计算水位,该方法虽对复杂环境具有较高鲁棒性,但对水面复杂光学噪声的抑制有待进一步提高;吴婷等[13]通过灰度直方图统计水体、水尺、背景的灰度值并进行分析,确定灰度拉伸范围,明确水尺与水体的分界线识别水位线,最后根据水位线至水尺顶部像素高度换算水位,该方法较好地解决了水尺倒影、水面折射引起的测量误差,但对水尺污损、异物遮挡等场景并未分析;Lin 等[14]首先利用最大类间方差法分割水尺识别水位线,再分割出水尺上的字符,对字符进行模板匹配,最后结合水位线计算水位,该方法因未去除最大类间方差法的分割残余,使实际测量误差较大;Lee等[15]通过分析相邻帧图像同一位置区域,计算得到相关系数识别出水面,并进一步换算成水位,该方法计算相关系数时间长,效率较低;Kim 等[16]通过制作水位映射表,将水尺图像直方图的平均图像峰值作为水位线,该方法虽可以克服水尺的污损问题,但实用性较低。
上述基于图像处理测量水位的方法往往借助水位标尺,大多数仅限于小量程的水尺图像研究,在实际应用中,存在水尺易受太阳阴影、水体倒影、异物遮挡等环境影响。基于此,本文提出一种基于图像识别的无标尺水位测量技术,该技术不借助水位标尺,利用神经网络和图像识别对水位图像进行语义分割识别水位线并检测出水位线坐标,根据水位标定的数学模型,通过线性插值和坐标拟合的方法计算水位。
无标尺水位测量技术主要包括水位标定、图像配准、水位线识别和综合水位计算4 个部分。首先通过水位标定建立水位计算的数学模型,然后借助图像配准将采集到的水位图像与标准图像进行匹配,标准图像为水位标定时某机位的模板图像,图像配准可消除因摄像头轻微晃动带来的图像偏移问题,再将匹配图像输入到神经网络,识别水位线并检测出水位线坐标,最后根据水位标定的数学模型计算水位。
摄像头采集水位图像时,空间中的投射点与图像中的像素坐标点是一一对应的。根据对应关系,可通过线性插值法和曲线拟合法计算水位,这就是水位标定的数学模型。本文的水位标定过程见图1,将球型摄像头固定在岸堤的正前方,其中,摄像头像素200 万,最大支持23 倍光学变焦,水平范围360°和垂直范围−15°~90°自动翻转,100 m 红外补光,标识从岸堤上方至下方依次垂直于水面下放,下放时球型摄像头根据标识相对位置进行拍摄并检测其中心点的像素坐标,同时全站仪测量出标识相对于岸堤顶部的实际高程,即可建立标识像素坐标p和实际高程h的对应关系。从1 号机位连续到n号机位,每个机位间隔1 m,标识每隔15 cm 共取20 个点进行水位标定,覆盖了水位变化的绝大部分区域,可为大量程的水位测量提供条件。
图1 水位标定方法示意Fig. 1 Schematic diagram of water level calibration method
通过标识进行水位标定,建立像素坐标和实际高程参照表,针对同一个场景,环境条件较好的情况下仅需标定1 次。与传统水位标尺相比,本方法避免了室外环境干扰和水尺污损造成水尺识别困难及水尺量程短等问题。
水位标定是水位计算前的准备工作,在进行图像采集时由于环境影响摄像头可能会发生轻微晃动,造成同一时段内同一个机位采集的水位图像中水体区域产生位置偏差,水位线坐标识别误差相对较大,水位测量结果不满足精度要求,则需要将对应机位采集到的水位图像与标准图像进行空间配准。图像配准一般分为关键点检测、特征匹配和图像变换3 个步骤[17]。本文采取基于特征点的图像配准[18],具体过程如图2所示,通过AKAZE 特征点检测对应机位标准图像和待配准水位图像的共同特征点作为配准依据,计算每对特征点之间的距离,并返回每个特征点k个最佳匹配中的最小距离来建立空间匹配关系(图2 (a)),利用特征点的参数计算空间变换矩阵,将待配准水位图像转换成匹配图像(图2(b))。
图2 基于特征点的水位图像配准结果Fig. 2 Water level image registration results based on feature points
本文提出一种基于U-net 神经网络的水位线识别方法。将摄像头采集的水位图像及对应标签图像作为数据集输入U-net 神经网络进行训练,生成水体区域和非水体区域的图像语义分割模型。标签图像使用LabelMe 标注软件制作:对原始图像中水体边界进行勾画,作为水位图像中水体区域的真实参考,最后将勾画图像进行二值化像素分类,水体区域像素标记为255,非水体区域像素标记为0。图3 为标签图像的制作示例。
图3 标签图像制作示例Fig. 3 Example of label image making
针对本文应用场景,同一河道或水库考虑昼、夜两种环境,对于利用U-net 神经网络的图像分割问题,根据“经验法则”,建议每一类别收集1 000 张图像并有对应清晰的标签[19],当训练数据碰到特殊情况,如遮挡、阴影、模糊等出现识别错误,确保模型有高精度分割和较高鲁棒性,经过对图像进行亮度和对比度增强、水平翻转及随机方向旋转等方式扩充,其中,亮度从0.7~1.3,对比度从0.2~1.8 随机变化,图像总数可达6 000 多张,每张都具有清晰的标签,数据集的数量和质量满足训练要求。
U-net 神经网络最早由Ronneberger 等[20]设计并应用于医学影像分割领域,试验表明在训练样本较少的情况下模型仍能取得良好的分割效果。网络结构包括收缩路径和扩展路径:左侧收缩路径由2 个3×3 卷积(Conv)重复应用组成,每个卷积后都跟1 个修正线性单元(ReLU)和1 个2×2 的最大池化(Max pool)操作。水位图像先由卷积层提取图像特征,再由最大池化减少卷积层提取的特征个数,增加特征的鲁棒性,在每一步采样中,通过加倍特征的通道数量,最后生成水位图像的缩略图。右侧扩展路径包含了一个特征谱的上采样,然后是一个将特征数量通道减半的2×2 反卷积(up-conv)和一个来自相应收缩路径图谱的连接(Copy and Crop),以及每次都跟随着一个修正线性函数(ReLU)的2 次3×3 卷积(Conv)。在最后一层,一个1×1 卷积(Conv)将每一个64 组的特征向量映射到需要类的数量。上采样层中,如两个过程得到的特征谱大小不匹配时,通过反卷积层将当前特征映射扩大,整个上采样过程把抽象的特征再还原到原图的尺寸,最终得到分割结果。
本文将数据集按8∶1∶1 划分为训练集、验证集和测试集,通过Numpy 矩阵切片确定图像高度和宽度,将摄像头采集的1 920 像素×1 080 像素大小的原始水位图像裁剪为512 像素×512 像素。其中训练样本规模为4 884 张;验证样本为814 张,用于初步评估模型能力;测试样本为814 张,用于验证本文方法的精度。网络输出与输入图像具有相同尺寸的二值化分割图像:其中,值为0 的像元点为网络识别的非水体,值为255 的像元点为网络识别的水体(图4),通过边缘检测水体区域和非水体的边界识别水位线,借助图像识别水位线和标定线连线的交点确定水位线坐标。
图4 U-net 水体区域识别网络结构Fig. 4 Structure of U-net water area identification network
在单个机位的水位标定中,标识不同位置的像素坐标形成了像素区间,检测到水位线像素坐标后,判断像素坐标是否在标定的像素区间内:若在区间内,利用标识的实际高度和像素坐标进行线性插值计算该机位的水位,表达式为:
式中:hi为第i个机位的水位;Hj和Hj+1分别为像素区间下限和上限对应的实际高度;yi为第i个机位的水位线坐标;yj和yj+1分别为像素区间下限和上限坐标。
若水位线坐标不在标定的像素区间内,则通过最小二乘法拟合像素坐标和实际高度的关系曲线,将水位线坐标直接代入曲线方程计算水位。利用最小二乘法时,要求误差的平方和最小:
式中:h(yi)为标识点纵向像素坐标yi对应的实际高度;Sεi为拟合曲线方程ψ(yi)在yi处的偏差。
某一时间段内,从1 号机位连续到3 号机位采集水位图像(图5),进行综合水位计算:若相邻机位中存在某一水位为空值,则默认排除该机位水位作为最终水位的参考值(图5(a));剩余机位计算水位分别为hi、hi+1,则该时间段内最终水位h=(hi+hi+1)/2;若相邻机位只有1 个计算水位,则该时间段内最终水位h=hi(i=1,2,3)。
图5 1 号机位到3 号机位水位图像采集示意Fig. 5 Schematic diagrams of water level image acquisition from stand 1 to stand 3
为验证上述水位测量方法的有效性,以宁波某水库为研究实例,该水库集水面积约259 km2,校核库容约1.198 亿m3,为大二型水库。数据集主要由昼、夜间摄像头采集的水位图像构成,每隔5 d 昼、夜监测1 次水位,并与人工测量水位进行比较,分析水位测量误差。
本文采用Keras 框架进行训练,Tensorflow 为后端,Adam 为优化器,初始学习率设置为0.000 1,CPU为Intel 第九代酷睿i7 9700K,GPU 为NVIDIA GeForce GTX 2080Ti。数据集通过U-net 神经网络迭代1 次,试验记录1 次准确率和损失率,计算方法为:
式中:TP为模型预测为水体的正样本;TN为模型预测为非水体的负样本;FP为模型预测为水体的负样本;FN为模型预测为非水体的正样本。
本次模型训练共迭代90 次,实现了高准确性和低损失率。由图6 可以看出,训练集迭代约70 次后准确率稳定在97%以上,最高可达到97.8%;损失率稳定在3%以下,最低达到2.4%。所以,通过U-net神经网络模型分割水体可以反映水位的真实情况。
图6 训练准确率和损失率变化Fig. 6 Changes in training accuracy and loss rate
水位线识别过程如图7 和图8 所示:图7(a)、图8(a)分别为昼、夜采集到的原始水位图像,图7(b)、图8(b)为模型识别出的水位轮廓图像,图7(c)、图8(c)为边缘检测出的水位线图像。水位图像通过摄像头采集后上传云端服务器,单张图像通过本文算法识别水位线的效率约为187 ms。
图7 白天水位线识别Fig. 7 Daytime water level recognition
图8 夜间水位线识别Fig. 8 Water level recognition at night
通过无标尺水位测量技术监测水位,得到的结果见表1,其中:Y为水位线的纵向像素坐标,H为人工测量的实际水位,h为本文方法计算得到的水位,δ为绝对误差。
表1 昼、夜水位测量数据Tab. 1 Daytime and nocturnal water level measurement data table
本文提出了一种基于图像识别的无标尺水位测量技术,该技术通过水位标定,利用神经网络识别水位线后得到水位线坐标,根据水位标定的数学模型计算水位。通过球型摄像头不同机位采集标识图像进行水位标定,覆盖了水位变化的绝大部分区域,避免了水位标尺量程短的问题,可以为大量程的水位测量提供数学模型。利用U-net 神经网络分割水位图像中水体区域和非水体区域识别水位线,模型分割精度高,晴朗条件下,昼、夜适应性强。采用该技术对宁波某水库水位进行了详细测量,结果显示昼、夜测量误差均在1 cm 以内。这说明该技术能满足河道、水库等大量程的水位实时测量。