洛阳市做网站贴吧,自适应网站模板下载,wordpress5回复后查看,静态展示网站模板作者|李秋键
出品|AI科技大本营(ID:rgznai100) 智能化农业作为人工智能应用的重要领域#xff0c;对较高的图像处理能力要求较高#xff0c;其中图像分割作为图像处理方法在其中起着重要作用。图像分割是图像分析的关键步骤#xff0c;在复杂的自然背景下进行图像分割, 难度…作者|李秋键
出品|AI科技大本营(ID:rgznai100) 智能化农业作为人工智能应用的重要领域对较高的图像处理能力要求较高其中图像分割作为图像处理方法在其中起着重要作用。图像分割是图像分析的关键步骤在复杂的自然背景下进行图像分割, 难度较大。 在传统的病虫害图像分割算法中应用最多的是基于统计模式识别、K-均值聚类、模糊C-均值聚类、Otsu、levelset、EM等算法。Gui等人提出了一种基于复杂背景的彩色叶片图像的大豆叶病检测系统该系统根据K均值算法和结合经验阈值基于显著性映射从大豆叶片病害图像中分割出显著区域Kaur等人提出了一种基于K均值聚类算法的葡萄病害叶片图像分割方法.Chaudhary等人提出了一种基于图像处理技术的植物叶片病斑分割算法比较了CIELAB、HSI和YCbCr颜色空间在病害检测过程中的效果.Mohammad等人比较了阈值法、分水岭法、边缘检测法、模糊C-均值聚类法和K-均值聚类法在植物病害检测中的应用指出它们适合于任务重叠聚类。
而Unet网络作为图像分割的经典深度学习算法在植物叶片病虫害区域分割中也起着重要作用。故本项目通过使用python语言搭建Unet图像分割技术实现对植物病虫害区域的分割。其简单训练几轮后的模型效果如下图可见
1.基本介绍
1.1 环境要求
本次环境使用的是python3.6.5windows平台。主要用的库有
opencv模块。在计算机视觉项目的开发中opencv作为较大众的开源库拥有了丰富的常用图像处理函数库采用C/C语言编写可以运行在Linux/Windows/Mac等操作系统上能够快速的实现一些图像处理和识别的任务。
numpy模块。numpy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵比Python自身的嵌套列表结构(nested list structure)要高效得多(该结构也可以用来表示矩阵(matrix))。
pytorch模块。pytorch是一个基于Torch的Python开源机器学习库用于自然语言处理等应用程序。它主要由Facebookd的人工智能小组开发不仅能够 实现强大的GPU加速同时还支持动态神经网络这一点是现在很多主流框架如TensorFlow都不支持的。PyTorch提供了两个高级功能1.具有强大的GPU加速的张量计算如Numpy 2.包含自动求导系统的深度神经网络 除了Facebook之外Twitter、GMU和Salesforce等机构都采用了pytorch。
visdom模块。visdom一个灵活的可视化工具可用来对于 实时富数据的 创建组织和共享。支持Torch和numpy还有pytorch。visdom 可以实现远程数据的可视化对科学实验有很大帮助。我们可以远程的发送图片和数据并进行在ui界面显示出来检查实验结果或者debug。
1.2 Unet模型介绍
U-Net 网络模型是在 2015 年由 Ronneberger 等人提出的。U-Net 基于全卷积网络 FCN其网络结构与 FCN 相似都采用了编码器和解码器以及跳跃连接的拓扑结构能够实现在少量训练图像上进行更加精准的分割。但是 U-Net 与 FCN 不同之处在于 U-Net 网络是左右对称的。其左侧是用于捕获上下文信息的收缩路径网络右侧是用于精确定位的扩张路径与收缩路径对称以恢复图像大小。编码器对应层的输出特征图经复制、裁减后与反卷积后的特征图通过跳跃连接进行特征融合然后作为下一层的输入继续上采样。U-Net 网络在上采样过程中有大量的特征通道这使得网络能够将上下文信息传到更高分辨率的层。
2.模型搭建
2.1数据集准备
首先我们使用labelme工具对需要准备好的数据集进行处理标注。生成对应的json文件放置同一目录即可。其中labelme可以实现对图像进行多边形矩形圆形多段线线段点形式的标注可用于目标检测图像分割等任务。处理格式如下
2.2模型创建
U-Net 网络模型结构主要包括编码器、解码器和跳跃连接部分。编码器用于抽象特征、提取信息解码器部分使得图像逐步恢复原始尺寸而跳跃连接则将不同层次的特征进行了融合。在这里我们使用segmentation_models_pytorch库实现对unet的直接调用
其中UNet编解码器初始化代码如下
def __init__(self,encoder_name: str resnet34,encoder_depth: int 5,encoder_weights: Optional[str] imagenet,decoder_use_batchnorm: bool True,decoder_channels: List[int] (256, 128, 64, 32, 16),decoder_attention_type: Optional[str] None,in_channels: int 3,classes: int 1,activation: Optional[Union[str, callable]] None,aux_params: Optional[dict] None,):super().__init__()self.encoder get_encoder(encoder_name,in_channelsin_channels,depthencoder_depth,weightsencoder_weights,)self.decoder UnetDecoder(encoder_channelsself.encoder.out_channels,decoder_channelsdecoder_channels,n_blocksencoder_depth,use_batchnormdecoder_use_batchnorm,centerTrue if encoder_name.startswith(vgg) else False,attention_typedecoder_attention_type,)self.segmentation_head SegmentationHead(in_channelsdecoder_channels[-1],out_channelsclasses,activationactivation,kernel_size3,)2.3 模型训练
设置模型基本参数其中包括学习率batchsize迭代次数损失值等初始化。UNet 网络及大部分使用 Relu 函数进行激活能够有效避免和纠正梯度消失问题。
def __init__(self, model):self.num_workers 0self.batch_size {train: 8, val:1}self.accumulation_steps 32 // self.batch_size[train]self.lr 1e-3self.num_epochs 100self.best_loss float(inf)self.best_dice float(0)self.phases [train, val]self.device torch.device(cuda:0)torch.set_default_tensor_type(torch.cuda.FloatTensor)self.net modelself.criterion nn.BCEWithLogitsLoss()self.optimizer optim.Adam(self.net.parameters(), lrself.lr)self.scheduler ReduceLROnPlateau(self.optimizer, modemin, patience4, verboseTrue)self.net self.net.to(self.device)cudnn.benchmark Trueself.dataloaders {phase: provider(image_pathimage_path,phasephase,mean(0.485, 0.456, 0.406),std(0.229, 0.224, 0.225),batch_sizeself.batch_size[phase],num_workersself.num_workers,)for phase in self.phases}self.losses {phase: [] for phase in self.phases}self.iou_scores {phase: [] for phase in self.phases}self.dice_scores {phase: [] for phase in self.phases}
2.4模型评估
损失函数是神经网络寻找最优权重参数的指标。常用的损失函数有均方误差、交叉熵损失函数等。U-Net 网络中使用了交叉熵损失函数在最后的特征图上通过像素级的 soft-max进行计算。Loss可以通过标准二值交叉熵binary cross-entropy和 Dice 损失计算这是评估图像分割成功与否的常用性能标准。交并比IoU 是基于像素的评价标准通常用于评估分割性能。这里考虑了目标矩阵与结果矩阵之间的不同像素比。这个度量与Dice计算也有关。
def __init__(self, phase, epoch):self.base_threshold 0.5 # heres the thresholdself.base_dice_scores []self.dice_neg_scores []self.dice_pos_scores []self.iou_scores []
def update(self, targets, outputs):probs torch.sigmoid(outputs)dice, dice_neg, dice_pos, _, _ metric(probs, targets, self.base_threshold)self.base_dice_scores.append(dice)self.dice_pos_scores.append(dice_pos)self.dice_neg_scores.append(dice_neg)preds predict(probs, self.base_threshold)iou compute_iou_batch(preds, targets, classes[1])self.iou_scores.append(iou)
def get_metrics(self):dice np.mean(self.base_dice_scores)dice_neg np.mean(self.dice_neg_scores)dice_pos np.mean(self.dice_pos_scores)dices [dice, dice_neg, dice_pos]iou np.nanmean(self.iou_scores)return dices, iou2.5可视化
通过设置visdom模块中的provider建立训练过程中的可视化然后使用命令“python -m visdom.server”实现浏览器访问训练过程。
def provider(image_path, phase, meanNone, stdNone, batch_size4, num_workers0,
):image_list glob(os.path.join(image_path, *))train_idx, val_idx train_test_split(range(len(image_list)), random_state4396, test_size0.1)index train_idx if phase train else val_idxdataset CatDataset(index, image_list, phasephase)dataloader DataLoader(dataset, batch_sizebatch_size, num_workersnum_workers, pin_memoryTrue, shuffleTrue,)return dataloader完整代码
链接https://pan.baidu.com/s/11quQOLw7uIP-JJ8LPBIIuQ
提取码dyrt
作者简介
李秋键CSDN博客专家CSDN达人课作者。硕士在读于中国矿业大学开发有taptap竞赛获奖等。