自然场景OCR检测(YOLOv3+CRNN)

2023-05-16

(自然场景OCR检测(YOLOv3+CRNN))(中文+英文模型)

前言

最近对于自然场景下的OCR比较有兴趣,所以总结了一些目前OCR现状,并且找了一个自然场景OCR的项目练练手。本人新手小白,若出现理解不当的地方,还望指出。

简介

目前的主流自然场景OCR模型:文字检测+文字识别
文字识别步骤

文字检测:解决的问题是哪里有文字,文字的范围有多大。
主要方法:
1.CTPN:水平文字检测,四个自由度,类似物体检测(常用成熟基础)。
2.目标检测:如YOLO、SSD、Mask-R-CNN。
3.Seglink:倾斜文本检测,文本框是不规则的四边形,八个自由度。
4.RRPN:允许带角度的矩形框覆盖。
5.EAST:允许带角度矩形框或任意四边形覆盖。
6.TextBox:水平矩形框。
7.TextBox++:旋转矩形框。
8.TextSnake:圆盘覆盖的方法。

文字识别:对定位好的文字区域进行识别,主要解决的问题是每个文字是什么,将图像中的文字区域进转化为字符信息。

文字检测定位文字图像区域

主要方法:
文本行识别2种基本算法框架
1.CRNN(CNN+RNN(BLSTM)+CTC)
2.CNN+Seq2Seq+Attention

此项目采取CTPN + YOLO v3 + CRNN方式进行OCR识别,下面对该方案进行一个大致讲解(需对照源码理解)。
源码地址:https://github.com/chineseocr/chineseocr
整个项目代码(包含本人对代码详细注解):https://download.csdn.net/download/qq_39706357/13193446

一、检测文字朝向,调整文字识别倾斜角度

1.检测文字朝向(ROTATE = [0,90,180,270])

剪切图像边缘,将图像变成(224,224,3)尺寸,图像channel中心化处理,读取Angle-model(vgg16 : 5层卷积,2层全连接,最后经过softmax预测),预测文字朝向,旋转图片。

2. 调整文字识别倾斜角度

将新生成的图像进行灰度化处理,将图像缩放在一个尺度范围内(600~900),图像归一化处理(原图与归一化之后的运行结果完全一致,说明归一化不会改变图像本身的信息存储,但是通过打印出来的像素值可以发现,取值范围从0~255已经转化为0~1之间了,这个对于后续的神经网络或者卷积神经网络处理有很大的好处),进行多维百分比滤波处理,修剪(原图-模糊处理后的图像+1),裁剪边框。
计算图像每行的均值向量,得到该向量的方差。如果图像文字不存在文字倾斜(假设所有文字朝向一致),那么对应的方差应该是最大,找到方差最大对应的角度,就是文字的倾斜角度。本项目中,只取了-15到15度,主要是计算速度的影响,如果不考虑性能,可以增大修正角度。

二、检测文字区域

1.目标区域检测(text_detect)

图像预处理:关于图像中文字的标注是范围框选的,然后在每个框中对其进行宽为8,高为Box高的分割,即CTPN,每一个小框作为的true_boxes,如下图所示
在这里插入图片描述

1)darknet53:

Darknet-53的网络结构
上图是以输入图像256 x 256进行预训练来进行介绍的,常用的尺寸是416 x 416,都是32的倍数。(卷积的strides默认为(1,1),padding默认为same,当strides为(2,2)时padding为valid)。

2)feature extractor

在这里插入图片描述
最后的输出 feature map[y1, y2, y3] ,每个像素num_anchors*(num_classes+5)( 4个边界框偏移量,1个目标性预测)

3)变换格式

将图像的标注框true_boxes的标签,变成与预测anchor box相同的格式标签y_true
现在有很多的true_boxes,我们想要把y_true的表示分为三层,所以就需要将true_boxes分给不同的三层特征,将true_boxes与9个anchors进行iou计算,因为每层的有三个anchors,将true_boxes分给对于9个anchors中与其最大iou的anchor,所在的特征层。最后转换成y_true的表达形式,后转换成y_true的表达形式,得到的y_true是相对feature真实坐标。

preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes):
input:
true_boxes: array, shape=(m, T, 5) m = 批量数 T = 最大框数
input_shape:图像尺寸
anchors: array, shape=(N, 2), wh
output:
y_true = [num_layers, m, grid_shape[0], grid_shape[1], anchors_number = 3, 5+ num_classes ]
y_true的第0和1位是中心点xy,范围是(0 ~ 13/26/52),xy的值0 ~ 1(在feature map像素点中),第2和3位是宽高wh,范围是0 ~ 1,第4位是置信度1或0,第5 ~ n位是类别为1其余为0.
实现方法:设y_true是全0矩阵(np.zeros)列表,即[(m,13,13,3,6),(m,26,26,3,6),(m,52,52,3,6)],将图像中的标注框box在原图中的长宽与9个anchor box长宽进行iou计算,找出与每个标注框box iou值最大的anchor box,因为每个anchor所在的feature map和y_true[4]是固定的,找到这个anchor所在的feature map和y_true[4] (anchor在(0,1,2))中序号位置,再利用true_boxes的xy坐标,确定出其所在feature map的 grid位置(i,j),最后用true_boxes[3]去替换y_true中相应grid中的预测框中心点xy在这个gird的0~1值,wh的0 ~ 1值,confidence(置信度) = 1,所对应的类别 = 1.

4)Loss function

将预测的feature map[y1, y2, y3]与y_true送入loss function:
一、将预测的yolo_outputs (feature map[y1, y2, y3])送入yolo_head函数,输出grid(目标在grid的位置,shape:[gridxgridx1x2]), raw_pred(预测的输出,shape:[Nxgridxgridx3x(5+num_classes)]), pred_xy(预测的xy在grid上归一化的真实值,shape: [Nxgridxgridx3x2]), pred_wh(预测的wh在grid上归一化的真实值,shape: [Nxgridxgridx3x2])。
yolo_head: 1.grid:建立横纵坐标系生,跟feature map大小一致[gridxgridx1x2], grid是feature map中grid cell的左上角坐标。2. box_xy:将yolo_outputs中的xy坐标,先经过sigmoid函数,后加上偏移量,最后除以grid,也就是(sigmoid(x,y)+grid左上坐标) / grid。3. box_wh:将yolo_outputs中的wh长度,先进行e为底的幂计算,后跟anchor进行乘法计算,然后除以grid。
二、将y_true中的xywh真实值,通过上述公式换算成偏移量raw_true_xy、raw_true_wh,y_pre也为偏移量。
(1)xy_loss = confidence * box_loss_scale * 二分类的交叉熵(y_true, y_pred)
设定 box_loss_scale = 2 – wh,wh是y_true的wh,于是wh越小,box_loss_scale越大, 实际上,我们知道yolov1里作者在loss里对宽高都做了开根号处理,是为了使得大小差别比较大的边框差别减小。因为对不同大小的bbox预测中,想比于大的bbox预测偏差,小bbox预测偏差相同的尺寸对IOU影响更大,而均方误差对同样的偏差loss一样,为此取根号。例如,同样将一个 100x100 的目标与一个 10x10 的目标都预测大了 10 个像素,预测框为 110 x 110 与 20 x 20。显然第一种情况我们还可以接受,但第二种情况相当于把边界框预测大了 1 倍,但如果不使用根号函数,那么损失相同,显然加根号后对小框预测偏差10个像素带来了更大的损失。而在yolov2和v3里,损失函数进行了改进,不再简单地加根号了,而是用scale = 2 - groundtruth.w * groundtruth.h加大对小框的损失。

