当前位置: 首页 > 编程日记 > 正文

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竞赛获奖等。

相关文章:

SilverLight 4页面跳转大全

http://blog.csdn.net/lihaiyin/article/details/5674766 //Silverlight页面的跳转 //(Application.Current.RootVisual as IContent).Content new DragControl(); //普通页面跳转 HtmlWindow html HtmlPage.Window; //html.Navigate(new Uri("http://www.0379zd.co…

Linux 性能监控常用命令

工具简单介绍top查看进程活动状态以及一些系统状况vmstat查看系统状态、硬件和系统信息等iostat查看CPU 负载&#xff0c;硬盘状况sar综合工具&#xff0c;查看系统状况mpstat查看多处理器状况netstat查看网络状况iptraf实时网络状况监测tcpdump抓取网络数据包&#xff0c;详细…

jquery 1.6以上版本 全选

2019独角兽企业重金招聘Python工程师标准>>> <html xmlns"http://www.w3.org/1999/xhtml"> <head><title>全选&#xff0c;不全选&#xff0c;反选</title><script src"jquery.js" type"text/javascript"…

想提高代码水平,做到这点就够了

【CSDN 编者按】本篇文章来自于《程序员》杂志的一位老读者&#xff0c;他从大学时最深刻的记忆谈起&#xff0c;到编程路上的心得体会&#xff0c;再到对广大年轻程序员的建议&#xff0c;全篇娓娓道来&#xff0c;希望能对大家有所帮助。作者 | 姜宁 华为开源能力中心技术专…

modified: xxx(modified content, untracked content)

from:://http://blog.csdn.net/huguohu2006/article/details/7045052 提交代码到服务器后发现git clone下来的有些目录是空的。 查看服务器的目录果然是空的。看本季git add . 后查看git status modified: xxx(modified content, untracked content) 大概意思是xxx目录没有…

一些JSON相关的函数

JSON作为一种轻量的数据传输格式&#xff0c;越来越受到人们的青睐。下面是我仿照Prototype的一些实现。 JSONFilter:/^///*-secure-([/s/S]*)/*///s*$/, unfilterJSON:function(json,filter) { return json.replace((filter || dom.JSONFilter), function(a,b){ return b |…

太任性!17 岁少年买不到回国机票,因“泄愤”攻击航司系统,被判刑 4 年

整理 | 王晓曼出品 | 程序人生&#xff08;ID&#xff1a;coder _life&#xff09;因买不到回国机票&#xff0c;一气之下&#xff0c;身处境外的17岁少年陈某竟多次、持续攻击某航空公司计算机系统&#xff0c;致使该航空公司对外服务网络全面瘫痪近四小时&#xff0c;5000余万…

hbase2.0.0-安装部署

依赖hadoop 环境&#xff0c;我这边的版本是hadoop-2.6.5 选择hbase2.0.0版本的时候&#xff0c;去官网查看支持的hadoop版本 1、伪分布式安装 下载&#xff1a;http://mirror.bit.edu.cn/apache/hbase/2.0.0-alpha4/ 版本&#xff1a;hbase-2.0.0-alpha4-bin.tar.gz 2、tar -z…

Git详解之二 Git基础

Git 基础 读完本章你就能上手使用 Git 了。本章将介绍几个最基本的&#xff0c;也是最常用的 Git 命令&#xff0c;以后绝大多数时间里用到的也就是这几个命令。读完本章&#xff0c;你就能初始化一个新的代码仓库&#xff0c;做一些适当配置&#xff1b;开始或停止跟踪某些文件…

一致性哈希(Consistent Hashing)

在大型web应用中&#xff0c;缓存可算是当今的一个标准开发配置了。在大规模的缓存应用中&#xff0c;应运而生了分布式缓存系统。分布式缓存系统的基本原理&#xff0c;大家也有所耳闻。key-value如何均匀的分散到集群中&#xff1f;说到此&#xff0c;最常规的方式莫过于hash…

CT片居然可以这么玩:用头部CT断层扫描片复原三维头像

作者&#xff1a;天元浪子 来源&#xff1a;Python作业辅导员前言CT是现代医学影像的主力设备&#xff0c;寻常百姓并不陌生。通常&#xff0c;一张CT片由多张连续断层扫描的图像组成。在医生眼中&#xff0c;CT片展示了人体器官的形态和性质&#xff0c;是判断病人健康状况的重…

Nginx学习笔记(一) Nginx架构

Nginx全程是什么&#xff1f; Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。 daemon守护线程 nginx在启动后&#xff0c;在unix系统中会以daemon的方式在后台运行&#xff0c;后台进程包含一个master…

PXE实现批量部署linux系统

pxe批量部署linux服务器1、pxe介绍PXE是有intel设计的协议&#xff0c;它可以使计算机通过网络启动&#xff0c;协议分为client和server两端&#xff0c;PXEclient在网卡的ROM中&#xff0c;当计算机引导时&#xff0c;BIOS把PXE client调入内存中执行&#xff0c;并显示出命令…

首场见习挑战赛倒计时3天!20000元奖学金瓜分就等你了!

CSDN软件开发精英赛是基于“C认证—软件工程师能力认证考试”而设立的编程比赛&#xff0c;大赛联合广大科技企业设置丰厚礼品及30万元奖学金。从7月22日官宣到今日&#xff0c;短短一个月内&#xff0c;大赛已经吸引了来自全国的2000&#xff0b;开发者参与其中。第一轮“见习…

一致性哈希算法以及其PHP实现

在做服务器负载均衡时候可供选择的负载均衡的算法有很多&#xff0c;包括&#xff1a; 轮循算法&#xff08;Round Robin&#xff09;、哈希算法&#xff08;HASH&#xff09;、最少连接算法&#xff08;Least Connection&#xff09;、响应速度算法&#xff08;Response Time…

