学习淘淘商城第七十九课(LVS+Nginx负载均衡----下篇)

110 篇文章 383 订阅
9 篇文章 1 订阅

       上节课我们一起学习了LVS+Nginx负载均衡DR模式的环境搭建,这节我们一起学习下LVS四层+Nginx七层负载均衡环境的搭建和LVS高可用环境搭建。

LVS四层+Nginx七层负载均衡环境的搭建

       需求:lvs采用DR模式基本上没有性能瓶颈,用户请求输入至lvs经过负载转发到后台服务上,通过后台服务输出响应给用户。nginx的负载性能远没有lvs好,lvs四层+nginx七层负载的好处是最前端是lvs接收请求进行负载转发,由多个nginx共同完成七层负载,这样nginx的负载性能就可以线性扩展。

       环境准备,如下所示,可以看到,与上节课相比多了两台tomcat服务器。

vip:192.168.156.110
lvs-director:192.168.156.35

nginx1:192.168.156.36 安装nginx
nginx2:192.168.156.37 安装nginx

tomcat1:192.168.156.38         安装tomcat
tomcat2:192.168.156.39                 安装tomcat

       lvs-director服务器的搭建与上节课一样,我们用上节课那个lvs-director就可以了,lvs-nginx1和lvs-nginx2与上节课的唯一不同之处是在nginx.conf配置文件中添加了对tomcat的负载均衡设置,如下图所示。(lvs-nginx1和lvs-nginx2的nginx.conf文件都做如下图所示修改


          上图修改的内容如下

upstream tomcat_server_pool{
		server 192.168.156.38:8080;
		server 192.168.156.39:8080;
	}
location / {
            proxy_pass http://tomcat_server_pool;
            index  index.html index.htm;
        }
       由于修改了nginx.conf文件,因此要重启nginx服务

[root@lvs-nginx1 conf]# /usr/local/nginx/sbin/nginx -s reload

[root@lvs-nginx2 conf]# /usr/local/nginx/sbin/nginx -s reload

      下面我们便新建两台虚拟机,IP分别设置成192.168.156.38和192.168.156.39,关于如何新建虚拟机在上节说过了,这里不啰嗦,要安装tomcat,要有JDK环境,关于如何安装JDK及tomcat,大家可以参考http://blog.csdn.net/u012453843/article/details/72599478这篇博客进行学习。为了区分不同的tomcat首页,我们修改下Tomcat的欢迎页内容,大家可以参考http://blog.csdn.net/u012453843/article/details/72599478这篇博客进行修改。

      安装完Tomcat之后,我们访问地址http://192.168.156.110,可以看到我们访问到的tomcat欢迎页出现的规律是两次"lvs-tomcat1"之后是两次"lvs-tomcat2"然后在两次"lvs-tomcat1"如此循环往复,之所以会出现这种请款是因为我们有两个nginx,两个nginx都对两个tomcat进行了负载均衡,两套负载均衡综合在一起便会出现这种现象。如果停止任意一台nginx或停止任意一台tomcat不影响访问。


        这样,LVS四层+Nginx七层负载均衡环境便搭建好了!

LVS高可用环境搭建

       1.什么是高可用?

         lvs作为负载均衡器,所有请求都先到达lvs,可见lvs处于非常重要的位置,如果lvs服务器宕机后端web服务将无法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

        2.keepalived+lvs实现主备

        2.1 什么是keepalived?

        keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
  Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

        2.2  keepalived工作原理

        keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。

        2.3 keepalived+lvs实现主备过程

        2.3.1 集群初始状态


        2.3.2 主机宕机


        2.3.3 主机恢复


         2.4 环境准备

vip:192.168.156.110
lvs-director:192.168.156.35 主lvs
lvs-director:192.168.156.40 备lvs

nginx1:192.168.156.36 安装nginx
nginx2:192.168.156.37 安装nginx

tomcat1:192.168.1.200  安装tomcat(实际的服务器,如果没有实际服务器就用虚拟机代替)
tomcat2:192.168.1.201  安装tomcat(实际的服务器,如果没有实际服务器就用虚拟机代替)
tomcat3:114.55.254.239  安装tomcat(实际的服务器,如果没有实际服务器就用虚拟机代替)

        2.5 安装keepalived

        分别在主备lvs上安装keepalived,关于keepalived的安装,大家可以参考http://blog.csdn.net/u012453843/article/details/72808459这篇博客进行学习。

        2.6 配置keepalived

         2.6.1 修改主lvs下/etc/keepalived/keepalived.conf文件

! Configuration File for keepalived

global_defs {
   notification_email {
     1204507593@qq.com							#发生故障时发送的邮箱
   }
   notification_email_from m13633801872@163.com		#使用哪个邮箱发送
   smtp_server smtp.163.com							#发件服务器
   smtp_connect_timeout 30							#连接smtp连接超时时间
   router_id LVS_DR									#机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}

vrrp_script chk_lvs { 
	script "/etc/keepalived/lvs_check.sh"  	#监测lvs是否健康的脚本
    interval 2  							#每隔两秒检查一次
    weight -20  							#每执行成功一次权重减20
}

vrrp_instance VI_1 {
    state MASTER			#标示为主lvs
    interface eth0			#HA检测端口
    virtual_router_id 51	#主备的virtual_router_id 必须相同
    priority 100			#优先级,备lvs要比主lvs稍小
    advert_int 1			#VRRP Multicast广播周期秒数
    authentication {		#定义认证
        auth_type PASS		#认证方式为口令认证
        auth_pass 1111		#定义口令
    }
	track_script {  
		chk_lvs  			#与上面vrrp_script chk_lvs的名称要一致
    }
    virtual_ipaddress {		#定义VIP
        192.168.156.110		#多个VIP可换行添加
    }
}

virtual_server 192.168.156.110 80 {
    delay_loop 6			#每隔6秒查看realserver状态
    lb_algo wlc				#调度算法为加权最小连接数
    lb_kind DR				#lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50	#同一IP的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP			#用TCP监测realserver的状态

    real_server 192.168.156.35 80 {		#定义realserver
        weight 3						#定义权重
        TCP_CHECK {						#注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
			connect_timeout 3			#连接超时时间为3秒
			nb_get_retry 3				#重连次数3
			delay_before_retry 3		#每次尝试间隔3秒
			connect_port 80				#连接端口号 80
		}
    }
	
	real_server 192.168.156.40 80 {		#定义realserver
        weight 3						#定义权重
        TCP_CHECK {						#注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
			connect_timeout 3			#连接超时时间为3秒
			nb_get_retry 3				#重连次数3
			delay_before_retry 3		#每次尝试间隔3秒
			connect_port 80				#连接端口号 80
		}
    }
}

       2.6.2 修改备lvs下/etc/keepalived/keepalived.conf文件
       配置备lvs时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

global_defs {
   notification_email {
     1204507593@qq.com							#发生故障时发送的邮箱
   }
   notification_email_from m13633801872@163.com		#使用哪个邮箱发送
   smtp_server smtp.163.com							#发件服务器
   smtp_connect_timeout 30							#连接smtp连接超时时间
   router_id LVS_DR_BACK							#机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到
}

vrrp_script chk_lvs { 
	script "/etc/keepalived/lvs_check.sh"  	#监测lvs是否健康的脚本
    interval 2  							#每隔两秒检查一次
    weight -20  							#每执行成功一次权重减20
}

vrrp_instance VI_1 {
    state BACKUP			#标示为备份lvs
    interface eth0			#HA检测端口
    virtual_router_id 51	#主备的virtual_router_id 必须相同
    priority 99				#优先级,备lvs要比主lvs稍小
    advert_int 1			#VRRP Multicast广播周期秒数
    authentication {		#定义认证
        auth_type PASS		#认证方式为口令认证
        auth_pass 1111		#定义口令
    }
	track_script {  
		chk_lvs  			#与上面vrrp_script chk_lvs的名称要一致
    }
    virtual_ipaddress {		#定义VIP
        192.168.156.110		#多个VIP可换行添加
    }
}

virtual_server 192.168.156.110 80 {
    delay_loop 6			#每隔6秒查看realserver状态
    lb_algo wlc				#调度算法为加权最小连接数
    lb_kind DR				#lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.0
    persistence_timeout 50	#同一IP的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP			#用TCP监测realserver的状态

    real_server 192.168.156.35 80 {		#定义realserver
        weight 3						#定义权重
        TCP_CHECK {						#注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
			connect_timeout 3			#连接超时时间为3秒
			nb_get_retry 3				#重连次数3
			delay_before_retry 3		#每次尝试间隔3秒
			connect_port 80				#连接端口号 80
		}
    }
	
	real_server 192.168.156.40 80 {		#定义realserver
        weight 3						#定义权重
        TCP_CHECK {						#注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
			connect_timeout 3			#连接超时时间为3秒
			nb_get_retry 3				#重连次数3
			delay_before_retry 3		#每次尝试间隔3秒
			connect_port 80				#连接端口号 80
		}
    }
}

       在/etc/keepalived目录下我们新建上面提到的lvs_check.sh脚本,为方便编辑我们还是使用NodePad++来操作,脚本内容如下:

#!/bin/sh  
aa=`ipvsadm -ln`
str="Route"
bb=`echo $aa|grep $str|wc -l`
if [ $bb = 0 ];then
	service lvsdr start
	sleep 3
	aa=`ipvsadm -ln`
	bb=`echo $aa|grep $str|wc -l`
	if [ $bb = 0 ];then
		killall keepalived
	fi
fi
          下面我来解释下上面脚本的意思,其中aa=`ipvsadm -ln`用于查看lvs是否处于启动状态

           当lvs没有启动时,回显信息如下

[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.156.110:80 wlc persistent 50
[root@lvs-dr keepalived]#
           当lvs处于启动状态时,回显信息如下:可以看到,与上面的信息相比,多了两行(192.168.156.36:80            Route   1      0          0和192.168.156.37:80            Route   1      0          0)。

[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.156.110:80 rr
  -> 192.168.156.36:80            Route   1      0          0         
  -> 192.168.156.37:80            Route   1      0          0         
[root@lvs-dr keepalived]#
         脚本中str="Route"的意思是,如果lvs启动了,那么多出的两行信息中包含"Route"字符串,而没有启动lvs时是没有"Route"信息的,因此"Route"成了判断条件。

         脚本中bb=`echo $aa|grep $str|wc -l`这句代码的意思是判断"ipvsadm -ln"命令的回显信息中包含"Route"的个数。如果是0就代表lvs没有启动,如果大于0就代表lvs已经启动了。

         下面两行代码的意思就是如果lvs没有启动,那么就启动lvs服务

if [ $bb = 0 ];then
	service lvsdr start
        下面几行代码的意思是,我们启动lvs服务后停3秒后再次判断"ipvsadm -ln"的回显信息中是否包含"Route",要判断当前是否包含就必须重新获取回显信息并且重新获取包含数量,如果还是没有包含的话,说明lvs没有正常启动,这时便杀掉主设备的keepalived进程,让备份keepalived进行工作。

	sleep 3
	aa=`ipvsadm -ln`
	bb=`echo $aa|grep $str|wc -l`
	if [ $bb = 0 ];then
		killall keepalived
	fi
            写完脚本我们要确保该脚本的格式为unix格式,关于如何做,前面已经说过了,这里不再啰嗦。

            我们还需要给该脚本添加执行权限:

[root@lvs-dr keepalived]# chmod +x lvs_check.sh
             添加完权限后,可以看到脚本的颜色变深绿色了。


              注意:在两台lvs服务器的/etc/keepalived目录下都添加lvs_check.sh脚本。

            2.7 测试

             先确保没有启动keepalived和lvs,然后使用命令service keepalived start来启动主备keepalived服务,启动完之后,我们使用命令"ipvsadm -ln"来查看lvs的启动状态,发现正常启动了。

[root@lvs-dr keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.156.110:80 rr
  -> 192.168.156.36:80            Route   1      1          0         
  -> 192.168.156.37:80            Route   1      1          0         
[root@lvs-dr keepalived]#
            这时我们使用ip a来查看下虚拟IP,先来看主lvs设备的虚拟IP信息,如下图所示,发现是有虚拟IP(192.168.156.110)的。


          接着,我们再来看下备份lvs设备的虚拟IP信息,如下图所示,发现在eth0这个接口上并没有虚拟IP,在eth0:0上有这个虚拟IP。

           出现这种情况似乎与我们想象的不太一样,为了与我们想象的结果一样,我们可以先把主lvs设备的keepalived服务关闭,然后关掉备份lvs设备的keepalived服务之后重启备份lvs设备的keepalived服务。为了让虚拟IP回到主lvs设备上,这时我们再启动主lvs设备的keepalived服务。这时我们再看备份lvs设备,就与我们想象的一致了。


           下面我们来测试访问tomcat首页,我们需要在lvs-nginx1和lvs-nginx2两台设备上修改nginx的配置文件,两台设备修改的内容一样,如下图所示。


         修改的内容如下

upstream loadbalance {
		server 192.168.1.200:8086;
		server 192.168.1.201:8086;
		server 114.55.254.239:8086;
	}
location / {
            proxy_pass http://loadbalance;
            index  index.html index.htm;
        }

          由于nginx修改了配置文件,因此我们需要重启lvs-nginx1和lvs-nginx2两台服务器

[root@lvs-nginx1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@lvs-nginx2 ~]# /usr/local/nginx/sbin/nginx -s reload
          为了区分三台不同的设备上的tomcat首页,我对tomcat首页进行了标记,这个前面也说过了,这里不啰嗦了。

          现在我们便来访问虚拟IP192.168.156.110,刷新它,就会发现我们在tomcat1、tomcat2、tomcat3之间均匀切换,说明负载是起作用的。


            为了测试高可用性,我们可以杀掉主keepalived服务,如下

[root@lvs-dr keepalived]# service keepalived stop
停止 keepalived:                                          [确定]
[root@lvs-dr keepalived]#
          我们继续访问虚拟IP,发现是没有问题的,我们再重新启动主lvs设备的服务,发现虚拟IP就又回到了主服务器。与我们所画的图是一致的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
淘淘商城是一个综合性的B2C平台,类似与京东、天猫商城,其打造的是商业模式为“社区+电子商务”, 用户不只是在社区中有自己的圈子,还可以将电商加入到社区中,整个电商网站实现的功能非常之多,采用分布式的系统架构设计,包括后台管理、前台系统、购物车系统、订单系统、单点登录系统、搜索系统、会员系统等。 1、 该项目采用了分布式系统的架构,目前,在大型网站中使用非常广泛。 2、 各个系统之间采用接口调用的方式进行交互,即:面向服务的开发,每个团队、系统,分工明确,各司其职。 3、 后台系统使用了目前主流的框架技术,Spring、SpringMVC、Mybatis实现,开发更有效率,网站性能更高。 4、 后台系统中的前端UI采用了Jquery EasyUI完成,界面更加的美观。 5、 系统后台使用多级菜单布局,并使用KindEditor框架作为富文本编辑器。 6、 前台系统中采用CSS+DIV技术开发界面,使用Jquery完成和动态效果和后台服务的数据交互。 7、 项目引入了内容关系系统的概念,实现了对网站大部分内容的管理维护,使开发更加的高效。 8、 使用单点登录系统(SSO)来实现集群状态下的用户数据的维护。 9、 使用高性能的KV数据库Redis完成数据的存储以及缓存,提高数网站整体的性能。 10、 使用企业级开源系统Solr完成商品以及订单数据的搜索。 11、 在数据库存储方面使用MySQL的主从复制架构,使用Spring的AOP实现数据的读写分离,以保证在“读多写少”的场景下的高性能。 12、 使用高性能的企业级消息系统RabbitMQ,完了系统间的通信,使得系统间的耦合度大大降低。 13、 部署方面使用LVS + keepalived + Nginx实现了双机主备、双主热备,实现了一个高可用的系统架构。 14、 项目开发采用团队式的开发,统一使用Maven私服构建项目,使用统一的SVN服务进行代码的管理。 【程内容】 项目功能实现分析 RESTful Web Service、SVN 项目讲解、环境搭建 后台系统功能实现 前台系统搭建、实现、内容管理系统实现 Redis入门 单点登录系统 订单系统、Quartz入门 Solr入门以及搜索系统实现 MQ学习、改造搜索、商品详情缓存逻辑 实现购物车、读写分离 dubbo入门、优化单点登录系统 分布式部署架构讲解以及实施 分组实战 + 项目总结以及就业指导 拔高--Redis集群、Tomcat优化、MySQL优化
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
1 目标检测的定义 目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。 目标检测任务可分为两个关键的子任务,目标定位和目标分类。首先检测图像中目标的位置(目标定位),然后给出每个目标的具体类别(目标分类)。输出结果是一个边界框(称为Bounding-box,一般形式为(x1,y1,x2,y2),表示框的左上角坐标和右下角坐标),一个置信度分数(Confidence Score),表示边界框中是否包含检测对象的概率和各个类别的概率(首先得到类别概率,经过Softmax可得到类别标签)。 1.1 Two stage方法 目前主流的基于深度学习的目标检测算法主要分为两类:Two stage和One stage。Two stage方法将目标检测过程分为两个阶段。第一个阶段是 Region Proposal 生成阶段,主要用于生成潜在的目标候选框(Bounding-box proposals)。这个阶段通常使用卷积神经网络(CNN)从输入图像中提取特征,然后通过一些技巧(如选择性搜索)来生成候选框。第二个阶段是分类和位置精修阶段,将第一个阶段生成的候选框输入到另一个 CNN 中进行分类,并根据分类结果对候选框的位置进行微调。Two stage 方法的优点是准确度较高,缺点是速度相对较慢。 常见Tow stage目标检测算法有:R-CNN系列、SPPNet等。 1.2 One stage方法 One stage方法直接利用模型提取特征值,并利用这些特征值进行目标的分类和定位,不需要生成Region Proposal。这种方法的优点是速度快,因为省略了Region Proposal生成的过程。One stage方法的缺点是准确度相对较低,因为它没有对潜在的目标进行预先筛选。 常见的One stage目标检测算法有:YOLO系列、SSD系列和RetinaNet等。 2 常见名词解释 2.1 NMS(Non-Maximum Suppression) 目标检测模型一般会给出目标的多个预测边界框,对成百上千的预测边界框都进行调整肯定是不可行的,需要对这些结果先进行一个大体的挑选。NMS称为非极大值抑制,作用是从众多预测边界框中挑选出最具代表性的结果,这样可以加快算法效率,其主要流程如下: 设定一个置信度分数阈值,将置信度分数小于阈值的直接过滤掉 将剩下框的置信度分数从大到小排序,选中值最大的框 遍历其余的框,如果和当前框的重叠面积(IOU)大于设定的阈值(一般为0.7),就将框删除(超过设定阈值,认为两个框的里面的物体属于同一个类别) 从未处理的框中继续选一个置信度分数最大的,重复上述过程,直至所有框处理完毕 2.2 IoU(Intersection over Union) 定义了两个边界框的重叠度,当预测边界框和真实边界框差异很小时,或重叠度很大时,表示模型产生的预测边界框很准确。边界框A、B的IOU计算公式为: 2.3 mAP(mean Average Precision) mAP即均值平均精度,是评估目标检测模型效果的最重要指标,这个值介于0到1之间,且越大越好。mAP是AP(Average Precision)的平均值,那么首先需要了解AP的概念。想要了解AP的概念,还要首先了解目标检测中Precision和Recall的概念。 首先我们设置置信度阈值(Confidence Threshold)和IoU阈值(一般设置为0.5,也会衡量0.75以及0.9的mAP值): 当一个预测边界框被认为是True Positive(TP)时,需要同时满足下面三个条件: Confidence Score > Confidence Threshold 预测类别匹配真实值(Ground truth)的类别 预测边界框的IoU大于设定的IoU阈值 不满足条件2或条件3,则认为是False Positive(FP)。当对应同一个真值有多个预测结果时,只有最高置信度分数的预测结果被认为是True Positive,其余被认为是False Positive。 Precision和Recall的概念如下图所示: Precision表示TP与预测边界框数量的比值 Recall表示TP与真实边界框数量的比值 改变不同的置信度阈值,可以获得多组Precision和Recall,Recall放X轴,Precision放Y轴,可以画出一个Precision-Recall曲线,简称P-R
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值