(2)wh_loss = confidence * box_loss_scale * 0.5 * 均方误差(y_true, y_pred))
边框回归最简单的想法就是通过平移加尺度缩放进行微调,这里虽然wh回归不是线性回归,但是当输入的 Proposal 与 Ground Truth 相差较小时,即IOU很大时(RCNN 设置的是 IoU>0.6),可以认为这种变换是一种线性变换,那么我们就可以用线性回归(线性回归就是给定输入的特征向量 X, 学习一组参数 W, 使得经过线性回归后的值跟真实值 Y(Ground Truth)非常接近. 即Y≈WX )来建模对窗口进行微调, 否则会导致训练的回归模型不work(当 Proposal跟 GT 离得较远,就是复杂的非线性问题了,此时用线性回归建模显然就不合理了)
在这里插入图片描述
所以,边框回归微调时,可以当作线性回归。
(3)confidence_loss = confidence * 二分类的交叉熵(y_true, y_pred) + (1- confidence) * 二分类的交叉熵(y_true, y_pred) * ignore_mask)
ignore_mask:即confidence为反面的mask。将目标y_true中有是否有目标转成bool型生成true_box,然后同pred_box计算iou,pred_box(13,13,3,4)与真实窗口true_box(设有j个)之间的IOU,输出为iou(13,13,3,j),best_iou(13,13,3)值是最大的iou,删掉小于阈值的BBOX,ignore_mask[b]存放的是pred_box(13,13,3,4)iou小于ignore_thresh的grid,即ignore_mask[b]=[13,13,3],如果小于ignore_thresh,其值为0;大于为1。

(4)class_loss = confidence * 二分类的交叉熵(y_true, y_pred)
为什么多分类问题用二值交叉熵解决?
里,我们可以理解为,“所有的分类都预测正确”为一个类1,否则就是另一个类0。这样就把多分类看做是二分类问题,当且仅当所有的分类都预测对时,loss最小
最后分别对loss进行简单的加总求和取均值.
loss = [‘class_loss’,‘xy_loss’,‘wh_loss’,‘confidence_loss’]

细节补充:
在这里插入图片描述
其中,Cx,Cy是feature map中grid cell的左上角坐标,在yolov3中每个grid cell在feature map中的宽和高均为1。如下图的情形时,这个bbox边界框的中心属于第二行第二列的grid cell,它的左上角坐标为(1,1),故Cx=1,Cy=1.公式中的Pw、Ph是预设的anchor box映射到feature map中的宽和高。
在这里插入图片描述
最终得到的边框坐标值是bx,by,bw,bh即边界框bbox相对于feature map的位置和大小,是我们需要的预测输出坐标。但我们网络实际上的学习目标是tx,ty,tw,th这4个offsets,其中tx,ty是预测的坐标偏移值,tw,th是尺度缩放,有了这4个offsets,自然可以根据之前的公式去求得真正需要的bx,by,bw,bh4个坐标。至于为何不直接学习bx,by,bw,bh呢?因为YOLO 的输出是一个卷积特征图,包含沿特征图深度的边界框属性。边界框属性由彼此堆叠的单元格预测得出。因此,如果你需要在 (5,6) 处访问该单元格的第二个边框bbox,那么你需要通过 map[5,6, (5+C): 2*(5+C)] 将其编入索引。这种格式对于输出处理过程(例如通过目标置信度进行阈值处理、添加对中心的网格偏移、应用锚点等)很不方便,因此我们求偏移量即可。那么这样就只需要求偏移量,也就可以用上面的公式求出bx,by,bw,bh,反正是等价的。另外,通过学习偏移量,就可以通过网络原始给定的anchor box坐标经过线性回归微调(平移加尺度缩放)去逐渐靠近groundtruth。
那么4个坐标tx,ty,tw,th是怎么求出来的呢?
tx = Gx – Cx ty = Gy – Cy 这样就可以直接求bbox中心距离grid cell左上角的坐标的偏移量。
w和th的公式yolov3和faster-rcnn系列是一样的,是物体所在边框的长宽和anchor box长宽之间的比率,不管Faster-RCNN还是YOLO,都不是直接回归bounding box的长宽而是尺度缩放到对数空间,是怕训练会带来不稳定的梯度。因为如果不做变换,直接预测相对形变tw,那么要求tw>0,因为你的框的宽高不可能是负数。这样,是在做一个有不等式条件约束的优化问题,没法直接用SGD来做。所以先取一个对数变换,将其不等式约束去掉,就可以了。
训练时用的groundtruth的4个坐标去做差值和比值得到tx,ty,tw,th,测试时就用预测的bbox就好了,公式修改就简单了,把Gx和Gy改为预测的x,y,Gw、Gh改为预测的w,h即可。
网络可以不断学习tx,ty,tw,th偏移量和尺度缩放,预测时使用这4个offsets求得bx,by,bw,bh即可。
在这里插入图片描述
这个公式tx,ty为何要sigmoid一下啊?前面讲到了在yolov3中没有让Gx - Cx后除以Pw得到tx,而是直接Gx - Cx得到tx,这样会有问题是导致tx比较大且很可能>1.(因为没有除以Pw归一化尺度)。用sigmoid将tx,ty压缩到[0,1]区间內,可以有效的确保目标中心处于执行预测的网格单元中,防止偏移过多。举个例子,我们刚刚都知道了网络不会预测边界框中心的确切坐标而是预测与预测目标的grid cell左上角相关的偏移tx,ty。如13*13的feature map中,某个目标的中心点预测为(0.4,0.7),它的cx,cy即中心落入的grid cell坐标是(6,6),则该物体的在feature map中的中心实际坐标显然是(6.4,6.7).这种情况没毛病,但若tx,ty大于1,比如(1.2,0.7)则该物体在feature map的的中心实际坐标是(7.2,6.7),注意这时候该物体中心在这个物体所属grid cell外面了,但(6,6)这个grid cell却检测出我们这个单元格内含有目标的中心(yolo是采取物体中心归哪个grid cell整个物体就归哪个grid celll了),这样就矛盾了,因为左上角为(6,6)的grid cell负责预测这个物体,这个物体中心必须出现在这个grid cell中而不能出现在它旁边网格中,一旦tx,ty算出来大于1就会引起矛盾,因而必须归一化。
看最后两行公式,tw为何要指数呀,这就好理解了嘛,因为tw,th是log尺度缩放到对数空间了,当然要指数回来,而且这样可以保证大于0。 至于左边乘以Pw或者Ph是因为tw=log(Gw/Pw)当然应该乘回来得到真正的宽高。

