精华内容
下载资源
问答
  • OCR的全称是Optical Character Recognition,光学字符识别技术。目前应用于各个领域方向,甚至这些应用就在我们的身边,比如身份证的识别,交通路牌的识别,车牌的自动识别等等。本文就学习一下基于开源软件和大厂...

    OCR的全称是Optical Character Recognition,光学字符识别技术。目前应用于各个领域方向,甚至这些应用就在我们的身边,比如身份证的识别,交通路牌的识别,车牌的自动识别等等。本文就学习一下基于开源软件和大厂服务的文字识别效果。

    方案1:基于开源软件Tesseract实现

      有些时候使用开源软件比较方便,当然目前最有名的就是tesseract,目前由谷歌在进行维护,貌似使用的还是传统机器学习的方式。

    方案2:百度文字识别接口服务

      下面主要针对Python开发者,描述百度文字识别接口服务的相关技术内容。OCR接口提供了自然场景下整图文字检测、定位、识别等功能。文字识别的结果可以用于翻译、搜索、验证码等代替用户输入的场景。

      首先我们可以找一个产品服务的定价单:

    ef42b490f611476db59ee36893b9bf3f.png

      可以看到,倘若你的服务只有偶尔用一次,完全可以使用这种体验型的免费服务。如果一天需要调用一万次,那么一个月基本的花费在5w左右——成本还是很高的,所以很多商用的场景大多数都采用自主研发的方法来做。

      下面学习一下百度API的SDK软件开发工具包(Software Development Kit)的使用。

    1,百度AipOcr接口能力

    a33d8f387590e5fc99b67d29048f817d.png

    2,安装接口模型

    pip install baidu-aip

    3,新建AipOcr

      AipOcr是OCR的Python SDK客户端,为使用OCR的开发人员提供了一系列的交互方法。

      参考如下代码新建一个AipOcr:from aip import AipOcr """ 你的 APPID AK SK """APP_ID = '你的 App ID'API_KEY = '你的 Api Key'SECRET_KEY = '你的 Secret Key' client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

      在上面代码中,常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

      上面代码块里APP_ID 、API_KEY、SECRET_KEY 三个值对应在http://console.bce.baidu.com/ai/#/ai/ocr/app/list 这里找到,需要用百度账号登录,然后创建一个应用,如下图:

    fae4f68ab3f5a373b3d01324bf2d555c.png
    0accea65935ebebe2950b4569253fc79.png

    4,配置AipOcr

      如果用户需要配置AipOcr的网络请求参数(一般不需要配置),可以在构造AipOcr之后调用接口设置参数,目前只支持以下参数:

    5,通用文字识别接口说明

      我们向服务请求识别某张图中的所有文字

    """ 读取图片 """def get_file_content(filePath):    with open(filePath, 'rb') as fp:        return fp.read() image = get_file_content('example.jpg') """ 调用通用文字识别, 图片参数为本地图片 """client.basicGeneral(image); """ 如果有可选参数 """options = {}options["language_type"] = "CHN_ENG"options["detect_direction"] = "true"options["detect_language"] = "true"options["probability"] = "true" """ 带参数调用通用文字识别, 图片参数为本地图片 """client.basicGeneral(image, options) url = "https//www.x.com/sample.jpg" """ 调用通用文字识别, 图片参数为远程url图片 """client.basicGeneralUrl(url); """ 如果有可选参数 """options = {}options["language_type"] = "CHN_ENG"options["detect_direction"] = "true"options["detect_language"] = "true"options["probability"] = "true" """ 带参数调用通用文字识别, 图片参数为远程url图片 """client.basicGeneralUrl(url, options)

    6,通用文字识别 请求参数详情

    931927f5ec05ddf817164e4dacdfa8ee.png

    7,通用文字识别 返回数据参数详情

    832e50f15f03903ccba9475cd3276ef8.png

    8, 通用文字识别返回示例

    {"log_id": 2471272194,"words_result_num": 2,"words_result":    [        {"words": " TSINGTAO"},        {"words": "青島睥酒"}    ]}

    9,最终代码:

    # -*- coding: UTF-8 -*-from aip import AipOcr # 定义常量APP_ID = '14544448'API_KEY = 'yRZGUXAlCd0c9vQj1kAjBEfY'SECRET_KEY = 'sc0DKGy7wZ9MeWFGZnbscbRyoDB2IQlj' # 初始化AipFace对象client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 读取图片def get_file_content(filePath):    with open(filePath, 'rb') as fp:        return fp.read() image = get_file_content('binary_best.jpg')# 调用通用文字识别, 图片为本地图片res=client.general(image)print(res) for item in res['words_result']:    print(item['words'])

    10,识别结果

      识别图片1为:

    28bd5a0b2c7f8a50b1881d0256eddff3.png

      识别结果1为:

    {'log_id': 599780865793529561, 'words_result_num': 7, 'words_result': [{'location': {'width': 321, 'top': 6, 'left': 2, 'height': 23}, 'words': '山有木兮木有枝,心悦君兮君不知。'}, {'location': {'width': 143, 'top': 46, 'left': 2, 'height': 19}, 'words': '出自先秦的《越人歌》'}, {'location': {'width': 146, 'top': 84, 'left': 1, 'height': 18}, 'words': '今夕何夕兮,拳舟中流'}, {'location': {'width': 181, 'top': 112, 'left': 1, 'height': 19}, 'words': '今日何日兮,得与王子同舟。'}, {'location': {'width': 152, 'top': 141, 'left': 1, 'height': 17}, 'words': '蒙羞被好兮,不訾诟耻。'}, {'location': {'width': 181, 'top': 168, 'left': 1, 'height': 19}, 'words': '心几烦而不绝兮,得知王子。'}, {'location': {'width': 222, 'top': 195, 'left': 2, 'height': 20}, 'words': '山有木兮木有枝,心悦君兮君不知。'}]}

    山有木兮木有枝,心悦君兮君不知。

    出自先秦的《越人歌》

    今夕何夕兮,拳舟中流

    今日何日兮,得与王子同舟。

    蒙羞被好兮,不訾诟耻。

    心几烦而不绝兮,得知王子。

    山有木兮木有枝,心悦君兮君不知。

    Process finished with exit code 0

      识别图片2为:

    8cb199918861a78d0c094d5556366b63.png

      识别结果2为:

    {'log_id': 7769540578562875641, 'words_result_num': 7, 'words_result': [{'location': {'width': 44, 'top': 20, 'left': 39, 'height': 21}, 'words': 'GTIN'}, {'location': {'width': 54, 'top': 18, 'left': 329, 'height': 20}, 'words': 'Count'}, {'location': {'width': 139, 'top': 45, 'left': 37, 'height': 21}, 'words': '00190198720566'}, {'location': {'width': 73, 'top': 76, 'left': 36, 'height': 24}, 'words': 'SSCC18:'}, {'location': {'width': 69, 'top': 78, 'left': 329, 'height': 21}, 'words': 'Product'}, {'location': {'width': 178, 'top': 104, 'left': 35,'height': 21}, 'words': '008859090495625554'}, {'location': {'width': 108, 'top': 104, 'left': 328, 'height': 22}, 'words': 'MRJP2CH/A'}]} 

    GTIN

    Count

    00190198720566

    SSCC18:

    Product

    008859090495625554

    MRJP2CH/A

      参考:http://ai.baidu.com/docs#/OCR-Python-SDK/e4ddca43

    方案3:KNN实现简单的OCR

      这次在网上看到KNN在ocr的识别,非常想尝试一下,原文作者说KNN在ocr的识别过程中能发挥作用的地方就是将图像中的文字转化为文本格式,而OCR的其他部分,比如图像预处理,二值化等操作将丢给OpenCV去操作。

      代码地址:github:https://github.com/hahahaha1997/OCR

    1,训练集简介

        由于我们采用的是KNN来转换图像中的文字为文本格式,需要一个庞大的手写字符训练集来支撑我们的算法。这里我使用的是《机器学习实战》2.3实例:手写识别系统中使用的数据集,其下载地址为:https://www.manning.com/books/machine-learning-in-action,在Source CodeCh02digitsrainingDigits中的两千多个手写字符既是我所使用的训练集。

        这个训练集配合上它所提供的测试集,提供了一个准确度非常高的分类器:

      训练集是由0~9十个数字组成的,每个数字有两百个左右的训练样本。所有的训练样本统一被处理为一个32*32的0/1矩阵,其中所有值为1的连通区域构成了形象上的数字,如下所示:

    89fdb5d6e7067c1baed6988f4796e1bb.png

    所以,在构造我们的测试集的时候,所有的手写数字图片必须被处理为这样的格式才能够使得分类算法正确地进行,这也是KNN的局限所在。

    2、构建测试集

        上面已经提到,要想算法正确地进行,测试集的样式应该和训练集相同,也就是说我们要把一张包含有手写数字的图像,转换为一个32*32的0/1点阵。

        测试集使用我自己手写的10个数字:

    9b06e9849cf3f050a7e061538b57251d.png

      这里存在一个非常大的问题:这个数据集的作者是土耳其人,他们书写数字的习惯和我们有诸多不同,比如上面的数字4和数字8,下面这样子的数字就无法识别:4/8。哈哈,也就是说它连印刷体都无法识别,这是这个训练集的一大缺陷之一。

        1)图像预处理

         图像预处理的过程是一个数字图像处理(DIP)的过程,观察上面的10个数字,可以发现每张图像的大小/对比度的差距都非常大,所以图像预处理应该消除这些差距。

         第一步是进行图像的放大/缩小。由于我们很难产生一个小于32*32像素的手写数字图像,所以这里主要是缩小图像:

    import cv2def readImage(imagePath):    image = cv2.imread(imagePath,cv2.IMREAD_GRAYSCALE)    image = cv2.resize(image,(32,32),interpolation = cv2.INTER_AREA)    return image

      这里我没有去实现图像重采样的方法,而是采用的OpenCV,通过area来确定取样点的灰度值(推荐用bicubic interpolation,对应的插入函数应该是INTER_CUBIC),在读入图像的时候读入方式位IMRAD_GRAYSCALE,因为我们需要的是识别手写字符,灰度图对比彩色图能更好的突出重点。

        进行图像的缩放是不够的,因为观察上面的图片可以发现:拍摄环境对于对比度的影响非常大,所以我们应该突出深色区域(数字部分),来保证后面的工作顺利进行,这里采用的是伽马变换(也可以采用对数变换):

    def imageGamma(image):    for i in range(32):        for j in range(32):            image[i][j]=3*pow(image[i][j],0.8)    return image

        2)图像二值化

        缩小/放大后的图像已经是一个32*32的图像了,下一步则是将非数字区域填充0,数字区域填充1,这里我采用的是阈值二值化处理:

    def imageThreshold(image):    ret,image = cv2.threshold(image,150,255,cv2.THRESH_BINARY)    return image

      经过二值化处理,数字部分的灰度值应该为0,而非数字部分的连通区域的灰度值应该为255,如下所示:

    d30059b020f99a56c5ae2e4f3cd30f53.png

          3)去噪

          图像去噪的方式有很多种,这里建立使用自适应中值滤波器进行降噪,因为我们的图像在传输过程中可能出现若干的椒盐噪声,这个噪声在上述的二值化处理中有时候是非常棘手的。

          到目前为止,一副手机摄像的手写数字图像就可以转换为一个32*32的二值图像。

          4)生成训练样本

          如何将这个32*32的二值图像转换为0/1图像,这个处理非常简单:

    def imageProcess(image):        with open(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits6_0.txt','w+') as file:        for i in range(32):            for j in range(32):                if image[i][j] == 255:                    file.write('0')                else:                    file.write('1')            file.writelines('')

      这里我的代码在扫描这个图像的同时,将其保存为一个训练样本,命名和训练集的明明要求一样为N_M.txt,其中N代表这个训练样本的实际分类是什么数字,M代表这是这个数字的第几个样本。这里对图像进行灰度变换已经是多此一举了,我所需要的是0/1矩阵而非一个0/1图像,所以在扫描过程中一并生成训练样本更加省时直观。

          5)形成训练集

          上面的示例只是生成一个图像的训练样本的,而实际上我们往往需要一次性生成一个训练集,这就要求这个图像预处理、二值化并且生成0/1矩阵的过程是自动的:

    from os import listdirdef imProcess(imagePath):    testDigits = listdir(imagePath)    for i in range(len(testDigits)):        imageName = testDigits[i]#图像命名格式为N_M.png,NM含义见4)生成训练样本        #imageClass = int((imageName.split('.')[0]).split('_')[0])#这个图像的数字是多少        image = cv2.imread(imageName,cv2.IMREAD_GRAYSCALE)         image = cv2.resize(image, (32, 32), interpolation=cv2.INTER_AREA)        ret, image = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)            with open(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits'+imageName.split('.')[0]+'.txt','w+') as file:            for i in range(32):                for j in range(32):                    if image[i][j] == 255:                        file.write('0')                    else:                        file.write('1')                file.writelines('')

          这个函数将imagePath文件夹中所有的N_M命名的手写数字图像读取并经过预处理、二值化、最后保存为对应的0/1矩阵,命名为N_M.txt,这就构成一个训练集了。

    3、构建分类器

        分类器如下:

    def classify(vector,dataSet,labels,k):    distance = sqrt(abs(((tile(vec,(dataSet.shape[0],1)) - dataSet) ** 2).sum(axis = 1))); #计算距离    sortedDistance = distance.argsort()    dict={}    for i in range(k):        label = labels[sortedDistance[i]]        if not label in dict:             dict[label] = 1        else:             dict[label]+=1   sortedDict = sorted(dict,key = operator.itemgetter(1),reverse = True)   return sortedDict[0][0] def dict2list(dic:dict):#将字典转换为list类型    keys=dic.keys()    values=dic.values()    lst=[(key, value)for key,value in zip(keys,values)]    return lst

      distance的计算和dict2list函数的详解在上一节,戳上面的classify既可以跳转过去。

      分类器已经构建完成,下一步是提取每一个测试样本,提取训练集,提取label的过程:(这个过程大部分用的是《机器学习实战》中的代码,对于难以理解的代码在下文中做了解释:)

      1)读取0/1矩阵文件:

    def img2vector(filename):    returnvec = numpy.zeros((1,1024))    file = open(filename)    for i in range(32):        line = file.readline()        for j in range(32):            returnvec[0,32*i+j] = int(line[j])    return returnvec

      这里要注意:构造一个32*32的全零矩阵的时候,应该是numpy.zeros((1,1024)),双层括号!双层括号!双层括号!代表构造的是一个二维矩阵!

      2)读取训练集和测试集并求解准确率:

    def handWritingClassifyTest():    labels=[]    trainingFile = listdir(r'F:甥敳獲yangPycharmProjectsOCR_KNNrainingDigits')    m = len(trainingFile)    trainingMat = numpy.zeros((m,1024))    for i in range(m):        file = trainingFile[i]        filestr = file.strip('.')[0]        classnum = int(filestr.strip('_')[0])        labels.append(classnum)        trainingMat[i,:] = img2vector('trainingDigits/%s' % file)    testFileList = listdir(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits')    error = 0.0    testnum = len(testFileList)    for i in range(testnum):        file_test = testFileList[i]        filestr_test = file_test.strip('.')[0]        classnum_test = int(filestr_test.strip('_')[0])        vector_test = img2vector('testDigits/%s'%file_test)        result = classify(vector_test,trainingMat,labels,1)        if(result!=classnum_test):error+=1.0    print("准确率:%f"%(1.0-(error/float(testnum))))

      代码其实没有很难懂的地方,主要任务就是读取文件,通过img2vctor函数转换为矩阵,还有切割文件名获取该测试样本的类别和该训练样本的类别,通过对比获得准确率。

      3、使用分类器

        现在为止,我们的分类器已经构建完成,下面就是测试和使用阶段:

        1)测试《机器学习实战》中给出的训练集:

    1be82998fdfdc10b4edd790ebc0c7a11.png
    2af82146b4eebda80efacd8f562c98cd.png

          2)测试手写训练集:

          果然学不出来大佬写字,附上几张无法识别的0/1数字矩阵:(0,4,6无法识别的原因是比划太细哈哈,8无法识别的原因……太端正了吧)

    d4fc80a6320f9b92af6187e439465bc9.png

    4、完整代码:

    from os import listdirimport numpyimport operatorimport cv2 def imProcess(imagePath):    testDigits = listdir(imagePath)    for i in range(len(testDigits)):        imageName = testDigits[i]#图像命名格式为N_M.png,NM含义见4)生成训练样本        #imageClass = int((imageName.split('.')[0]).split('_')[0])#这个图像的数字是多少        image = cv2.imread(imageName,cv2.IMREAD_GRAYSCALE)        image = cv2.resize(image, (32, 32), interpolation=cv2.INTER_AREA)        ret, image = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)        with open(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits'+imageName.split('.')[0]+'.txt','w+') as file:            for i in range(32):                for j in range(32):                    if image[i][j] == 255:                        file.write('0')                    else:                        file.write('1')                file.writelines('') def img2vector(filename):    returnvec = numpy.zeros((1,1024))    file = open(filename)    for i in range(32):        line = file.readline()        for j in range(32):            returnvec[0,32*i+j] = int(line[j])    return returnvec def handWritingClassifyTest():    labels=[]    trainingFile = listdir(r'F:甥敳獲yangPycharmProjectsOCR_KNNrainingDigits')    m = len(trainingFile)    trainingMat = numpy.zeros((m,1024))    for i in range(m):        file = trainingFile[i]        filestr = file.strip('.')[0]        classnum = int(filestr.strip('_')[0])        labels.append(classnum)        trainingMat[i,:] = img2vector('trainingDigits/%s' % file)    testFileList = listdir(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits')    error = 0.0    testnum = len(testFileList)    for i in range(testnum):        file_test = testFileList[i]        filestr_test = file_test.strip('.')[0]        classnum_test = int(filestr_test.strip('_')[0])        vector_test = img2vector('testDigits/%s'%file_test)        result = classify(vector_test,trainingMat,labels,1)        if(result!=classnum_test):error+=1.0    print("准确率:%f"%(1.0-(error/float(testnum)))) def classify(inX,dataSet,labels,k):    size = dataSet.shape[0]    distance = (((numpy.tile(inX,(size,1))-dataSet)**2).sum(axis=1))**0.5    sortedDistance = distance.argsort()    count = {}    for i in range(k):        label = labels[sortedDistance[i]]        count[label]=count.get(label,0)+1    sortedcount = sorted(dict2list(count),key=operator.itemgetter(1),reverse=True)    return sortedcount[0][0] def dict2list(dic:dict):#将字典转换为list类型    keys=dic.keys()    values=dic.values()    lst=[(key, value)for key,value in zip(keys,values)]    return lst # def imProcess(image):#     image = cv2.resize(image, (32, 32), interpolation=cv2.INTER_AREA)#     ret, image = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)#     cv2.imshow('result',image)#     cv2.waitKey(0)#     with open(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits6_0.txt','w+') as file:#         for i in range(32):#             for j in range(32):#                 if image[i][j] == 255:#                     file.write('0')#                 else:#                     file.write('1')#             file.writelines('')   # iamge = cv2.imread(r'C:甥敳獲yangDesktop6.png',cv2.IMREAD_GRAYSCALE)# image = imProcess(iamge)imProcess(r'F:甥敳獲yangPycharmProjectsOCR_KNNestDigits')handWritingClassifyTest()

    5、总结

        KNN还是不适合用来做OCR的识别过程的,虽然《机器学习实战》的作者提到这个系统是美国的邮件分拣系统实际运行的一个系统,但是它肯定无法高准确率地识别中国人写的手写文字就对了,毕竟中国有些地方的“9”还会写成“p”的样子的。这一节主要是将KNN拓展到实际运用中的,结合上一节的理论,KNN的执行效率还是太低了,比如这个系统,要识别一个手写数字,它需要和所有的训练样本做距离计算,每个距离计算又有1024个(a-b)²,还有运行效率特别低下的sqrt(),如果是一个非常大的测试集,需要的时间就更加庞大,如果训练集非常庞大,在将0/1矩阵读入内存中的时候,内存开销是非常巨大的,所以整个程序可能会非常耗时费力。不过KNN仍旧是一个精度非常高的算法,并且也是机器学习分类算法中最简单的算法之一。

    KNN实现OCR的转载地址:https://www.cnblogs.com/DawnSwallow/p/9440516.html

    知识储备:使用Python写入数据到Excel文件中

    1 安装XlsxWriter

      python XlsxWriter模块创建aexcel表格,生成的文件后缀名为.xlsx,最大能够支持1048576行数据,16384列数据

    pip install XlsxWriter

    365599f0a401964795a06a60e5749c37.png

    2 在Excel写数据

    # 建立文件workbook = xlsxwriter.Workbook("text.xlsx")# 可以制定表的名字# worksheet = workbook.add_worksheet('text')worksheet = workbook.add_worksheet()  # 设置列宽# worksheet.set_column('A:A',10)# 设置祖体bold = workbook.add_format({'bold':True})# 定义数字格式# money = workbook.add_format({'num_format':'$#,##0'})  # 写入带粗体的数据worksheet.write('A1','data',bold)worksheet.write('B1','work')'''worksheet.write(0, 0, 'Hello')     # write_string()worksheet.write(1, 0, 'World')     # write_string()worksheet.write(2, 0, 2)        # write_number()worksheet.write(3, 0, 3.00001)     # write_number()worksheet.write(4, 0, '=SIN(PI()/4)')  # write_formula()worksheet.write(5, 0, '')        # write_blank()worksheet.write(6, 0, None)       # write_blank()'''  worksheet.write('A3',15)worksheet.write('B3',20)worksheet.write('C3',44)worksheet.write('D3',36)# xlsx计算数据worksheet.write('E3','=SUM(A3:D3)')  '''建立Chart对象: chart = workbook.add_chart({type, 'column'})Chart: Area, Bar, Column, Doughnut, Line, Pie, Scatter, Stock, Radar将图插入到sheet中: worksheet.insert_chart('A7', chart)'''  # 定义插入的图标样式chart = workbook.add_chart({"type":'column'})  headings = ['a','b','c']data = [  [1,2,3,4,5],  [2,4,6,8,10],  [3,6,9,12,15],]# 按行插入数据worksheet.write_row('A4',headings)# 按列插入数据worksheet.write_column('A5',data[0])worksheet.write_column('B5',data[1])worksheet.write_column('C5',data[2])# 图行的数据区# name:代表图例名称;# categories:是x轴项,也就是类别;# values:是y轴项,也就是值;chart.add_series({  'name':'=Sheet1!$B$4',  'categories':'=Sheet1!$A$5:$A$9',  'values':'=Sheet1!$B$5:$B$9',})chart.add_series({  'name':['Sheet1', 3, 2],  'categories':['Sheet1', 4, 0, 8, 0],  'values':['Sheet1', 4, 2, 8, 2],})# 图形的标题chart.set_title ({'name': 'Percent Stacked Chart'})# 图形X轴的说明chart.set_x_axis({'name': 'Test number'})# 图形Y轴的说明chart.set_y_axis({'name': 'Sample length (mm)'})# 设置图表风格chart.set_style(11)# 插入图形,带偏移worksheet.insert_chart('D12',chart,{'x_offset': 25, 'y_offset': 10})

    workbook.close()

    展开全文
  • 简介用非常简单的语言来说,模式识别是一种问题,而机器学习是一种解决方案。模式识别与人工智能和机器学习密切相关。模式识别机器学习的工程应用。机器学习处理可以从数据中学习的系统的构建和研究,而不是仅遵循...

    6529cc21f12e2d25e0895eb8dc89a4ac.png

    45bdd08ccbc217391a14dd6a7e737e13.png

    简介

    用非常简单的语言来说,模式识别是一种问题,而机器学习是一种解决方案。模式识别与人工智能和机器学习密切相关。模式识别是机器学习的工程应用。机器学习处理可以从数据中学习的系统的构建和研究,而不是仅遵循明确编程的指令,而模式识别是对数据中模式和规律性的识别。

    1.机器学习

    机器学习的目标绝不是做出“完美”的猜测,因为机器学习涉及的领域根本不存在这样的东西。我们的目标是做出足够好的猜测。机器学习是一种自动建立分析模型的数据分析方法。机器学习是一个使用算法从数据中学习并做出预测的领域。然后,一个机器学习算法采用这些例子并产生一个程序来完成这项工作。机器学习很大程度上建立在统计数据上。例如,当我们训练机器学习时,我们必须给它一个统计上有意义的随机样本作为训练数据。如果训练集不是随机的,我们就面临着机器学习模式不存在的风险。

    2.模式识别

    模式识别是利用机器学习算法进行模式识别的过程。模式识别可以定义为基于已经获得的知识或从模式及其表示中提取的统计信息对数据进行分类。模式识别是一种检测特定系统或数据集信息的特征或数据排列的能力。数据科学工作中的预测分析可以使用模式识别算法来隔离未来时间序列数据的统计上可能的运动。的技术背景下,模式可能会重复序列数据随着时间的推移,可以用来预测趋势,特殊配置的特征图像识别对象,频繁的单词和短语组合的自然语言处理(NLP),或特定的集群网络上的行为,表明攻击——在几乎无休止的其他可能性。其中,模式识别是机器学习的一个分支,它强调对给定场景中的数据模式或数据规则的识别。模式识别涉及模式的分类和聚类。。

    3.模式识别的特点:

    模式识别完全依赖于数据,并从数据本身得出任何结果或模型

    模式识别系统应快速,准确地识别熟悉的模式

    快速识别和分类不熟悉的物体

    从不同角度准确识别形状和物体

    即使部分隐藏也能识别出图案和对象

    轻松,自动地快速识别模式

    模式识别始终从数据中学习

    4.模式识别中的训练与学习模型

    培训是学习模式识别的基础。学习是一种现象,系统可以通过这种现象对系统进行训练,使其适应于以准确的方式给出结果。学习是最重要的阶段,因为系统对提供给系统的数据的性能如何取决于数据上使用的算法。

    该模型需要经历两个阶段,数据集分为两类,一类用于训练模型并称为训练集,另一类用于训练后对模型进行测试,称为测试集。

    9485a6fb2c9445ace9d1cb9c1c0259d4.png

    4.1训练集

    训练集用于构建模型。它由用于训练系统的一组图像组成。使用的训练规则和算法提供了有关如何将输入数据与输出决策相关联的相关信息。通过将这些算法应用于数据集对系统进行训练,从数据中提取所有相关信息,并获得结果。通常,将数据集数据的80-85%用于训练数据。

    4.2测试集

    测试数据用于测试系统。这是一组数据,用于验证系统是否经过训练后是否产生正确的输出。通常,数据集的数据的20%用于测试。测试数据用于测量系统的准确性。

    5.模式识别的应用

    计算机视觉:模式识别用于从给定的图像/视频样本中提取有意义的特征,并用于计算机视觉中的各种应用,例如生物和生物医学成像。

    图像处理,分割和分析:模式识别用于为图像处理所需的机器提供人类识别智能。

    模式识别在恐怖分子检测、信用欺诈检测、信用应用等方面得到了广泛的应用。

    指纹识别:指纹识别技术是生物识别市场中的主导技术。已经使用许多识别方法来执行指纹匹配,其中广泛使用了模式识别方法。

    地震分析:模式识别方法用于发现,成像和解释地震阵列记录中的时间模式。统计模式识别已在不同类型的地震分析模型中实现和使用。

    雷达信号分析:模式识别和信号处理方法被用于雷达信号分类的各种应用中,例如AP地雷检测和识别。

    语音识别:使用模式识别范例已获得语音识别的最大成功。它用于各种语音识别算法中,这些算法试图避免使用描述的音素级别的问题,并将较大的单位(如单词)视为模式。

    6.模式识别的优势

    模式识别可以解释DNA序列

    模式识别已广泛应用于天文学,医学,机器人技术和卫星遥感

    模式识别解决分类问题

    模式识别解决了伪造生物特征检测的问题

    对于视障人士的布料图案识别很有用

    我们可以从不同角度识别特定物体

    模式识别有助于法医实验室

    机器学习与模式识别之间的区别

    7.学习和模式识别之间的差异:

    机器学习模式识别
    机器学习是一种自动建立分析模型的数据分析方法。模式识别是各种算法的工程应用,目的是识别数据中的模式。
    机器学习更多地是在实践方面模式识别是更多地在理论方面
    可以解决实时问题可以解决实时问题
    我们需要机器/计算机来应用机器学习算法。模式识别可能在机器外部

    推荐阅读

    (点击标题可跳转阅读)

    最详细、最完整的相机标定讲解

    深度学习+机器视觉=下一代检测

    视觉检测系统最经典的结构你了解吗?

    机器视觉技术的十大应用领域

    工业相机和普通相机究竟有什么不同?

    基于机器视觉和深度学习的智能缺陷检测

    波士顿等移动机器人的视觉算法解析

    2020年37个人工智能技术发展趋势

    机器视觉的光源选型及打光方案分析

    光学三维测量技术及应用

    国内80%搞机器视觉的工程师,走的路子是错的!

    视觉+机器人,如何实现连接器的自动装配?

    机器视觉技术发展的五大趋势

    搞懂机器视觉基本内容,这份PPT就够了

    机器视觉:PC式视觉系统与嵌入式视觉系统区别  

    基于HALCON的机器视觉开发,C++或C#如何选择? 

    3D视觉技术在机器人抓取作业中的应用实例

    基于机器视觉的粗糙度检测方案

    机器视觉常用图像软件对比及分析

    工业相机编程流程及SDK接口使用汇总

    2fd29699bd9d2e7c3492d2d7e889990a.gif End 2fd29699bd9d2e7c3492d2d7e889990a.gif

    商务合作:QQ:1504328545

    声明:部分内容来源于网络,仅供读者学习、交流之目的。文章版权归原作者所有。如有不妥,请联系删除。

    更多是视觉资讯尽在“新机器视觉”微信公众号~

    141485d3b5a7dd309114ae6ae344b7fa.png

    展开全文
  • 【导语】:本文推荐的 GitHub 项目用 Python 实现流行的机器学习算法,还包括算法实现背后的解析。每个算法都有交互式 Jupyter Notebook 演示,你可以使用它来训练数据和算法配置,并实时在浏览器中查看结果、图表和...

    【导语】:本文推荐的 GitHub 项目用 Python 实现流行的机器学习算法,还包括算法实现背后的解析。每个算法都有交互式 Jupyter Notebook 演示,你可以使用它来训练数据和算法配置,并实时在浏览器中查看结果、图表和预测。

    简介

    Homemade Machine Learning 这个项目的目标,并不是通过使用第三方库一行实现机器学习算法,而是从零开始实现,并且能更好地理解每个算法背后的数学原理。这就是为什么所有的算法实现都被叫做“homemade”,并且这些算法并不打算用于实际生产中。

    (前哨君提示由于微信不支持外链,下文中的? 数学、⚙️ 代码 和 ▶️ 演示,需要在项目主页跳转查看。)

    本项目地址: 

    https://github.com/trekhleb/homemade-machine-learning

    监督式学习

    在监督式学习中,我们将一组训练数据作为输入,每个训练组中,一组标签或者“正确答案”作为输出。然后,我们训练我们的模型(机器学习算法参数)将输入映射到正确的输出中(正确的预测)。最终的目标是找到一个模型参数,这个模型参数能够做到,即使是一个新的输入例,也能保持持续正确的输入->输出映射(预测)。

    回归

    在回归问题中,我们做实值预测。最基本的,我们尝试沿着训练给出的例子,画一个线/平面/n维平面。

    使用示例:股票价格预测,销售分析,任何数字依赖等。

    线性回归

    0ef5c94c11b4bee6d47db095640e743b.png

    • ? 数学 | 线性回归 - 理论和延申阅读的链接

    • ⚙️ 代码 | 线性回归- 实现示例

    • ▶️ 演示 | 单变量线性回归 - 通过经济GDP预测国家幸福指数

    • ▶️ 演示| 多元线性回归 - 通过经济GDP和自由度指数来预测国家幸福指数

    • ▶️ 演示| 非线性回归 - 通过带有多项式和正弦特征的线性回归来预测非线性依赖

    分类

    在分类问题中,我们通过某种特征过滤了输入例。

    使用示例:垃圾过滤器,语言探测,寻找相似文档,手写文字识别等。

    逻辑回归

    • ? 数学 | 逻辑回归 - 理论和拓展阅读的链接

    • ⚙️ 代码 | 逻辑回归 - 实现示例

    • ▶️ 演示| 逻辑回归(线性边界) - 基于花瓣长度和宽度预测鸢尾花

    • ▶️ 演示 | 逻辑回归(非线性边界) - 基于参数1和参数2预测微型芯片的有效性

    • ▶️ 演示 | 多元逻辑回归| MNIST - 从28x28像素的图片中识别手写数字

    • ▶️ 演示 | 多元逻辑回归| 流行的MNIST - 从28x28像素的图片中识别衣服类型

    非监督式学习

    非监督式学习是机器学习的一个分支,学习使用的测试数据没有被标记,分类或归纳。非监督式学习没有反馈,而是学习识别数据中的共性,之后的具体反应基于每个数据段中存在或不存在的共性。

    聚类

    在聚类问题中,我们通过未知的特点过滤训练示例。算法本身决定什么样的特性用于过滤。

    使用举例:市场分割,社会网络分析,组织计算集群,天文数据处理,图像压缩等。

    ? K-means 算法
    ? 数学 | K-means 算法 - 理论和拓展阅读的链接
    ⚙️ 代码 | K-means 算法 - 实现示例
    ▶️ 演示| K-means 算法- 基于花瓣长度和宽度预测鸢尾花

    异常探测

    异常探测(也叫离群探测)是稀有物品、事件或者观察的鉴别,主要通过比对与主数据的显著不同来提高怀疑特性。

    使用示例:入侵检测,欺诈检测,系统健康监控,还有从数据集中删除异常数据等。

    ? 使用高斯分布进行异常探测
    ? 数学 | 使用高斯分布进行异常探测 - 理论和拓展阅读的链接
    ⚙️ 代码| 使用高斯分布进行异常探测- 实现用例
    ▶️ 演示 | 异常探测 - 找到服务器操作中的异常,比如潜伏期,临界值

    神经网络

    神经网络不是一个算法,而是一个机器学习的算法框架,主要用来处理复杂的数据输入。

    使用示例:通常是所有其他算法的替代品,例如图像识别,声音识别,图像处理(分析具体特征),语言翻译等。

    多层认知 (MLP)

    ? 数学 | 多层认知 - 理论和拓展阅读的链接
    ⚙️ 代码| 多层认知- 实现用例
    ▶️ 演示 | 多层认知 | MNIST - 从像素为28x28的图片中识别手写笔迹
    ▶️ 演示 | 多层认知| 流行的MNIST - 从28x28像素的图片中识别衣服类型

    机器学习图谱

    97221a17c1a5eb0f6ed79d4521f16d40.png

    学习前提

    1. 安装python

    2. 安装依赖。运行下面的命令,可以安装本项目需要的所有依赖:

    pip install -r requirements.txt
    1. 本地启动Jupyter或者远程启动Jupyter

    数据集

    本项目使用的数据集可以在如下链接中找到:

    https://github.com/trekhleb/homemade-machine-learning/tree/master/data

    - EOF - 

    更多优秀开源项目(点击下方图片可跳转)

    c43e3d2dc96ca968e20f4f4a472a5e42.png

    8ecd144244a99252a6a83bca69219965.png

    4d86564f2d124b41026c316710864de5.png


    如果觉得本文介绍的开源项目不错,欢迎转发推荐给更多人。

    bb93e1fd63e1f27bccc4a18bbaaa717b.png

    分享、点赞和在看

    支持我们分享更多优秀开源项目,谢谢!

    展开全文
  • 前言 不知不觉中,我们的生活到处充满了二维码。登录账户需要二维码;加好友需要二维码;共享单车需要二维码;商品包装上也有二维码;甚至连楼下卖水果的阿姨手里都拿张二维码收款...条形码是一维数据,当机器在水...

    前言

           不知不觉中,我们的生活到处充满了二维码。登录账户需要二维码;加好友需要二维码;共享单车需要二维码;商品包装上也有二维码;甚至连楼下卖水果的阿姨手里都拿张二维码收款。那么,有没有想过这个二维码到底是什么东西呢?那么这个二维码的图案会不会多到不小心重合了呢?

    条形码

    在二维码出现之前,大行其道的还得是条形码,比如超市收银员扫的那个黑白条就是条形码。条形码是一维数据,当机器在水平方向上扫码这些粗细不同的黑白条时能够获取到其中的数据信息。相比于只在一个维度上携带信息的条形码,二维码在水平、垂直两个维度上都携带了数据。

    说白了,条形码和二维码都是对一些数字、字母、字符等人们共识的常规文字,转换成另外一种相对应的符号(黑白条、黑白方块),然后又让这些符号能够被机器识别和翻译成为常规文字。

    静态二维码

           二维码其实有点类似于我们学生时代考试中用到的答题卡。我们在考试中将需要选择的正确答案用2B铅笔✏️涂黑后,这个信息就可以被机器扫描出来。机器批阅的效率非常高,一秒钟就可以知道你考了多少分。

    当然,二维码和答题卡的原理还不太一样。二维码的生成原理并不难理解,其实就是把数据信息转换成对应的黑白方块,最后拼接成了一个日常可见的正方形图案。也就意味着,如果改变了数据信息,就会直接改变二维码的图案,这也是静态码的重要特点。

    二进制生成图形码

    说了半天,还是没用说到关键点,就是怎么就把数据信息转换成对应的条形码和二维码。

    这里先介绍一下划时代意义的“二进制”。二进制由0和1组成,二进制的过程也被称为编码过程,它可以将数字、字母等字符转换成由0和1组成的数字集合。

    下面是字符转二进制的转换表格,在线二进制转换:http://www.txttool.com/wenben_strbinary.asp。

    字符 二进制
    0 00110000
    1 00110001
    2 00110010
    3 00110011
    10 00110001 00110000
    11 00110001 00110001
    a 01100001
    b 01100010
    c 01100011
    ab 01100001 01100010
    . 00101110

    比如,百度的网址 “www.baidu.com ” 转换成二进制后如下所示:

    01110111011101110111011100101110011000100110000101101001011001000111010100101110011000110110111101101101

    如果,此时“0”对应白色方块、“1”对应黑色方块的话,就会出现许多大大小小黑白方块。最后把这些方块填入一个大的正方形内,就形成了二维码图案了。

    二维码的定位 

    不知道,大家有没有好奇,为什么所有的二维码的边角都有三个大的黑色方块。如下图所示:

    其实,这三个大小相同的黑色方块是为了给二维做定位的。定位?啥意思?很简单啊,就是你的二维可能斜了、歪了、倒立了,相机就可以通过这三个黑方块点判断二维的正确存放位置了啊!💡叮咚!这下大家都明白了吧。

    展开全文
  • 浅析二维码基本原理

    2020-10-21 16:08:01
    随着科技的发展,人的感官认识能力逐渐的被机器模拟出来。模式识别是对物体的直观信息进行读取识别,而这些信息通常数据量大且较为复杂,所以模式识别技术很难应用到对识别效率要求较高的应用领域,例如交通运输、...
  • 原文链接:图片相似度识别:aHash算法微信公众号:机器学习养成记 搜索添加微信公众号:chenchenwingsaHash、pHash、dHash是常用的图像相似度识别算法,原理简单,实现方便,个人把这三个算法作为学习图片相似度识别...
  • 今天推荐一门机器学习的基础课程,回归原理和算法,为自己奠定基础。这门课现在限时特价,49元,很快会恢复原价 69,现在购买,立省 20 元。识别下图二维码,即刻投资自己的...
  • (长按识别上图二维码) 微信公众号原文链接:基于redis的分布式锁实现 文章目录背景方案探索分布式锁实现方式分布式锁保持数据一致的原理实现过程 背景 CMDB系统里面的机器数据会分为很多种类,比如系统服务数据,...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

二维码机器识别原理