Linux入门(四)

目录&#xff1a; 1234567891011121314一、根文件系统层级标准FHS二、bash的基础特性&#xff08;一&#xff09;1.命令历史 2.命令行补全 3.路径补全 4.命令行展开 5.命令执行的状态结果 6.引用 7.快捷键 三、目录管理相关命令mkdir、rmdir、tree四、引用命令的执行结果五、文…

OSI[七层]与TCP/IP[四层]模型简述简图

OSI参考模型&#xff08;OSI/RM&#xff09;的全称是开放系统互连参考模型&#xff08;Open System Interconnection Reference Model&#xff0c;OSI/RM&#xff09;&#xff0c;它是由国际标准化组织&#xff08;International Standard Organization&#xff0c;ISO&#xf…

中国国际消费电子博览会拥抱转型,全新面貌拭目以待!

2021年9月24—26日&#xff0c;第十九届中国国际消费电子博览会&#xff08;简称电博会&#xff09;将在青岛国际会展中心隆重举行&#xff0c;如今距离电博会开幕已不到3个月的时间&#xff0c;全国各地的参展企业跃跃欲试、积极筹备。 长久以来&#xff0c;电博会为全球消费…

Fragment提交transaction导致state loss异常

下面自从Honeycomb发布后&#xff0c;下面栈跟踪信息和异常信息已经困扰了StackOverFlow很久了。 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.j…

ASP网络编程从入门到精通 下载

《ASP网络编程从入门到精通》 清华大学出版社 特点&#xff1a; 面向ASP零基础读者&#xff0c;循序渐进 全面分析ASP技术细节 用代码描述个个知识点&#xff0c;操作性强 通过典型模块设计&#xff0c;体会ASP的奥妙 通过网上商城购物系统&#xff0c;增加项目开发经验 适合的…

项目Makefile文件模板

整理出来的一个Makefile模板,新增了一个内容,调用gcc生成依赖文件,这样如果某个c文件包含的头文件被更新了,该c文件以及依赖于该c文件的obj文件都会被重新编译.这个模板是按照我习惯的项目文件组织形式进行定义的,我的习惯是头文件放在include文件夹,代码放在src文件夹,目标文件…

小撒、金晨都想拥有!百度全球首款汽车机器人亮相,车内躺着看星星

整理 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 金晨坐了都想带回家的车、无人车出行服务、撒贝宁与祝融号对话等等。 这届百度世界大会真的很惊艳。 8月18日&#xff0c;百度与央视新闻联合举办“AI这时代&#xff0c;星辰大海——百度世界大会2021…

解决oracle11g安装导致数据库无法自动搜集统计信息-转

近期发现个别11G数据库无法自动收集统计信息&#xff0c;部分视图查询结果如下&#xff1a; SQL> select client_name,status from dba_autotask_client where client_name auto optimizer stats collection;CLIENT_NAME STATUS -----------------------------------------…

服务器监控--cacti中英文版安装全解

近段时间一直在整服务器监控方面的东西,以下就是cacti中英文版安装的全过程,各安装包基本都是最新的,基于Centos 5.2平台下安装的!!#!/bin/bash# BY kerryhu# QQ:263205768# MAIL:king_819163.com# BLOG:[url]http://kerry.blog.51cto.com[/url]# Please manual operation yum …

lighttpd1.4.18代码分析

lighttpd1.4.18代码分析(八)--状态机(2)CON_STATE_READ状态posted 2008-09-24 10:50 那谁 阅读(2225) | 评论 (1) 编辑 lighttpd1.4.18代码分析(七)--状态机(1)CON_STATE_REQUEST_START状态posted 2008-09-22 15:10 那谁 阅读(2259) | 评论 (0) 编辑 lighttpd1.4.18代码分析…

惊艳亮相!马斯克发布自研超算 Dojo 芯片、特斯拉人形机器人

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 北京时间 8 月 20 日&#xff0c;特斯拉 AI 日终于开始了&#xff01;在活动上不仅推出自研计算机系统Dojo 及 D1 芯片&#xff0c;同时还推出了特斯拉的下一个大型项目&#xff1a;人形机器人&#x…

git revert和git reset的区别

git revert 是撤销某次操作&#xff0c;此次操作之前的commit都会被保留git reset 是撤销某次提交&#xff0c;但是此次之后的修改都会被退回到暂存区具体一个例子&#xff0c;假设有三个commit&#xff0c; git st:commit3: add test3.ccommit2: add test2.ccommit1: add test…

python之深浅拷贝

对于 数字 和 字符串 而言&#xff0c;赋值、浅拷贝和深拷贝无意义&#xff0c;因为其永远指向同一个内存地址。 import copy # ######### 数字、字符串 #########n1 123 # n1 "age 10"print(id(n1)) # ## 赋值 ##n2 n1 print(id(n2)) # ## 浅拷贝 ##n2 copy.cop…

linux:关于Linux系统中 CPU Memory IO Network的性能监测

我们知道&#xff1a;系统优化是一项复杂、繁琐、长期的工作.通常监测的子系统有以下这些&#xff1a;CPUMemoryIONetwork下面是常用的监测工具Linux 系统包括很多子系统&#xff08;包括刚刚介绍的CPU&#xff0c;Memory&#xff0c;IO&#xff0c;Network&#xff0c;等&…

火爆 GitHub!这个 AI 神器究竟有什么魅力?

图像分割&#xff08;image segmentation&#xff09;技术是计算机视觉领域的一个重要的研究方向&#xff0c;图像分割是计算机视觉中的一个关键过程。它包括将视觉输入分割成片段以简化图像分析。片段表示目标或目标的一部分&#xff0c;并由像素集或“超像素”组成。图像分割…