我正在从事一个文本识别项目。我已经使用TensorFlow构建了一个分类器来预测数字,但我想通过使用文本定位和文本分割(分离每个字符)来实现一个更复杂的文本识别算法,但我没有找到这些算法的实现。那么,您是否知道一些使用TensorFlow在自然场景图片中进行文本本地化和文本分割的算法/实现/提示I(实际上是在体育图片的记分牌中进行文本本地化和分割)?非常感谢你的帮助。
hrysbysz1#
要对页面上的元素进行分组,比如文本和图像的段落,可以使用一些聚类算法,和/或带有一些阈值的斑点检测。您可以使用Radon变换来识别线条并检测扫描页面的倾斜。我认为,字符分离你将不得不搞乱字体。一些多项式匹配/拟合或什么的。(这是一个非常疯狂的猜测,现在,不要把它当真)。但类似的方法将允许你得到的字符线,并识别它在同一步骤。至于识别,一旦你有了一个字符,有一个很好的三角学技巧来比较字符的Angular 和数据库中存储的Angular 。我不是一个Maven如何页面分割确切的工作,但它似乎是我的方式成为一个。只是在一个项目的工作,包括它。所以给予我一个月,我将能够告诉你更多。:D无论如何,你应该去阅读Tesseract代码,看看惠普和谷歌是如何做到的。它应该会给予你很好的想法。祝你好运!
2fjabf4q2#
在完成对象检测后,您可以执行文本检测,并将其传递给Tesseract。在将图像传递给检测器函数之前,可以有多种变化来增强图像。参考文件https://arxiv.org/abs/1704.03155v2https://arxiv.org/pdf/2002.07662.pdf
def text_detector(image): #hasFrame, image = cap.read() orig = image (H, W) = image.shape[:2] (newW, newH) = (640, 320) rW = W / float(newW) rH = H / float(newH) image = cv2.resize(image, (newW, newH)) (H, W) = image.shape[:2] layerNames = [ "feature_fusion/Conv_7/Sigmoid", "feature_fusion/concat_3"] blob = cv2.dnn.blobFromImage(image, 1.0, (W, H), (123.68, 116.78, 103.94), swapRB=True, crop=False) net.setInput(blob) (scores, geometry) = net.forward(layerNames) (numRows, numCols) = scores.shape[2:4] rects = [] confidences = [] for y in range(0, numRows): scoresData = scores[0, 0, y] xData0 = geometry[0, 0, y] xData1 = geometry[0, 1, y] xData2 = geometry[0, 2, y] xData3 = geometry[0, 3, y] anglesData = geometry[0, 4, y] # loop over the number of columns for x in range(0, numCols): # if our score does not have sufficient probability, ignore it if scoresData[x] < 0.5: continue # compute the offset factor as our resulting feature maps will # be 4x smaller than the input image (offsetX, offsetY) = (x * 4.0, y * 4.0) # extract the rotation angle for the prediction and then # compute the sin and cosine angle = anglesData[x] cos = np.cos(angle) sin = np.sin(angle) # use the geometry volume to derive the width and height of # the bounding box h = xData0[x] + xData2[x] w = xData1[x] + xData3[x] # compute both the starting and ending (x, y)-coordinates for # the text prediction bounding box endX = int(offsetX + (cos * xData1[x]) + (sin * xData2[x])) endY = int(offsetY - (sin * xData1[x]) + (cos * xData2[x])) startX = int(endX - w) startY = int(endY - h) # add the bounding box coordinates and probability score to # our respective lists rects.append((startX, startY, endX, endY)) confidences.append(scoresData[x]) boxes = non_max_suppression(np.array(rects), probs=confidences) for (startX, startY, endX, endY) in boxes: startX = int(startX * rW) startY = int(startY * rH) endX = int(endX * rW) endY = int(endY * rH) # draw the bounding box on the image cv2.rectangle(orig, (startX, startY), (endX, endY), (0, 255, 0), 3) return orig
2条答案
按热度按时间hrysbysz1#
要对页面上的元素进行分组,比如文本和图像的段落,可以使用一些聚类算法,和/或带有一些阈值的斑点检测。
您可以使用Radon变换来识别线条并检测扫描页面的倾斜。
我认为,字符分离你将不得不搞乱字体。一些多项式匹配/拟合或什么的。(这是一个非常疯狂的猜测,现在,不要把它当真)。但类似的方法将允许你得到的字符线,并识别它在同一步骤。
至于识别,一旦你有了一个字符,有一个很好的三角学技巧来比较字符的Angular 和数据库中存储的Angular 。
我不是一个Maven如何页面分割确切的工作,但它似乎是我的方式成为一个。只是在一个项目的工作,包括它。所以给予我一个月,我将能够告诉你更多。:D
无论如何,你应该去阅读Tesseract代码,看看惠普和谷歌是如何做到的。它应该会给予你很好的想法。
祝你好运!
2fjabf4q2#
在完成对象检测后,您可以执行文本检测,并将其传递给Tesseract。在将图像传递给检测器函数之前,可以有多种变化来增强图像。
参考文件https://arxiv.org/abs/1704.03155v2https://arxiv.org/pdf/2002.07662.pdf