机器视觉在应用过程中是如何识别图片的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器视觉在应用过程中是如何识别图片的?相关的知识,希望对你有一定的参考价值。
🌹🌹🌹人工智能的“慧眼”——机器视觉技术💫
🍅机器视觉在电气工程和工程数学中的应用十分广泛,而这两门课程在大学阶段是有的专业必修课程,机器视觉在应用过程中识别图像,🌺也就是计算机视觉系统的工作识别图像过程,都要借助大数据的可视化分析和计算机在神经元领域的研究,而机器视觉则运用机器来观察图像📸,从而传导计算机识别。那么一起来看看到底是如何识别图片的呢💕💕!
一:🍅提取图像特征📸
🌺🌺🌺机器视觉系统分为硬件设备和软件算法两部分,一组图片图像进入计算机的机器视觉系统会有计算机的特定器件来进行一些预处理,当然这处理的过程也分为许多步骤,但总的来说需要先通过特征提取来达到第一步的计算机视觉初层的识别效果📸。
二:🍅连接大数据进行对比,再进行计算机网络深度提取💕
🌺🌺🌺计算机系统会通过对提取特征的一些模型预测写出一些编码来形成一些主要的图像识别,进入21世纪,那益于我们互联网的发展和一些数据的信息的提升。机器的一些识别图像的方法也更加简便,但总是要由计算机视觉系统来进行多规模的处理,👁🗨👁🗨👁🗨机器自动从一些海量的一些图片中总结出物体的特征,网络系统会进行大幅度的详细识别,然后在总结了一些事物的基本特征以后,就会借助计算机的视觉技术然后进行进一步的神经网络图像识别📸,但在这之前,计算机中需要有大量的图片信息匹对输入的图片信息⏰。在电脑系统的视觉第一层管理下,摄取图片最边缘的部分,然后在计算机的神经操作下,神经系统中的深度网络继续提取更加复杂的结构。最后再把整个结构提取,然后再输出对比。但是有一些计算机的输出图像跟你所搜索的图像视觉不一样,这样的技术,在医学生活和军事都有显著的应用💕💕💕。
三:🍅仿照眼球识别图像原理,传达图片信息💕
🌺🌺🌺归根结底,我们是通过计算机的网络识别来传达机器视觉的应用,通过深度的计算机网络,来识别一些图像📸,在当今时代技术突破下,人脸识别甚至能做到百万分之一的误差。可见技术识别图像的技术已经发展到了一个很高的层次,总的来说我们机器的图像识别和人类的眼球图像识别原理相近。它的发展和研究也是以人类眼球识别图像的方式作为铺垫,而发展技术的进步,会使得机器识别的难度大大降低,从而更多的应用于生活💕💕💕。
🍅总的来说,机器视觉在应用过程中识别图像可以分为以下步骤。第一,首先要提取基本的信息特征来在数据库中进行对比,其次要在庞大的大数据库中进行数据的分析📸,提取一些特殊的特点,最后要通过对图像分类的重复处理,来找出大数据中与其图像最相近的图像。得益于互联网时代的高速发展🌺🌺,现在的机器视觉在识别图片的过程中,有的错误率已经降到了百万分之一⏰,在未来的发展中有望达到机器识别图片完全零误差的程度🌼🌼🌼🌼。
参考技术A💦作为一名计算机专业大三的学生,对人工智能和机器学习有一定的了解。尤其是近些年,伴随人工智能的迅猛发展,人们对于人机交互技术的需要愈来愈高,图像识别技术也再度进到大众的视线。图像识别技术是人工智能关键行业之一,其主要作用是清除图像里的冗余信息,获取关键信息,从而使得电子设备替代人鉴定识别物品、草木、角色、面部和姿势等。
💦针对繁杂情景,基于机器视觉的图像识别技术展现出了比较好的可靠性、客观性和精确性。因为图像识别技术涉及到许多技术,因此研究相关技术是图像识别技术的前提。
💦机器视觉技术是利用计算机替代人们视觉的,对三维空间中的人和东西做出一定的分析、判断。而基于机器视觉的图像识别流程包含图像收集获取、预处理、特征获取分析、图像匹配等。
🌊图像收集获取
🌊一般来说,基于机器视觉的图像识别算法的图像收集关键取决于电子设备的监控后人摄像头,用于拍摄收集图像的摄像头将收集过的图像,根据图像数据采集卡传送到硬件配置部分,这是进行所有图像识别技术等相关图像处理技术的一切前提条件。
💧预处理
💧图像预处理的目的是减少后面图像解决工作压力,提早对图像开展去噪、补偿、提高、校准等处理,给予超清的图像。现在已有的图像识别算法有近千百种,但核心内容是图像分割、图像二值化、灰度值检测等技术。
💧在图像预处理环节中,针对不同的图像识别算法,还可以在预处理环节解决不同类型的特征值、灰度级等主要参数处理问题,该阶段的处理结果的好与坏直接关系最后的图像分析匹配数据。
💫特征量获取分析
💫特征的挑选获取对图像识别速度与精密度有很大影响。图像特征获取是使用电子计算机获取图像信息内容,分辨每一个图像点是否为一个图像特征。
💫特征提取的作用是将图像中的每一个点划分成不同孤立点、持续曲线图以及连续的区域等不同子集合。通常情况下,图像的特征有很多包括色调特征、空间特征、纹路特征、形态特征和局部特征。
🌬️图像匹配
🌬️图像匹配是拿来分辨两张图像是不是同样,反而是用于科学研究分析判断两张图像间的相似度,图像间的相似度随算法的规定而改变。
🌬️一般相似性选用图像搜索算法分辨两张不一样图像里的物件。因为图像的多元性和获得图像时的光源、视角、自然环境的差别,必须选择适合的特征点来简单化图像,鉴别精密度。
🌌结束语
🌌总的来说,根据机器视觉的图像识别技术流程包括图像预处理、特征获取、图像配对等多个方面表现出了智能化技术、多元化的特性,是发展机器视觉的重要发展前景。
🌌在基于机器视觉的图像识别技术的发展中,对获取的图像进行预处理以及获取的特征进行识别匹配为基础,应用人工智能技术、虚拟现实技术等新技术去完成鉴别全过程。目前已经广泛用于航天航空、医疗等各个行业。
🌌机器视觉的图像识别技术作为一项先进技术,未来市场的需求必定会更大,将于未来智能化设备中获得更广泛应用,以适应日益持续增长的机器视觉市场需求,开发设计更多机器视觉图像识别设备。
参考技术B机器视觉技术已经是运用多各种生产方面,一般机器视觉是应用在检测,检验以及管控等方面使用。
其实,机器视觉识别图片的方式可以是以特征,光源和信息获取等方式来识别。而这些方式也是属于图像数据采集,所以图像数据采集算是机器视觉在应用过程中识别图片最基本的一个方式之一。
01. 图片主要特征。
要通过机器视觉识别图片,首先需要大量的图片和素材。所以需要通过图片数据采集来找到大量图片。举个例子,我们需要机器视觉在参差不齐的种子上选出优质的种子。但前提需要先收集大量种子图片,就像是胖胖的种子,颜色偏黄的种子,长身的种子等。
所以先把各种各样的种子收集好之后,机器视觉技术就会在根据种子的形状,面积和长宽比数据来筛选出好的种子。通过几种特征因素筛选后,机器视觉技术就能找出优质种子。同理,机器视觉技术也是这样识别图片。
02. 光源。
光源也可以为机器视觉应用设计上识别图片。因为使用不同种类和颜色的光源可以更好突出目标图片的主要特征,这主要是为了将检测的部分和非检测部分之间产生明显的区别。这里可以理解为目标图片中有多种元素,为了让机器人识别到其中一种特定元素,那么机器视觉采取光源方式来识别图片。
03. 信息获取。
信息获取可以理解为一张图片往往蕴含多种信息。一张海滩照片里面会有沙滩,海水,海鸥或者是玩水的人等元素。要机器识别什么是海滩的照片,机器视觉技术需要掌握和获取一般海滩的照片有哪些主要元素。
因此,只要将照片的信息获取后,机器视觉技术可以从掌握信息后提取关键元素,从而识别出照片。
别小看机器视觉技术应用,现在机器视觉技术应用在很多方面都起到有效作用。尤其在农业方面,机器视觉技术能够提高农业生产力和保障农作物质量。
参考技术C机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。
作为一名大学生,机器视觉在我们大学生活中的应用有很多,例如:忘记带门禁卡可以刷脸,手机面容解锁、纸质文档转电子文档可以使用文字识别,等等。但这只是我们所熟知的一小部分,而机器视觉的应用远不止这一小部分,不论是在工业、农业、医药、军事、航天等都有很大的应用。
那很多小伙伴就会好奇,机器视觉到底是什么呢?他在应用过程中又是如何进行识别图片的?
首先,我们对于机器视觉进行一个简单的了解,什么是机器视觉,机器视觉通过字面意思我们就可以了解得到,机器视觉就是通过站在机器的立场上以机器代替人眼进行识别或者测量,用机器做出人眼才能够做出的事情。
通过简单的了解我们可以发现这和我们所学习的智能AI的概念很相像,其实机器视觉是AI的一个简单的分支。
在这个科技飞速发展的时代,智能AI从一个概念化的东西开始逐渐转化为实质化,其分支有很多,而机器视觉则是智能AI的核心模块。
机器视觉包括图像处理、机械工程技术、控制、电光源照明、光学成像、传感器、模拟与数字视频技术、计算机软硬件技术(图像增强和分析算法、图像卡、 I/O卡等)。一个典型的机器视觉应用系统包括图像捕捉、光源系统、图像数字化模块、数字图像处理模块、智能判断决策模块和机械控制执行模块。
那么机器视觉是如何进行识别图片的呢?
其实原理很简单,机器视觉的图像目标识别运用了模式识别和图像处理原理,在众多的图片当中,经过初步识别之后,找到相关的目标图像,并将该目标图像进行分类处理。与计算机视觉技术相比,机器视觉的图像目标识别方法操作更为快捷,系统结构组成比较简单。在处理图像之前,需要获取完整的图像,在获取图像的过程当中,还要采用一套灵敏的硬件设备,如照明光源、用于调节图像清晰程度的镜头与摄像机等。
以上就是机器视觉在应用过程中如何识别图片的原理以及相关的一些知识。
参考技术D大二有一门课程叫做模式识别,刚好可以来回答这一个问题。
机器视觉,这两个词分开来看再正常不过了,机器嘛,视觉呐,但是合起来看就跟文言文一样了,开始看不懂了,那机器为什么会有视觉?某乎上说的是机器有视觉是由于照明光源,镜头,工业摄像机,图像采集,图像处理,其他外部设备组成的,我觉得除了图像处理其他部分都很好理解,下面着重讲一下图像处理部分。
那什么是图像处理呢?如果将机器视觉类比于人眼识物,视神经就是工业摄像机的话,那么图像处理相当于大脑这一部分。这也可以认为机器视觉智慧的集中体现。
举个例子,你想要让机器从一堆不同种类的狗狗图片中识别出哪一只是金毛。首先,我们先想想看人是怎么做的,一个人如果从来没见过金毛,那么当他看到金毛的时候他不会知道这是金毛,只有当他看了很多金毛,记住了金毛很多区别于其他狗狗的特征的时候,他才会认识金毛,机器识别金毛的过程也大致如此。
你要准备大量的金毛图片作为输入,然后计算机会筛选出金毛的某些特点,比如耳朵比例比较大这一点,当然这只是其中一点,计算机能够给出成千上万个这种特点,至于计算机是如何给出这些特征的,这个是业界难题。然后把不同种类的狗狗图片放进去,计算机便能够根据这些特点识别出来哪些是金毛。那么计算机是如何识别图片的呢?大概过程如下,电脑先将图片中的不同像素点转化为数字矩阵,然后计算机将卷积核(卷积核可以看成一个5*5的数字方阵)与数字化的图片进行地毯式地比对,比如进行一个矩阵相乘运算,当卷积核与这个矩阵相乘的结果与周围明显不同的时候,就说明卷积核与这个矩阵吻合度最高,比对成功了。这只是一个卷积核,一个也许说明不了什么,但是成千上万个卷积核就可以说明了,其实这个过程可以类比于按图索骥这个传统故事。这也是为什么会出现识别出来的东西不准。
爬虫-Tesseract
机器视觉
从 Google 的无人驾驶汽车到可以识别假钞的自动售卖机,机器视觉一直都是一个应用广 泛且具有深远的影响和雄伟的愿景的领域。
我们将重点介绍机器视觉的一个分支:文字识别,介绍如何用一些 Python库来识别和使用在线图片中的文字。
我们可以很轻松的阅读图片里的文字,但是机器阅读这些图片就会非常困难,利用这种人类用户可以正常读取但是大多数机器人都没法读取的图片,验证码 (CAPTCHA)就出现了。验证码读取的难易程度也大不相同,有些验证码比其他的更加难读。
将图像翻译成文字一般被称为光学文字识别(Optical Character Recognition, OCR)。可以实现OCR的底层库并不多,目前很多库都是使用共同的几个底层 OCR 库,或者是在上面 进行定制。
ORC库概述
在读取和处理图像、图像相关的机器学习以及创建图像等任务中,Python 一直都是非常出色的语言。虽然有很多库可以进行图像处理,但在这里我们只重点介绍:Tesseract
Tesseract
Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统。 除了极高的精确度, Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。
安装Tesseract
Windows 系统
下载可执行安装文件 tesseract-ocr 安装。
Linux 系统
可以通过 apt-get 安装: $sudo apt-get tesseract-ocr
Mac OS X系统
用 Homebrew等第三方库可以很方便地安装 : brew install tesseract
要使用 Tesseract 的功能,比如后面的示例中训练程序识别字母,要先在系统中设置一 个新的环境变量 $TESSDATA_PREFIX,让 Tesseract 知道训练的数据文件存储在哪里,然后搞一份tessdata数据文件,放到Tesseract目录下。
在大多数 Linux 系统和 Mac OS X 系统上,可以这么设置: $export TESSDATA_PREFIX=/usr/local/share/Tesseract
在 Windows 系统上,你可以通过下面这行命令设置环境变量: #setx TESSDATA_PREFIX C:Program FilesTesseract OCRTesseract
安装pytesseract
Tesseract 是一个 Python 的命令行工具,不是通过 import 语句导入的库。安装之后,要用 tesseract 命令在 Python 的外面运行,但我们可以通过 pip3 安装支持Python 版本的 Tesseract库:
pip install pytesseract
处理规范的文字
你要处理的大多数文字都是比较干净、格式规范的。格式规范的文字通常可以满足一些需求,不过究竟什么是“格式混乱”,什么算“格式规范”,确实因人而异。 通常,格式规范的文字具有以下特点:
- 使用一个标准字体(不包含手写体、草书,或者十分“花哨的”字体) ? 虽然被复印或拍照,字体还是很清晰,没有多余的痕迹或污点
- 排列整齐,没有歪歪斜斜的字
- 没有超出图片范围,也没有残缺不全,或紧紧贴在图片的边缘
文字的一些格式问题在图片预处理时可以进行解决。例如,可以把图片转换成灰度图,调 整亮度和对比度,还可以根据需要进行裁剪和旋转(详情请关注图像与信号处理),但是,这些做法在进行更具扩展性的 训练时会遇到一些限制。
格式规范文字的理想示例:
通过下面的命令运行 Tesseract,读取文件并把结果写到一个文本文件中:
tesseract test.jpg text
识别结果很准确,不过符号^和*分别被表示成了双引号和单引号。大体上可以让你很舒服地阅读。
通过Python代码实现
import pytesseract
from PIL import Image
image = Image.open('test.jpg')
text = pytesseract.image_to_string(image)
print(text)
对图片进行阈值过滤和降噪处理
很多时候我们在网上会看到这样的图片:
随着背景色从左到右不断加深,文字变得越来越难以识别,Tesseract 识别出的 每一行的最后几个字符都是错的。
遇到这类问题,可以先用 Python 脚本对图片进行清理。利用 Pillow 库,我们可以创建一个 阈值过滤器来去掉渐变的背景色,只把文字留下来,从而让图片更加清晰,便于 Tesseract 读取:
from PIL import Image
import subprocess
def cleanFile(filePath, newFilePath):
image = Image.open(filePath)
# 对图片进行阈值过滤,然后保存
image = image.point(lambda x: 0 if x<143 else 255)
image.save(newFilePath)
# 调用系统的tesseract命令对图片进行OCR识别
subprocess.call(["tesseract", newFilePath, "output"])
# 打开文件读取结果
file = open("output.txt", 'r')
print(file.read())
file.close()
cleanFile("text.jpg", "textclean.png")
通过一个阈值对前面的“模糊”图片进行过滤的结果:
从网站图片中抓取文字
用 Tesseract 读取硬盘里图片上的文字,可能不怎么令人兴奋,但当我们把它和网络爬虫组合使用时,就能成为一个强大的工具。
网站上的图片可能并不是故意把文字做得很花哨 (就像餐馆菜单的 JPG 图片上的艺术字),但它们上面的文字对网络爬虫来说就是隐藏起来 了,举个例子:
虽然亚马逊的 robots.txt 文件允许抓取网站的产品页面,但是图书的预览页通常不让网络机器人采集。
图书的预览页是通过用户触发 Ajax 脚本进行加载的,预览图片隐藏在 div 节点 下面;其实,普通的访问者会觉得它们看起来更像是一个 Flash 动画,而不是一个图片文 件。当然,即使我们能获得图片,要把它们读成文字也没那么简单。
下面的程序就解决了这个问题:首先导航到托尔斯泰的《战争与和平》的大字号印刷版,打开阅读器,收集图片的 URL 链接,然后下载图片,识别图片,最后打印每个图片的文字。:
import time
from urllib.request import urlretrieve
import subprocess
from selenium import webdriver
#创建新的Selenium driver
driver = webdriver.PhantomJS()
# 用Selenium试试Firefox浏览器:
# driver = webdriver.Firefox()
driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")
# 单击图书预览按钮 driver.find_element_by_id("sitbLogoImg").click() imageList = set()
# 等待页面加载完成
time.sleep(5)
# 当向右箭头可以点击时,开始翻页
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
driver.find_element_by_id("sitbReaderRightPageTurner").click()
time.sleep(2)
# 获取已加载的新页面(一次可以加载多个页面,但是重复的页面不能加载到集合中)
pages = driver.find_elements_by_xpath("//div[@class='pageImage']/div/img")
for page in pages:
image = page.get_attribute("src")
imageList.add(image)
driver.quit()
# 用Tesseract处理我们收集的图片URL链接
for image in sorted(imageList):
# 保存图片
urlretrieve(image, "page.jpg")
p = subprocess.Popen(["tesseract", "page.jpg", "page"], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
f = open("page.txt", "r")
p.wait()
print(f.read())
通过给 Tesseract 提供大量已知的文字与图片映射集,经过训练 Tesseract 就可以“学会”识别同一种字体,而且可以达到极高的精确率和准确率,甚至可以忽略图片中文字的背景色和相对位置等问题。
尝试对知乎网验证码进行处理:
许多流行的内容管理系统即使加了验证码模块,其众所周知的注册页面也经常会遭到网络 机器人的垃圾注册。
那么,这些网络机器人究,竟是怎么做的呢?既然我们已经,可以成功地识别出保存在电脑上 的验证码了,那么如何才能实现一个全能的网络机器人呢?
大多数网站生成的验证码图片都具有以下属性。
- 它们是服务器端的程序动态生成的图片。验证码图片的 src 属性可能和普通图片不太一 样,比如 <img src="WebForm.aspx?id=8AP85CQKE9TJ">,但是可以和其他图片一样进行 下载和处理。
- 图片的答案存储在服务器端的数据库里。
- 很多验证码都有时间限制,如果你太长时间没解决就会失效。
- 常用的处理方法就是,首先把验证码图片下载到硬盘里,清理干净,然后用 Tesseract 处理 图片,最后返回符合网站要求的识别结果。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import time
import pytesseract
from PIL import Image
from bs4 import BeautifulSoup
def captcha(data):
with open('captcha.jpg','wb') as fp:
fp.write(data)
time.sleep(1)
image = Image.open("captcha.jpg")
text = pytesseract.image_to_string(image)
print "机器识别后的验证码为:" + text
command = raw_input("请输入Y表示同意使用,按其他键自行重新输入:")
if (command == "Y" or command == "y"):
return text
else:
return raw_input('输入验证码:')
def zhihuLogin(username,password):
# 构建一个保存Cookie值的session对象
sessiona = requests.Session()
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'}
# 先获取页面信息,找到需要POST的数据(并且已记录当前页面的Cookie)
html = sessiona.get('https://www.zhihu.com/#signin', headers=headers).content
# 找到 name 属性值为 _xsrf 的input标签,取出value里的值
_xsrf = BeautifulSoup(html ,'lxml').find('input', attrs={'name':'_xsrf'}).get('value')
# 取出验证码,r后面的值是Unix时间戳,time.time()
captcha_url = 'https://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000)
response = sessiona.get(captcha_url, headers = headers)
data = {
"_xsrf":_xsrf,
"email":username,
"password":password,
"remember_me":True,
"captcha": captcha(response.content)
}
response = sessiona.post('https://www.zhihu.com/login/email', data = data, headers=headers)
print response.text
response = sessiona.get('https://www.zhihu.com/people/maozhaojun/activities', headers=headers)
print response.text
if __name__ == "__main__":
#username = raw_input("username")
#password = raw_input("password")
zhihuLogin('[email protected]','ALAxxxxIME')
值得注意的是,有两种异常情况会导致这个程序运行失败。第一种情况是,如果 Tesseract 从验证码图片中识别的结果不是四个字符(因为训练样本中验证码的所有有效答案都必须 是四个字符),结果不会被提交,程序失败。第二种情况是虽然识别的结果是四个字符, 被提交到了表单,但是服务器对结果不认可,程序仍然失败。
在实际运行过程中,第一种 情况发生的可能性大约为 50%,发生时程序不会向表单提交,程序直接结束并提示验证码 识别错误。第二种异常情况发生的概率约为 20%,四个字符都对的概率约是 30%(每个字 母的识别正确率大约是 80%,如果是五个字符都识别,正确的总概率是 32.8%)。
训练Tesseract
大多数其他的验证码都是比较简单的。例如,流行的 PHP 内容管理系统 Drupal 有一个著名的验证码模块:https://www.drupal.org/project/captcha 可以生成不同难度的验证码。
那么与其他验证码相比,究竟是什么让这个验证码更容易被人类和机器读懂呢?
- 字母没有相互叠加在一起,在水平方向上也没有彼此交叉。也就是说,可以在每一个字 母外面画一个方框,而不会重叠在一起。
- 图片没有背景色、线条或其他对 OCR 程序产生干扰的噪点。
- 虽然不能因一个图片下定论,但是这个验证码用的字体种类很少,而且用的是 sans-serif 字体(像“4”和“M”)和一种手写形式的字体(像“m”“C”和“3”)。
- 白色背景色与深色字母之间的对比度很高。
这个验证码只做了一点点改变,就让 OCR 程序很难识别。
- 字母和数据都使用了,这会增加待搜索字符的数量。
- 字母随机的倾斜程度会迷惑 OCR 软件,但是人类还是很容易识别的。
- 那个比较陌生的手写字体很有挑战性,在“C”和“3”里面还有额外的线条。另外这 个非常小的小写“m”,计算机需要进行额外的训练才能识别。
用下面的代码运行 Tesseract 识别图片:
tesseract captchaExample.png output
我们得到的结果 output.txt 是: 4N,,,C<3.
训练Tesseract
要训练 Tesseract 识别一种文字,无论是晦涩难懂的字体还是验证码,你都需要向 Tesseract 提供每个字符不同形式的样本。
做这个枯燥的工作可能要花好几个小时的时间,你可能更想用这点儿时间找个好看的视频 或电影看看。首先要把大量的验证码样本下载到一个文件夹里。
下载的样本数量由验证码 的复杂程度决定;我在训练集里一共放了 100 个样本(一共 500 个字符,平均每个字符 8 个样本;a~z 大小写字母加 0~9 数字,一共 62 个字符),应该足够训练的了。
提示:建议使用验证码的真实结果给每个样本文件命名(即4MmC3.jpg)。 这样可以帮你 一次性对大量的文件进行快速检查——你可以先把图片调成缩略图模式,然后通过文件名 对比不同的图片。这样在后面的步骤中进行训练效果的检查也会很方便。
第二步是准确地告诉 Tesseract 一张图片中的每个字符是什么,以及每个字符的具体位置。 这里需要创建一些矩形定位文件(box file),一个验证码图片生成一个矩形定位文件。一 个图片的矩形定位文件如下所示:
要训练 Tesseract 识别一种文字,无论是晦涩难懂的字体还是验证码,你都需要向 Tesseract 提供每个字符不同形式的样本。
做这个枯燥的工作可能要花好几个小时的时间,你可能更想用这点儿时间找个好看的视频 或电影看看。首先要把大量的验证码样本下载到一个文件夹里。
下载的样本数量由验证码 的复杂程度决定;我在训练集里一共放了 100 个样本(一共 500 个字符,平均每个字符 8 个样本;a~z 大小写字母加 0~9 数字,一共 62 个字符),应该足够训练的了。
提示:建议使用验证码的真实结果给每个样本文件命名(即4MmC3.jpg)。 这样可以帮你 一次性对大量的文件进行快速检查——你可以先把图片调成缩略图模式,然后通过文件名 对比不同的图片。这样在后面的步骤中进行训练效果的检查也会很方便。
第二步是准确地告诉 Tesseract 一张图片中的每个字符是什么,以及每个字符的具体位置。 这里需要创建一些矩形定位文件(box file),一个验证码图片生成一个矩形定位文件。一 个图片的矩形定位文件如下所示:
4 15 26 33 55 0
M 38 13 67 45 0
m 79 15 101 26 0
C 111 33 136 60 0
3 147 17 176 45 0
第一列符号是图片中的每个字符,后面的 4 个数字分别是包围这个字符的最小矩形的坐标 (图片左下角是原点 (0,0),4 个数字分别对应每个字符的左下角 x 坐标、左下角 y 坐标、右上角 x 坐标和右上角 y 坐标),最后一个数字“0”表示图片样本的编号。
显然,手工创建这些图片矩形定位文件很无聊,不过有一些工具可以帮你完成。我很喜欢 在线工具 Tesseract OCR Chopper,因为它不需要 安装,也没有其他依赖,只要有浏览器就可以运行,而且用法很简单:上传图片,如果要 增加新矩形就单击“add”按钮,还可以根据需要调整矩形的尺寸,最后把新生成的矩形 定位文件复制到一个新文件里就可以了。
矩形定位文件必须保存在一个 .box 后缀的文本文件中。和图片文件一样,文本文件也是用 验证码的实际结果命名(例如,4MmC3.box)。另外,这样便于检查 .box 文件的内容和文件的名称,而且按文件名对目录中的文件排序之后,就可以让 .box 文件与对应的图片文件 的实际结果进行对比。
你还需要创建大约 100 个 .box 文件来保证你有足够的训练数据。因为 Tesseract 会忽略那 些不能读取的文件,所以建议你尽量多做一些矩形定位文件,以保证训练足够充分。如果 你觉得训练的 OCR 结果没有达到你的目标,或者 Tesseract 识别某些字符时总是出错,多 创建一些训练数据然后重新训练将是一个不错的改进方法。
创建完满载 .box 文件和图片文件的数据文件夹之后,在做进一步分析之前最好备份一下这 个文件夹。虽然在数据上运行训练程序不太可能删除任何数据,但是创建 .box 文件用了你 好几个小时的时间,来之不易,稳妥一点儿总没错。此外,能够抓取一个满是编译数据的 混乱目录,然后再尝试一次,总是好的。
前面的内容只是对 Tesseract 库强大的字体训练和识别能力的一个简略概述。如果你对 Tesseract 的其他训练方法感兴趣,甚至打算建立自己的验证码训练文件库,或者想和全世 界的 Tesseract 爱好者分享自己对一种新字体的识别成果,推荐阅读 Tesseract 的文档:https://github.com/tesseract-ocr/tesseract/wiki
以上是关于机器视觉在应用过程中是如何识别图片的?的主要内容,如果未能解决你的问题,请参考以下文章