python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
Two-Step Vertification required:
Please enter the mobile app OTPverification code:
01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话,每次会话要输入一次验证码。
总共5台服务器,每个服务器执行5个常规命令,其中一个服务器执行一个特殊命令 5*5+1=26
那么我就要输入26次验证码,验证码每30秒变更一次。每个验证码能用2,3次。
02.验证码肯定要输入的,那么就输入一次,把所有命令操作打包成一次会话执行所有命令,命令包含回车等操作符。
把命放在列表中,当然用循环拼接字符串,一个一个写也可以,但太长可能会写错。
不讲这么多,上脚本主题
# #-*-coding:utf-8-*-
'''000.导入包'''# from posixpath import split
#001.SSH连接堡垒机,输入命令返回结果到txt文件的包
import util.exe_ssh as es
#002.构建截图窗口的包
import util.ssh_windows as sw
#003.向巡检报告插入图片的包
import util.insert_image as ii
#004.删除txt,png的包
import util.dele_file as df
#005.时间的包
import time
#006.存储ip,端口,账号,密码,文件地址信息的类
import entity.ssh_info as si
#007.创建命令列表的包
import util.create_command_list as ccl'''100.变量'''
#101.获取当天的年月日
current_time = time.strftime('%Y-%m-%d',time.localtime(time.time()))
#102.我所有登录信息话在ssh_access类里面,通过对象调用变量参数
ssh_obj = si.ssh_access()
#103.单纯文件名
file_name = ssh_obj.file_name
#104.文件的后序docx#
seq_name = ssh_obj.seq_name
#105.存放巡检报告的目录
default_path = ssh_obj.default_path
#106.巡检报告模板的地址
origen_path = default_path+"\\"+file_name+seq_name
#107.重命名巡检模板的巡检报告的地址
rename_path = default_path+"\\"+current_time+"\\"+file_name+current_time+seq_name
#108.putty,因为做一个假的putty窗口,putty图标的位置
icon_path=ssh_obj.icon_path
#109.存放命令返回结果txt文件的目录位置
txt_path=ssh_obj.txt_path
#110.访问堡垒机的ip地址
ip = ssh_obj.ip
#111.访问堡垒机的端口
port=ssh_obj.port
#112.访问堡垒机的账号
account=ssh_obj.account
#113.访问堡垒机的密码
pwd=ssh_obj.pwd
#114.服务器ip地址的列表
#115存ip的列表
fwq_name = []
for value in ssh_obj.ip_dic.values():fwq_name.append(value)
'''print("fwq_name的内容")'''
'''print(fwq_name)'''
#116.存放需要命令的列表
fwq_command=ssh_obj.command_list
'''print("fwq_command的内容")'''
'''print(fwq_command)'''
#117.服务器中文搜索的列表
fwq_search_name=[]
for key in ssh_obj.ip_dic.keys():fwq_search_name.append(key)
'''print("fwq_search_name的内容")'''
'''print(fwq_search_name)'''
#118.存放写入txt的目录
fwq_pre_txt_address = ssh_obj.fwq_pre_txt_address
'''print("fwq_pre_txt_address的内容")'''
'''print(fwq_pre_txt_address)'''
#119.存放截图的目录
fwq_pre_img_address = ssh_obj.fwq_pre_img_address
#120.单次会话所有输入命令的列表
full_fwq_name_command_list=ccl.get_fwq_full_name_command_list(fwq_search_name,fwq_command)'''200.业务代码'''
#连接堡垒机,SSH连接返回命结果到txt文件
es.command2txt(ip, #登录堡垒机的ip地址port, #登录堡垒机的端口account, #登录堡垒机的账号pwd, #登录堡垒机的密码fwq_name, #服务器ip地址的列表full_fwq_name_command_list, #单次会话所有输入命令的列表fwq_pre_txt_address #存放写入txt的目录)#202.遍历截图
sw.show_windows_loop(fwq_pre_txt_address,fwq_pre_img_address,icon_path)
#203.遍历插入图片
ii.table_insert_img_loop(rename_path,fwq_pre_img_address)
#把生成png图片删除
df.del_file(fwq_pre_img_address)
#把生成txt文件全部删除
df.del_file(txt_path)
我主要是对正面的包进行修改
#001.SSH连接堡垒机,输入命令返回结果到txt文件的包
import util.exe_ssh as es
# coding: utf-8
'''000.导入包'''
#001.用来休眠1秒的包
import time
#002.这个是访问堡垒机的包
import paramiko
#003.获取目录中所有文件名的包
import util.return_dir_file_name as rdf
#004.用于删除文件
import os
#005.创建相同长度的数字字符串列表的包
import util.create_number_order as cno
#006.删除特定字符串前的字符串的包
import util.delete_before_string as dbs
#007.操作txt文件的包,里面写了两个方法,一个是把两个txt文件合并,一个是地址拼接前面加一些东西
import util.txt_util as tu'''100.变量'''
#101.服务器账号前序
account_imf=['[root@oaapp02 ~]# ','[root@oaapp01 ~]# ','[root@bang01 ~]# ','[root@rac1 ~]# ','[root@rac2 ~]# ']
#102.txt的文件名列表,用于对指定txt文件进行操作
keywords_01 = ["01", "12", "23","34","45",'56']
keywords_2=["03","05","07","09"]
keywords_3=["14","16","18","20"]
keywords_4=["25","27","29","31"]
keywords_5=["36","38","40","42"]
keywords_6=["47","49","51","53"]'''200.方法'''
#201.把命令执行结果写入txt文件的方法
def command2txt(ip, #ip不变的port, #端口不变的account, #用户名不变的pwd, #密码不变的fwq_name, #服务器ip的列表commands, #不是单个命令,而是接收一个命令列表 txt_path, txt_address #txt的地址列表):#202.获取私钥pkey=paramiko.RSAKey.from_private_key_file("C:\\Users\\human\\.ssh\\id_rsa",password=pwd)#203.paramiko SSH对象client = paramiko.SSHClient()#204.自动将服务器的公钥添加到known_hosts文件,并接受公钥。client.set_missing_host_key_policy(paramiko.AutoAddPolicy())#205.连接堡垒机client.connect(hostname=ip,port=port,username=account,pkey=pkey,timeout=60)#206.创建发送命令的对象shell = client.invoke_shell()#207.生成00-99的字符串列表number_list=cno.create_hundred_order_list(99)# print(number_list)#208.设置计数器count,拼设置初值为0count=0#209.遍历里面的命令for comand in commands:#210.用下标控制获取数字n=number_list[count]# print(n)#211.发送命令shell.send(comand)#212.如果准备就pass跳过while not shell.recv_ready():pass#213.睡眠0.5秒,模仿人操作time.sleep(0.5)#214.如果命令是'/',则跳过if comand == '/':continue#215.如果命令是搜索的堡垒机的字符串,则跳过elif comand in ('应用服务器02','应用服务器03','应用服务器01','数据库1','数据库2'):continue#216.过滤完执行下面的else:#217.接收命令执行结果stdout = shell.recv(10240)#218.对结果进行解码longstring = stdout.decode('utf-8')#219.如果结果包含"连用云",则跳过if "连用云" in longstring:continue#220.如果结果包含"exit",则跳过elif "exit" == longstring:continueelse:#221.将结果写入txt文件with open(txt_address+n+".txt",'w') as f:print(longstring,file = f)#222.计数器加1count+=1#223.获取目录中的文件名列表 file_name_list=rdf.re_file_name_list(txt_path)# print(file_name_list)#224.删除开头没有用的txt文件for f in file_name_list:print("f的值")print(f)keywords = ["00", "11", "22","33","44","55"]if any(keyword in f for keyword in keywords):os.remove(txt_path+"\\"+f)#225.删除完文件再获取目录中的文件名列表file_name_list=rdf.re_file_name_list(txt_path)#226.删除登录每个服务器txt文件开头的一些内容for f in file_name_list:# print("f的值")# print(f)#227.if any(keyword in f for keyword in keywords_01):# os.remove(txt_path+"\\"+f)with open(txt_path+"\\"+f, 'r') as file:content = file.read()if '56' in f:content = dbs.dele_before_str(content,'[root')with open(txt_path+"\\"+f, 'w') as file:file.write(content)else: content = dbs.dele_before_str(content,'[root').replace("--color=never","")with open(txt_path+"\\"+f, 'w') as file:file.write(content)#删除完再获取for f in file_name_list:if any(keyword in f for keyword in keywords_2): with open(txt_path+"\\"+f, 'r') as file:content = file.read()content = account_imf[0]+contentwith open(txt_path+"\\"+f, 'w') as file:file.write(content)for f in file_name_list:if any(keyword in f for keyword in keywords_3): with open(txt_path+"\\"+f, 'r') as file:content = file.read()content = account_imf[1]+contentwith open(txt_path+"\\"+f, 'w') as file:file.write(content)for f in file_name_list:if any(keyword in f for keyword in keywords_4): with open(txt_path+"\\"+f, 'r') as file:content = file.read()content = account_imf[2]+contentwith open(txt_path+"\\"+f, 'w') as file:file.write(content)for f in file_name_list:if any(keyword in f for keyword in keywords_5): with open(txt_path+"\\"+f, 'r') as file:content = file.read()content = account_imf[3]+contentwith open(txt_path+"\\"+f, 'w') as file:file.write(content)for f in file_name_list:if any(keyword in f for keyword in keywords_6): with open(txt_path+"\\"+f, 'r') as file:content = file.read()content = account_imf[4]+contentwith open(txt_path+"\\"+f, 'w') as file:file.write(content)file_name_list=rdf.re_file_name_list(txt_path)# print("fwq_name的值") # print(fwq_name)for ip_name in fwq_name:if ip_name==fwq_name[0]:tu.conbine_txt(tu.add_pre_txt_address(file_name_list[0]),tu.add_pre_txt_address(file_name_list[1]),tu.add_pre_txt_address(ip_name+"-0.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[2]),tu.add_pre_txt_address(file_name_list[3]),tu.add_pre_txt_address(ip_name+"-1.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[4]),tu.add_pre_txt_address(file_name_list[5]),tu.add_pre_txt_address(ip_name+"-2.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[6]),tu.add_pre_txt_address(file_name_list[7]),tu.add_pre_txt_address(ip_name+"-3.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[8]),tu.add_pre_txt_address(file_name_list[9]),tu.add_pre_txt_address(ip_name+"-4.txt"))elif ip_name==fwq_name[1]:tu.conbine_txt(tu.add_pre_txt_address(file_name_list[10]),tu.add_pre_txt_address(file_name_list[11]),tu.add_pre_txt_address(ip_name+"-0.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[12]),tu.add_pre_txt_address(file_name_list[13]),tu.add_pre_txt_address(ip_name+"-1.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[14]),tu.add_pre_txt_address(file_name_list[15]),tu.add_pre_txt_address(ip_name+"-2.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[16]),tu.add_pre_txt_address(file_name_list[17]),tu.add_pre_txt_address(ip_name+"-3.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[18]),tu.add_pre_txt_address(file_name_list[19]),tu.add_pre_txt_address(ip_name+"-4.txt"))elif ip_name==fwq_name[2]:tu.conbine_txt(tu.add_pre_txt_address(file_name_list[20]),tu.add_pre_txt_address(file_name_list[21]),tu.add_pre_txt_address(ip_name+"-0.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[22]),tu.add_pre_txt_address(file_name_list[23]),tu.add_pre_txt_address(ip_name+"-1.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[24]),tu.add_pre_txt_address(file_name_list[25]),tu.add_pre_txt_address(ip_name+"-2.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[26]),tu.add_pre_txt_address(file_name_list[27]),tu.add_pre_txt_address(ip_name+"-3.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[28]),tu.add_pre_txt_address(file_name_list[29]),tu.add_pre_txt_address(ip_name+"-4.txt"))elif ip_name==fwq_name[3]:tu.conbine_txt(tu.add_pre_txt_address(file_name_list[30]), tu.add_pre_txt_address(file_name_list[31]),tu.add_pre_txt_address(ip_name+"-0.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[32]),tu.add_pre_txt_address(file_name_list[33]),tu.add_pre_txt_address(ip_name+"-1.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[34]),tu.add_pre_txt_address(file_name_list[35]),tu.add_pre_txt_address(ip_name+"-2.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[36]),tu.add_pre_txt_address(file_name_list[37]),tu.add_pre_txt_address(ip_name+"-3.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[38]),tu.add_pre_txt_address(file_name_list[39]),tu.add_pre_txt_address(ip_name+"-4.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[-3]),tu.add_pre_txt_address(file_name_list[-2]),tu.add_pre_txt_address(ip_name+"-5.txt"))elif ip_name==fwq_name[4]:tu.conbine_txt(tu.add_pre_txt_address(file_name_list[40]),tu.add_pre_txt_address(file_name_list[41]),tu.add_pre_txt_address(ip_name+"-0.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[42]),tu.add_pre_txt_address(file_name_list[43]),tu.add_pre_txt_address(ip_name+"-1.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[44]),tu.add_pre_txt_address(file_name_list[45]),tu.add_pre_txt_address(ip_name+"-2.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[46]),tu.add_pre_txt_address(file_name_list[47]),tu.add_pre_txt_address(ip_name+"-3.txt"))tu.conbine_txt(tu.add_pre_txt_address(file_name_list[48]),tu.add_pre_txt_address(file_name_list[49]),tu.add_pre_txt_address(ip_name+"-4.txt"))#删除00-55的txt文for f in file_name_list:print("f的值")print(f)# keywords = ["00", "11", "22","33","44","55"]if any(keyword in f for keyword in number_list):os.remove(txt_path+"\\"+f)
相关文章:

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改
Two-Step Vertification required: Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录,也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录,算一次会话…...

【工控】线扫相机小结 第四篇
背景 这一片主要是对第三篇继续补充。话说上一篇讲到了两种模式的切换,上一篇还遗留了一个Bug,在这一篇里进行订正! 代码回顾 /// <summary>/// 其实就是打开触发/// </summary>void SetLineSacanWorkMode(){-----首先设置为帧…...

亲测解决Unpack operator in subscript requires Python 3.11 or newer
这个问题是在小虎想提前定义一个list,然后作为index list来调用另一个list里面的变量出现的问题。 环境 Ubuntu 22.04 + python 3.10 故障代码示例 NoneList = [None] * opt.spatial_dims TargetMask = Target[i] == torch.arange(1...

数据结构 ——— 堆排序算法的实现
目录 前言 向下调整算法(默认建大堆) 堆排序算法的实现(默认升序) 前言 在之前几章学习了如何用向上调整算法和向下调整算法对数组进行建大/小堆数据结构 ——— 向上/向下调整算法将数组调整为升/降序_对数组进行降序排序代码…...

On-Chip-Network之Topology
片上网络拓扑决定了网络中节点和通道之间的物理布局和连接。拓扑对整体网络性价比的影响是巨大的。拓扑决定了消息 必须经过的跳数(或路由器)以及跳数之间的互连长度,从而显著影响网络延迟。由于经过路由器和链路会产生功耗,因此 …...

2024年11月21日Github流行趋势
项目名称:twenty 项目维护者:charlesBochet, lucasbordeau, Weiko, FelixMalfait, bosiraphael项目介绍:正在构建一个由社区支持的现代化Salesforce替代品。项目star数:21,798项目fork数:2,347 项目名称:p…...

第三十八章 IOT 通信协议MQTT协议实现的中间件EMQXDocker安装与验证指南
EMQX概述以及Docker安装与验证指南 一、EMQX概述 EMQX(原名EMQ X),是一款完全开源、高度可伸缩、高可用的分布式MQTT消息服务器。它不仅支持MQTT协议,还兼容CoAP/LwM2M等多种物联网协议,是5G时代万物互联的重要消息引擎。这款软件由杭州映云科技有限公司开发,基于Erlan…...

Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
目录 安装包 flume的部署 负载均衡测试 故障恢复 安装包 在这里给大家准备好了flume的安装包 通过网盘分享的文件:apache-flume-1.9.0-bin.tar.gz 链接: https://pan.baidu.com/s/1DXMA4PxdDtUQeMB4J62xoQ 提取码: euz7 --来自百度网盘超级会员v4的分享 ----…...

CodiMD导出pdf失败或无中文
CodiMD导出pdf失败,弹出文件保存窗口,有个pdf文件能下载,但是保存的时候提示“网站出问题了”,实际到服务器上看会发现docker崩溃了。 解决办法: 使用最新的CodiMD镜像,如nabo.codimd.dev/hackmdio/hackmd:…...

数字图像处理(2):Verilog基础语法
(1)Verilog常见数据类型: reg型、wire型、integer型、parameter型 (2)Verilog 常见进制:二进制(b或B)、十进制(d或D)、八进制(o或O)、…...

Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析:…...

爬虫重定向问题解决
一,问题 做爬虫时会遇到强制重定向的链接,此时可以手动获取重定向后的链接 如下图情况 第二个链接是目标要抓取的,但它是第一个链接重定向过去的,第一个链接接口状态也是302 二,解决方法 请求第一个链接࿰…...

Java技术复习提升 10异常
10 异常 10.1异常介绍及分类 异常捕获 选中后alttabt->选中try-catch 异常就是程序执行中不正常的情况 注意语法和逻辑错误并不是异常 异常分类有两种 error和exception error是错误 虚拟机无法解决的严重问题 exception是其他因为编程错误或者外在因素导致的一般性的问…...

真题-桂城2022年五年级
目录 GC.2022.五年级.01.拍7 输入数据 1 输出数据 1 GC.2022.五年级.02.硬币 输入数据 1 输出数据 1 答案: GC.2022.五年级.03.次大公约数 输入数据 1 输出数据 1 GC.2022.五年级.04.显示器 输入数据 1 输出数据 1 GC.2022.五年级.05.数对 输入数据 1 输…...

android 使用MediaPlayer实现音乐播放--权限请求
在Android应用中,获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新,从Android 6.0(API级别23)开始,应用需要动态请求权限,而到了android 13以上需要的权限又做了进一步…...

Web开发:ORM框架之使用Freesql的DbFrist封装常见功能
一、调用 public class Program {static string connectionstring "连接字符串(数据库名)";static void Main(string[] args){//1.连接数据库var freesql new FreeSqlBuilder().UseConnectionString(DataType.SqlServer, connectionstring…...

【多线程-第一天-多线程的执行原理-多线程的优缺点-主线程 Objective-C语言】
一、多线程的执行原理 1.单任务操作系统:同一时间只能执行一个任务 多任务操作系统:同一时间可以执行多个任务 比如,我可以一边听着酷狗,一边聊着QQ, 在单任务的操作系统里边,只有进程,没有线程, 单任务操作系统,CPU必须执行完一个任务,才能执行第二个任务, 多任…...

SQL基础语法介绍-基于MySQL
文章目录 一、SQL分类二、SQL语法1.数据库字段类型1.1.数值类型1.2 字符类型1.3 日期类型 2.字段约束2.1约束介绍2.2 非空约束(not null)2.3 唯一约束(unique)2.4 主键约束(primary key)2.5 自增长主键2.6 …...

一分钟学习数据安全——数据安全风险的系统化应对思路
数据是组织的重要资产,未经授权的数据访问可能导致数据泄露、数据篡改、隐私侵犯和合规风险等问题。企业可以通过数据访问控制来提高信息系统在数据全生命周期管理中的安全性。企业可以引入IAM系统,来控制身份来管理权限。通过对用户访问权限的管理和合适…...

端口port常识
端口(Port)用于区分不同的服务或进程。在网络通信中,每个运行在计算机上的进程都会通过一个端口来与其他计算机上的进程进行通信。以下是一些关于端口和使用常识的信息: 端口号范围: 0-1023:这些被称为“知…...

【Oracle实战】文章导读
【Oracle基础】 【实战】Oracle基础之单机安装-01 Windows 2016 Oracle 11gR2【实战】Oracle基础之单机安装-02 Windows 2016 Oracle 12cR2【实战】Oracle基础之单机安装-03 CentOS 7.9 Oracle 11gR2【实战】Oracle基础之单机安装&#x…...

“人工智能+高职”:VR虚拟仿真实训室的发展前景
在当今科技日新月异的时代,人工智能(AI)与虚拟现实(VR)技术的融合正逐步改变着各行各业,教育领域也不例外。特别是在高等职业教育(简称“高职”)体系中,VR虚拟仿真实训室…...

c语言学习27宏定义条件编译
1类型重定义 typedef typedef关键字 属性:关键字 功能:将数据类型重新定义别名 (数据类型 别名) 格式:typedef数据类型名 别名; 例子:typedef unsigned char u8; 位置…...

理论结合实践:用Umami构建网站分析系统
个人博客地址(欢迎大家访问):理论结合实践:用Umami构建网站分析系统 1. 引言 网站统计分析是一种通过收集、处理和分析网站数据来评估网站性能、用户行为和流量来源的综合方法。通过分析用户访问模式、页面浏览量、访问时长、用户…...

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线
文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…...

移动充储机器人“小奥”的多场景应用(上)
在当前现代化城市交通体系中,移动充储机器人“小奥”发挥着至关重要的作用。该机器人不仅是一个简单的设备,而是一个集成了高科技的移动充电站,为新能源汽车提供了一种前所未有的便捷充电解决方案。该机器人配备了先进的电池管理系统…...

已解决wordpress提示正在执行例行维护,请一分钟后回来
今天打开网站时提示“正在执行例行维护,请一分钟后回来”,一分钟后还这样,刷新也没用,这究竟是怎么回事了? 问题原因 这是WordPress在更新,wordpress在升级程序、主题、插件时,都会先切换到维护模式&…...

DDR3脚位解析,class分类
SDQ{0-31}:数据信号,为输入/输出双向信号。 SA{0-15}:地址信号为输入信号。 SDQS{0-3}P/N:数据选通信号,数据可以通过DQS的上升沿与下降沿传输。在读模式时,DQS由存储器发给CPU,DQS与数据边沿对齐。在写模…...

【深度学习|目标跟踪】DeepSort 详解
DeepSort详解 1、Sort回顾2、DeepSort的状态向量3、DeepSort的外观特征4、DeepSort的track状态5、DeepSort的代价矩阵以及门控矩阵6、DeepSort的级联匹配 1、Sort回顾 查看这篇博客 2、DeepSort的状态向量 Sort中的卡尔曼滤波使用的目标的状态向量是一个7维的向量,…...

快速图像识别:落叶植物叶片分类
1.背景意义 研究背景与意义 随着全球生态环境的变化,植物的多样性及其在生态系统中的重要性日益受到关注。植物叶片的分类不仅是植物学研究的基础,也是生态监测、农业管理和生物多样性保护的重要环节。传统的植物分类方法依赖于人工观察和专家知识&…...