记feature map大小为W,H(如13*13),可将bbox相对于整张图片的位置和大小计算出来(使4个值均处于[0,1]区间内)约束了bbox的位置预测值到[0,1]会使得模型更容易稳定训练(如果不是[0,1]区间,yolo的每个bbox的维度都是85,前5个属性是(Cx,Cy,w,h,confidence),后80个是类别概率,如果坐标不归一化,和这些概率值一起训练肯定不收敛)
只需要把之前计算的bx,bw都除以W,把by,bh都除以H。即
在这里插入图片描述

5)检测box和score

通过yolo_head将out = [y1,y2,y3]中的xywh转换成真实坐标
box_score = box_confidence * box_class_probs,box_confidence为0或者1
将box中超出图片尺寸的坐标换成在图像中对应的边缘点
box.shape = (m,4), 4是box的真实坐标(x1,y1,x2,y2),score = (m, 1)

6)预测结果

在这里插入图片描述

2.检测并合并proposals(TextDetector)

1. 首先过滤掉scores小于TEXT_PROPOSALS_MIN_SCORE的box
2. 进行nums,剔除掉重复的文本框

将scores展开排序,返回相应的index,将scores和boxes在水平方向上平铺,利用非极大抑制,将大于阈值的都淘汰掉,即过滤重复的box
非极大抑制:
1将所有框的得分排序,选中最高分及其对应的框
2遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除.
3从未处理的框中继续选一个得分最高的,重复上述过程。

3. 将scores进行标准化处理

data = (data-min_)/(max_-min_)

4. 合并文本行,连接文本区域变成文本行(详见代码)

TextProposalConnector.get_text_lines()

4.1) TextProposalGraphBuilder 发现可合并的文本区域

a) 创建Image.shape [ 1 ] 个[ ],shape = [batch,x,y],也就是对图像中水平方向的每个像素点,建立一个列表 [ [ ] [ ] [ ] [ ] … ] (一共x个[ ]),将每个box的x1所对应坐标的box的index插入到boxes_table的横坐标所对应的[ ]位置,构成boxes_table。
b) 计算每个index对应的box与其右侧30像素的所有box重合程度高的box的index(get_successions()函数,分别调用了MAX_HORIZONTAL_GAP,MIN_V_OVERLAPS,MIN_SIZE_SIM这三个参数作为匹配的度量),留下该index的box对应successions的box相应scores最高的index。
c) 判断当前Box的scores是否比它右侧scores最高、重叠度最好的box的左侧30像素scores最高、水平重叠度最好的box的scores还高,如果匹配成功,则将graph[index, succession_index]=True
d) 迭代查找graph中true,即从做到右依次最匹配的box,填入sub_graphs=[ ],将合并的Box的index放在一个列表里,返回这个列表sub_graphs,如[[50, 36, 58, 135, 198, 191, 204, 218, 227, 177], [52, 21, 14, 12, 9, 10, 16, 24, 120], [96, 29, 74, 171, 186, 248, 268, 277]]。

4.2) TextProposalConnector:连接文本区域

将sub_graphs列表中的Box合并,返回text_lines[文本区域的数量,8]
[0:x0(Boxes中的最小x0),1:拟合box的x0,y0坐标,取x0+offset和x1-offset,得到的lt_y, rt_y的中取最小值(offset的作用:因为存在左或者右倾斜,取最大的范围),2:x1(Boxes中的最大x1),3:拟合box的x0,y1坐标,取x0+offset和x1-offset,得到的lb_y, rb_y取最大值,4:合并的Box的平均值,5:中心点拟合函数中 x一次幂前系数,6:中心点拟合函数中 x零次幂前系数,7:box高度平均值+2.5,返回text_lines,即文本行的信息。最后再进行一个非极大抑制(因文本行较少重复,TEXT_LINE_NMS_THRESH = 0.99 ##文本行之间测iou值。)

4.3) 变换坐标(get_boxes( ))

因存在旋转,所有要将之前的文本框变成旋转的矩形,详细转换过程如下图所示
在这里插入图片描述
将text_lines的8个值通过get_boxes变换,生成一个(len(bboxes),[x1,y1,x2,y2,x3,y3,x4,y4])数组,四个坐标点分别为左上,右上,左下,右下。再通过sort_bo对bounding box进行排序,根据竖直方向的从上至下排序。

5. 检测结果

在这里插入图片描述
(上述检测结果存在些许问题,由于这张图片检测的难度较大,可以将检测的参数阈值设置高些)
最后返回[len(bboxes),[x1,y1,x2,y2,x3,y3,x4,y4]] 输入crnnRec进行文字检测

三、检测文字

1. 图像预处理

1.计算每个bounding box的角度
2.选装bounding box框出的部分,并裁剪出来
3. 把bounding box旋转到正确的方向
4. 转为灰度图
5. 送入网络识别

2. crnnOcr(test版)

1) 预处理
对图片进行按比例裁剪,裁剪出高为32的图片,处理后的图片尺寸为[1,1,32,scale×w]
2) 加载crnnOcr模型,检测出预测结果
CRNN模型:
在这里插入图片描述
上图为论文模型,仅作参考
上图为论文模型(输入图片尺寸大小为100×32),这里,我们以128×32大小的图片为例
partImg[1,128,32]先经过经过以上CNN处理,得到feature map[batch, channels, height, weight] ,cnn输出将height变成1,去掉该维度,把 width 当做LSTM 的时间 time steps, 这样就变成了 [width, batch, channels] = [16, b, 516] 对应LSTM 的输入 [n_steps, batch_size, output]
也就是将feature map的每一列或者每几列作为一个时间序列输入特征,送入RNN(双向LSTM),最后输出[T, b, n_class(5530个汉字)],最终的输出结果直观上可以想象成将128分为16份,每一份对应5530个类别的概率。
输出pre为[16,1,5530]
3) 解码
1.取5530类中,概率最大的类别[16,1,5530]->[16,1]
例如:tensor([1770, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1954])
2.将以上输出对应到汉字表解码,输出相应的文本。
转换:促销

