使用 YOLO 或其他图像识别技术来识别图像中存在的所有字母数字文本

共3个回答,已解决, 标签: python opencv machine-learning deep-learning yolo

我有多个图像图,所有这些都包含标签作为字母数字字符,而不仅仅是文本标签本身。我希望我的 YOLO 模型能够识别其中存在的所有数字和字母数字字符。

我如何训练我的 YOLO 模型做同样的事情。数据集可以在这里找到。Https://drive.google.com/open?id= 掐

例如: 请参见边界框。我想让 YOLO 检测文本存在的任何地方。然而,目前没有必要识别其中的文本。

enter image description here

同样需要为这些类型的图像做enter image description here enter image description here

图片可以下载这里

这是我尝试使用 opencv,但它并不适用于数据集中的所有图像。

进口 cv2
将 numpy 导入为 np
进口 pytesseract

Pytesseract.tesseract_cmd = r "C: \ Users \ HPO2KOR \ AppData \ Local \ Tesseract-OCR \ tesseract.exe"

图像 = cv2.imread (r 'c: \ Users \ HPO2KOR \ Desktop \ Work \ venv \ 专利 \ 微粒探测器 \ PD4.png')
Gray = cv2.cvtColor (图像,cv2.COLOR _ BGR2GRAY)
Thresh = cv2.threshold (灰色,0,255,cv2.THRESH _ BINARY_INV cv2.THRESH _ OTSU) [1]
Clean = thresh.copy ()

水平内核 = cv2.getStructuringElement (cv2.MORPH _ RECT,(15,1))
Detect_horizontal = cv2.morphologyEx (thresh,cv2.MORPH _ OPEN,horizontal_kernel,迭代 = 2)
Cnts = cv2.findContours (detect_horizontal,cv2.RETR _ EXTERNAL,cv2.CHAIN _ APPROX_SIMPLE)
如果 len (cnts) = = 2,则 cnts = cnts [0],否则 cnts [1]
对于碳纳米管中的碳:
Cv2.drawContours (clean,[c],-1,0,3)

Vertical_kernel = cv2.getStructuringElement (cv2.MORPH _ RECT,(1,30))
Detect_vertical = cv2.morphologyEx (thresh,cv2.MORPH _ OPEN,vertical_kernel,迭代次数 = 2)
Cnts = cv2.findContours (detect_vertical,cv2.RETR _ EXTERNAL,cv2.CHAIN _ APPROX_SIMPLE)
如果 len (cnts) = = 2,则 cnts = cnts [0],否则 cnts [1]
对于碳纳米管中的碳:
Cv2.drawContours (clean,[c],-1,0,3)

Cnts = cv2.findContours (clean,cv2.RETR _ EXTERNAL,cv2.CHAIN _ APPROX_SIMPLE)
如果 len (cnts) = = 2,则 cnts = cnts [0],否则 cnts [1]
对于碳纳米管中的碳:
区域 = cv2.contourArea (c)
如果面积 <100:
Cv2.drawContours (clean,[c],-1,0,3)
Elif 面积> 1000:
Cv2.drawContours (clean,[c],-1,0,-1)
Peri = cv2.arcLength (c,True)
大约 = cv2.approxPolyDP (c,0.02 * peri,True)
X,y,w,h = cv2.boundingRect (c)
如果 len (大约) = = 4:
Cv2.rectangle (clean,(x,y),(x w,y h),0,-1)

Open_kernel = cv2.getStructuringElement (cv2.MORPH _ RECT,(2,2))
Opening = cv2.morphologyEx (clean,cv2.MORPH _ OPEN,open_kernel,迭代次数 = 2)
Close_kernel = cv2.getStructuringElement (cv2.MORPH _ RECT,(3,2))
Close = cv2.morphologyEx (打开,cv2.MORPH _ CLOSE,close_kernel,迭代 = 4)
Cnts = cv2.findContours (close,cv2.RETR _ EXTERNAL,cv2.CHAIN _ APPROX_SIMPLE)
如果 len (cnts) = = 2,则 cnts = cnts [0],否则 cnts [1]
对于碳纳米管中的碳:
X,y,w,h = cv2.boundingRect (c)
区域 = cv2.contourArea (c)
如果面积大于 500:
ROI = 图像 [y: y h,x: x w]
ROI = cv2.GaussianBlur (ROI,(3,3),0)
Data = pytesseract.image_to_string (ROI,lang = 'engs',config = '-- psm 6')
如果 data.isalnum ():
Cv2.rectangle (image,(x,y),(x w,y h),(36,255,12),2)
打印 (数据)

Cv2.imwrite ('image.png',image)
Cv2.imwrite ('clean.Png',clean)
Cv2.imwrite ('close.png',close)
Cv2.imwrite ('opening.png',打开)
Cv2.waitKey ()

