FASText(上) : Fast 角点

FAST特征点检测算法的两篇论文 Machine learning for high-speed corner detection FASTER and better: A machine learning approach to corner detection 立即下载

0导语

本文主要介绍论文FASText:Efficient Unconstrained Scene Text Detector[pdf][code],其核心思想是定制化fast角点使其更有利于场景文字的检测。因此本文主要分上下两篇,第一篇先介绍fast角点,并剖析其opencv(2.4.10)的代码,下篇再介绍FSAText.

首先我们直观感受下FASText和Fast角点,参数阈值为12,FASText用的是FASText12,fast的是TYPE_7_12。并且根据论文的数据,它的proposal比MSER要少一半,但是检出率recall要高25%,并且速度还是4倍以上,全面优于MSER。



                                            FASText(3013个角点)

 


             Fast(7924个角点)

 

1 Fast特征点

1.1角点候选

Fast角点的思想很简单,很早就已经出来了[2],但是请注意opencv(2.4.10)中NMS的做法法跟论文中有些差别,后面我们会看到。

Fast中对特征点的定义是这样的:

如图3,以当前点(绿色点)为中心,某个半径r画圆。考查圆周上的点(红色),假设它们一共有k个。如果红色的点中有连续超过n个点都大于(或小于)当前点像素值加上某一阈值t的和,那么当前坐标就会被认为是角点的候选。opencv中k和n有3种配置,默认的是k = 16,n = 9,还有k=12, n=7和k=8,n=5这两种配置


 

上面的例子中如果我们假设k=16,n=9,t=10的话,那么我们就可以找到这么一组点(黄色),其满足上面的所有条件


 

1)在圆周上且是连续的

2)点的个数10,超过9

3)它们的像素值都低于中心点t以上

所以该点就是潜在角点。从原理上看,fast角点的不具备scale不变性,但基本具有旋转不变和平移不变性。

 

 

1.2 NMS

再次强调论文和opencv采用的是不同的思路

第二步也是最后一步就是普通的NMS,但是这里面比较麻烦的是这么去评价一个点的好坏,论文中用的是


其中


意思就是先挑选出圆周上所有比中心点大阈值t以上的点集G和比它小阈值t以上的点集L

G = {,} L = {138,135,82,96,109,71,121,117,140,117,74,110,137,141}

求绝对差并减掉t

G = {}, L ={5,8,61,47,34,72,22,26,3,26,69,33,6,2};

求和

G = 0, L = 414

取两者的最大值414作为分数

 

但是opencv代码中用的是另外一种思路。类似于木桶原理,它选的是符合条件的点集中与中心点相差最小的像素点,并用他们之间的绝对差作为这个角点的分数。上面的例子中,黄色的点与中心点相差最下的是140,因此分数是13.

 

本文就讲到这,由于本人水平有限,错误与纰漏还请指正。附上opencv的代码,去掉了优化部分,以方便阅读。

 

<pre name="code" class="cpp">#include <opencv/cv.hpp>
#include <vector>

namespace TestFastKeyPoint
{
	using namespace cv;
	void makeOffsets(int pixel[25], int rowStride, int patternSize)
	{
		static const int offsets16[][2] =
		{
			{ 0, 3 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 3, 0 }, { 3, -1 }, { 2, -2 }, { 1, -3 },
			{ 0, -3 }, { -1, -3 }, { -2, -2 }, { -3, -1 }, { -3, 0 }, { -3, 1 }, { -2, 2 }, { -1, 3 }
		};

		static const int offsets12[][2] =
		{
			{ 0, 2 }, { 1, 2 }, { 2, 1 }, { 2, 0 }, { 2, -1 }, { 1, -2 },
			{ 0, -2 }, { -1, -2 }, { -2, -1 }, { -2, 0 }, { -2, 1 }, { -1, 2 }
		};

		static const int offsets8[][2] =
		{
			{ 0, 1 }, { 1, 1 }, { 1, 0 }, { 1, -1 },
			{ 0, -1 }, { -1, -1 }, { -1, 0 }, { -1, 1 }
		};

		const int(*offsets)[2] = patternSize == 16 ? offsets16 :
			patternSize == 12 ? offsets12 :
			patternSize == 8 ? offsets8 : 0;

		CV_Assert(pixel && offsets);

		int k = 0;
		for (; k < patternSize; k++)
			pixel[k] = offsets[k][0] + offsets[k][1] * rowStride;
		//主要是为了在做NMS的时候方便,因为16个构成一个圆形,如果我从第16个点开始,那么我就可以直接往下遍历这个数组直接获取1-8号点的像素
		for (; k < 25; k++)
			pixel[k] = pixel[k - patternSize];
	}

	template<int patternSize>
	int cornerScore(const uchar* ptr, const int pixel[], int threshold);

	template<>
	int cornerScore<12>(const uchar* ptr, const int pixel[], int threshold)
	{
		const int K = 6, N = K * 3 + 1;
		int k, v = ptr[0];
		short d[N + 4];
		for (k = 0; k < N; k++)
			d[k] = (short)(v - ptr[pixel[k]]);


		int a0 = threshold;
		for (k = 0; k < 12; k += 2)
		{
			int a = std::min((int)d[k + 1], (int)d[k + 2]);
			if (a <= a0)
				continue;
			a = std::min(a, (int)d[k + 3]);
			a = std::min(a, (int)d[k + 4]);
			a = std::min(a, (int)d[k + 5]);
			a = std::min(a, (int)d[k + 6]);
			a0 = std::max(a0, std::min(a, (int)d[k]));
			a0 = std::max(a0, std::min(a, (int)d[k + 7]));
		}

		int b0 = -a0;
		for (k = 0; k < 12; k += 2)
		{
			int b = std::max((int)d[k + 1], (int)d[k + 2]);
			b = std::max(b, (int)d[k + 3]);
			b = std::max(b, (int)d[k + 4]);
			if (b >= b0)
				continue;
			b = std::max(b, (int)d[k + 5]);
			b = std::max(b, (int)d[k + 6]);

			b0 = std::min(b0, std::max(b, (int)d[k]));
			b0 = std::min(b0, std::max(b, (int)d[k + 7]));
		}

		threshold = -b0 - 1;



		return threshold;
	}

	template<>
	int cornerScore<8>(const uchar* ptr, const int pixel[], int threshold)
	{
		const int K = 4, N = K * 3 + 1;
		int k, v = ptr[0];
		short d[N];
		for (k = 0; k < N; k++)
			d[k] = (short)(v - ptr[pixel[k]]);


		int a0 = threshold;
		for (k = 0; k < 8; k += 2)
		{
			int a = std::min((int)d[k + 1], (int)d[k + 2]);
			if (a <= a0)
				continue;
			a = std::min(a, (int)d[k + 3]);
			a = std::min(a, (int)d[k + 4]);
			a0 = std::max(a0, std::min(a, (int)d[k]));
			a0 = std::max(a0, std::min(a, (int)d[k + 5]));
		}

		int b0 = -a0;
		for (k = 0; k < 8; k += 2)
		{
			int b = std::max((int)d[k + 1], (int)d[k + 2]);
			b = std::max(b, (int)d[k + 3]);
			if (b >= b0)
				continue;
			b = std::max(b, (int)d[k + 4]);

			b0 = std::min(b0, std::max(b, (int)d[k]));
			b0 = std::min(b0, std::max(b, (int)d[k + 5]));
		}

		threshold = -b0 - 1;

		return threshold;
	}
	template<>
	int cornerScore<16>(const uchar* ptr, const int pixel[], int threshold)
	{
		const int K = 8, N = K * 3 + 1;
		int k, v = ptr[0];
		short d[N];
		for (k = 0; k < N; k++)
			d[k] = (short)(v - ptr[pixel[k]]);//求像素差

		//正的差
		int a0 = threshold;
		for (k = 0; k < 16; k += 2)
		{
			int a = std::min((int)d[k + 1], (int)d[k + 2]);
			a = std::min(a, (int)d[k + 3]);
			if (a <= a0)
				continue;
			a = std::min(a, (int)d[k + 4]);
			a = std::min(a, (int)d[k + 5]);
			a = std::min(a, (int)d[k + 6]);
			a = std::min(a, (int)d[k + 7]);
			a = std::min(a, (int)d[k + 8]);
			a0 = std::max(a0, std::min(a, (int)d[k]));
			a0 = std::max(a0, std::min(a, (int)d[k + 9]));
		}

		int b0 = -a0;
		for (k = 0; k < 16; k += 2)
		{
			int b = std::max((int)d[k + 1], (int)d[k + 2]);
			b = std::max(b, (int)d[k + 3]);
			b = std::max(b, (int)d[k + 4]);
			b = std::max(b, (int)d[k + 5]);
			if (b >= b0)
				continue;
			b = std::max(b, (int)d[k + 6]);
			b = std::max(b, (int)d[k + 7]);
			b = std::max(b, (int)d[k + 8]);

			b0 = std::min(b0, std::max(b, (int)d[k]));
			b0 = std::min(b0, std::max(b, (int)d[k + 9]));
		}

		threshold = -b0 - 1;

		return threshold;
	}


	template<int patternSize>
	void FAST_t(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression)
	{
		Mat img = _img.getMat();
		const int K = patternSize / 2, N = patternSize + K + 1;
		int i, j, k, pixel[25];
		makeOffsets(pixel, (int)img.step, patternSize);

		keypoints.clear();

		threshold = std::min(std::max(threshold, 0), 255);
		//两个像素值相差的范围是在-255到255,所以设个512的数组
		//像素相差在阈值内的为0
		//像素大于中心点一定阈值的为2
		//像素小于中心店一定阈值的为1
		uchar threshold_tab[512];
		for (i = -255; i <= 255; i++)
			threshold_tab[i + 255] = (uchar)(i < -threshold ? 1 : i > threshold ? 2 : 0);

		AutoBuffer<uchar> _buf((img.cols + 16) * 3 * (sizeof(int)+sizeof(uchar)) + 128);
		uchar* buf[3];
		//存的是分数,由于采用了木桶原理,分数不会超过255,因此用一个字节就可以了
		buf[0] = _buf; buf[1] = buf[0] + img.cols; buf[2] = buf[1] + img.cols;
		int* cpbuf[3];
		cpbuf[0] = (int*)alignPtr(buf[2] + img.cols, sizeof(int)) + 1;//存的是角点的坐标 1是为了存cornerpos[-1] = ncorners;
		cpbuf[1] = cpbuf[0] + img.cols + 1;
		cpbuf[2] = cpbuf[1] + img.cols + 1;
		memset(buf[0], 0, img.cols * 3);

		for (i = 3; i < img.rows - 2; i++)
		{
			const uchar* ptr = img.ptr<uchar>(i) +3;
			uchar* curr = buf[(i - 3) % 3];
			int* cornerpos = cpbuf[(i - 3) % 3];
			memset(curr, 0, img.cols);
			int ncorners = 0;

			if (i < img.rows - 3)
			{
				j = 3;
				for (; j < img.cols - 3; j++, ptr++)
				{
					int v = ptr[0];
					const uchar* tab = &threshold_tab[0] - v + 255;
					int d = tab[ptr[pixel[0]]] | tab[ptr[pixel[8]]];// examine 1 and 9,  tab 结果是0 说明类似

					if (d == 0)
						continue;

					d &= tab[ptr[pixel[2]]] | tab[ptr[pixel[10]]];//
					d &= tab[ptr[pixel[4]]] | tab[ptr[pixel[12]]];//5 13
					d &= tab[ptr[pixel[6]]] | tab[ptr[pixel[14]]];//7 15

					if (d == 0)
						continue;

					d &= tab[ptr[pixel[1]]] | tab[ptr[pixel[9]]];
					d &= tab[ptr[pixel[3]]] | tab[ptr[pixel[11]]];
					d &= tab[ptr[pixel[5]]] | tab[ptr[pixel[13]]];
					d &= tab[ptr[pixel[7]]] | tab[ptr[pixel[15]]];

					//如果是3说明全是一大一小,最优的情况也只会是只有连续8个大于或小于这个阈值,所以不会是
					if (d & 1)
					{
						int vt = v - threshold, count = 0;

						for (k = 0; k < N; k++)
						{
							int x = ptr[pixel[k]];
							if (x < vt)
							{
								if (++count > K)
								{
									cornerpos[ncorners++] = j;
									if (nonmax_suppression)
										curr[j] = (uchar)cornerScore<patternSize>(ptr, pixel, threshold);
									break;
								}
							}
							else
								count = 0;//重置,保证小于的点都是连续的
						}
					}

					if (d & 2)
					{
						int vt = v + threshold, count = 0;

						for (k = 0; k < N; k++)
						{
							int x = ptr[pixel[k]];
							if (x > vt)
							{
								if (++count > K)
								{
									cornerpos[ncorners++] = j;
									if (nonmax_suppression)
										curr[j] = (uchar)cornerScore<patternSize>(ptr, pixel, threshold);
									break;
								}
							}
							else
								count = 0;
						}
					}
				}
			}

			cornerpos[-1] = ncorners;

			if (i == 3)
				continue;

			const uchar* prev = buf[(i - 4 + 3) % 3];//+3是为了防止负数
			const uchar* pprev = buf[(i - 5 + 3) % 3];
			cornerpos = cpbuf[(i - 4 + 3) % 3];
			ncorners = cornerpos[-1];

			for (k = 0; k < ncorners; k++)//检查上一行的角点是否会被NMS抑制掉
			{
				j = cornerpos[k];
				int score = prev[j];
				if (!nonmax_suppression ||
					(score > prev[j + 1] && score > prev[j - 1] &&
					score > pprev[j - 1] && score > pprev[j] && score > pprev[j + 1] &&
					score > curr[j - 1] && score > curr[j] && score > curr[j + 1]))
				{
					keypoints.push_back(KeyPoint((float)j, (float)(i - 1), 7.f, -1, (float)score));
				}
			}
		}
	}

	void FASTX(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression, int type)
	{
		switch (type) {
		case FastFeatureDetector::TYPE_5_8://前面的数都是后面的一半加一
			FAST_t<8>(_img, keypoints, threshold, nonmax_suppression);
			break;
		case FastFeatureDetector::TYPE_7_12:
			FAST_t<12>(_img, keypoints, threshold, nonmax_suppression);
			break;
		case FastFeatureDetector::TYPE_9_16:
			FAST_t<16>(_img, keypoints, threshold, nonmax_suppression);
			break;
		}
	}

	void FAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression)
	{
		FASTX(_img, keypoints, threshold, nonmax_suppression, FastFeatureDetector::TYPE_9_16);
	}
}


 

参考文献

[1]Buta M. FASText: Efficientunconstrained scene text detector[C]//2015 IEEE International Conference onComputer Vision (ICCV). IEEE, 2015: 1206-1214.

 

[2]Rosten E, Drummond T.Machine learning for high-speed corner detection[C]//European conference oncomputer vision. Springer Berlin Heidelberg, 2006: 430-443.

FAST检测角点+SIFT特征描述符描述角点(MATLAB) FAST算法原理:若某像素与其周围邻域内足够多的像素点相差较大,则该点可能是角点。用FAST算法检测角点,代替差分高斯金字塔取极值检测角点的方法,速度块;接着用SIFT特征描述符描述角点,省略尺度空间值,只用原图像中角点邻域的梯度值和方向计算角点主方向,接着计算32个方向向量来描述角点。之和可用于特征点匹配。 立即下载

相关推荐

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2396

FastText算法原理解析

1. 前言 自然语言处理(NLP)是机器学习,人工智能中的一个重要领域。文本表达是 NLP中的基础技术,文本分类则是 NLP 的重要应用。fasttext是facebook开源的一个词向量与文本分类工具,在2016年开源,典型应用场景是“带监督的文本分类问题”。提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。 fastText结合了自然语言处理和机器学习中最成功的理念。这些...

weixin_30528371的博客 656

DexProtector内存校验绕过与DEX提取实战

DEX文件是Android应用的核心执行单元,其动态加载与运行时保护机制直接关系到App安全强度。DexProtector作为主流商业加固方案,摒弃传统文件级防护,转而依托ART虚拟机下的匿名内存映射段(anonymous mmap)构建多维校验体系——涵盖字节码完整性校验、内存页属性检测及运行时环境感知。其技术价值在于将防护锚点从静态APK迁移至动态内存态,大幅提升逆向门槛。典型应用场景包括金融类App的防篡改加固、游戏客户端的反外挂保护,以及政企应用的合规性安全增强。本文聚焦DexProtector v

weixin_30315435的博客 712

推荐开源项目:FASText - 高效的无约束场景文本检测器

推荐开源项目:FASText - 高效的无约束场景文本检测器 在当今这个信息爆炸的时代,图像中文本的自动识别成为了计算机视觉领域的一大热点。其中,FASText就是一款由Busta M., Neumann L., 和Matas J.在2015年的ICCV会议上提出的高效无约束场景文本检测利器。它不仅在效率上占有明显优势,更以其独特的算法设计,简化了复杂场景下文本的检测流程。 项目介绍 FASTex...

gitblog_00448的博客 616

Altium Designer差分走线实战:从规则设置到阻抗匹配的完整流程

本文详细讲解了在Altium Designer中进行差分走线的完整实战流程,涵盖从原理图定义差分对、PCB布局管理、关键设计规则设置,到利用阻抗计算工具确定线宽与间距,以及布线技巧与等长处理等核心步骤。文章旨在帮助工程师掌握高速PCB设计中差分信号传输的关键技术,确保信号完整性并实现精确的阻抗匹配。

weixin_29163857的博客 254

2026.3.9:具身智能之GraspNet:Ubuntu24.04安装GraspNet

本文详细介绍了在Ubuntu24.04系统下安装GraspNet具身智能框架的全过程。主要包括:1) 创建Python3.9虚拟环境;2) 安装CUDA12.8和PyTorch2.7.0等基础依赖;3) 编译安装pointnet2、knn和graspnetAPI三个核心组件;4) 修改源码适配新版PyTorch;5) 下载预训练权重并成功运行demo。安装过程中特别提示了可能遇到的报错处理方案,最终在GPU环境下实现了GraspNet的部署运行。整个流程涵盖了从环境配置到项目运行的完整步骤,为具身智能研究者

拥抱具身智能,昇腾Ascend C 202

开源项目推荐:FASText - 高效无约束场景文本检测器

开源项目推荐:FASText - 高效无约束场景文本检测器 1. 项目基础介绍与主要编程语言 FASText 是一个高效的无约束场景文本检测器,由 MichalBusta 开发并维护。该项目旨在解决复杂场景中文字的检测问题,广泛应用于图像处理、计算机视觉等领域。项目主要使用 C++ 编程语言,同时使用了 CMake 构建,并依赖 OpenCV 库。此外,项目中包含了一些用于处理和评估的工具,这些工...

gitblog_01024的博客 478

当启动容器的时候提示:exec format error?如何解决问题

Docker容器出现"exec format error"的主要原因是架构不兼容(如ARM设备运行x86镜像)。解决方案包括:1)匹配镜像与宿主机架构;2)构建时指定平台;3)安装QEMU模拟器;4)修复文件权限和格式;5)验证基础镜像兼容性。排查流程应从检查架构匹配开始,逐步验证权限、解释器和换行符等问题。建议优先使用多架构镜像,构建时明确指定平台,并使用buildx工具生成多平台镜像。调试时可进入容器手动验证文件格式和兼容性。

weixin_39291964的博客 2716

fastext

fastext fastext可以用于文本分类。 fasttext其实是在word2vec的基础上,修改了底层的特征表示。引入了ngram以及BPE。 fasttext使用x1,x2…xn表示一个ngram向量,原本使用一个向量可以表示一个词,这里需要使用多个向量来表示一个词;然后再使用全部的ngram去预测指定的类别。 引入了层级softmax,在做对很多个类别的分类预测时,由于频率更高的类别,具有更浅的深度,所以时间复杂度更低。 几个概念 BPE(byte pair encoder)字节对编码,可以

qq_25992377的博客 638

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5827

手把手教你学Simulink--基于飞行控制与稳定性的场景实例:固定翼无人机的自动起飞与降落控制

本文介绍了使用Simulink对固定翼无人机自动起飞与降落控制系统进行建模与仿真的完整流程。首先构建了包含飞行器动力学模型、控制系统、环境模拟等模块的系统结构,详细阐述了简化动力学方程的推导和实现。重点讲解了PID控制器设计,包括起飞阶段的速度控制和降落阶段的高度控制策略。通过添加环境干扰和输入信号,建立了完整的仿真模型,并利用输出显示模块评估系统性能。该实例为无人机自主控制系统的开发提供了有效的仿真验证方法,有助于优化参数提高飞行稳定性。

MHD0815的博客 4308

NLP学习——Fastext

facebookresearch/fastText: Library for fast text representation and classification. (github.com)fastText/python at main · facebookresearch/fastText (github.com)Word representations · fastTextText classification · fastText

fushe6766的博客 250

华为OD面试八股真题 - 操作系统 - 1

华为OD技术面,操作系统相关八股真题提供详细解答,这篇博客主要涉及于进程和线程相关知识点

qq_45776114的博客 1631

FASText(下):FASText

