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,一经查实,立即删除!

相关文章

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

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

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

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

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

钉工牌将工作身份验证与支付功能相整合&#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;这里主要介绍一…

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

简介&#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;游戏行业在当今的互联网…

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

简介&#xff1a; 架构师一定要有技术的广度。大家一定要学会积累&#xff0c;积累到一定的程度以后&#xff0c;你会做到无师自通。 先自我介绍一下&#xff0c;我叫道延&#xff0c; 2014年进入阿里&#xff0c;在阿里通信呆了接近两年。2016年底到了业务平台&#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;数据暴露面、…

滴滴 Flink-1.10 升级之路

简介&#xff1a; 滴滴实时计算引擎从 Flink-1.4 无缝升级到 Flink-1.10 版本&#xff0c;做到了完全对用户透明。并且在新版本的指标、调度、SQL 引擎等进行了一些优化&#xff0c;在性能和易用性上相较旧版本都有很大提升。 一、 背景 在本次升级之前&#xff0c;我们使用的…

苹果新算法已混进 iOS 14.3!CSAM 检测技术再遭网友争议

整理 | 禾木木出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;苹果宣布即将推出 CSAM 检测系统时&#xff0c;遭到了 4000 多个组织及个人的公开反对&#xff0c;他们质疑苹果会破坏用户隐私和端到端加密机制。一位 Reddit 用户发现 CSAM 算法竟已被悄悄地隐…

数字化时代,阿里云云效如何构建下一代研发协作工具平台?

简介&#xff1a; 本次分享主要由四部分组成&#xff1a; 1、企业在成长过程中遇到的研发效能困境&#xff1b; 2、研发管理从信息化走向数字化的路径&#xff0c;以及背后的逻辑&#xff1b; 3、云原生和 AI 两项新技术在研发平台上的落地&#xff1b; 4、结合阿里巴巴自身案例…

珠海小学计算机比赛,欢聚一堂 共叙佳话 —— 参加珠海市中小学信息技术工作年会纪要...

欢聚一堂 共叙佳话——参加珠海市中小学信息技术工作年会纪要2012年12月22日&#xff0c;香洲区中小学信息技术工作室一行8人赴金湾一小&#xff0c;参加了珠海市教育学会中小学信息技术教学专业委员会组织的第三届年会&#xff0c;会议分为四项议程。一、近两年工作总结上午&a…

安谋科技发布新业务品牌“核芯动力”,先手布局智能计算产业

安谋科技&#xff08;中国&#xff09;有限公司&#xff08;“安谋科技”&#xff09;举行“创芯生&#xff0c;赋未来” 新业务品牌战略发布会&#xff0c;重磅发布“双轮驱动”战略以及新业务品牌“核芯动力”。新业务品牌的发布代表安谋科技引领智能计算产业发展趋势、推动计…

技术方案设计的方法论及案例分享

简介&#xff1a; 怎么去体现技术方案设计的深度是大家普遍关心的一个问题&#xff0c;这个问题不是个例问题&#xff0c;因此本文主要分享下作者个人的一些观点和看法。 怎么去体现技术方案设计的深度是大家普遍关心的一个问题&#xff0c;这个问题不是个例问题&#xff0c;因…

第四范式:现代存储架构下的系统优化实践

8月21日&#xff0c;白玉兰开源联合示说网主办的“开源大数据技术线上meetup”特邀约大数据领域的前沿技术专家&#xff0c;就大数据存储的关键技术、挑战和当前应用展开交流讨论&#xff0c;阵容强大、内容全面。第四范式体系架构科学家&#xff0c;高性能计算Team leader卢冕…

穿越疫情,阿里云3000万补贴助力中小企业寒冬突围

简介&#xff1a; 2021年&#xff0c;活下去&#xff0c;是所有中小企业的一致心愿。冬将尽&#xff0c;春将来。我们也都在迫切等待着百花齐放的春天到来&#xff0c;阿里云愿和广大中小企业一起守望相助&#xff0c;共待山河无恙&#xff0c;春暖花开&#xff01; 简介&#…