识别结果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
识别结果:
在这里插入图片描述
##########################################################
如对于上述有疑问,欢迎指出,欢迎留言

参考

yolo3 https://github.com/pjreddie/darknet.git
crnn https://github.com/meijieru/crnn.pytorch.git
ctpn https://github.com/eragonruan/text-detection-ctpn
CTPN https://github.com/tianzhi0549/CTPN
keras yolo3 https://github.com/qqwweee/keras-yolo3.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自然场景OCR检测(YOLOv3+CRNN) 的相关文章

  • 【OCR】实战使用 - 如何提高识别文字的精准度?

    实战使用 如何提高文字识别的精准度 我们在平常使用OCR的时候 经常会出现文字识别不精准的情况 我们改如何提高文字识别的精度呢 以下是一些提高OCR Optical Character Recognition 光学字符识别 文字识别精准度的
  • 训练 tesseract 后,tessdata 文件夹中应包含哪些文件?

    我使用 tesseract 作为我的 ANPR 应用程序的 OCR 引擎 我已经用车牌字体训练了 tesseract 3 01v 但我需要知道 tessdata 文件夹中应包含哪些文件 我应该使用安装 tesseract 3 01v 的同一
  • PHP/jQuery/JavaScript 中的免费 OCR 处理 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费的 PHP OCR API 在 PHP jQuery 或 JavaScript 中有详细
  • 神经网络特征提取

    我正在使用神经网络进行字母和数字的简单识别 到目前为止 我使用字母图像的每个像素作为网络的输入 不用说 这种方法产生的网络非常大 所以我想从图像中提取特征并将它们用作神经网络的输入 我的第一个问题是字母的哪些属性有利于识别它们 第二个问题是
  • Android OCR 仅使用流行的 tessercat fork tess-two 检测数字

    我正在使用流行的 OCR tessercat fork for android tess twohttps github com rmtheis tess two https github com rmtheis tess two 我整合了
  • 通过 pytesseract 和 PIL 提高文本识别的准确性

    所以我试图从图像中提取文本 由于图像的质量和尺寸不好 因此给出的结果不准确 我尝试了一些 PIL 的增强功能和其他功能 但这只会恶化图像质量 有人可以建议对图像进行一些增强以获得更好的结果 一些图像示例 在提供的图像示例中 文本的视觉质量非
  • emgucv:C# 中的 pan 卡不正确的倾斜检测

    我有三个泛卡图像 用于使用 emgucv 和 c 测试图像的倾斜 顶部的第一张图像检测到 180 度工作正常 中间的第二张图像检测到的 90 度应检测为 180 度 第三张图像检测到 180 度应检测为 90 度 我想在这里分享的一个观察结
  • Android 中最好的 OCR(光学字符识别)示例 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个在android中运行OCR的例子 我做了一些研究并找到了一个在android中实现OCR的例子 https github co
  • OCR 解决方案可以检测数字手写体吗?

    有没有一种解决方案可以很好地书写数字 1 10 我尝试了超正方体 但我只得到垃圾 理想情况下是 OSS 但商业也可以 OpenCV 现在附带手写数字识别 OCR 示例 你可以参考一下 http code opencv org project
  • 使用Python从具有两列或三列数据的图像中使用OCR读取图像中的文本

    在示例图像中 仅作为参考 我的图像将具有相同的图案 一个页面具有完整的水平文本 其他页面具有两个水平文本列 如何在python中自动检测文档的模式并逐一读取另一列数据 我将 Tesseract OCR 与 Psm 6 一起使用 它是水平读取
  • unicharset_extractor:找不到命令

    我想使用超正方体创建新的列车数据 因此 请按照以下网站中提到的步骤进行操作 https blog cedric ws how to train tesseract 301 https blog cedric ws how to train
  • Windows 7 OCR API

    我一直在审查 Office 2007 MODI OCR 的替代品 OneNote 2010 解决方案的质量 结果低于 2007 我注意到 一旦您安装了可选 tiff 过滤器 http technet microsoft com en us
  • 让 tesseract 只识别数字

    我正在尝试改进我制作的 OCR 程序来读取我正在使用的某个图像的布局 现在 我希望我的 OCR 程序只能识别数字 0 9 我尝试遵循问题的解决方案 限制 tesseract 正在寻找的字符 https stackoverflow com q
  • pytesseract 错误 Windows 错误 [错误 2]

    您好 我正在尝试使用 python 库 pytesseract 从图像中提取文本 请查找代码 from PIL import Image from pytesseract import image to string print image
  • Google Vision API 文本识别器无法正常工作

    我使用 Google Vision API 来读取报纸等任何物体上的文本或墙上的文本 我已经尝试过来自 Google 开发者网站的相同示例 但我的文本识别器总是返回 falseIsOperational功能 我在 Blackberry ke
  • tesseract (v3.03) 输出为 PDF [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么会返回这个错误呢 root amd 3700 2gb ocr test tesseract l dan pdf png out pd
  • 使用 Tesseract OCR 和 python 进行数字识别

    我使用 Tesseract 和 python 读取数字 从能量计 除了数字 1 之外 一切都运行良好 Tesseract 无法读取 1 数字 This is the picture I send to tesseract tesseract
  • 在 google Vision OCR 中被识别为单个单词的特殊字符?

    我试图让谷歌视觉 OCR 正则表达式可搜索 我已经完成了它 并且当文档仅包含英文字符时效果很好 但当有其他语言的文本时 它就会失败 发生这种情况是因为我在谷歌视觉单词组件中只有英文字符 如下所示 VISION API WORD COUNTE
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • Tess4j - Pdf 到 Tiff 到 tesseract - “警告:分辨率 0 dpi 无效。使用 70 代替。”

    我正在使用 tess4j net sourceforge tess4j tess4j 4 4 0 并尝试对 pdf 文件进行 OCR 因此 据我了解 我必须首先将 pdf 转换为 tiff 或 png 其中有任何建议吗 我这样做是这样的 t

随机推荐

  • Go并发(多任务)时如何进行同步? 如何数据互通? 图文讲解 [_]~( ̄▽ ̄)~* Go相关

    文章目录 Go并发同义说明 Go并发基础主线程与go程等待go程与 96 同步 sync 96 go程通讯与 96 管道 channel 96 关闭管道 Go并发 Go的并发官方称其为goroutine 我们可以将它看成为一个轻量级的线程
  • 如何使用Go创建工作池? 配合计时器使用工作池 图文讲解 [_]~( ̄▽ ̄)~* Go相关

    文章目录 使用go程通信创建工作池计时器 96 time Timer 96 工作池与计时器 使用go程通信创建工作池 创建工作池会用到我上述的大部分特性 span class token keyword func span 工作函数 spa
  • 机器学习实战(基于scikit-learn和TensorFlow)-第七章随机森林笔记(一)

    关注微信公共号 xff1a 小程在线 关注CSDN博客 xff1a 程志伟的博客 Python 3 7 6 default Jan 8 2020 20 23 39 MSC v 1916 64 bit AMD64 Type 34 copyri
  • 致 喷子们

    之前年轻 xff0c 被喷子在留言下面喷了 xff0c 竟然自闭了好几年 xff0c 一直不敢发文章 xff0c 还把之前的文章全部改为不可见 现在想想 xff0c 就应该喷回去 越想越气 xff0c 草
  • Go的并发如何配合上下文(ctx Context)使用? [_]~( ̄▽ ̄)~* Go相关

    文章目录 上下文处理创建上下文上下文继承线程安全 说明 上下文的英文是context 其英文简写约定俗成是 ctx 上下文处理 上下文在go中有一个约定俗成的写法ctx 如果你用过python应该知道self 这是python类初始化的一个
  • Java--信号量

    信号量 信号量 xff08 英语 xff1a Semaphore xff09 又称为信号量 旗语 xff0c 是一个同步对象 xff0c 用于保持在0至指定最大值之间的一个计数值 在系统中 xff0c 给予每一个进程一个信号量 xff0c
  • C++ 继承学习心得

    单继承 xff1a 一个子类只有一个直接父类时 xff0c 称这个继承关系为单继承 多继承 xff1a 一个子类中有两个或以上直接父类时 xff0c 称这个继承关系为多继承 菱形继承 是一种特殊的继承关系 菱形继承的问题 xff1a 有数据
  • 你的代码放在 GitHub 上,真的安全吗?

    受俄乌冲突的影响 xff0c GitHub 目前正在考虑限制俄罗斯开发人员访问开源代码存储库的可能性 无独有偶 xff0c 早在 2019 年 xff0c GitHub 就曾经因为美国出台贸易制裁国家名单 xff0c 对名单上的国家 地区的
  • ROS进阶学习(一至八)讲

    https blog csdn net weixin 40641902 article list 1 转载自weixin 40641902的博客
  • 如何将Docker升级到最新版本

    CentOS7如何将Docker升级到最新版 如果我们docker的版本比较低的话 xff0c 要怎么才能更新自己docker的版本呢 xff1f 下面是具体的方法 1 查找主机上关于Docker的软件包 rpm qa grep docke
  • 编译Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight

    宾夕法尼亚大学kumar实验室2018年发布 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight xff0c 基于MSCKF基础上实现双目视觉惯导里程计 刚好这
  • 公网k8s集群搭建史上超详细的教程!!!

    一 背景 xff1a 1 实验背景 x1f9ea 在学习k8s搭建中 xff0c 网上大部分教程都是用虚拟机做单机集群 xff0c 只有极少数是使用服务器搭建教程 xff1b 但是用云服务器搭建的教程中教程版本都比较老 随着时间的推移 xf
  • 【repo/git小技巧】repo sync时报错“The remote end hung up unexpectedly”解决办法

    像往常一样使用repo init gt repo sync 的形式进行代码仓库下载 xff0c 但每次下载repo sync都不能执行成功 xff0c 问题为 The remote end hung up unexpectedly xff0
  • 在 React 中实现记忆以提高性能小技巧

    React 如何渲染 UI 在详细了解 React 中的 memoization 之前 xff0c 让我们先看看 React 如何使用虚拟 DOM 呈现 UI 常规 DOM 基本上包含一组表示为树的节点 DOM 中的每个节点都是 UI 元素
  • 《Linux内核设计与实现》读书总结

    Linux内核设计与实现 进程管理 进程 xff1a 处于执行器的程序 xff0c 包含代码段 xff0c 打开的文件 xff0c 信号 xff0c 内核内部数据 xff0c 内存地址空间 xff0c 多个线程 xff0c 存放全局变量的数
  • python无报错但是主函数没有执行

    python无报错但是主函数没有执行 是不是遇到过python没有报错 xff0c 但是主函数没有执行 xff0c 完全没有结果的情况 遇到这种情况很有可能就是你没有添加if name 61 61 main 这个东西 xff0c 或者格式不
  • 2018.2.2PHPstrom破解版

    作者 xff1a 聽 雨 来源 xff1a CSDN 原文 xff1a https blog csdn net qq 39439751 article details 82758330 版权声明 xff1a 本文为博主原创文章 xff0c
  • python3中 print不加括号报错!

    python 3和python 2的print是有区别 xff0c python3需要加括号 xff0c 但python2不需要 span class token operator gt gt span span class token o
  • leetcode 772 基本计算器3 双栈解析表达式 单调栈

    此题是比较难的一个题 xff0c 不能简单的用递归来做 假设我们已经能把数字分离出来 xff0c 并且解决了其他无关细节 此时我们要考虑 xff0c 如何处理括号和运算优先级 此题最强的一点是 xff0c 当你看到一个符号时 xff0c 你
  • 自然场景OCR检测(YOLOv3+CRNN)

    自然场景OCR检测 YOLOv3 43 CRNN xff08 中文 43 英文模型 xff09 前言 最近对于自然场景下的OCR比较有兴趣 xff0c 所以总结了一些目前OCR现状 xff0c 并且找了一个自然场景OCR的项目练练手 本人新