使用深度学习与计算机视觉完成对果园的语义分割及三维重建 任务综述 生产力、劳动力短缺、效率和可持续性是推动自动化技术在当今农业中使用的一些关键问题。农业机器人和无人或自主地面车辆 (UGV) 导航的主要任务之一是环境测绘。 解决这些挑战并减少农业机器人绘制更大果园地图的工作量的一种方法是使用无人机图像等遥感数据,而不是使用同步定位和地图绘制(SLAM)方法。 无人机图像包含有关不同地面类型的可见信息,农作物和障碍物。 当可用时,该信息可以传播到 3D 空间使用摄影测量为机器人机器人任务和路径规划生成语义地图。
数据集 训练数据集收集于莱布尼茨农业工程和生物经济研究所数字农业现场实验室(52.46725°N,12.95895°E)。 该数据集包含蓝莓田的航空图像和全球导航卫星系统 (GNSS) 位置数据。 试验田中的蓝莓树由 50 多个不同的蓝莓品种组成,这些品种的大小和蓝莓树之间的间隙宽度各不相同。
由于果园整体的图片过大,所以被分割为较小的图片并使用CVAT进行标注,CVAT是一種免費的,開源的,基於Web的圖像和視頻註釋工具,用於為計算機視覺算法的數據添加標籤。通过CVAT可以实现云端上的多人合作标注。patchify 可以将图像切割成较小的图像并将切割后的图像恢复为较大的图像,选择正确的步骤来切割具有不同重叠区域的较小图像。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import osimport cv2import numpy as npfrom matplotlib import pyplot as pl tfrom patchify import pa tchifyimport t i f f f i l e as ti f fdef image_normalized ( dir_path , save_dir ) :’’’ tif size : 512 * 512 gray : param dir_pa th : path to your images di re c t o r y : param save_dir : path to your images a f t e r normalized : return : ’’’ for file_name in os . li s tdi r ( dir_path ) : i f os . path . spli tex t ( file_name ) [ 1 ] . r e pl a c e ( ’ . ’ , ’ ’ ) == " JPG " : jpg_name = os . path . join ( dir_path , file_name ) save_path = os . path . join ( save_dir , file_name ) img = cv2 . imread ( jpg_name ) patches_img = patchify (img , ( 480 , 480 , 3 ) , step=460 ) file_rename = os . path . spli tex t ( file_name ) [ 0 ] for i in range ( patches_img . shape [ 0 ]) : for j in range ( patches_img . shape [ 1 ]) : single_patch_img = patches_img [ i , j , 0 , : , : , :] cv2 . imwrite ( save_dir+"/" + file_rename+"_" + s tr ( i )+s tr ( j )+ " . png " , single_pa tch_img ) image_normalized (" input_filepath " ," output_filepath " )
大数据集是深度神经网络成功应用的先决条件。 虽然可以通过注释更多图像来获得更多数据,但这将是耗时且费力的。 除了增加数据集的大小之外,图像增强还可以有目的地强调图像的整体或局部特征,例如提高图像的颜色、亮度和对比度,使不清晰的图像变得清晰,或强调某些特征 感兴趣的,扩大不同对象特征之间的差异,数据集采用了翻转,随机亮度,随机裁剪,来增强数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 import albumentations as Adef round_clip_0_1 (x, **kwargs ): return x.round ().clip(0 , 1 ) def get_training_augmentation (): train_transform = [ A.HorizontalFlip(p=0.5 ), A.ShiftScaleRotate(scale_limit=0.5 , rotate_limit=0 , shift_limit=0.1 , p=1 , border_mode=0 ), A.PadIfNeeded(min_height=MAIN_SIZE_X, min_width=MAIN_SIZE_Y, always_apply=True , border_mode=0 ), A.RandomCrop(height=MAIN_SIZE_X, width=MAIN_SIZE_Y, always_apply=True ), A.IAAAdditiveGaussianNoise(p=0.2 ), A.IAAPerspective(p=0.5 ), A.OneOf( [ A.CLAHE(p=1 ), A.RandomBrightness(p=1 ), A.RandomGamma(p=1 ), ], p=0.9 , ), A.OneOf( [ A.IAASharpen(p=1 ), A.Blur(blur_limit=3 , p=1 ), A.MotionBlur(blur_limit=3 , p=1 ), ], p=0.9 , ), A.OneOf( [ A.RandomContrast(p=1 ), A.HueSaturationValue(p=1 ), ], p=0.9 , ), A.Lambda(mask=round_clip_0_1) ] return A.Compose(train_transform) def get_validation_augmentation (): """Add paddings to make image shape divisible by 32""" test_transform = [ A.PadIfNeeded(480 , 480 ) ] return A.Compose(test_transform) def get_preprocessing (preprocessing_fn ): """Construct preprocessing transform Args: preprocessing_fn (callbale): data normalization function (can be specific for each pretrained neural network) Return: transform: albumentations.Compose """ _transform = [ A.Lambda(image=preprocessing_fn), ] return A.Compose(_transform)
标注后的图像 80% 用于训练,15%用于验证,5% 用于测试。
模型 模型使用了efficientnet-Unet作为训练模型,并使用了focal loss+dice loss作为损失函数,训练参数如表:
input image size
320x320
backbone
Efficientb3
opimizer
Adam
batchsize
16
learningrate
0.0001
classes
2
epochs
50
训练结果 Unet 在测试测试集得出的多个参数中表现最好,达到了 0.74632 的 IoU 分数和 0.80431 的 F1 分数。 然而,由于蓝莓田边缘样本较少,边界上的灌木和其他农田存在错误注释。 为了提高模型的准确性并拓宽其应用范围,需要使用其他对象的样本数据来扩充数据集,以增强果园边缘的学习.
如图所示,为对正上方和斜角45°的图片预测:
在实际测试中,使用了QGIS实现了不同图层的叠加,来更好的展示对整个果园的预测结果,其中绿色是蓝莓的真值点。灰色的是不能行驶的区域,白色是可行使区域的地图
由于数据是使用从同一蓝莓田获得的 202 张无人机图像进行训练和测试的,为了更好地测试模型,使用了其他果园的无人机图像。 该果园的可行驶区域也有类似的低草生长,因此该模型在分割可行驶区域方面的性能可以在该果园得到很好的验证。 除此之外,添加更多标签还可以 以提高模型使用的灵活性。 这也印证了模型的能够通过广泛的数据预测可行驶区域。 输入模型的图像取自与蓝莓田结构相似的不同田地,在该田地的这些行中种植其他作物,例如醋栗: