由猫儿FM出品,怀上原声气球出品 广播剧《青龙图腾》12月15日正式开播! 崇明:余林纾疯了 武侯:甄黄羲 原《青龙图腾》在晋江文学城连载 我期待着在4天的倒计时中见...
-
同时,他们还比较了几种好的监督和非监督模型:
从以上两个结果可以看出,这种方法比大多数无监督模型好得多,与有监督学习相比也不差;最关键的问题是它是一个没有标注数据的端到端模型。
显然,这种新方法可以很容易地扩展到其他领域,包括语义分割。
二、自主驾驶的研究问题
报告标题:自动驾驶的有效场景理解
主讲人:石建萍商汤科技
论文下载地址:
场景理解:语义分段的上下文编码
对象理解:用于实例分割的路径聚合网络
视频理解:低延迟视频语义分割
3D场景结构理解:geonet:密集深度、光流、相机姿态的无监督学习
石建萍介绍了上唐科技2018年在CVPR发表的四篇文章,分别是自动驾驶研究中的场景理解、物体理解、视频理解和三维场景结构理解。
1.场景理解
关于场景的理解,上汤科技在2017年CVPR的一篇就业论文中做了相关的研究,他们在论文中提出了PSPNet模型,并通过金字塔池对场景进行了全局表示。
这种方法可以得到更好的场景信息,但金字塔汇集结构是人为设计的;它的计算还是比较重的。针对这两点,他们在今年的这篇文章中做了进一步的优化和加速。基本思路是用更灵活有效的模块代替人工设计的金字塔池。
首先,他们把特征编码放入一个类似字典学习的表达式中。当输入图片通过CNN网络时,信息被编码到字典基中,场景的表达被学习到特征中。然后,将学习到的场景特征拉伸到图片的原始维度,从而获得场景的信息。
除了上下文编码模块,石建萍等人在模型中加入了一个损失,即语义编码损失,以此来了解某个类别是否存在于整个世界。添加这样的全局约束后,对那些较小类别的预测会更好。
总的来说,这种方法比去年的方法表现好一点,但石建萍仍然对此感到遗憾,因为她认为去年整个方向没有多大改善,所以有必要看看是否由于其他原因性能不能得到很大改善。
2.物理理解
这篇关于对象理解的文章是他们去年在COCO比赛中的作品,该比赛获得了对象分割第一名和对象检测第二名。
根据石建萍的说法,他们最初的目的是实现更高的目标,所以他们基于两个最好的框架,一个是FPNet,另一个是Mask-RCNN,并做了一系列的改进。
他们设计了如下网络:
在这个网络中,我们仍然可以看到FPNet和Mask-RCNN的影子。改进如下:对FPNet的主干进行自下而上的增强;在FPNet中,每个尺度的建议是直接从相应的尺度中获得的,但是石建萍发现事实上其他尺度也会对这个尺度的建议有很大的帮助,所以他们加入了自适应特征学习的模块;在Mask-RCNN中,他们加入了全连通融合,可以保留更多的全局信息,进一步提高Mask。
以下是添加每个模块后的性能改进:
3.视频理解
从实际场景中获得的数据大部分是视频数据,但仍然没有能很好利用视频的方案。在本文中,石建萍等人考虑了如何在保持良好性能的同时减少视频理解的延迟。
设计的网络如下图所示:
关键思想是给关键帧分配相对较高的计算量,而类似的帧相应地分配较少的计算量。在网络中,另一个关键点是将前一帧的特征转移到下一帧。
他们为特征设置阈值,以便自动选择关键帧。显然,这里的阈值也决定了计算的准确性;其实如果不是必须的,可以设置稍微高一点的门槛。此外,该方法还可以动态反映视频帧的变化。比如场景变化很快的时候,关键点会很快出现。
特征传递是通过底层特征学习相应的权重,这些权重与输入相关,可以通过这些权重实现特征的自动传递。还有一点就是他们还设计了一个调度策略,使得整个关键帧的计算可以延迟,即在非关键帧部分可以同时计算关键帧信息;通过这种调度方案,可以有效降低整个网络的时延。
与其他方案相比,在做视频理解的时候,往往需要对每一帧都做很重的计算。本文提出的方案能够在保证较高性能的同时有效降低整个模型的延迟。
4.对三维场景结构的理解
以往关于理解三维场景结构的研究包括深度估计、光流估计和摄像机运动估计,但它们的每一部分都是一个独立的网络。因此,石建萍等人考虑是否有可能建立一个基于CNN的方案和几何约束的统一框架,同时得到更好的结果。
网络模型的结构如下图所示:
整个模型是一个无监督的网络,可以在没有任何外部信息的情况下训练深度、光流和摄像机运动。首先通过深度网络预测深度,得到深度图。另外,PoseNet用于预测相机运动;通过前后框架之间的信息。然后,将深度图和摄像机运动结合成刚性流,通过刚性流和最终流完成监督学习。
另一方面,考虑到会有一些刚性结构);在场景中;还有人,车等等。会因运动而改变。所以他们把两部分分开。前者可以通过相机运动轻松处理。对于对象运动,我们需要添加一个额外的约束。
整个目标函数如下,包括上述所有过程的损失:
最后,我们可以看到,这种无监督的方法比以前的方法可以获得更可靠的深度和流量结果,并且还发现移动对象的效果更好。代码下载链接:http://github.com/yzcjtr/GeoNet
第三,从深度和广度上引入神经风格转换
报告标题:神经类型转移的扩展
主讲人:廖婧-微软亚洲研究院
论文下载:
1.具有深度特征重组的任意风格转换
2.立体神经风格转移
廖婧介绍了她的团队在CVPR 2018年出版的关于神经风格转移的两个可扩展的作品。一种是深度方向上的延伸,即从理论上对以往的NST进行分类总结,提出一种整合各方优势的方法。另一个是在广度方向的扩展,即NST在VR和AR领域的应用。他们提出了一个限制左右眼风格不一致的网络模型。
1.更深:分类和扩展
风格转换已成为目前的研究热点。神经风格转换是指当给定两幅图片时,一幅是风格图像,另一幅是内容图像,然后通过预先训练的神经网络将前者的风格转换为后者。这种方法通常依靠预先训练好的CNN,能很好的分解图像,在高层表现图像的内容,在低层表现图像的风格。
因此,希望这个图像的深层特征与高层次的内容图像和低层次的样式图像相似。这是神经风格转移的一般思路。
目前所有的神经风格转换都定义了两个损失函数,即内容损失和风格损失。这些神经风格变换模型的内容损失通常采用特征映射之间的L^2损失函数;但是不同的车型风格损失是不一样的。
根据风格损失的不同,这些模型大致可以分为两类:一类是参数模型,要求生成的图片的特征图与待学习的风格图像的特征图在整体上具有统计相似性;另一种是非参数模型,希望最终生成的图片的特征图的局部面片全部来自于风格图像。所以可以说,前者定义了全局的相似性,后者定义了局部的相似性。
两种模式各有利弊。
参数化模型可以很好的学习风格的整体特征;但是localtexture的结构很难保证,会忽略空之间的一些布局。比如上图帆船的红色映射到海水。
另一方面,非参数模型可以很好地保证局部的结构,但很可能无法保证整体的模仿。另外,由于局部法没有限制如何使用补丁,可能会导致一两个补丁的大量出现,最终产生一个洗白神器。
那么一个很自然的思考就是,你能不能想出一个办法,把两者的优点结合起来,同时避免各自的缺点?廖婧的团队提出了这样一种新颖的方法,他们称之为洗牌。
这种方法的核心思想史:重新排列风格图像的深层特征,即每个像素出现一次,但出现的位置与原始图像不同。这种重排的结果首先符合局部styleloss另一方面,目前全局损失主要采用对所有像素求和的gram矩阵法。这种方法不关心像素是如何分布的,所以即使像素的分布受到干扰,也不会影响全局丢失的结果。因此,这种刷新方法不仅符合在gram矩阵上定义的全局样式,还符合在patch上定义的局部样式。在论文中,他们对这个结果做了数学分析,这里就不展开了。
但是这种方法有一个严格的要求,就是每个像素只能出现一次。有时这种要求会有问题,如下图所示:
内容形象有两人四眼,风格形象只有一人两眼。如果只允许贴片使用一次,眼罩是不够的。因此,在实际操作中,廖婧等人定义了一个相对软的参数,用来控制所使用的补丁数量。当参数较大时,约束性较强,模型更接近全局法;相反,更接近于非参数局部的结果。通过设置参数,可以动态调整结果的偏差,自适应融合两侧特征。
模型框架如下图所示:
样式转换后的对比图如下:
从结果可以看出,这种刷新方法比参数化方法更能保留局部纹理,比非参数化方法更能再现Style的整体特征。
2.更广:VR/AR/AR眼睛款式一样
现在VR和AR都很流行,微软也生产了相关产品Hololens。在对VR/AR应用风格转换时,首先会出现一个问题,就是VR/AR设备有左眼视图和右眼视图。如果两个视图的图像分别转换,即两者的转换没有相关性,那么左右眼看到的转换后的风格图像就会不一致,拍摄VR/AR时会出现各种鬼影,让用户无法很好的感受到3D风格结构。
解决这个问题的关键是在风格转换的过程中加入左右眼的约束,称为视差约束。
廖婧的团队定义了一个新的网络,大致分为三个部分。
第一种是图像风格转换网络,只要能分为编码器和解码器,可以是市面上任何一种图像风格转换网络。
其次,它是一个视差遮挡网络,以左右眼的图像作为输入,输出两帧图像之间的视差及其置信度。
在中间部分,根据视差进行特征增强,这意味着左眼和右眼向中间对称扭曲,然后在中间域进行增强,得到可信的结果,然后分别投影到左眼和右眼。
添加约束后的效果显示在动画中:
-
同时,他们还比较了几种好的监督和非监督模型:
从以上两个结果可以看出,这种方法比大多数无监督模型好得多,与有监督学习相比也不差;最关键的问题是它是一个没有标注数据的端到端模型。
显然,这种新方法可以很容易地扩展到其他领域,包括语义分割。
二、自主驾驶的研究问题
报告标题:自动驾驶的有效场景理解
主讲人:石建萍商汤科技
论文下载地址:
场景理解:语义分段的上下文编码
对象理解:用于实例分割的路径聚合网络
视频理解:低延迟视频语义分割
3D场景结构理解:geonet:密集深度、光流、相机姿态的无监督学习
石建萍介绍了上唐科技2018年在CVPR发表的四篇文章,分别是自动驾驶研究中的场景理解、物体理解、视频理解和三维场景结构理解。
1.场景理解
关于场景的理解,上汤科技在2017年CVPR的一篇就业论文中做了相关的研究,他们在论文中提出了PSPNet模型,并通过金字塔池对场景进行了全局表示。
这种方法可以得到更好的场景信息,但金字塔汇集结构是人为设计的;它的计算还是比较重的。针对这两点,他们在今年的这篇文章中做了进一步的优化和加速。基本思路是用更灵活有效的模块代替人工设计的金字塔池。
首先,他们把特征编码放入一个类似字典学习的表达式中。当输入图片通过CNN网络时,信息被编码到字典基中,场景的表达被学习到特征中。然后,将学习到的场景特征拉伸到图片的原始维度,从而获得场景的信息。
除了上下文编码模块,石建萍等人在模型中加入了一个损失,即语义编码损失,以此来了解某个类别是否存在于整个世界。添加这样的全局约束后,对那些较小类别的预测会更好。
总的来说,这种方法比去年的方法表现好一点,但石建萍仍然对此感到遗憾,因为她认为去年整个方向没有多大改善,所以有必要看看是否由于其他原因性能不能得到很大改善。
2.物理理解
这篇关于对象理解的文章是他们去年在COCO比赛中的作品,该比赛获得了对象分割第一名和对象检测第二名。
根据石建萍的说法,他们最初的目的是实现更高的目标,所以他们基于两个最好的框架,一个是FPNet,另一个是Mask-RCNN,并做了一系列的改进。
他们设计了如下网络:
在这个网络中,我们仍然可以看到FPNet和Mask-RCNN的影子。改进如下:对FPNet的主干进行自下而上的增强;在FPNet中,每个尺度的建议是直接从相应的尺度中获得的,但是石建萍发现事实上其他尺度也会对这个尺度的建议有很大的帮助,所以他们加入了自适应特征学习的模块;在Mask-RCNN中,他们加入了全连通融合,可以保留更多的全局信息,进一步提高Mask。
以下是添加每个模块后的性能改进:
3.视频理解
从实际场景中获得的数据大部分是视频数据,但仍然没有能很好利用视频的方案。在本文中,石建萍等人考虑了如何在保持良好性能的同时减少视频理解的延迟。
设计的网络如下图所示:
关键思想是给关键帧分配相对较高的计算量,而类似的帧相应地分配较少的计算量。在网络中,另一个关键点是将前一帧的特征转移到下一帧。
他们为特征设置阈值,以便自动选择关键帧。显然,这里的阈值也决定了计算的准确性;其实如果不是必须的,可以设置稍微高一点的门槛。此外,该方法还可以动态反映视频帧的变化。比如场景变化很快的时候,关键点会很快出现。
特征传递是通过底层特征学习相应的权重,这些权重与输入相关,可以通过这些权重实现特征的自动传递。还有一点就是他们还设计了一个调度策略,使得整个关键帧的计算可以延迟,即在非关键帧部分可以同时计算关键帧信息;通过这种调度方案,可以有效降低整个网络的时延。
与其他方案相比,在做视频理解的时候,往往需要对每一帧都做很重的计算。本文提出的方案能够在保证较高性能的同时有效降低整个模型的延迟。
4.对三维场景结构的理解
以往关于理解三维场景结构的研究包括深度估计、光流估计和摄像机运动估计,但它们的每一部分都是一个独立的网络。因此,石建萍等人考虑是否有可能建立一个基于CNN的方案和几何约束的统一框架,同时得到更好的结果。
网络模型的结构如下图所示:
整个模型是一个无监督的网络,可以在没有任何外部信息的情况下训练深度、光流和摄像机运动。首先通过深度网络预测深度,得到深度图。另外,PoseNet用于预测相机运动;通过前后框架之间的信息。然后,将深度图和摄像机运动结合成刚性流,通过刚性流和最终流完成监督学习。
另一方面,考虑到会有一些刚性结构);在场景中;还有人,车等等。会因运动而改变。所以他们把两部分分开。前者可以通过相机运动轻松处理。对于对象运动,我们需要添加一个额外的约束。
整个目标函数如下,包括上述所有过程的损失:
最后,我们可以看到,这种无监督的方法比以前的方法可以获得更可靠的深度和流量结果,并且还发现移动对象的效果更好。代码下载链接:http://github.com/yzcjtr/GeoNet
第三,从深度和广度上引入神经风格转换
报告标题:神经类型转移的扩展
主讲人:廖婧-微软亚洲研究院
论文下载:
1.具有深度特征重组的任意风格转换
2.立体神经风格转移
廖婧介绍了她的团队在CVPR 2018年出版的关于神经风格转移的两个可扩展的作品。一种是深度方向上的延伸,即从理论上对以往的NST进行分类总结,提出一种整合各方优势的方法。另一个是在广度方向的扩展,即NST在VR和AR领域的应用。他们提出了一个限制左右眼风格不一致的网络模型。
1.更深:分类和扩展
风格转换已成为目前的研究热点。神经风格转换是指当给定两幅图片时,一幅是风格图像,另一幅是内容图像,然后通过预先训练的神经网络将前者的风格转换为后者。这种方法通常依靠预先训练好的CNN,能很好的分解图像,在高层表现图像的内容,在低层表现图像的风格。
因此,希望这个图像的深层特征与高层次的内容图像和低层次的样式图像相似。这是神经风格转移的一般思路。
目前所有的神经风格转换都定义了两个损失函数,即内容损失和风格损失。这些神经风格变换模型的内容损失通常采用特征映射之间的L^2损失函数;但是不同的车型风格损失是不一样的。
根据风格损失的不同,这些模型大致可以分为两类:一类是参数模型,要求生成的图片的特征图与待学习的风格图像的特征图在整体上具有统计相似性;另一种是非参数模型,希望最终生成的图片的特征图的局部面片全部来自于风格图像。所以可以说,前者定义了全局的相似性,后者定义了局部的相似性。
两种模式各有利弊。
参数化模型可以很好的学习风格的整体特征;但是localtexture的结构很难保证,会忽略空之间的一些布局。比如上图帆船的红色映射到海水。
另一方面,非参数模型可以很好地保证局部的结构,但很可能无法保证整体的模仿。另外,由于局部法没有限制如何使用补丁,可能会导致一两个补丁的大量出现,最终产生一个洗白神器。
那么一个很自然的思考就是,你能不能想出一个办法,把两者的优点结合起来,同时避免各自的缺点?廖婧的团队提出了这样一种新颖的方法,他们称之为洗牌。
这种方法的核心思想史:重新排列风格图像的深层特征,即每个像素出现一次,但出现的位置与原始图像不同。这种重排的结果首先符合局部styleloss另一方面,目前全局损失主要采用对所有像素求和的gram矩阵法。这种方法不关心像素是如何分布的,所以即使像素的分布受到干扰,也不会影响全局丢失的结果。因此,这种刷新方法不仅符合在gram矩阵上定义的全局样式,还符合在patch上定义的局部样式。在论文中,他们对这个结果做了数学分析,这里就不展开了。
但是这种方法有一个严格的要求,就是每个像素只能出现一次。有时这种要求会有问题,如下图所示:
内容形象有两人四眼,风格形象只有一人两眼。如果只允许贴片使用一次,眼罩是不够的。因此,在实际操作中,廖婧等人定义了一个相对软的参数,用来控制所使用的补丁数量。当参数较大时,约束性较强,模型更接近全局法;相反,更接近于非参数局部的结果。通过设置参数,可以动态调整结果的偏差,自适应融合两侧特征。
模型框架如下图所示:
样式转换后的对比图如下:
从结果可以看出,这种刷新方法比参数化方法更能保留局部纹理,比非参数化方法更能再现Style的整体特征。
2.更广:VR/AR/AR眼睛款式一样
现在VR和AR都很流行,微软也生产了相关产品Hololens。在对VR/AR应用风格转换时,首先会出现一个问题,就是VR/AR设备有左眼视图和右眼视图。如果两个视图的图像分别转换,即两者的转换没有相关性,那么左右眼看到的转换后的风格图像就会不一致,拍摄VR/AR时会出现各种鬼影,让用户无法很好的感受到3D风格结构。
解决这个问题的关键是在风格转换的过程中加入左右眼的约束,称为视差约束。
廖婧的团队定义了一个新的网络,大致分为三个部分。
第一种是图像风格转换网络,只要能分为编码器和解码器,可以是市面上任何一种图像风格转换网络。
其次,它是一个视差遮挡网络,以左右眼的图像作为输入,输出两帧图像之间的视差及其置信度。
在中间部分,根据视差进行特征增强,这意味着左眼和右眼向中间对称扭曲,然后在中间域进行增强,得到可信的结果,然后分别投影到左眼和右眼。
添加约束后的效果显示在动画中:
由猫儿FM出品,怀上原声气球出品 广播剧《青龙图腾》12月15日正式开播! 崇明:余林纾疯了 武侯:甄黄羲 原《青龙图腾》在晋江文学城连载 我期待着在4天的倒计时中见...
-
现在打开Python shell,确认已经导入了OpenCV和pytesseract:
恭喜!如果没有导入错误,您的机器现在已经安装,可以使用OpenCV执行光学字符识别和文本识别任务。
了解OpenCV光学字符识别和镶嵌文字识别
图3: OpenCV OCR流程图。
现在我们已经在系统上成功安装了OpenCV和Tesseract,让我们简单回顾一下这个过程和相关的命令。
首先,我们使用OpenCV的EAST文本检测器来检测图像中的文本。东部文本检测器将提供文本感兴趣区域的边界框坐标。我们将提取每个文本的感兴趣区域,并将其输入到镶嵌v4的LSTM深度学习文本识别算法中。LSTM的输出将提供实际的光学字符识别结果。最后,我们将在输出图像上绘制OpenCV OCR结果。
过程中使用的Tesseract命令必须在pytesseract库下调用。在调用tessarct库时,我们需要提供大量的标志。最重要的三个标志是-l,- oem和- ism。
-l标志控制输入文本的语言。英语在本教程示例中使用。在这里你可以看到宇宙魔方支持的所有语言:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files.
- oem控制Tesseract使用的算法类型。执行以下命令查看可用的光学字符识别引擎模式:
我们将使用- oem 1,这表明我们只想使用深度学习LSTM引擎。
最后一个重要标志- psm控制着Tesseract使用的自动页面分割模式:
在对文本ROI进行OCR时,我发现模式6和模式7表现更好,但如果对大量文本进行OCR,可以尝试3。
如果你得到不正确的OCR结果,我强烈建议调整- psm,这会极大地影响你输出的OCR结果。
项目结构
您可以从本文的下载部分下载。然后解压进入目录。以下树形命令使我们能够在终端查看目录结构:
我们的项目包含一个目录和两个重要文件:
images/:该目录包含六个含有场景文本的测试图像。我们将使用这些图像进行 OpenCV OCR 操作。frozen_east_text_detection.pb:EAST 文本检测器。该 CNN 已经经过预训练,可用于文本检测。它是由 OpenCV 提供的,你也可以在「Downloads」部分下载它。text_recognition.py:我们的 OCR 脚本。我们将逐行 review 该脚本。它使用 EAST 文本检测器找到图像中的文本区域,然后利用 Tesseract v4 执行文本识别。实现我们的OpenCV光学字符识别算法
现在让我们开始使用OpenCV来执行文本识别!
打开text_recognition.py文件并插入以下代码:
本教程中的OCR脚本需要五次导入,其中一次已经内置到OpenCV中。
最重要的一点是,我们将使用pytesseract和OpenCV。我的imutils包会用于非最大值抑制,因为OpenCV的NMSBoxes函数无法适应Python API。我注意到NumPy是OpenCV的一个依赖。
argparse包包含在Python中,用于处理命令行参数,所以不需要在这里安装。
现在您已经处理了导入,让我们实现decode_predictions函数:
decode_predictions函数从第8行开始,本文对此进行了详细描述。功能:
使用基于深度学习的文本检测器来检测(不是识别)图像中的文本区域。该文本检测器生成两个阵列,一个包括给定区域包含文本的概率,另一个阵列将该概率映射到输入图像中的边界框位置。东部文本检测器产生两个变量:
scores:文本区域的概率。geometry:文本区域的边界框位置。这两个变量都是decode_predictions函数的参数。
该函数处理输入数据,并获得包含文本边界框的位置和该区域包含文本的相应概率的元组:
rects:该值基于 geometry,其格式更加紧凑,方便我们稍后将其应用于 NMS。confidences:该列表中的置信度值对应 rects 中的每个矩形。这两个值都是由decode_predictions函数获得的。
注意:在完美的情况下,旋转的包围盒也是矩形的,但是提取旋转的包围盒不利于解释本教程的概念。因此,我计算了水平边框矩形。如果你想提取文本的旋转边界框并输入宇宙魔方,你可以在第41行得到角度。
有关上述代码块的更多详细信息,请参见https://www . pyimagesearch . com/2018/08/20/opencv-text-detection-east-text-detector。
让我们解析命令行参数:
我们的脚本需要两个命令行参数:
--image:输入图像的路径。--east:预训练 EAST 文本检测器的路径。以下命令行参数是可选的:
--min-confidence:检测到的文本区域的最小概率。--width:图像输入 EAST 文本检测器之前需要重新调整的宽度,我们的检测器要求宽度是 32 的倍数。--height:与宽度类似。检测器要求调整后的高度是 32 的倍数。--padding:添加到每个 ROI 边框的(可选)填充数量。如果你发现 OCR 结果不正确,那么你可以尝试 0.05、0.10 等值。接下来,我们将加载和预处理图像,并初始化关键变量:
第82行和第83行,将图像加载到内存中并复制。
获取原始的宽度和高度,然后从args字典中提取新的宽度和高度。我们使用原始尺寸和新尺寸来计算比率,该比率用于在稍后的脚本中扩展边界框坐标。
然后调整图像大小,忽略这里的纵横比。
接下来,我们将使用EAST文本检测器:
第99到101行,将两个输出层的名称转换为列表格式。然后,预训练的EAST神经网络被加载到存储器中。
必须强调的是,你至少需要OpenCV 3 . 4 . 2版,有cv2.dnn.readNet实现。
下一步是见证第一个“奇迹”:
要查找文本,我们:
在第 109 和 110 行构建 blob。详情参见 https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/。将 blob 输入 EAST 神经网络中,获取 scores 和 geometry(第 111 和 112 行)。使用之前定义的 decode_predictions 函数解码预测(第 116 行)。通过 imutils 方法进行非极大值抑制(第 117 行)。NMS 高效使用概率最高的文本区域,删除其他重叠区域。现在我们知道了文本区域的位置,我们需要识别文本。我们开始围绕边界框循环,并处理结果,为实际的文本识别做准备:
我们初始化结果列表,以包括我们的光学字符识别边界框和文本。然后在盒子上循环,我们:
基于之前计算的比率扩展边界框(第 126-129 行)。填充边界框(第 134-141 行)。最后,提取被填充的 roi(第 144 行)。本文中的OpenCV OCR过程可以用一点点魔方v4“魔法”来完成:
在第151行,我们设置了宇宙魔方配置参数。
注意:如果您得到错误的光学字符识别结果,您可能需要使用本教程开头的说明来配置- psm值。
在第152行,pytesseract库执行剩余的操作,调用pytesseract.image _ to _ string,并输入roi和配置字符串。
只需两行代码,就可以使用Tesseract v4来识别图像中的文本感兴趣区域。记住,很多过程发生在底层。
我们的结果附加到结果列表。
接下来,我们继续这个过程,并在循环的基础上处理其他ROI。
现在,让我们打印出结果,看看它是否真的有效:
第159行根据边界框的Y坐标从上到下对结果进行排序。
为了循环显示结果,我们:
将 OCR 处理过的文本打印到终端(第 164-166 行)。从文本中去掉非 ASCII 字符,因为 OpenCV 在 cv2.putText 函数中不支持非 ASCII 字符(第 171 行)。基于 ROI 绘制 ROI 周围的边界框和结果文本(第 173-176 行)。展示输出,等待即将按下的键(第 179、180 行)。OpenCV文本识别结果
现在我们已经实现了OpenCV OCR流程。
请务必使用本教程的下载部分下载源代码、OpenCV EAST文本检测器模型和示例图像。
打开命令行,导航到您下载并提取压缩包的位置,然后执行以下命令:
图4:第一次尝试OpenCV OCR成功!
先说一个简单的例子。
注意我们的OpenCV OCR系统是如何正确检测图像中的文字,然后识别文字的。
下一个例子更具代表性,是一个真实世界的图像:
图5:对于更复杂的图像例子,我们使用OpenCV和Tesseract 4对白色背景的招牌进行OCR。
第三,关注我们的OpenCV OCR系统如何正确定位和识别文本。但是,在终端输出中,我们看到了一个注册商标Unicode符号,其中Tesseract可能会被欺骗,因为OpenCV EAST文本检测器报告的边界框与标志后面的植物重叠。
让我们看看OpenCV OCR和文本识别的另一个例子:
-
现在打开Python shell,确认已经导入了OpenCV和pytesseract:
恭喜!如果没有导入错误,您的机器现在已经安装,可以使用OpenCV执行光学字符识别和文本识别任务。
了解OpenCV光学字符识别和镶嵌文字识别
图3: OpenCV OCR流程图。
现在我们已经在系统上成功安装了OpenCV和Tesseract,让我们简单回顾一下这个过程和相关的命令。
首先,我们使用OpenCV的EAST文本检测器来检测图像中的文本。东部文本检测器将提供文本感兴趣区域的边界框坐标。我们将提取每个文本的感兴趣区域,并将其输入到镶嵌v4的LSTM深度学习文本识别算法中。LSTM的输出将提供实际的光学字符识别结果。最后,我们将在输出图像上绘制OpenCV OCR结果。
过程中使用的Tesseract命令必须在pytesseract库下调用。在调用tessarct库时,我们需要提供大量的标志。最重要的三个标志是-l,- oem和- ism。
-l标志控制输入文本的语言。英语在本教程示例中使用。在这里你可以看到宇宙魔方支持的所有语言:https://github.com/tesseract-ocr/tesseract/wiki/Data-Files.
- oem控制Tesseract使用的算法类型。执行以下命令查看可用的光学字符识别引擎模式:
我们将使用- oem 1,这表明我们只想使用深度学习LSTM引擎。
最后一个重要标志- psm控制着Tesseract使用的自动页面分割模式:
在对文本ROI进行OCR时,我发现模式6和模式7表现更好,但如果对大量文本进行OCR,可以尝试3。
如果你得到不正确的OCR结果,我强烈建议调整- psm,这会极大地影响你输出的OCR结果。
项目结构
您可以从本文的下载部分下载。然后解压进入目录。以下树形命令使我们能够在终端查看目录结构:
我们的项目包含一个目录和两个重要文件:
images/:该目录包含六个含有场景文本的测试图像。我们将使用这些图像进行 OpenCV OCR 操作。frozen_east_text_detection.pb:EAST 文本检测器。该 CNN 已经经过预训练,可用于文本检测。它是由 OpenCV 提供的,你也可以在「Downloads」部分下载它。text_recognition.py:我们的 OCR 脚本。我们将逐行 review 该脚本。它使用 EAST 文本检测器找到图像中的文本区域,然后利用 Tesseract v4 执行文本识别。实现我们的OpenCV光学字符识别算法
现在让我们开始使用OpenCV来执行文本识别!
打开text_recognition.py文件并插入以下代码:
本教程中的OCR脚本需要五次导入,其中一次已经内置到OpenCV中。
最重要的一点是,我们将使用pytesseract和OpenCV。我的imutils包会用于非最大值抑制,因为OpenCV的NMSBoxes函数无法适应Python API。我注意到NumPy是OpenCV的一个依赖。
argparse包包含在Python中,用于处理命令行参数,所以不需要在这里安装。
现在您已经处理了导入,让我们实现decode_predictions函数:
decode_predictions函数从第8行开始,本文对此进行了详细描述。功能:
使用基于深度学习的文本检测器来检测(不是识别)图像中的文本区域。该文本检测器生成两个阵列,一个包括给定区域包含文本的概率,另一个阵列将该概率映射到输入图像中的边界框位置。东部文本检测器产生两个变量:
scores:文本区域的概率。geometry:文本区域的边界框位置。这两个变量都是decode_predictions函数的参数。
该函数处理输入数据,并获得包含文本边界框的位置和该区域包含文本的相应概率的元组:
rects:该值基于 geometry,其格式更加紧凑,方便我们稍后将其应用于 NMS。confidences:该列表中的置信度值对应 rects 中的每个矩形。这两个值都是由decode_predictions函数获得的。
注意:在完美的情况下,旋转的包围盒也是矩形的,但是提取旋转的包围盒不利于解释本教程的概念。因此,我计算了水平边框矩形。如果你想提取文本的旋转边界框并输入宇宙魔方,你可以在第41行得到角度。
有关上述代码块的更多详细信息,请参见https://www . pyimagesearch . com/2018/08/20/opencv-text-detection-east-text-detector。
让我们解析命令行参数:
我们的脚本需要两个命令行参数:
--image:输入图像的路径。--east:预训练 EAST 文本检测器的路径。以下命令行参数是可选的:
--min-confidence:检测到的文本区域的最小概率。--width:图像输入 EAST 文本检测器之前需要重新调整的宽度,我们的检测器要求宽度是 32 的倍数。--height:与宽度类似。检测器要求调整后的高度是 32 的倍数。--padding:添加到每个 ROI 边框的(可选)填充数量。如果你发现 OCR 结果不正确,那么你可以尝试 0.05、0.10 等值。接下来,我们将加载和预处理图像,并初始化关键变量:
第82行和第83行,将图像加载到内存中并复制。
获取原始的宽度和高度,然后从args字典中提取新的宽度和高度。我们使用原始尺寸和新尺寸来计算比率,该比率用于在稍后的脚本中扩展边界框坐标。
然后调整图像大小,忽略这里的纵横比。
接下来,我们将使用EAST文本检测器:
第99到101行,将两个输出层的名称转换为列表格式。然后,预训练的EAST神经网络被加载到存储器中。
必须强调的是,你至少需要OpenCV 3 . 4 . 2版,有cv2.dnn.readNet实现。
下一步是见证第一个“奇迹”:
要查找文本,我们:
在第 109 和 110 行构建 blob。详情参见 https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/。将 blob 输入 EAST 神经网络中,获取 scores 和 geometry(第 111 和 112 行)。使用之前定义的 decode_predictions 函数解码预测(第 116 行)。通过 imutils 方法进行非极大值抑制(第 117 行)。NMS 高效使用概率最高的文本区域,删除其他重叠区域。现在我们知道了文本区域的位置,我们需要识别文本。我们开始围绕边界框循环,并处理结果,为实际的文本识别做准备:
我们初始化结果列表,以包括我们的光学字符识别边界框和文本。然后在盒子上循环,我们:
基于之前计算的比率扩展边界框(第 126-129 行)。填充边界框(第 134-141 行)。最后,提取被填充的 roi(第 144 行)。本文中的OpenCV OCR过程可以用一点点魔方v4“魔法”来完成:
在第151行,我们设置了宇宙魔方配置参数。
注意:如果您得到错误的光学字符识别结果,您可能需要使用本教程开头的说明来配置- psm值。
在第152行,pytesseract库执行剩余的操作,调用pytesseract.image _ to _ string,并输入roi和配置字符串。
只需两行代码,就可以使用Tesseract v4来识别图像中的文本感兴趣区域。记住,很多过程发生在底层。
我们的结果附加到结果列表。
接下来,我们继续这个过程,并在循环的基础上处理其他ROI。
现在,让我们打印出结果,看看它是否真的有效:
第159行根据边界框的Y坐标从上到下对结果进行排序。
为了循环显示结果,我们:
将 OCR 处理过的文本打印到终端(第 164-166 行)。从文本中去掉非 ASCII 字符,因为 OpenCV 在 cv2.putText 函数中不支持非 ASCII 字符(第 171 行)。基于 ROI 绘制 ROI 周围的边界框和结果文本(第 173-176 行)。展示输出,等待即将按下的键(第 179、180 行)。OpenCV文本识别结果
现在我们已经实现了OpenCV OCR流程。
请务必使用本教程的下载部分下载源代码、OpenCV EAST文本检测器模型和示例图像。
打开命令行,导航到您下载并提取压缩包的位置,然后执行以下命令:
图4:第一次尝试OpenCV OCR成功!
先说一个简单的例子。
注意我们的OpenCV OCR系统是如何正确检测图像中的文字,然后识别文字的。
下一个例子更具代表性,是一个真实世界的图像:
图5:对于更复杂的图像例子,我们使用OpenCV和Tesseract 4对白色背景的招牌进行OCR。
第三,关注我们的OpenCV OCR系统如何正确定位和识别文本。但是,在终端输出中,我们看到了一个注册商标Unicode符号,其中Tesseract可能会被欺骗,因为OpenCV EAST文本检测器报告的边界框与标志后面的植物重叠。
让我们看看OpenCV OCR和文本识别的另一个例子:
-
那么,CV和简历有什么区别呢?
●科研、教育、学术研究方面的职位,需要提供CV。与简历相比,简历通常更详细,更全面。
●简历完整形式为拉丁币简历,简历主要用于申请学术、教育、科研职位,或者申请奖学金等。现在人们经常把简历和简历叫做“简历”,但其实简历应该是“简历”,简历就是简历。
●简历要求概述与求职相关的教育准备和经历,是经验和技能的总结,主要目的是说服用人单位自行录用;简历需要以学术工作为主,不关注与学历、学业成绩没有直接关系的材料。
以下是关于简历和简历写作的注意事项:
1、CV比简历长。因为前者强调申请人的全面性,而后者强调申请人特征的简单性。
2.如果你是硕士或博士毕业,在简历上简单写下你的毕业论文。
3.研究简历中的语言等级:你的语言应该是非专业人士可以理解的,同时,这个专业的专家应该对你的学术成就感兴趣。
4.求职信:简历必须要有求职信。可以省略吗?这个问题很好回答:有的人吃饭前洗手,有的人不洗手,由你决定。
5.简历选择使用强有力的主动动词。如果学生使用负责。“负责”是发生在你身上的事,不是你做的事。
6.简历应该是基于成绩来描述相关背景,而不是发生在你身上的事。因此,不要写工作经验
7、“注重细节”。你就是这样的人,别人不是吗?写自己独特的地方。
8.“努力”体现在简历中的事实上,不要用每个人都能说的话来体现你的努力。
9.“告诉玩家/结果导向”也是一样,用简历中的事实展示而不是告诉你。
10.S-A-R写作:CV主要显示协议,所以可以按照S-A-R写作:情况,行动,结果。也就是说,CV是用来表现成绩的,而不是简单的描述经历。
CV的架构
个人信息和联系信息
个人详细信息和联系信息
主要包括个人姓名、生日、手机号码、邮箱和地址。
教育背景和职业资格
教育和资格
学历包括学校和专业,平均分/绩点/专业排名按副科列出。你应该仔细标明你学习的开始和结束时间。没毕业的可以写。
行业资质主要是指如果加入各种专业和行业组织,需要注明加盟时间。
获奖经历
荣誉和奖励
按时间顺序从最早到现在。由于奖项很多,奖项的比例可以在奖项后注明,让审计人员更直观的感受到奖项的含金量,比如一等奖。
志愿工作
志愿者
这一节也可以与实习经历放在一起,注明时间和志愿机构或志愿者。时间越长越好。用同一句话写下你的工作和权威。
技能/爱好
技能/爱好
关于技能,比如C/C++/Java。这个更倾向于找工作的方向。如果空间不够,就没必要写了。但如果沈剑飞/博士等人有直接导师的话,可以写出来表明自己十八般武艺都精通,尤其是工作方面。
←重点!!!
写CV各部分的时候,总是以“动词”开头的句子。
而且描述要具体清晰,最好能提出数字来证明,而不是堆砌一堆形容词。
重点应该放在你成就了多少人,这个成就带来了什么影响。
总而言之,简历是要做的
简单明了,详细恰当,内容全面,专业突出
希望所有出国留学的和尚都能写出吸引眼球的简历!
-
那么,CV和简历有什么区别呢?
●科研、教育、学术研究方面的职位,需要提供CV。与简历相比,简历通常更详细,更全面。
●简历完整形式为拉丁币简历,简历主要用于申请学术、教育、科研职位,或者申请奖学金等。现在人们经常把简历和简历叫做“简历”,但其实简历应该是“简历”,简历就是简历。
●简历要求概述与求职相关的教育准备和经历,是经验和技能的总结,主要目的是说服用人单位自行录用;简历需要以学术工作为主,不关注与学历、学业成绩没有直接关系的材料。
以下是关于简历和简历写作的注意事项:
1、CV比简历长。因为前者强调申请人的全面性,而后者强调申请人特征的简单性。
2.如果你是硕士或博士毕业,在简历上简单写下你的毕业论文。
3.研究简历中的语言等级:你的语言应该是非专业人士可以理解的,同时,这个专业的专家应该对你的学术成就感兴趣。
4.求职信:简历必须要有求职信。可以省略吗?这个问题很好回答:有的人吃饭前洗手,有的人不洗手,由你决定。
5.简历选择使用强有力的主动动词。如果学生使用负责。“负责”是发生在你身上的事,不是你做的事。
6.简历应该是基于成绩来描述相关背景,而不是发生在你身上的事。因此,不要写工作经验
7、“注重细节”。你就是这样的人,别人不是吗?写自己独特的地方。
8.“努力”体现在简历中的事实上,不要用每个人都能说的话来体现你的努力。
9.“告诉玩家/结果导向”也是一样,用简历中的事实展示而不是告诉你。
10.S-A-R写作:CV主要显示协议,所以可以按照S-A-R写作:情况,行动,结果。也就是说,CV是用来表现成绩的,而不是简单的描述经历。
CV的架构
个人信息和联系信息
个人详细信息和联系信息
主要包括个人姓名、生日、手机号码、邮箱和地址。
教育背景和职业资格
教育和资格
学历包括学校和专业,平均分/绩点/专业排名按副科列出。你应该仔细标明你学习的开始和结束时间。没毕业的可以写。
行业资质主要是指如果加入各种专业和行业组织,需要注明加盟时间。
获奖经历
荣誉和奖励
按时间顺序从最早到现在。由于奖项很多,奖项的比例可以在奖项后注明,让审计人员更直观的感受到奖项的含金量,比如一等奖。
志愿工作
志愿者
这一节也可以与实习经历放在一起,注明时间和志愿机构或志愿者。时间越长越好。用同一句话写下你的工作和权威。
技能/爱好
技能/爱好
关于技能,比如C/C++/Java。这个更倾向于找工作的方向。如果空间不够,就没必要写了。但如果沈剑飞/博士等人有直接导师的话,可以写出来表明自己十八般武艺都精通,尤其是工作方面。
←重点!!!
写CV各部分的时候,总是以“动词”开头的句子。
而且描述要具体清晰,最好能提出数字来证明,而不是堆砌一堆形容词。
重点应该放在你成就了多少人,这个成就带来了什么影响。
总而言之,简历是要做的
简单明了,详细恰当,内容全面,专业突出
希望所有出国留学的和尚都能写出吸引眼球的简历!
-
那么,CV和简历有什么区别呢?
●科研、教育、学术研究方面的职位,需要提供CV。与简历相比,简历通常更详细,更全面。
●简历完整形式为拉丁币简历,简历主要用于申请学术、教育、科研职位,或者申请奖学金等。现在人们经常把简历和简历叫做“简历”,但其实简历应该是“简历”,简历就是简历。
●简历要求概述与求职相关的教育准备和经历,是经验和技能的总结,主要目的是说服用人单位自行录用;简历需要以学术工作为主,不关注与学历、学业成绩没有直接关系的材料。
以下是关于简历和简历写作的注意事项:
1、CV比简历长。因为前者强调申请人的全面性,而后者强调申请人特征的简单性。
2.如果你是硕士或博士毕业,在简历上简单写下你的毕业论文。
3.研究简历中的语言等级:你的语言应该是非专业人士可以理解的,同时,这个专业的专家应该对你的学术成就感兴趣。
4.求职信:简历必须要有求职信。可以省略吗?这个问题很好回答:有的人吃饭前洗手,有的人不洗手,由你决定。
5.简历选择使用强有力的主动动词。如果学生使用负责。“负责”是发生在你身上的事,不是你做的事。
6.简历应该是基于成绩来描述相关背景,而不是发生在你身上的事。因此,不要写工作经验
7、“注重细节”。你就是这样的人,别人不是吗?写自己独特的地方。
8.“努力”体现在简历中的事实上,不要用每个人都能说的话来体现你的努力。
9.“告诉玩家/结果导向”也是一样,用简历中的事实展示而不是告诉你。
10.S-A-R写作:CV主要显示协议,所以可以按照S-A-R写作:情况,行动,结果。也就是说,CV是用来表现成绩的,而不是简单的描述经历。
CV的架构
个人信息和联系信息
个人详细信息和联系信息
主要包括个人姓名、生日、手机号码、邮箱和地址。
教育背景和职业资格
教育和资格
学历包括学校和专业,平均分/绩点/专业排名按副科列出。你应该仔细标明你学习的开始和结束时间。没毕业的可以写。
行业资质主要是指如果加入各种专业和行业组织,需要注明加盟时间。
获奖经历
荣誉和奖励
按时间顺序从最早到现在。由于奖项很多,奖项的比例可以在奖项后注明,让审计人员更直观的感受到奖项的含金量,比如一等奖。
志愿工作
志愿者
这一节也可以与实习经历放在一起,注明时间和志愿机构或志愿者。时间越长越好。用同一句话写下你的工作和权威。
技能/爱好
技能/爱好
关于技能,比如C/C++/Java。这个更倾向于找工作的方向。如果空间不够,就没必要写了。但如果沈剑飞/博士等人有直接导师的话,可以写出来表明自己十八般武艺都精通,尤其是工作方面。
←重点!!!
写CV各部分的时候,总是以“动词”开头的句子。
而且描述要具体清晰,最好能提出数字来证明,而不是堆砌一堆形容词。
重点应该放在你成就了多少人,这个成就带来了什么影响。
总而言之,简历是要做的
简单明了,详细恰当,内容全面,专业突出
希望所有出国留学的和尚都能写出吸引眼球的简历!
-
那么,CV和简历有什么区别呢?
●科研、教育、学术研究方面的职位,需要提供CV。与简历相比,简历通常更详细,更全面。
●简历完整形式为拉丁币简历,简历主要用于申请学术、教育、科研职位,或者申请奖学金等。现在人们经常把简历和简历叫做“简历”,但其实简历应该是“简历”,简历就是简历。
●简历要求概述与求职相关的教育准备和经历,是经验和技能的总结,主要目的是说服用人单位自行录用;简历需要以学术工作为主,不关注与学历、学业成绩没有直接关系的材料。
以下是关于简历和简历写作的注意事项:
1、CV比简历长。因为前者强调申请人的全面性,而后者强调申请人特征的简单性。
2.如果你是硕士或博士毕业,在简历上简单写下你的毕业论文。
3.研究简历中的语言等级:你的语言应该是非专业人士可以理解的,同时,这个专业的专家应该对你的学术成就感兴趣。
4.求职信:简历必须要有求职信。可以省略吗?这个问题很好回答:有的人吃饭前洗手,有的人不洗手,由你决定。
5.简历选择使用强有力的主动动词。如果学生使用负责。“负责”是发生在你身上的事,不是你做的事。
6.简历应该是基于成绩来描述相关背景,而不是发生在你身上的事。因此,不要写工作经验
7、“注重细节”。你就是这样的人,别人不是吗?写自己独特的地方。
8.“努力”体现在简历中的事实上,不要用每个人都能说的话来体现你的努力。
9.“告诉玩家/结果导向”也是一样,用简历中的事实展示而不是告诉你。
10.S-A-R写作:CV主要显示协议,所以可以按照S-A-R写作:情况,行动,结果。也就是说,CV是用来表现成绩的,而不是简单的描述经历。
CV的架构
个人信息和联系信息
个人详细信息和联系信息
主要包括个人姓名、生日、手机号码、邮箱和地址。
教育背景和职业资格
教育和资格
学历包括学校和专业,平均分/绩点/专业排名按副科列出。你应该仔细标明你学习的开始和结束时间。没毕业的可以写。
行业资质主要是指如果加入各种专业和行业组织,需要注明加盟时间。
获奖经历
荣誉和奖励
按时间顺序从最早到现在。由于奖项很多,奖项的比例可以在奖项后注明,让审计人员更直观的感受到奖项的含金量,比如一等奖。
志愿工作
志愿者
这一节也可以与实习经历放在一起,注明时间和志愿机构或志愿者。时间越长越好。用同一句话写下你的工作和权威。
技能/爱好
技能/爱好
关于技能,比如C/C++/Java。这个更倾向于找工作的方向。如果空间不够,就没必要写了。但如果沈剑飞/博士等人有直接导师的话,可以写出来表明自己十八般武艺都精通,尤其是工作方面。
←重点!!!
写CV各部分的时候,总是以“动词”开头的句子。
而且描述要具体清晰,最好能提出数字来证明,而不是堆砌一堆形容词。
重点应该放在你成就了多少人,这个成就带来了什么影响。
总而言之,简历是要做的
简单明了,详细恰当,内容全面,专业突出
希望所有出国留学的和尚都能写出吸引眼球的简历!