本
文
摘
要
【作者简介】:王飞,武汉大学遥感信息工程学院遥感科学以技术专业毕业,现任云南喻宁科技有限公司总经理,云南天目空间信息技术有限公司副总经理。如对本文及相关内容感兴趣者,可通过邮箱winfield@whu.edu.cn联系作者本人。
【声明】
【1】本文所述研究内容得到了武汉大学测绘遥感信息工程国家重点实验室摄影测量与遥感专业博士研究生周明婷同学的大力支持和指导,本人在此表示衷心感谢!
【2】本文所述研究内容系作者本人工作内容之技术总结及业余研究,发表于此之目的是为抛砖引玉,期待同行指点。本文所述内容如果不妥之处,期待指正!
*****************************************
[正文]
[摘要]本文以云南省楚雄州禄丰县烟叶种植区域为调查对象,提出了一种基于深度学习的烟叶种植区域自动提取方法。首先使用固定翼或多旋翼无人机按照1:2000测绘标准制作目标区域0.2米分辨率的无人机正射影像,然后通过人工目视解译识别烟叶种植区域,并将其作为训练样本及测试样本用于TensorFlow+U-net深度学习框架中,进行烟叶种植区域自动识别学习训练,最后利用学习得到的模型对禄丰县全县烟叶种植区域进行自动识别。与人工目视解译结果相比,基于深度学习自动识别得到的烟叶种植区域精度可达92%以上,该方法在节省大量人力成本的同时效率更高,值得进一步拓展研究。
0 引言
近年来,随着无人机在测绘遥感领域的应用普及,使得获取高空间分辨率影像数据的效率也越来越高。与传统遥感(卫星遥感、载人飞机遥感)相比,无人机遥感具有不受大气因素干扰、空间分辨率高、成本低、易操作、影像获取时效性高等特点。同时,随着深度学习在图像识别应用领域中准确率的不断提高,使得利用深度学习进行农作物种植区域提取成为可能。深度学习的理论方法在20世纪70年代就已经出现,但是受限于硬件条件,其真实价值直到近几年才得以完全展现。如今,随着计算机性能的提升,利用深度学习进行遥感影像分类识别,其精度已不低于传统分类精度,在部分特殊领域其分类精度甚至已远超传统分类。
2019年,陈前等人[1]采用GF-1卫星8m分辨率卫星影像基于深度学习进行水体提取,结果表明深度学习的精度高于水体指数法、面向对象法和支持向量机法,且能有效去除建筑物和阴影的影响。2020年,罗巍等人[2]提出利用TensorFlow + MASK RC-NN深度学习框架对杨梅树进行调查的方法,结果表明该方法不仅能大大节省人工分析遥感影像的时间、提高工作效率,还可以通过将获取到的树冠轮廓矢量叠加到ArcGIS中,直观的显示杨梅树的分布范围和具体数量。
目前国内外比较知名的深度学习框架有百度的PaddlePaddle框架、Google的TensorFlow框架[3]、Facebook的PyTorch等。本文采用TensorFlow机器学习框架对0.2米分辨率无人机影像进行烟叶种植区域自动提取,并对其结果进行分析和验证评价。
1 研究区概况
研究区域位于云南省楚雄彝族自治州禄丰县(24°50′N~25°30′N,101°37′~102°25′E),行政区域总面积约为3536平方公里,东西最宽约76千米,南北最长约68千米,全县河谷纵横,海拔1300~2754米。禄丰县属中亚热带季风气候。年均气温 16.2℃ ,年平均降雨量930~950毫米,年无霜期322天,处于滇中湿润区与半湿润区的交汇地带,水分充足,森林覆率达70%。
烤烟是禄丰县的传统支柱产业,种植收益良好,群众认可度高,近年来禄丰县全县烟叶种植面积年均约为10万亩。
2 无人机影像获取及预处理
本文基于0.2米分辨率无人机影像进行研究,采用固定翼无人机+多旋翼无人机+单镜头获取无人机影像。影像获取及预处理流程如图1所示:
图1 无人机影像获取及预处理流程无人机影像获取时间为2018年5月至2018年6月,该时间段为烟叶移栽初期。据了解,禄丰县一般在每年5月中下旬开始移栽烤烟,刚移栽时覆有薄膜(一般为黑色薄膜),黑色薄膜一般在7月初逐渐移除。薄膜宽度约为0.8米,薄膜间隔约0.5米,烟叶种植区纹理特征明显,相似地物少,如图2所示。
图2 五月底六月初烟叶生长情况(左图为0.2米分辨率无人机影像上的烟叶种植区域,右图为现场图片)由于烤烟基本种植于农田耕作区域,所以在无人机航飞之前,本文先将林区等非种植区域剔除,主要获取农田区域无人机影像。最终获取的全部无人机影像如图3所示:
图3 获取的全部无人机影像分布示意图3 研究方法
深度学习的原理[6]如图4所示,可以简单概括为以下几点:
1) 在开始时对神经网络的权重进行随机赋值,并计算预测值与预期值的差距,得到损失值。
2) 根据最新的损失值,利用反向传播算法来微调神经网络每层的参数,从而降低损失值。
3) 根据调整的参数继续计算预测值,并计算新的预测值与预期值的差距,得到新的损失值。
4) 重复步骤2)和步骤3),直到整个神经网络的损失值达到最小,此时算法收敛,得到最终的模型。
图4 深度学习原理本文首先参照Google官方安装指导文档[4]搭建深度学习框架,同时进行深度学习样本制作,然后采用Python语言编写深度学习脚本。通过不断训练和优化模型,得到最佳的模型,并利用此模型对禄丰县全县烟叶种植区域进行自动识别,最后对其精度进行评定。具体流程如图5所示:
图5 研究方法流程图3.1 搭建TensorFlow深度学习框架
参照Google官方安装指导文档进行环境搭建,本文使用的硬件配置如表1所示:
表 1 计算机硬件配置项目型号系统Windows 10CPUIntel® Core™ i7-7740X CPU @ 4.3GHz 八核GPUNVIDIA Geforce RTX 2080 TiRAMDDR4 128GB硬盘Intel 1T M2 2280 NVME主要软件如表2所示:
表 2主要软件软件版本TensorFlow-gpu1.13.1Python3.7.2CUDA®10.1NVIDIA® cuDNN SDK7.5Anaconda34.6.7OpenCV-Python4.0.0.21Keras2.2.4Numpy1.16.2Scikit-image0.14.2gdal2.3.33.2 深度学习样本制作
根据深度学习的原理,要得到一个精度较好的模型,需要输入大量的样本数据进行训练。本文采用如下步骤进行样本制作:
1) 将无人机影像重采样至0.2m分辨率,得到三波段的真彩色影像。
2) 划定样本范围A。
3) 在ArcMap中对无人机正射影像进行目视解译,勾勒出样本范围A内烟叶种植区域,并以面状矢量数据进行存储,同时对其进行栅格化,并导出为单波段栅格影像(此时烟叶种植区域灰度值为255,非烟叶种植区域灰度值为0)。
4) 在Global Mapper中,对步骤3)中导出的单波段栅格影像以样本范围A进行切片。每个切片为512像素*512像素*1个波段,位深度为8bit,文件格式为.tif格式(如图6左图所示)。该数据为Label切片数据。
5)在Global Mapper中,对步骤1)中重采样后的0.2米分辨率无人机影像以样本范围A进行切片。采用与步骤4)同样的命名方式,得到和Label数据一一对应的切片。每个切片为512像素*512像素*3个波段,位深度为8bit,文件格式为.tif格式(如图6右图所示)。该数据为Train切片数据。
图6 深度学习训练样本(左图为Label切片数据,右图为对应的Train切片数据)按照上述步骤,共得到21828张原始Train切片数据(对应21828张Label切片数据),由于在前述数据处理过程中采用了批量切片方法,故存在无效数据(即512像素*512像素范围内无烟叶种植或仅有极少烟叶种植),需要对其进行剔除。剔除的策略是通过计算每个Label数据切片中的像素值之和,并与某一指定阈值K(本文设定的阈值K=0.05*512*512*255)进行比较,判断样本是否包含足够的目标,如果小于该阈值K,表明该切片内烟叶种植区域占比小于某一比例(本文中设定的K值对应的比例为5%),则剔除该Label切片数据及其对应的Train切片数据。该步骤用Python语言实现,主要代码如下:
data = dataset_label.ReadAsArray(0,0,xsize,ysize) nsum = data.sum() if nsum <= 0.05*xsize*ysize*255: dataset_label = None os.remove(filename_label) os.remove(filename_train)无效数据剔除后,得到有效Train切片数据9382张(对应9382张Label切片数据)。
3.3 编写深度学习脚本
深度学习脚本主要分为四大功能模块:样本数据集扩展模块、训练数据及测试数据提取模块、训练模块、预测模块。使用Python语言进行脚本编写。
3.3.1 样本数据集扩展模块
机器学习需要大量的样本数据进行模型训练才能得到较好的精度,为了得到更多的样本数据,本文通过旋转和翻转来扩展样本数据集。经旋转0°、90°、180°、270°、纵向翻转、横向翻转、同时横向和纵向翻转后,样本数据集扩展模块把1份原始数据扩展为7份数据。通过这一步骤,原本的9382份样本数据变为65674份样本数据。
3.3.2 训练数据及测试数据提取模块
把扩展后的样本数据集进行随机提取,得到Train数据集和Test数据集,前者用于训练模型,后者用于精度检测。随机提取的方式为:遍历文件夹内的文件,每读取到一个文件,生成一个0.00~1.00之间的随机数,若小于0.25,则将对应的数据作为测试数据,否则作为训练数据。测试数据属于完全随机选取,每次执行该脚本会产生不同的结果。最终,测试数据与训练数据数量之比大约为1:3。
3.3.3 训练模块
本文基于U-net模型[5]基础,采用Nadam梯度下降方式进行训练。输入图像为512像素*512像素的3波段真彩色影像数据和对应的单波段Label数据。在Label数据中,白 *** 域表示烟叶种植区域,黑 *** 域表示非烟叶种植区域。核心流程如图7所示。
图7 基于U-net进行烟叶种植区域识别的核心流程训练模块主要的实现代码如下:
model = build_res_U-net(input_shape = input_shape) model.summary() optimizer = keras.optimizers.Nadam(lr = 0.002 , beta_1 = 0.9 , beta_2 = 0.999 , epsilon = 1e-8 , schedule_decay = 0.004) parallel_model = multi_gpu_model(model , gpus = 2) parallel_model.compile(optimizer = optimizer , loss = binary_crossentropy , metrics = [accuracy]) filepath = save_weights_path + "res-U-net-weights-improvement2-{epoch:02d}-{val_acc:.2f}.hdf5" checkpoint = ModelCheckpoint(filepath , monitor=val_acc , verbose=0 , save_best_only=True , mode=max) history = LossHistory() logdir = save_logs_path if not os.path.exists(logdir): os.makedirs(logdir) tensorboard = TensorBoard(log_dir = logdir , histogram_freq = 0) callbacks_list = [checkpoint , history , tensorboard] #data G = LoadBatches.imageSegmentationGenerator(train_images_path , train_segs_path , train_batch_size , input_height , input_width) if validate: G2 = LoadBatches.imageSegmentationGenerator(val_images_path , val_segs_path , val_batch_size , input_height , input_width) train_images = glob.glob(train_images_path + "/*." + "jpg") + glob.glob(train_images_path + "/*." + "png") + glob.glob(train_images_path + "/*." + "tiff") + glob.glob(train_images_path + "/*." + "tif") val_images = glob.glob(val_images_path + "/*." + "jpg") + glob.glob(val_images_path + "/*." + "png") + glob.glob(val_images_path + "/*." + "tiff") + glob.glob(val_images_path + "/*." + "tif") steps_per_epoch_train = len(train_images)/train_batch_size + 2 steps_per_epoch_val = len(val_images)/val_batch_size + 2 if not os.path.exists(save_weights_path): os.mkdir(save_weights_path) if not validate: parallel_model.fit_generator(G , steps_per_epoch=steps_per_epoch_train , epochs = epochs , callbacks = callbacks_list , verbose = 1) else: parallel_model.fit_generator(generator = G , steps_per_epoch = steps_per_epoch_val , validation_data = G2 , validation_steps = steps_per_epoch_val , epochs = epochs , callbacks = callbacks_list , verbose = 1) history.loss_plot(epoch)3.3.4 预测模块
本模块主要功能是对烟叶种植区域进行自动识别。输入数据为512像素*512像素的三波段真彩色影像,输出结果为512像素*512像素的单波段灰度图,其中,白 *** 域为模型预测的烟叶种植区域,黑色部分为非烟叶种植区域。主要实现代码如下:
m = build_res_U-net(input_sharp) m.load_weights(args.save_weights_path) m.compile(loss=binary_crossentropy , optimizer = optimizer_name , metrics = [accuracy]) images = glob.glob(images_path + "/*." + "jpg") + glob.glob(images_path + "/*." + "png") + glob.glob(images_path + "/*." + "tif") + glob.glob(images_path + "/*.tiff") images.sort() imgTestDataset = np.ndarray((len(images) , input_height , input_width , 1) , dtype = np.float32) if not os.path.exists(pred_dir): os.mkdir(pred_dir) for testImgPath in images: num_proceed =num_proceed + 1 imgs_test = Image.open(testImgPath) imgs_test = img_to_array(imgs_test) imgs_test = imgs_test.astype(float32) imgs_test /= 255 mean = imgs_test.mean(axis = 0) imgs_test -= mean imgs_mask_test = m.predict(np.array([imgs_test]))[0] imgs_mask_test = imgs_mask_test.reshape((input_height , input_width)) imgs_mask_test = img_to_array(imgs_mask_test) imgs_mask_test[imgs_mask_test > 0.5] = 1 imgs_mask_test[imgs_mask_test <= 0.5] = 0 seg_img = (imgs_mask_test[:,:] * 255.).astype(np.uint8) seg_img[seg_img == 0] = 1 outName = testImgPath.replace(images_path , args.output_path) imsave(os.path.join(outName) , seg_img)3.4 训练模型、优化模型参数
通过调整以下两个重要参数进行训练及优化模型:Epochs: 向前和向后传播中所有批次的单次训练迭代。即在模型训练过程中,样本数据被使用的次数;Batch_Size:一次训练的样本数目。
不同参数组合所需的训练时间和理论精度如表3所示。
表 3 不同参数组合下的精度统计表参数组合训练时间(h)精度(ACC)Epochs : 60 + Batch_Size : 81694.87%Epochs : 60 + Batch_Size : 42594.62%Epochs : 60 + Batch_Size : 22694.35%Epochs : 80 + Batch_Size : 82395.11%Epochs : 80 + Batch_Size : 43094.82%Epochs : 80 + Batch_Size : 23694.77%Epochs : 100 + Batch_Size : 83095.24%Epochs : 100 + Batch_Size : 43595.12%Epochs : 100 + Batch_Size : 24595.07%从上表可以看出,随着Epochs增加,模型ACC精度逐渐增加。Batch_Size越大,模型ACC精度也越高。通过对比表格,本文最终选用ACC精度最高的参数(即Epochs:100 + Batch_Size:8)训练得到的模型进行后续烟叶种植区域识别。该参数组合在训练过程中的收敛情况如图8所示:
图8 参数组合Epochs:100 + Batchs_Size:8的模型收敛情况3.5 烟叶种植区域识别
为了得到矢量的面状识别成果,本文进行了如下处理:
1) 在用Global Mapper进行无人机正射影像切片时,同时导出每个切片的坐标信息文件(.tfw文件和.prj文件)。
2) 预测得到的单波段灰度图文件名与输入的三波段真彩色切片文件保持一致。
3) 将预测得到的单波段灰度图与三波段真彩色影像批量切片时导出的坐标信息文件置于同一文件夹内,并用Global Mapper进行合并,即可得到具有坐标信息的单波段灰度图,其中白色为烟叶种植区域,黑色为非烟叶种植区域。
4) 在ArcMap中对步骤3)得到的单波段灰度图进行矢量化,并将灰度值字段添加至矢量化成果的属性表中。删除灰度值非255的区域后,利用制图综合消除小图斑,并进行平滑处理,得到最终分类成果。
本文得到的最终成果如下所示,其中图9和图10是对于覆膜和不覆膜烟叶种植区域的识别成果,图11是对人工目视解译结果和深度学习自动识别结果的对比,图12是禄丰县整体识别结果对比。
图9 覆膜烟叶种植区域识别效果(左图为覆膜原始影像,右图白 *** 域为自动识别的烟叶种植区域)图10 非覆膜烟叶种植区域识别效果(左图为非覆膜原始影像,右图白 *** 域为自动识别的烟叶种植区域)图11自动识别结果与人工解译结果局部对比(左图为人工解译结果,右图为自动识别结果)图12 自动识别结果与人工解译整体对比(左图为人工解译结果,右图为自动识别结果)本文在禄丰县烟叶种植区域识别中投入的人力物力如表4所示。可以看出,与人工目视解译相比,深度学习自动识别具有在效率方面具有无可比拟的优势。
表 4 烟叶种植区域人工目视解译和深度学习自动识别效率对比识别方式总面积(亩)投入人力物力耗时(小时)效率(亩)人工目视解译986476人+6台电脑84196深度学习自动识别942561人+1台电脑5.517137备注:此处效率的定义是:1人+1台电脑每小时识别的烟叶种植区域面积。3.6 精度评定
由于本文只关注烟叶种植区域,故精度评定采取的策略如下:
1) 在人工目视解译勾画的烟叶种植区域内随机选定500个点,统计通过深度学习得到的烟叶种植区域成果中对应点位的识别情况。
2) 在通过深度学习识别的烟叶种植区域内随机选定500个点,统计通过人工目视解译得到的烟叶种植区域中对应点的真实烟叶种植情况。
按照上述策略,统计得到如下表5。
表 5 精度评定统计表项目数目百分比人工解译随机选定的点中通过深度学习被正确识别为烟叶种植区域的数量476/50095.2%通过深度学习识别的烟叶种植区域中经人工解译确认为烟叶种植区域的数量462/50092.4%4 结果与分析
由表5的精度统计结果和表4的识别效率对比,我们可以看出:通过深度学习识别的烟叶种植区域其理论准确性达到了95.2%,考虑到其他因素的影响,其实际准确性达到了92.4%,对于典型农作物,已经具有非常大的应用价值,尤其是对于涉及范围较广的农作物,与人工识别效率相对比,深度学习具有无可比拟的优势。
在研究过程中,同时也发现了几个可以进一步改进的地方:
1)本文假定人工目视解译结果为100%准确,故而在模型训练时使用了人工目视解译的结果作为训练样本输入。但实际人工目视解译结果也并非完全准确,由于不同人对于烟叶种植区域在无人机影像上的表现有不同的理解以及不同地区烟叶种植区域在无人机影像上的表现也不同,所以会造成最终的理论精度和实际精度有所偏差。
2)本文在研究过程中,Batch_Size的大小受硬件限制,无法设置更大的Batch_Size,可以通过选用更高配置的深度学习专用硬件来提高训练效率和精度。
3)本文训练所采用的样本为楚雄州禄丰县5月底至6月初使用无人机获取的烟叶种植区域0.2米分辨率影像,若要对其他地区或其他时间段的影像进行识别,则应采用对应的样本进行训练。但同一区域同一时间段的模型可在每年重复使用。
5 结语
无人机影像数据获取效率的提高,弥补了传统卫星影像空间分辨率低、受天气影响大、获取周期短的缺点,但无人机影像的数据量与传统卫星影像相比也大得多,因此无人机影像中目标信息的快速、高精度提取是一个新的挑战。基于此,本文通过使用TensorFlow机器学习框架+U-net对禄丰县烟叶种植区域进行自动识别,并与人工目视解译结果进行对比分析,认为与人工目视解译识别烟叶种植区域相比,深度学习在识别效率上具无可比拟的优势,且其识别正确率能达到92%以上,其成果可用于统计烟叶种植区域的面积。
本文所得到的训练模型除了在禄丰县的烟叶种植区域识别工作中证明有效可行外,也在鲁甸、曲靖等地选取相同时间段的无人机影像进行验证,其精度均达到了92%以上。
除了烟叶种植区域识别,深度学习也可以尝试在其他领域进行研究推广,比如甘蔗、香蕉、违章建筑检测等。
[参考文献]
[1] 陈前,郑利娟,李小娟,徐崇斌,吴俣,谢东海,刘亮. 基于深度学习的高分遥感影像水体提取模型研究[J]. 地理与地理信息科学. 2019.35(4):43-49
[2] 罗巍,王东亮,夏列钢,陈曙东. 基于深度学习的林业资源调查方法[J]. 林业科技通讯. 2018.8:17-22.
[3] Abadi M.,Barham P.,CHEN J.,et al. TensorFlow: A System for Large- Scale Machine Learning[C]//Proceedings of the 12th USENIX Symposium on Operating Systems Design and Implementation,2016.
[4] Google. 安装TensorFlow[OL]. https://tensorflow.google.cn/install.
[5] O. Ronneberger, P. Fischer, and T. Brox. U-net: Convolutional networks for biomedical image segmentation[C]// Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), vol. 9351. Springer Verlag, 2015.234–241.
[6] 刘晓,齐德昱,曹世轩. 基于TensorFlow2.0的图像分类算法研究[J]. 现代计算机. 2020.05:63-68.
本文作者联系方式:王飞 winfield@whu.edu.cn。