0导语 上一篇我们已经大致介绍了FAST角点,原始的FAST能处理一些带角点的的字母如L,P,但是很难处理o,和8等情况。以o为例,见下图,像素值会被截成四个部分,这样的话就很难满足原始的Fast角点需要连续多个点都要亮或暗的要求。另外由于Fast角点不是专门为定位文本设计,因此也会有很多的false postives.基于这些观察,FASText作者在Fast角点的基础上定制了两种角点SEK(...

PeaceInMind的博客 4061

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

FASText开源项目使用常见问题解决方案

FASText开源项目使用常见问题解决方案 FASText是一个开源项目,其核心功能是用于快速构建和训练文本分类器的Python库,使得用户能够使用简单的方法实现文本分类任务。主要编程语言是Python。 新手使用该项目需要注意的三个问题及解决步骤: 问题一:安装环境要求 新手可能会忽略阅读项目文档,不了解安装环境的要求,导致安装失败。 解决步骤: 确认Python版本。项目通常需要一个特定版本...

gitblog_01200的博客 278

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

faster-rcnn 之训练脚本解析:./tools/train_faster_rcnn_alt_opt.py

【说明】:分析faster-rcnn 训练的python脚本; #!/usr/bin/env python # -------------------------------------------------------- # Faster R-CNN # Copyright (c) 2015 Microsoft # Licensed under The MI

香蕉麦乐迪的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper:A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, Bag of Tricks for Efficient Text Classif...

素质云笔记 9万+

动手学深度学习 - NLP 词嵌入全解析:从 Word2Vec/GloVe 到 FastText/BPE 与 BERT

本文系统介绍了NLP中的词嵌入技术发展历程。首先讲解了Word2Vec的Skip-Gram和CBOW模型原理及其在中文文本的应用;然后介绍了融合全局统计的GloVe模型,并给出代码实践;针对传统词嵌入的缺陷,分析了FastText子词嵌入和BPE字节对编码的优势;最后重点阐述了上下文敏感的预训练模型BERT,包括其双向编码特性、输入表示方法以及中文分词器的具体使用方法。通过从静态词嵌入到动态上下文嵌入的技术演进,展现了NLP词向量表示的发展全貌。

nju_spy的博客 1014

fastText分类器

参考:https://blog.youkuaiyun.com/feilong_csdn/article/details/88655927

weixin_42631192的博客 188

FASText:高效无约束场景文本检测器

FASText:高效无约束场景文本检测器 项目介绍 FASText 是一个由 Michal Busta、Lukas Neumann 和 Jiri Matas 开发的开源项目,首次发表于 2015 年的 IEEE 国际计算机视觉会议(ICCV)。该工具旨在提供一种高效的手段来检测自然场景中的文本,无需特定约束。它利用了一种基于关键点的方法,在图像的尺度金字塔上绘制FASText关键点,并通过简单的H...

gitblog_00022的博客 427

Fasttext 总结

Fasttext是继word2vec词向量模型提出之后提出的模型(或者说算法),因为训练速度非常快而比较受工业界关注。Fastext本身也和word2vec模型有很多相似之处,这篇博文将会简单梳理一下fasttext相关知识,关于word2vec那部分就不细讲了。 Fasttext涉及两篇论文,也分别代表了它的两个应用方向 Bag of Tricks for Efficient Text Classification(201607) - 文本分类 Enriching Word Vectors with.

Steve Wang's blog 656

fasttext文本分类python实现_一个使用fasttext训练的新闻文本分类器/模型

fastext是什么?Facebook AI Research Lab 发布的一个用于快速进行文本分类和单词表示的库。优点是很快,可以进行分钟级训练,这意味着你可以在几分钟时间内就训练好一个分类模型。本文主要内容?使用fasttext训练一个效果不错的新闻文本分类器/模型。使用到的技术和环境?1. python 3.7、fasttext 0.9.1(截至2020/3/29最新版本) Windows...

weixin_39889792的博客 1296

FAST-ER角点检测算法详解(改良的FAST算法)

FAST-ER是FAST算法原作者在2010年提出的,它在原来算法里提高特征点检测的重复度,重复意味着第一张图片内的检测的点,也可以在第二张图片上的相应位置被检测出来,重复度可以由如下式子定义: 这里的Nrepeated指第一张图片内的检测点有多少能在第二张被检测到,而Nuseful定义为有用的特征点数。这里计算的一组图像序列的总的重复度,所以Nrepeated和Nuseful是图像序列

tostq的专栏 8198

FAST角点检测:Features From Accelerated Segment Test

FAST角点检测:Features From Accelerated Segment Test 一、FAST算法原理 二、FAST算法步骤 三、使用机器学习做一个角点分类器 四、非极大值抑制 五、OpenCV中进行FAST特征检测 六、小结 七、源码分析 八、参考文献 一、 FAST算法原理博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测),可以根据图

好记性不如烂笔头 7119
上一篇: 文字检测与识别资源
下一篇: FASText(下):FASText
PeaceInMind
博客等级 码龄11年 343粉丝 34原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值