是否有任何模型或任何 opencv techni

第1个答案(采用)
    A possible approach is to use the EAST (Efficient and Accurate Scene Text) deep learning text detector based on Zhou et al.’s 2017 paper, EAST: An Efficient and Accurate Scene Text Detector. The model was originally trained for detecting text in natural scene images but it may be possible to apply it on diagram images. EAST is quite robust and is capable of detecting blurred or reflective text. Here is a modified version of Adrian Rosebrock's implementation of EAST. Instead of applying the text detector directly on the image, we can try to remove as much non-text objects on the image before performing text detection. The idea is to remove horizontal lines, vertical lines, and non-text contours (curves, diagonals, circular shapes) before applying detection. Here's the results with some of your images:

Input ->要以绿色删除的非文本轮廓

结果

其他图像

预训练的frozen_east_text_detection.pb执行文本检测所需的模型可以是在这里找到。尽管该模型捕获了大部分文本,但结果不是 100% 准确,并且偶尔会有误报,这可能是因为它是如何在自然场景图像上训练的。为了获得更准确的结果,您可能需要训练自己的自定义模型。但是如果你想要一个像样的开箱即用的解决方案,那么这应该对你有用。看看阿德里安的OpenCV 文本检测 (东方文本检测器)博客文章对东方文本检测器进行了更全面的解释。

代码

从 imutils.Object _ detection 导入 non_max_suppression
将 numpy 导入为 np
进口 cv2

Def east_text _ detector (原始,图像,置信度 = 0.25):
# 设置新的宽度和高度,并确定变化的比率
(H,W) = 图像。形状 [: 2]
(NewW,newH) = (640,640)
RW = W/float (newW)
RH = h/float (newH)

# 调整图像大小并获取新图像尺寸
Image = cv2.resize (image,(newW,newH))
(H,W) = 图像。形状 [: 2]

# 为 EAST 探测器模型定义两个输出层名称
# 我们感兴趣 -- 第一个是输出概率和
# Second 可用于导出文本的边界框坐标
层名 = [
"Feature_fusion/Conv_7/Sigmoid",
"Feature_fusion/concat3"]

Net = cv2.dnn.readNet ('frozen_east _ text _ detection.pb')

# 从图像中构建一个 blob,然后执行
# 获得两个输出层集的模型
Blob = cv2.dnn.blobFromImage (image,1.0,(W,h),(123.68,116.78,103.94),swapRB = True,crop = False)
Net.setInput (blob)
(分数,几何) = 净。向前 (层名)

# 从分数卷中获取行数和列数,然后
# 初始化我们的一组边界框矩形和相应的
# 信心分数
(NumRows,numCols) = 分数。形状 [2:4]
Rects = [
第2个答案
    For convenience sake I'd like to add the package keras_ocr. It can easily be installed with pip, and is based on the CRAFT text detector, which is a bit newer than the EAST detector if I'm not wrong.

在检测旁边,它也已经做了一些光学字符识别!结果如下所示,将此视为一种替代方案,可能比公认的答案更容易实现。enter image description here

第3个答案
    What you're describing appears to be OCR (Optical character recognition). One OCR engine I know of is tesseract, although there is also this one from IBM and others.

由于 YOLO 最初是为一个非常不同的任务而训练的,使用它来本地化文本可能需要从头开始重新训练。可以尝试使用现有的包 (适应您的特定设置) 对于基本事实 (尽管值得记住的是,该模型通常只能与基本事实一样好)。或者,也许更容易生成用于训练的综合数据 (即在现有图形中选择的位置添加文本,然后训练以对其进行本地化)。

或者,如果你所有的目标图像的结构与上述相似,你可以尝试使用经典的 CV 试探法来创造基本的真相,就像你在上面做的分离/分割符号一样, 随后使用 CNN 在 MNIST 或类似数据上训练的分类来确定给定的 blob 是否包含符号。

对于这种情况,您选择 YOLO-python 中有现有的实现,例如,我有一些经验这个-应该相当直接地用你自己的事实来建立训练。

最后,如果使用 YOLO 或 CNN 本身不是一个目标,而仅仅是解决方案,那么上述任何 “基本事实” 都可以直接用作解决方案, 不是为了训练模型。

希望我正确理解你的问题

相关问题

通过随机抽样其他列数据创建新列 如何使用熊猫获得包括每一个组合的计数 如何有效地展开矩阵的值与小块? 用 OpenCV 自动调整一张纸的彩色照片的对比度和亮度 检测图像是否倒置 提取矩形的尺寸 使用 YOLO 或其他图像识别技术来识别图像中存在的所有字母数字文本 使用拆分表与完全分离表 (CreateML, Swift) 时, 评估精度是不同的 如何添加在 CNN 差