Unet网络实现叶子病虫害图像分割

作者|李秋键

出品|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.5+windows平台。主要用的库有:

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_channels=in_channels,depth=encoder_depth,weights=encoder_weights,)self.decoder = UnetDecoder(encoder_channels=self.encoder.out_channels,decoder_channels=decoder_channels,n_blocks=encoder_depth,use_batchnorm=decoder_use_batchnorm,center=True if encoder_name.startswith("vgg") else False,attention_type=decoder_attention_type,)self.segmentation_head = SegmentationHead(in_channels=decoder_channels[-1],out_channels=classes,activation=activation,kernel_size=3,)

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(), lr=self.lr)self.scheduler = ReduceLROnPlateau(self.optimizer, mode="min", patience=4, verbose=True)self.net = self.net.to(self.device)cudnn.benchmark = Trueself.dataloaders = {phase: provider(image_path=image_path,phase=phase,mean=(0.485, 0.456, 0.406),std=(0.229, 0.224, 0.225),batch_size=self.batch_size[phase],num_workers=self.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 # <<<<<<<<<<< here's 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, iou

2.5可视化

通过设置visdom模块中的provider建立训练过程中的可视化,然后使用命令“python -m visdom.server”实现浏览器访问训练过程。

def provider(image_path, phase, mean=None, std=None, batch_size=4, num_workers=0,
):image_list = glob(os.path.join(image_path, "*"))train_idx, val_idx = train_test_split(range(len(image_list)), random_state=4396, test_size=0.1)index = train_idx if phase == "train" else val_idxdataset = CatDataset(index, image_list, phase=phase)dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=num_workers, pin_memory=True, shuffle=True,)return dataloader

完整代码:

链接:https://pan.baidu.com/s/11quQOLw7uIP-JJ8LPBIIuQ

提取码:dyrt

作者简介:

李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你女朋友在买买买时,程序员小哥在干嘛?

年货节来了&#xff0c;你女朋友下单了吗&#xff1f; 观看直播已经成为人们日常上网的习惯之一&#xff0c;直播购物作为其中的重要项目&#xff0c;销售额屡创新高。最近&#xff0c;天猫年货节刚刚开幕&#xff0c;淘宝直播中就涌入了不少的用户前来抢购&#xff0c;毕竟足…

阿里毕玄:提升代码能力的4段经历

简介&#xff1a; 对于程序员而言&#xff0c;我始终认为代码是展现能力的关键。一个优秀程序员写的代码&#xff0c;和一个普通程序员写的代码是很容易看出差别的&#xff0c;代码是展示程序员硬实力的名片。如何提升写代码的能力&#xff0c;始终是一个关键的话题&#xff0c…

c语言 cstring “+”: 运算符不起任何作用;应输入带副作用的运算符_国家计算机二级考试C语言选择题高频考点汇总,干货满满...

【考点1】C语言的构成1.源程序由函数构成&#xff0c;每个函数完成相对独立的功能。2.每个源程序中必须有且只能有一个主函数&#xff0c;可以放在任何位置&#xff0c;但程序总是从主函数开始执行。3.函数体&#xff1a;在函数后面用一对花括号括起来的部分。4.每个语句以分号…

计算机教室卡通画,电脑绘画对彩色童年的应用

《电脑绘画对彩色童年的应用》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《电脑绘画对彩色童年的应用(3页珍藏版)》请在人人文库网上搜索。1、电脑绘画对彩色童年的应用平果县第五小学 黄江红1人文情怀绘画作为一种文化载体充分体现着人的价值取向。小学生电脑绘画…

钉钉推出“钉工牌”,门禁、差旅、员工福利一码通用

钉工牌将工作身份验证与支付功能相整合&#xff0c;不同于传统物理工牌&#xff0c;它是一张数字时代的“活”工牌。 编辑 | 宋慧 出品 | CSDN云计算 8月24日&#xff0c;钉钉向1700万企业组织正式推出“钉工牌”。企业开通此项功能后&#xff0c;员工可以用手机里的数字工牌刷…

快速了解云原生架构

简介&#xff1a; 云原生架构本质上也是一种软件架构&#xff0c;最大的特点是在云环境下运行&#xff0c;也算是微服务的一种延伸。 起源 1. 云原生&#xff08;Cloud Native&#xff09;的由来 云原生的概念最早开始于 2010 年&#xff0c;在当时 Paul Fremantle 的一篇博…

class传参 python_Python 初学者必备的常用内置函数

本文纲要Python 作为一门高级编程语言&#xff0c;为我们提供了许多方便易用的内置函数&#xff0c;节省了不少开发应用的时间。目前&#xff0c;Python 3.7 共有 69 个内置函数&#xff0c;一些是我们耳熟能详的函数&#xff0c;另一些却不是很常见&#xff0c;这里主要介绍一…

爱计算机辅助筛查肺结节,计算机辅助检测系统提高CT肺结节检出方式的研究

摘要&#xff1a;目的:通过对比研究计算机辅助检测系统(CAD)作为第二阅读者,同步阅读者筛查肺结节的方式,探索到适合临床推广应用的CAD辅助方式.方法:纳入60例MDCT检查肺部有结节的体检者.4位放射科医生阅读图像3次并进行标记,同时采用计时器计算时间.第一次,医生无CAD辅助方式…

线上流量越发昂贵,如何通过裂变营销实现业务增长?

简介&#xff1a; 公域流量流量越来越聚集于头部的媒体同时投放的费用越来越高。如&#xff1a;在游戏电商或金融行业&#xff0c;在广告投放拉新方面成本达到了100元左右。除了头部媒体的流量以外&#xff0c;在中长尾的流量上&#xff0c;这部分虽然成本低&#xff0c;但转化…

钉钉总裁不穷首谈产品观:To B产品用户不只是CEO

编辑 | 宋慧 出品 | CSDN云计算 头图 | 钉工牌发布现场图 8月24日&#xff0c;钉钉正式对外发布首个数字工牌产品“钉工牌”&#xff0c;这是行业内首个整合了工作身份验证与支付功能的数字工牌产品。以钉工牌为产品思考的原点&#xff0c;阿里巴巴集团副总裁、钉钉总裁叶军&a…

Serverless在游戏运营行业进行数据采集分析的最佳实践

简介&#xff1a; 这个架构不光适用于游戏运营行业&#xff0c;其实任何大数据采集传输的场景都是适用的&#xff0c;目前也已经有很多客户正在基于Serverless的架构跑在生产环境&#xff0c;或者正走在改造Serverless 架构的路上。 众所周知&#xff0c;游戏行业在当今的互联网…

c++折线平移算法_RSA笔记-蒙哥马利算法(1)

有些想补充的内容&#xff0c;但不好直接在初始的那一篇里改。因为那里讲得太细致了&#xff0c;是一步步讲得&#xff0c;要想再塞点别的东西进去就杂乱无章或喧宾夺主了。。所以重开一篇&#xff0c;后续有什么问题&#xff0c;都在这里更新。不是说细节我都明白透了&#xf…

高中计算机教学设计案例分析,高一年级信息技术教学设计(案例)

《高一年级信息技术教学设计(案例)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《高一年级信息技术教学设计(案例)(6页珍藏版)》请在人人文库网上搜索。1、高一 年级信息技术教学设计(案例)学校名称&#xff1a;思南县第八中学 姓名&#xff1a;卢娜 时间&#xff…

软件研发效能度量团体标准获得立项

在数字化转型浪潮下&#xff0c;软件研发团队持续、高效、高质交付的能力&#xff0c;已成为企业竞争力的关键要素。研发效能应当如何定义&#xff1f;透明、客观、全面的效能度量指标体系应当如何建立&#xff1f;效能度量应当如何应用&#xff0c;才能让这些数据真正成为研发…

我对技术架构的理解与架构师角色的思考

简介&#xff1a; 架构师一定要有技术的广度。大家一定要学会积累&#xff0c;积累到一定的程度以后&#xff0c;你会做到无师自通。 先自我介绍一下&#xff0c;我叫道延&#xff0c; 2014年进入阿里&#xff0c;在阿里通信呆了接近两年。2016年底到了业务平台&#xff0c;当时…

0到1:闲鱼高复杂度高性能社区圈子开发实录

简介&#xff1a; 鱼乐圈上线啦&#xff5e; 闲鱼会玩社区的重要阵地&#xff1a;会玩圈子今年年初已经上线啦~ 作为一款承载着「基于兴趣聚集同好人群」的社区型产品&#xff0c;相较于常规导购型产品来说&#xff0c;在业务复杂度、交互复杂度、性能体验稳定性要求上都要高出…

2018年计算机CPU纳米制程,联发科疯狂堆核计划曝光:7纳米制程,12核CPU

【PConline 资讯】联发科疯狂堆核的脚步并未停歇&#xff0c;在商用量产10纳米十核处理器——Helio X30之后&#xff0c;联发科瞄准了更先进的制程、更密集的CPU核心。据台湾电子时报(DIGITIMES)消息&#xff0c;联发科将首次集成12核CPU&#xff0c;预计第二季度由台积电的7纳…

佳能hdr_烧设备无止境不代表随时败家,佳能EOS 5D4“闲鱼”翻身取代200D

2019年最后一天马上翻篇&#xff0c;想过去看今朝我此起彼伏。待到明年赏花浪漫时&#xff0c;我希望我会笑得更开心一点。今天跟大伙说说刚从闲鱼入手的5D4。烧设备可以&#xff0c;烧相机要出人命&#xff0c;看大佬们三天两头往家里败镜头&#xff0c;我的荷包可撑不住。第一…

浅谈数据中台安全体系构建思路

作者&#xff1a;王振东来源&#xff1a;绿盟科技 战略规划部 摘要数据中台是大数据业务体系数据规约化建设的核心场景&#xff0c;数据中台既搭建大量数据归集的相关设施&#xff0c;又针对数据开展大量治理、运维、分析、加工、共享、开放等交互事务&#xff0c;数据暴露面、…

MaxCompute Tunnel 技术原理及开发实战

简介&#xff1a; MaxCompute&#xff08;原名ODPS&#xff09;是一种快速、完全托管的EB级数据仓库解决方案, 致力于批量结构化数据的存储和计算&#xff0c;为用户提供数据仓库的解决方案及分析建模服务。Tunnel是MaxCompute提供的数据传输服务&#xff0c;提供高并发的离线数…