ORB-SLAM2 ---- 词袋模型BOW
文章目录
- 一、回环检测的重要性
- 二、回环检测的方法
- 三、词袋模型
- 四、词典
- 五、实例展示
- 1. 计算评分
- 2. 找出有相同单词的关键帧
- 3. 用词袋进行快速匹配
- 六、总结
一、回环检测的重要性
在前面的学习我们知道,噪声的影响是不可消除的,而上一帧的误差不可避免的会累积到下一帧,使得整个SLAM出现累计误差,长时间的累积会让后续的位姿和地图点位置产生很大的影响,即使我们有很好的后端模型来减少误差,但好模型架不住烂数据。在只有相邻数据时我们能做的事情并不多,但是如果能得到间隔更久远的约束,就可以将误差拉回来。这就是回环检测的意义,就可以将x1-x100之间的位姿进行联系,然后构建回环,将误差平摊到大量的关键帧之中。这个SLAM过程中,回环检测非常重要,以至于有些时候我们把仅有前端和后端的系统称为视觉里程计,而把带有回环检测和全局后端的系统称为SLAM 。
二、回环检测的方法
我们知道回环检测最重要的是检测到回环,我们怎么来检测这个回环?从原理上来说,就是要在之前的关键帧中找出与当前关键帧很相似的一幅图像。在前面提取特征点的时候用过灰度法,但是当时就说过灰度是不稳定的,灰度受到光线的影响严重,我们不能保证发生回环的几个关键帧的光线条件一致。用如下的公式来表示两个图像的差异,如果A图像的光线发生偏差,会导致结果很大,可能会将两个相似度很高的图像误认为是完全不匹配的图像。
这个时候就产生了一个问题,怎么样才能正确的判断两个图像是否相似?词袋模型就孕育而出了,词袋模型能很好的解决这个问题。
三、词袋模型
词袋,也就是Bag-of-Words(BoW),目的是用“图像上有哪几种特征”来描述一幅图像。例如,我们说某张照片中有一个人、一辆车;而另一张中有两个人、一只狗。根据这样的描述,就可以度量这两幅图像的相似性。再具体一些,我们要做以下三步:
- 确定“人”“车”“狗”等概念–对应于BoW中的“单词”(Word),许多单词放在一
起,组成了“字典”(Dictionary )。- 确定一幅图像中出现了哪些在字典中定义的概念-我们用单词出现的情况(或直方
图)描述整幅图像。这就把一幅图像转换成了一个向量的描述。- 比较上一步中的描述的相似程度。
以上面举的例子来说,首先我们通过某种方式得到了一本“字典”。字典上记录了许多单词,每个单词都有一定意义,例如“人”“车”“狗”都是记录在字典中的单词,我们不妨记为 W1,w2,w3。然后,对于任意图像A,根据它们含有的单词,可记为:
我们有两种方法描述一幅图片,第一种是用单词数量,第二种只用单词出没出现在该函数中,如[1,0,1],单词出现记为1,没出现记为0。无论是哪种方式都可以很好的描述一个图像的特征。我们可以用如下公式来表示两个图像的匹配度评分:
可以看出如果两个向量完全一致的时候,函数值为1(两幅图像相似度高),两个向量完全相反的时候函数值为0(两幅图像相似度低)。
四、词典
我们在局部建图和回环检测线程中,都会用到词袋,那词袋到底是什么?答案是一幅图像中包含的单词(Word)的集合。而词典是包含所有单词信息的一个库,再出现词袋的地方,都会提到快速匹配,但是一个一个单词进行比较匹配真的算得上快速匹配吗?如果单词是按照顺序一个一个排列得话当然不是,甚至在单词数量很大的时候,会出现匹配时间很长的情况。这里用到的是数据结构中的方法,能进行快速的索引。字典的生成类似于一个聚类的问题,我们将根节点分为k个树杈,每个树杈按照特点继续细分,这样每次进行匹配的时候,就只需要知道这个单词在那个叶节点(分到最后的一层,称之为叶)上,然后依次向上寻找匹配,这样效率将大大的提升,真正意义上的实现了快速匹配。
五、实例展示
1. 计算评分
下面这个代码片段是回环检测线程中检测回环函数中的片段,可以看出这里就是用了计算词袋相似度评分的方法,来判断候选帧和当前帧之间的相似情况。
// Step 3:遍历当前回环关键帧所有连接(>15个共视地图点)关键帧,计算当前关键帧与每个共视关键的bow相似度得分,并得到最低得分minScoreconst vector<KeyFrame*> vpConnectedKeyFrames = mpCurrentKF->GetVectorCovisibleKeyFrames();const DBoW2::BowVector &CurrentBowVec = mpCurrentKF->mBowVec;float minScore = 1;for(size_t i=0; i<vpConnectedKeyFrames.size(); i++){KeyFrame* pKF = vpConnectedKeyFrames[i];if(pKF->isBad())continue;const DBoW2::BowVector &BowVec = pKF->mBowVec;// 计算两个关键帧的相似度得分;得分越低,相似度越低float score = mpORBVocabulary->score(CurrentBowVec, BowVec);// 更新最低得分if(score<minScore)minScore = score;}
2. 找出有相同单词的关键帧
下面这个代码片段是DetectLoopCandidates()函数中的片段,可以看出它充分的使用了单词(word),找出和当前帧有相同单词的帧,这里就用到了词典的快速索引方法。
for(DBoW2::BowVector::const_iterator vit=pKF->mBowVec.begin(), vend=pKF->mBowVec.end(); vit != vend; vit++){// 提取所有包含该word的KeyFramelist<KeyFrame*> &lKFs = mvInvertedFile[vit->first];// 然后对这些关键帧展开遍历for(list<KeyFrame*>::iterator lit=lKFs.begin(), lend= lKFs.end(); lit!=lend; lit++){KeyFrame* pKFi=*lit;if(pKFi->mnLoopQuery!=pKF->mnId) {// 还没有标记为pKF的闭环候选帧pKFi->mnLoopWords=0;// 和当前关键帧共视的话不作为闭环候选帧if(!spConnectedKeyFrames.count(pKFi)){// 没有共视就标记作为闭环候选关键帧,放到lKFsSharingWords里pKFi->mnLoopQuery=pKF->mnId;lKFsSharingWords.push_back(pKFi);}}pKFi->mnLoopWords++;// 记录pKFi与pKF具有相同word的个数}
3. 用词袋进行快速匹配
下面这个函数片段是跟踪线程中参考关键帧跟踪中的词袋快速匹配函数的片段,这里就利用词袋进行快速匹配,只有处于同一个note中的特征点才会进行匹配,这样就能大大的节省匹配时间。
const vector<cv::KeyPoint> &vKeysUn1 = pKF1->mvKeysUn;const DBoW2::FeatureVector &vFeatVec1 = pKF1->mFeatVec;const vector<MapPoint*> vpMapPoints1 = pKF1->GetMapPointMatches();const cv::Mat &Descriptors1 = pKF1->mDescriptors;const vector<cv::KeyPoint> &vKeysUn2 = pKF2->mvKeysUn;const DBoW2::FeatureVector &vFeatVec2 = pKF2->mFeatVec;const vector<MapPoint*> vpMapPoints2 = pKF2->GetMapPointMatches();const cv::Mat &Descriptors2 = pKF2->mDescriptors;// 保存匹配结果vpMatches12 = vector<MapPoint*>(vpMapPoints1.size(),static_cast<MapPoint*>(NULL));vector<bool> vbMatched2(vpMapPoints2.size(),false);// Step 2 构建旋转直方图,HISTO_LENGTH = 30vector<int> rotHist[HISTO_LENGTH];for(int i=0;i<HISTO_LENGTH;i++)rotHist[i].reserve(500);//! 原作者代码是 const float factor = 1.0f/HISTO_LENGTH; 是错误的,更改为下面代码 const float factor = HISTO_LENGTH/360.0f;int nmatches = 0;DBoW2::FeatureVector::const_iterator f1it = vFeatVec1.begin();DBoW2::FeatureVector::const_iterator f2it = vFeatVec2.begin();DBoW2::FeatureVector::const_iterator f1end = vFeatVec1.end();DBoW2::FeatureVector::const_iterator f2end = vFeatVec2.end();while(f1it != f1end && f2it != f2end){// Step 3 开始遍历,分别取出属于同一node的特征点(只有属于同一node,才有可能是匹配点)if(f1it->first == f2it->first){// 遍历KF中属于该node的特征点for(size_t i1=0, iend1=f1it->second.size(); i1<iend1; i1++){const size_t idx1 = f1it->second[i1];MapPoint* pMP1 = vpMapPoints1[idx1];if(!pMP1)continue;if(pMP1->isBad())continue;const cv::Mat &d1 = Descriptors1.row(idx1);int bestDist1=256;int bestIdx2 =-1 ;int bestDist2=256;// Step 4 遍历KF2中属于该node的特征点,找到了最优及次优匹配点for(size_t i2=0, iend2=f2it->second.size(); i2<iend2; i2++){const size_t idx2 = f2it->second[i2];MapPoint* pMP2 = vpMapPoints2[idx2];// 如果已经有匹配的点,或者遍历到的特征点对应的地图点无效if(vbMatched2[idx2] || !pMP2)continue;if(pMP2->isBad())continue;const cv::Mat &d2 = Descriptors2.row(idx2);int dist = DescriptorDistance(d1,d2);if(dist<bestDist1){bestDist2=bestDist1;bestDist1=dist;bestIdx2=idx2;}else if(dist<bestDist2){bestDist2=dist;}}// Step 5 对匹配结果进行检查,满足阈值、最优/次优比例,记录旋转直方图信息if(bestDist1<TH_LOW){if(static_cast<float>(bestDist1)<mfNNratio*static_cast<float>(bestDist2)){vpMatches12[idx1]=vpMapPoints2[bestIdx2];vbMatched2[bestIdx2]=true;if(mbCheckOrientation){float rot = vKeysUn1[idx1].angle-vKeysUn2[bestIdx2].angle;if(rot<0.0)rot+=360.0f;int bin = round(rot*factor);if(bin==HISTO_LENGTH)bin=0;assert(bin>=0 && bin<HISTO_LENGTH);rotHist[bin].push_back(idx1);}nmatches++;}}}
六、总结
词袋模型是ORB-SLAM2中很重要的一个模型,他的作用也有很多,在上述一一列举过,最重要的作用是,在回环检测中匹配相似的图像,曾经该方法是最优的方法之一,现在各种机器学习的发展,例如深度学习,能更高效的完成相似图像的识别,这也是最近深度学习大量运用在SLAM中的原因。
相关文章:
ORB-SLAM2 ---- 词袋模型BOW
文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道,噪声的影响是不可消除的,而上一帧的误差不可避免的…...
win11无法检测到其他显示器-NVIDIA
https://www.nvidia.cn/software/nvidia-app/ https://cn.download.nvidia.cn/nvapp/client/11.0.1.163/NVIDIA_app_v11.0.1.163.exe 下载安装后,检测驱动、更新驱动。...
基于Java+Swing+Mysql的网络聊天室
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
docker安装Elasticsearch
公网即可拉取镜像,这个镜像是可以拉得到的,版本号根据自己需要的来 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.15运行命令,xxxxxxxxxxxxxxxxxxxxxxxx_password 为自己的密码 docker run -d --name elasticsearch \-…...
Elasticsearch入门之HTTP高级查询操作
前言 上一篇博客我们学习了es的一些基础操作如下: 创建索引(创建表 create table)查看索引(查看表show tables)查看单个索引(查看单个表show create table)删除索引(删除表&#x…...
前端知识1html
VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span: <span style"color: red;">hello</span> <span>demo</span> span实现: 标题…...
《黑神话:悟空》闪退,提示D3D12崩溃,游戏崩溃无法启动是什么原因?要怎么解决?
《黑神话:悟空》闪退、D3D12崩溃及游戏无法启动:原因、解决方案与预防措施 作为一名软件开发从业者,我深知电脑游戏运行时可能遇到的各种问题,尤其是像《黑神话:悟空》这样的高品质游戏,其对硬件和系统配置…...
[GESP202312 五级] 烹饪问题
题目传送门 B3930 [GESP202312 五级] 烹饪问题 题目描述 有 N N N 种食材,编号从 0 0 0 至 N − 1 N-1 N−1,其中第 i i i 种食材的美味度为 a i a_i ai。 不同食材之间的组合可能产生奇妙的化学反应。具体来说,如果两种食材的美味…...
[代码随想录10]栈和队列
前言 栈和队列在STL中扮演的什么角色呢?我们知道STL的六大组件是:容器,适配器,算法,迭代器,空间配置器,仿函数,而我们今天要学的栈和队列就是属于适配器里面的,为什么栈和…...
TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面
前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中,命令行使用还是不太方便的,因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…...
Java、JavaWeb、数据库-图书管理系统
这一章主要是把上一章写在网页里的java 代码从网页中分离出来,放在专门的servlet类中。每一个servlet类对应一个数据库的表。 规范性问题: 1、dao包存放有关数据库的信息:BaseDao包就放数据库加载驱动和增删改和关闭资源;而其他…...
轻量化特征融合 | YOLOv8 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作
本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...
U盘文件乱码:原因、恢复、预防与总结
U盘文件乱码现象解析 U盘作为我们日常生活中常用的便携式存储设备,时常会遭遇文件乱码的问题。这种乱码现象通常表现为文件名变成一堆无意义的字符,文件内容无法正常查看,甚至文件根本无法被打开。当我们在电脑上插入U盘,准备查看…...
OpenStack介绍
OpenStack概述 OpenStack是一个开源的云计算管理平台软件,主要用于构建和管理云计算环境。它允许企业或组织通过数据中心的物理服务器创建和管理虚拟机、存储资源和网络等云计算服务。其核心组件包括计算(Nova)、网络(Neutron)、存储(Cinder、Swift)等。这些组件相互协作…...
OpenGL编译用户着色器shader
shader相信很多朋友们都听说过,shader就是运行再GPU上的程序。虽然是这么说,但是我们发现,很多IDE开发工具比如说visual studio 没有办法直接去运行shader代码。这是因为,许多编译器不会自动将shader文件编译成可执行的代码然后发…...
C++ 已经知道,中序和后序,推算前序的方法。
已经知道,中序和后序,推算前序的方法。 #include<iostream> using namespace std; string ldr_str,lrd_str;//中序遍历和后序遍历 void build(int l1,int r1,int l2,int r2){if(l1>r1) return ;//边界条件,说明已经没有元素了cout<<lrd_s…...
unity打包到安卓帧率降低
这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考...
计算机网络复习——概念强化作业
物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…...
DO、DTO、VO都是干什么的?
DO、DTO、VO 是三个常见的Java 对象,它们都是用来承载数据的,但是在不同的场景下有着不同的用途. 1.DO(Domain Object):领域对象,也称为实体对象。D0 通常用于数据库表的映射,DO中包含了实体的属性以及对实体的操作方法。DO 对应…...
深入探索 Node.js:构建强大的后端应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...
【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...
【Git】:远程操作
目录 新建远程仓库 克隆远程仓库 向远程仓库推送 拉取远程仓库 配置 Git 忽略特殊文件 给命令配置别名 我们可以自己搭建⼀台运行 Git 的服务器,不过现阶段,为了学 Git 先搭个服务器绝对是小题大作。好在这个世界上有个叫 GitHub 的神奇的网站࿰…...
服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs࿰…...
基于python django的药材数据可视化系统的设计与实现,可对各类药材数据做一个统计分析可视化
研究背景 随着中医药文化的不断传承与发展,传统中药材的市场需求逐渐增加。然而,随着药材种类繁多、来源复杂、品质参差不齐,如何高效地管理、分析与展示中药材的相关数据,成为现代中药产业面临的重要课题。传统的药材数据管理方…...
docker及docker exec命令学习笔记
docker exec 是一个常用的 Docker 命令,允许你在已经运行的容器中执行命令或启动新的进程。以下是详细介绍和常见用法: 基本语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]参数详解 1. CONTAINER指定目标容器的名字或容器 ID。可以通过以下命…...
【pyspark学习从入门到精通24】机器学习库_7
目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分:在现实世界中,我们并不总是有目标特征的奢侈条件,因此我们需要回归到无监督学习的范式,在那里我们尝试在数据中发现模式。 在出生数据…...
Unity 策略游戏地图上的网格是如何实现的
在Unity中实现策略游戏地图上的网格,主要涉及到地图数据的处理、地图的加载与渲染、以及玩家在地图上的移动与碰撞检测等关键步骤。以下是对这些步骤的详细解释: 一、地图数据的处理 收集地图数据:这包括地形高度、地形纹理、建筑物、树木等…...
【MySQL 进阶之路】锁详解
MySQL 锁详解 1. 锁的基本概念 锁在数据库中是用来保证数据一致性和防止并发冲突的一种机制。MySQL 中的锁可以分为不同的类型和粒度,每种锁都有特定的使用场景和特点。了解锁的类型、作用以及如何避免锁带来的问题是提升数据库性能和避免数据冲突的关键。 2. 锁…...
RK3588--解码H264(mpp-dec-h264-to-yuv-file)
1. 简介 源码下载:https://download.csdn.net/download/mao0514/90096131 本例完成H264格式文件解码,并保存为yuv格式文件。参考mpp_dec_test重写,进行了一部分精简。 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的 通用媒体…...
解决Conda虚拟环境中pip下载包总是到base环境的问题
conda本地创建的虚拟环境使用pip安装一些包总是安装到base环境中,导致无法正确进行环境隔离,下面是一些解决办法 方法一、使用python -m pip安装 1.1、验证虚拟环境的pip版本是哪个版本,如下所示,本人的demo虚拟环境直接使用pip…...
PyCharm 中设置虚拟环境
在 PyCharm 中设置虚拟环境的步骤如下: 1. 创建新项目时设置虚拟环境 1. 打开 PyCharm 并选择 New Project。 2. 在 Location 中指定项目路径。 3. 在右侧的 Python Interpreter 下,选择 New Environment。 Environment: 选择 Virtualenv。 Loca…...
M9484C VXG 矢量信号发生器- 110GHz-
M9484C VXG 矢量信号发生器 - 110GHz- M9484C VXG 是一款矢量信号发生器,在每个通道上提供 2.5 GHz 调制带宽,能够生成高达 54 GHz 的信号。 这款 VXG 矢量信号发生器可以组成经过校准和同步的全方位综合解决方案,帮助您更快测试下一代无线…...
机器学习详解(3):线性回归之代码详解
文章目录 1 数据预处理2 构建线性回归模型并绘制回归线初始化方法前向传播:forward_propagation代价函数:cost_function反向传播:backward_propagation参数更新:update_parameters训练方法:train代码运行结果 3 使用Py…...
工业检测基础-工业相机选型及应用场景
以下是一些常见的工业检测相机种类、检测原理、应用场景及选型依据: 2D相机 检测原理:基于二维图像捕获,通过分析图像的明暗、纹理、颜色等信息来检测物体的特征和缺陷.应用场景:广泛应用于平面工件的外观检测,如检测…...
标准状态下一个气体分子每秒平均碰撞次数的估算
要估算在标准状态(0C, 1个大气压)下,一个气体分子在1秒内与其他分子的碰撞次数,我们可以使用一些基本的物理和化学原理。这个过程涉及到气体动力学理论,特别是麦克斯韦-玻尔兹曼分布。 计算气体分子的平均速率…...
使用PHPUnit使用本地调试代替远程调试,快速提高开发效率
Laravel 是一个在 Linux 环境下表现非常出色的 PHP 框架,但它在 Windows 环境下可能会遇到一些兼容性和配置问题。为了调试或没试的方便可以在 Windows 环境下进行 Laravel PHPUnit进行本地调试和测试。 本地主要针对断点调试效果非常高效。 在 Laravel 中&#x…...
Android 镜像模式和扩展模式区别探讨-Android14
Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...
链表头文件大更新!!!
引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能,让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件,定义了一个模板类 LinkedListÿ…...
ROS2创建 base 包用于其他模块的参数配置和头文件依赖
Demo 背景 ROS2项目开发中存在以下需求:有多个包需要读取一些共同的配置项(以txt或者yaml形式存在),且依赖于一些公用的utils工具代码(C)。Solution: 创建一个 base_config 包来“存放” 配置文件和公用的头文件。gitee address: Gitee/CDal…...
设计模式の软件设计原则
文章目录 前言一、聚合&组合&继承&依赖1.1、继承1.2、组合1.3、聚合1.4、依赖 二、单一职责原则2.1、单一职责原则反面案例2.2、单一职责原则反面案例的改进 三、接口隔离原则3.1、接口隔离原则反面案例3.2、接口隔离原则反面案例的改进 四、依赖倒转原则4.1、依赖…...
【python自动化四】日志打印
我们在进行自动化测试时,需要打印过程日志和结果日志等,这里记录下日志的相关配置。这里我们直接自己新建一个logger。 先贴上日志代码如下,可根据需要修改: import logging import os import timefrom logging.handlers import …...
E498 ThinkPHP+MYSQL+LW+纯洁婚纱网站系统的设计与实现 源码 配置 文档 全套资料
婚纱网站系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 在互联网和电子商务迅速发展的今天,网络已经是人们日常生活所不可缺少的信息获取渠道,人们日常生活基本已完全被网络所覆盖,互联网影响到各…...
【PostgreSQL系列】列类型从整数转换为 UUID
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
shell脚本实战案例
文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑:在Windows系统写了一个脚本,比如上面,随后上传到服务,执行会报错 原因: 解决方案:在linux系统touch文件,并通过vim添加内容&…...
VAE为什么叫变分(variational),相对于AE有什么区别。
VAE为什么叫变分(variational),相对于AE有什么区别。 VAE为什么叫变分(variational)?VAE相对于AE有什么区别? VAE为什么叫变分(variational)? 变分自编码器&…...
Codeforces Round 991 (Div. 3)
补题连接 A. Line Breaks 思路:从头开始累加单词个数,超过m就退出。 代码: #include <bits/stdc.h> using namespace std; #define int long longvoid solve() {int n, m, k;cin >> n >> m;vector<string> a(n);…...
红日靶场vulnstark 4靶机的测试报告[细节](一)
目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、漏洞利用Getshell ①Struts 2 s2-045漏洞 手工利用s2-45漏洞 Msf综合利用 ②Tomcat框架(CVE-2017-12615) ③phpMyAdmin(CVE-2018-12613) 构造语句写入冰蝎木…...
Android上运行OpenCV(Android Studio)
用Android Studio的话,整体来说没什么难的,照着教程来做就好了。 【OpenCV】OpenCV库的安装 - Android与OpenCV系列教程_哔哩哔哩_bilibili 主要就是导入module,然后加入依赖。代码只有几行。 if(OpenCVLoader.initLocal()){Toast.makeText(…...
代码随想录算法训练营day50|动态规划12
不同的子序列 给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。、 编辑距离中的删除元素,其实就是直接变数字,其只删除原来的较长的数组里的元素 递推模拟,使用s的最后一个元素匹配,或者删除…...
图像生成-扩散模型的经典之作DDPM
论文:https://arxiv.org/pdf/2006.11239 项目:https://github.com/hojonathanho/diffusion Denoising Diffusion Probabilistic Models (DDPM) 是一种生成模型,它通过一系列逐步添加噪声的过程将数据点映射到一个简单的先验分布(…...