精华内容
下载资源
问答
  • importosimportcv2importnumpyKNN_SQUARE_SIDE=50# Square 50 x 50 px.defresize(cv_image,factor):new_size=tuple(map(lambdax:x*factor,cv_image.shape[::-1]))returncv2.resize(cv_image,new_size)defcrop(cv_ima...

    importosimportcv2importnumpy

    KNN_SQUARE_SIDE=50# Square 50 x 50 px.defresize(cv_image,factor):new_size=tuple(map(lambdax:x*factor,cv_image.shape[::-1]))returncv2.resize(cv_image,new_size)defcrop(cv_image,box):x0,y0,x1,y1=boxreturncv_image[y0:y1,x0:x1]defdraw_box(cv_image,box):x0,y0,x1,y1=box

    cv2.rectangle(cv_image,(x0,y0),(x1,y1),(0,0,255),2)defdraw_boxes_and_show(cv_image,boxes,title='N'):temp_image=cv2.cvtColor(cv_image,cv2.COLOR_GRAY2RGB)forboxinboxes:draw_box(temp_image,box)cv2.imshow(title,temp_image)cv2.waitKey(0)classBaseKnnMatcher(object):distance_threshold=0def__init__(self,source_dir):self.model,self.label_map=self.get_model_and_label_map(source_dir)@staticmethoddefget_model_and_label_map(source_dir):responses=[]label_map=[]samples=numpy.empty((0,KNN_SQUARE_SIDE*KNN_SQUARE_SIDE),numpy.float32)forlabel_idx,filenameinenumerate(os.listdir(source_dir)):label=filename[:filename.index('.png')]label_map.append(label)responses.append(label_idx)image=cv2.imread(os.path.join(source_dir,filename),0)suit_image_standard_size=cv2.resize(image,(KNN_SQUARE_SIDE,KNN_SQUARE_SIDE))sample=suit_image_standard_size.reshape((1,KNN_SQUARE_SIDE*KNN_SQUARE_SIDE))samples=numpy.append(samples,sample,0)responses=numpy.array(responses,numpy.float32)responses=responses.reshape((responses.size,1))model=cv2.KNearest()model.train(samples,responses)returnmodel,label_mapdefpredict(self,image):image_standard_size=cv2.resize(image,(KNN_SQUARE_SIDE,KNN_SQUARE_SIDE))image_standard_size=numpy.float32(image_standard_size.reshape((1,KNN_SQUARE_SIDE*KNN_SQUARE_SIDE)))closest_class,results,neigh_resp,distance=self.model.find_nearest(image_standard_size,k=1)ifdistance[0][0]>self.distance_threshold:returnNonereturnself.label_map[int(closest_class)]classDigitKnnMatcher(BaseKnnMatcher):distance_threshold=10**10classMeterValueReader(object):def__init__(self):self.digit_knn_matcher=DigitKnnMatcher(source_dir='templates')@classmethoddefget_symbol_boxes(cls,cv_image):ret,thresh=cv2.threshold(cv_image.copy(),150,255,cv2.THRESH_BINARY)contours,hierarchy=cv2.findContours(thresh,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)symbol_boxes=[]forcontourincontours:x,y,width,height=cv2.boundingRect(contour)# You can test here for box size, though not required in your example:# if cls.is_size_of_digit(width, height):# symbol_boxes.append((x, y, x+width, y+height))symbol_boxes.append((x,y,x+width,y+height))returnsymbol_boxesdefget_value(self,meter_cv2_image):symbol_boxes=self.get_symbol_boxes(meter_cv2_image)symbol_boxes.sort()# x is first in tuplesymbols=[]forboxinsymbol_boxes:symbol=self.digit_knn_matcher.predict(crop(meter_cv2_image,box))symbols.append(symbol)returnsymbolsif__name__=='__main__':# If you want to see how boxes detection works, uncomment these:# img_bw = cv2.imread(os.path.join('original.png'), 0)# boxes = MeterValueReader.get_symbol_boxes(img_bw)# draw_boxes_and_show(img_bw, boxes)# Uncomment to generate templates from image# import random# TEMPLATE_DIR = 'templates'# img_bw = cv2.imread(os.path.join('original.png'), 0)# boxes = MeterValueReader.get_symbol_boxes(img_bw)# for box in boxes:# # You need to label templates manually after extraction# cv2.imwrite(os.path.join(TEMPLATE_DIR, '%s.png' % random.randint(0, 1000)), crop(img_bw, box))img_bw=cv2.imread(os.path.join('original.png'),0)vr=MeterValueReader()printvr.get_value(img_bw)

    展开全文
  • 写在前面这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点。而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更完善...

    写在前面

    这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点。

    而且因为在编写的过程中,把前面的一些逻辑也修改了一些,将其变得更完善了,所以一切以本篇的为准。当然,如果想要直接看代码,代码全部放在我的GitHub中,所以这篇文章主要负责讲解,如需代码请自行前往GitHub。

    本次大纲

    上一次写到了数据库的建立,我们能够实时的将更新的训练图片存入CSV文件中。所以这次继续往下走,该轮到识别图片的内容了。

    首先我们需要从文件夹中提取出需要被识别的图片test.png,并且把它经过与训练图片相同的处理得到1x10000大小的向量。因为两者之间存在微小的差异,我也不是很想再往源代码之中增加逻辑了,所以我就直接把增加待识别图片的函数重新写一个命名为GetTestPicture,内容与GetTrainPicture类似,只不过少了“增加图片名称”这一个部分。

    之后我们就可以开始进行正式图片识别内容了。

    主要是计算待识别图片与所有训练图片的距离。当两个图片距离越近的时候,说明他们越相似,那么他们很有可能写的就是同一个数。所以利用这个原理,我们可以找出距离待识别图像最近的几个训练图片,并输出他们的数字分别是几。比如说我想输出前三个,前三个分别是3,3,9,那就说明这个待识别图片很有可能是3.

    之后还可以对每一个位置加个权重,具体的就放在下一次再讲,本节内容已经够多了。

    (第一篇文章之中我说过利用图片洞数检测。我尝试了一下,认为有些不妥,具体原因放在本文末。)

    MAIN代码

    所以直接把主要代码放上来,逻辑相对来说还是比较清晰的

    相比上一篇文章的内容,本篇文章里只增加了下面的的一段代码,即得到待识别图片名称、得到待识别图片向量、计算分类。

    下面我们将着重讲解CalculateResult函数的内容,即识别图片的算法。

    算法内容

    算法大致讲解

    我们在大纲之中已经简单介绍过了,所以我就直接把复制过来,并且再添加一些内容。

    假设我们在二维平面上有两个点A=(1,1)和B=(5,5),我现在再放一个点C=(2,2),那么请问,C点离哪一个更近?

    学过初中数学的都会知道肯定是离A点更近。所以我们换一种说法,我们现在有两个类A和B,A类中包括了点(1,1),B类中包括了点(5,5),所以对于点(2,2),它可能属于哪一类?

    因为这个点离A类的点更近一点,所以它可能属于A类。这就是结论。那么对于3维空间,A类是点(1,1,1)和B类是(5,5,5),那么对于点(2,2,2)肯定也是属于A类。

    可以看出,我们这里是将两个点的距离来作为判断属于哪一类的标准。那么对于我们将图片拉成的1xn维向量,他实际上投影到n维空间上就是一个点,所以我们将训练向量分成10类,分别代表十个数字,那么被识别数字靠近哪一个类,那说明它有可能属于这一个类。

    那么我们这里可以假设对于被识别向量,列出距离他最近的前十个向量分别属于哪一类别,然后根据名次加上一个权重,并计算出一个值。该值代表了可能是属于哪一个类,因此这就是我们得出的最终的一个结果——被识别手写数字图片的值。

    以上是第一篇文章中的内容,下面我着重讲一下数学方面的内容。

    考虑到某些地方不能够输入数学公式(或不方便输入),我还是把这一段内容贴成图片出来。

    0045126332-0.jpg

    之后直接挑出前几个离被识别图片最近的向量数字,基本上这几个数字就是被识别图片的数字了。但这样做未免有些简单,所以下一篇文章我会再深入一下,这张先讲计算距离的内容。

    主代码

    下面的代码中文件夹test用来存放待识别图片,并通过函数GetTestPicture来得到图片向量,之后和训练图片pic一起放进计算距离的函数CalculateResult中计算每一个待识别向量和其他所有图片向量的距离。

    函数CalculateResult在文件PictureAlgorithm.py中,这个文件里面包含了两个函数为CalculateDistance函数和CalculateResult函数,代表识别图片所用到的算法。

    函数CalculateResult

    这个函数的逻辑比较简单,也没什么好说的,主要的联系就是这个计算距离的CalculateDistance函数。

    函数CalculateDistance

    函数中我导入了四个参数:被识别向量test,训练向量train,与训练向量对应的每个向量对应代表的数字num,想要导出的前n个距离最近的向量。

    首先建立一个行数为test内被识别向量数量,列数为2*n的矩阵,每一行前n个放距离,后n个放数字。之后针对每一个被识别向量进行循环。

    首先直接计算每个训练图片与该识别图片的距离,直接可以用一行代码表示

    itemDis = np.sqrt(np.sum((item-train)**2, axis=1))

    这一行代码就是上文中的算法过程,我个人觉得还是比较复杂的,可以详细的拆开看一下,我这里不细讲了。下面的内容就是开始排序并且找到距离最近的前几个向量。

    这里的逻辑是:先排序,找到距离最小的前n个,存入矩阵。找到前n个在原矩阵中的位置,并找到对应位置上num的数字,存入dis的后n个。

    这样子就相当于完成了所有内容,返回dis即可。

    实际测试

    我自己动手写了一些数字,如图所示。所以实际上我们的数据库还是比较小的。

    00451221A-1.jpg

    所以我又写了一个数字作为待识别图像,通过程序运行以后,我们的以直接输出前十个最相似的向量:

    第1个向量为2.0,距离为33.62347223932534

    第2个向量为2.0,距离为35.64182105224185

    第3个向量为2.0,距离为38.69663119274146

    第4个向量为2.0,距离为43.52904133387693

    第5个向量为2.0,距离为43.69029199677604

    第6个向量为1.0,距离为43.730883339256714

    第7个向量为6.0,距离为44.94800943845918

    第8个向量为2.0,距离为45.033283944455924

    第9个向量为4.0,距离为45.43926712996951

    第10个向量为7.0,距离为45.64893989116544

    之后我又依次从1-9试了一遍,我自己手写的数字全部识别正确,可以看出准确率还是挺高的。所以做到这一步相当于已经完成度很高了。

    所以我就试了一下从网上找的图片,发现几乎没有正确的了。说明我们的数据库还是太小,只认得我的字体。不过话说这样,也可以做一个字体识别的程序。

    所以如果要提高准确率,那么扩大图库是必须的。这一次就到这里。

    总结

    所有源代码我都放在了我的GitHub中,如果有兴趣的话可以去看看。

    到这里就相当于算法内容写完了,比较简单,只用了一个类似于K最近邻的算法。

    下一篇文章将会讲一个给前n个排名加权的想法,这样来提高准确度。

    所以这一次就先到这里为止,谢谢。

    如果喜欢的话,麻烦点一个喜欢和关注一下噢,谢谢~

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

    原文链接:http://blog.csdn.net/Hanpu_Liang/article/details/78398363

    展开全文
  • 利用Python进行数字识别

    千次阅读 2020-12-27 17:43:40
    通过Python实现KNN算法。而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的...

    思路
    通过Python实现KNN算法。而KNN算法就是K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个类别,则该样本也属于这个类别。详情可在上一篇文章开头有介绍:
    https://www.jianshu.com/p/bddf84a60efc
    转载请注明出处:Michael孟良

    准备
    在Java项目里写了一个RGBUtils的class,将32x32像素的图片全部数字化输出:

    package com.yml.common;

    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;

    public class RGBUtils {

    public static void main(String[]args){
        try {
            BufferedImage bi = ImageIO.read(new File("D:\\workspace\\Utils\\src\\com\\yml\\common\\9_1.png"));
            String picString = "";
            for (int i = 0; i < 32; i++) {
                for (int j = 0; j < 32; j++) {
                    picString += getRGB(bi, j, i);
                }
                picString += "\r\r\n";
            }
            System.out.println(picString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static int getRGB(BufferedImage image, int x, int y) {
        int[] rgb = null;
        if (image != null && x < image.getWidth() && y < image.getHeight()) {
            rgb = new int[3];
            int pixel = image.getRGB(x, y);
            rgb[0] = (pixel & 0xff0000) >> 16;
            rgb[1] = (pixel & 0xff00) >> 8;
            rgb[2] = (pixel & 0xff);
        }
        if(null!=rgb&&255==rgb[0]&&255==rgb[1]&&255==rgb[2]){
            return 0;
        }else{
            return 1;
        }
    }
    

    }
    这是我在PS新建的32x32像素的数字9:
    数字9

    黑色是1白色是0,执行上述java类后得到
    数字9

    JAVA代码:https://github.com/MichaelYipInGitHub/PythonTest/blob/master/com/test/knn/JavaUtils/RGBUtils.java
    要放到java项目里跑
    如此这般我写了三个字一个5两个9,将他们变成TXT文件再TestData文件夹下

    代码(Python)

    coding:utf-8

    import os
    import numpy as np

    此方法将每个文件中3232的矩阵数据,转换到11024一行中

    from com.test.knn.KNNArcheyTest import classify

    def img2vector(filename):
    # 创建一个1行1024列的矩阵
    returnVect = np.zeros((1, 1024))
    # 打开当前的文件
    fr = open(filename, “rb”)
    # 每个文件中有32行,每行有32列数据,遍历32个行,将32个列数据放入1024的列中
    for i in range(32):
    lineStr = fr.readline()
    for j in range(32):
    returnVect[0, 32 * i + j] = int(lineStr[j])
    return returnVect

    def IdentifImg():
    labels = []
    # 读取训练集 TrainData目录下所有的文件和文件夹
    trainingFileList = os.listdir(‘TrainData’)
    m = len(trainingFileList)
    # zeros((m,1024)) 返回一个m行 ,1024列的矩阵,默认是浮点型的
    trainingMat = np.zeros((m, 1024))
    for i in range(m):
    # 获取文件名称 0_0.txt
    fileNameStr = trainingFileList[i]
    # 获取文件除了后缀的名称
    fileStr = fileNameStr.split(’.’)[0]
    # 获取文件"数字"的类别
    classNumStr = int(fileStr.split(’’)[0])
    labels.append(classNumStr)
    # 构建训练集, img2vector 每个文件返回一行数据 1024列
    trainingMat[i, :] = img2vector(‘TrainData/%s’ % fileNameStr)
    # 读取测试集数据
    testFileList = os.listdir(‘TestData’)
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
    fileNameStr = testFileList[i] #0_0.txt
    fileStr = fileNameStr.split(’.’)[0]
    classNumStr = int(fileStr.split(’
    ’)[0])
    vectorUnderTest = img2vector(‘TestData/%s’ % fileNameStr)
    classifierResult = classify(vectorUnderTest, trainingMat, labels, 5)
    print(“识别出的数字是: %d, 真实数字是: %d” % (classifierResult, classNumStr))
    if (classifierResult != classNumStr):
    errorCount += 1.0
    print("\n识别错误次数 %d" % errorCount)
    errorRate = errorCount / float(mTest)
    print("\n正确率: %f" % (1 - errorRate))

    if name == ‘main’:
    IdentifImg()
    思路
    首先将32x32像素的图片转变成一行1024(=32x32)空间坐标,其实就相当于一个1024维的空间。TainData 里面有两千条数据就相当于有两千个点。
    我们新建一个方法叫classify,就是把我们要测试的点放到训练数据空间里,看离他最近的k个点是什么值,这里我们K设置为5

    normData 测试数据集的某行, dataSet 训练数据集 ,labels 训练数据集的类别,k k的值

    def classify(normData, dataSet, labels, k):
    # 计算行数
    dataSetSize = dataSet.shape[0]
    # print (‘dataSetSize 长度 =%d’%dataSetSi ; vzvz ze)
    # 当前点到所有点的坐标差值 ,np.tile(x,(y,1)) 复制x 共y行 1列
    diffMat = np.tile(normData, (dataSetSize, 1)) - dataSet
    # 对每个坐标差值平方
    sqDiffMat = diffMat ** 2
    # 对于二维数组 sqDiffMat.sum(axis=0)指 对向量每列求和,sqDiffMat.sum(axis=1)是对向量每行求和,返回一个长度为行数的数组
    # 例如:narr = array([[ 1., 4., 6.],
    # [ 2., 5., 3.]])
    # narr.sum(axis=1) = array([ 11., 10.])
    # narr.sum(axis=0) = array([ 3., 9., 9.])
    sqDistances = sqDiffMat.sum(axis=1)
    # 欧式距离 最后开方
    distance = sqDistances ** 0.5
    # x.argsort() 将x中的元素从小到大排序,提取其对应的index 索引,返回数组
    # 例: tsum = array([ 11., 10.]) ---- tsum.argsort() = array([1, 0])
    sortedDistIndicies = distance.argsort()
    # classCount保存的K是魅力类型 V:在K个近邻中某一个类型的次数
    classCount = {}
    for i in range(k):
    # 获取对应的下标的类别
    voteLabel = labels[sortedDistIndicies[i]]
    # 给相同的类别次数计数
    classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
    # sorted 排序 返回新的list
    # sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    sortedClassCount = sorted(classCount.items(), key=lambda x: x[1], reverse=True)
    return sortedClassCount[0][0]
    我之前写的3的数字也变成1024维空间的点,选择最近的五个点进行判断。

    输出结果

    原来图片

    代码
    https://github.com/MichaelYipInGitHub/PythonTest/blob/master/com/test/knn/IdentifImg.py

    总结
    1.Python没用封装KNN 算法, 因为太简单,可以直接手写。
    2.从图片上看, 我用粗笔写的数字能识别到,细笔写的就识别不到,这可能与我的训练数据多为粗笔字体。
    3.数字识别可以引申到动物识别,人物识别,不过他们用的像素不只是0和1,数据会更加庞大, 算法更加复杂。

    作者:Michael孟良
    链接:https://www.jianshu.com/p/eea94034e3be
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 1. MNIST数据库MNIST数据库是Web上非常流行的OCR和手写字符识别分类器的训练资源。下载mnist.pkl.gz数据集,并将其放置到与.py文件同级目录下。2. 初始化参数(1)输入层由于采用MNIST数据库,它里面的每幅图像大小为...

    1. MNIST数据库

    MNIST数据库是Web上非常流行的OCR和手写字符识别分类器的训练资源。

    下载mnist.pkl.gz数据集,并将其放置到与.py文件同级目录下。

    2. 初始化参数

    (1)输入层

    由于采用MNIST数据库,它里面的每幅图像大小为28x28像素,即784像素,因此输入层有784个输入节点。

    (2)隐藏层

    隐藏层大小没有固定,通过多次尝试发现,在训练数据量不大的情况下,50-60个节点可得到最好结果。

    (3)输出层

    输出层为0-9的数字,共10个节点。

    3. 封装ANN库

    为了尽可能自行执行,此处建立了一个迷你库,用来封装ANN到OpenCV中的原始实现。

    注意:pickle是MNIST数据库序列化库,需要提前确保已安装。

    digits_ann.py内容如下:import cv2

    import pickle

    import numpy as np

    import gzip

    """OpenCV ANN Handwritten digit recognition example

    Wraps OpenCV's own ANN by automating the loading of data and supplying default paramters,

    such as 20 hidden layers, 10000 samples and 1 training epoch.

    The load data code is taken from http://neuralnetworksanddeeplearning.com/chap1.html

    by Michael Nielsen

    """

    def vectorized_result(j):

    e = np.zeros((10, 1))

    e[j] = 1.0

    return e

    def load_data():

    with gzip.open('./mnist.pkl.gz') as fp:

    #注意版本不同,需要添加传入第二个参数encoding='bytes',否则出现编码错误

    training_data, valid_data, test_data = pickle.load(fp,encoding='bytes')

    fp.close()

    return (training_data, valid_data, test_data)

    def wrap_data():

    #tr_d数组长度为50000,va_d数组长度为10000,te_d数组长度为10000

    tr_d, va_d, te_d = load_data()

    #训练数据集

    training_inputs = [np.reshape(x, (784, 1)) for x in tr_d[0]]

    training_results = [vectorized_result(y) for y in tr_d[1]]

    training_data = list(zip(training_inputs, training_results))

    #校验数据集

    validation_inputs = [np.reshape(x, (784, 1)) for x in va_d[0]]

    validation_data = list(zip(validation_inputs, va_d[1]))

    #测试数据集

    test_inputs = [np.reshape(x, (784, 1)) for x in te_d[0]]

    test_data = list(zip(test_inputs, te_d[1]))

    return (training_data, validation_data, test_data)

    def create_ANN(hidden = 20):

    ann = cv2.ml.ANN_MLP_create()  #建立模型

    ann.setTrainMethod(cv2.ml.ANN_MLP_RPROP | cv2.ml.ANN_MLP_UPDATE_WEIGHTS)  #设置训练方式为反向传播

    ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM) #设置激活函数为SIGMOID,还有cv2.ml.ANN_MLP_IDENTITY,cv2.ml.ANNMLP_GAUSSIAN

    ann.setLayerSizes(np.array([784, hidden, 10])) #设置层数,输入784层,输出层10

    ann.setTermCriteria(( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 100, 0.1 )) #设置终止条件

    return ann

    def train(ann, samples = 10000, epochs = 1):

    #tr:训练数据集; val:校验数据集; test:测试数据集;

    tr, val, test = wrap_data()

    for x in range(epochs):

    counter = 0

    for img in tr:

    if (counter > samples):

    break

    if (counter % 1000 == 0):

    print ("Epoch %d: Trained %d/%d" % (x, counter, samples))

    counter += 1

    data, digit = img

    ann.train(np.array([data.ravel()], dtype=np.float32), cv2.ml.ROW_SAMPLE, np.array([digit.ravel()], dtype=np.float32))

    print ("Epoch %d complete" % x)

    return ann, test

    def predict(ann, sample):

    resized = sample.copy()

    rows, cols = resized.shape

    if rows != 28 and cols != 28 and rows * cols > 0:

    resized = cv2.resize(resized, (28, 28), interpolation=cv2.INTER_CUBIC)

    return ann.predict(np.array([resized.ravel()], dtype=np.float32))

    4. ANN库调用方法import cv2

    import numpy as np

    import digits_ann as ANN

    def inside(r1, r2):

    x1,y1,w1,h1 = r1

    x2,y2,w2,h2 = r2

    if (x1 > x2) and (y1 > y2) and (x1+w1 

    return True

    else:

    return False

    def wrap_digit(rect):

    x, y, w, h = rect

    padding = 5

    hcenter = x + w/2

    vcenter = y + h/2

    if (h > w):

    w = h

    x = hcenter - (w/2)

    else:

    h = w

    y = vcenter - (h/2)

    return (int(x-padding), int(y-padding),int(w+padding),int(h+padding))

    '''

    注意:首次测试时,建议将使用完整的训练数据集,且进行多次迭代,直到收敛

    如:ann, test_data = ANN.train(ANN.create_ANN(100), 50000, 30)

    '''

    ann, test_data = ANN.train(ANN.create_ANN(10), 50000, 1)

    #调用所需识别的图片,并处理

    path = "./3.png"

    img = cv2.imread(path, cv2.IMREAD_UNCHANGED)

    bw = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    bw = cv2.GaussianBlur(bw, (7,7), 0)

    ret, thbw = cv2.threshold(bw, 127, 255, cv2.THRESH_BINARY_INV)

    thbw = cv2.erode(thbw, np.ones((2,2), np.uint8), iterations = 2)

    image, cntrs, hier = cv2.findContours(thbw.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

    rectangles = []

    for c in cntrs:

    r = x,y,w,h = cv2.boundingRect(c)

    a = cv2.contourArea(c)

    b = (img.shape[0]-3) * (img.shape[1] - 3)

    is_inside = False

    for q in rectangles:

    if inside(r, q):

    is_inside = True

    break

    if not is_inside:

    if not a == b:

    rectangles.append(r)

    for r in rectangles:

    x,y,w,h = wrap_digit(r)

    cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2)

    roi = thbw[y:y+h, x:x+w]

    try:

    digit_class = ANN.predict(ann, roi)[0]

    except:

    print("except")

    continue

    cv2.putText(img, "%d" % digit_class, (x, y-1), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0))

    cv2.imshow("thbw", thbw)

    cv2.imshow("contours", img)

    cv2.waitKey()

    cv2.destroyAllWindows()

    5. 识别结果

    除调用自带的ANN接口,也可自己尝试从零开始写ANN,可参考Michael Nielsen的文章。

    注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。

    展开全文
  • 小白的OpenCV-Python数字识别尝试日志环境准备(2021-10)opencv初尝试读取图像参考链接 环境准备(2021-10) 安装anaconda3到默认位置 从anaconda3命令行安装opencv-python 为了加快下载效率,可以修改pip源,相关...
  • 手写数字识别隶属于机器学习领域中的分类学习任务,Geoffrey Hinton将之称为“机器学习的果蝇”。本文旨在讨论搭建基于Jupyter Notebook环境的手写数字图像识别系统。首先, 本文讲述了JupyterLab的安装和使用方法;...
  • 手写数字识别,是很多深度学习教程里的入门第一例,但是这些教程往往只告诉了你怎么去构造神经网络,训练模型,最后得出一个准确率,但是很少有教程告诉如何运用这个你训练好模型去识别你自己手写的数字。...
  • 使用OpenCV和Python,OCR识别数字

    千次阅读 2021-02-22 17:00:10
    这篇博客将演示如何使用OpenCV和Python识别图像中的数字。该方法只适用于七段显示器(通常在数字闹钟上看到 数字显示器)。通过提取七个片段中的每个片段并应用基本阈值和形态学运算,可以确定哪些片段处于“打开”...
  • python图像数字识别

    2021-03-22 21:50:59
    1、安装必要的包: pip install pillow pip install pytesseract 2、安装tesseract-ocr的识别引擎 官网下载太慢,可使用以下链接下载 : ... 安装好后给tesseract.exe添加环境.....\Python\Python37\Lib\site-packages\py
  • 要在二的基础上 from mnist_tools import load_mnist, plot_images from sklearn.metrics import accuracy_score # 准确率 train_x,train_y,test_x,test_y = load_mnist() train_x = train_x.reshape(-1,28*28).as...
  • 读取视频帧,对每帧图像进行二值化处理、获取连通区域,通过设定连通区域的最小内接矩形的最小高度和长宽比范围,筛选合适的连通区域从而完成对手写数字的定位,接着通过k-NN算法对手写数字进行分类识别,实时在视频...
  • python-captcha ????持续更新 ing~ 欢迎 star / fork 环境 Python 3.5.2 Pillow 7.2.0 Pillow 是一个 Python 图像处理库。 安装Pillow 安装 pip3 install pillow 查看版本 $ python3 -m pip freeze | grep...
  • 编辑 系统变量里面 path,添加下面的安装路径:D:\Program Files\Tesseract-OCR(填写自己的实际安装路径) 3、安装python的第三方库: pip install pillow #一个python的图像处理库,pytesseract依赖 pip install ...
  • 写在前面其实我之前写过一个简单的识别手写数字的程序,但是因为逻辑比较简单,而且要求比较严苛,是在50x50大小像素的白底图上手写黑色数字,并且给的训练材料也不够多,导致准确率只能五五开。所以这一次准备写一...
  • 手动1.1安装要安装程序包,请在命令提示符(Windows)或终端(Mac)中运行命令pip install digit_recognition(可选:下载程序包并使用python setup.py install运行setup.py脚本)。该包使用以下依赖项:numpy、urllib3、...
  • 用多元逻辑回归手写数字识别训练样本简介首先,可以用逻辑回归实现手写数字识别的多元分类,在ex3data.mat文件中保存着一个包含5000个培训考试训练数据集的手写数字,.mat格式表示这些训练数据集以矩阵格式保存,而...
  • 写在前面其实我之前写过一个简单的识别手写数字的程序,但是因为逻辑比较简单,而且要求比较严苛,是在50x50大小像素的白底图上手写黑色数字,并且给的训练材料也不够多,导致准确率只能五五开。所以这一次准备写一...
  • python实现手写数字识别

    千次阅读 2021-01-02 12:50:11
    手写数字识别是一个经典的机器学习问题,通过识别手写体图片来判断数字 因为数字类别是0——9,所以是十分类问题 本文以KNN算法为例,来实现手写数字的识别 文章目录实现简单的手写数字识别关于load_digits简介调用...
  • 这是我看《深度学习入门——基于Python的理论和实现》的第N天,这本书,教你如何利用python,不用机器学习第三方库,自己去实现那些高大上的机器学习能实现的功能。是的它会涉及到很多数学知识,尤其是矩阵的处理,...
  • 我正在尝试通过Keras(theano后端)中的一些练习来了解CNN.我无法拟合以下模型(错误:AttributeError:’Convolution2D’...因此,输入形状应为1、28、140(灰度= 1,高度= 28,宽度= 28 * 5)目的是预测数字的顺序.谢谢!...
  • 此案例参考python数据科学手册,属于分类的一种,觉得挺有意思的。上代码from sklearn.datasets import load_digitsimport seaborn as sns#导入数据digits=load_digits()X=digits.datay=digits.targetprint(digits....
  • 本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下1、SVM手写数字识别识别步骤:(1)样本图像的准备。(2)图像尺寸标准化:将图像大小都标准化为8*8大小。(3)读取未知样本图像,提取图像...
  • python 手写体数字识别

    2021-04-27 05:47:20
    hwLabels.append(classnumCut(fileNameStr))trainingMat[i,:]=img2vecor(file+'/%s' % fileNameStr)return hwLabels,trainingMatdef handwritingTest(file):hwLabels,trainingMat = trainingDataSet('/root/python_t...
  • Usage:tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...] ...这个参数可以减少识别错误率. 默认为 3 configfile 参数值为tessdata\configs 和 tessdata\tessconfigs 目录下的文件名
  • 问题:我试图在OpenCV-Python(cv2)中实现“数字识别OCR”。它只是为了学习目的。我想在OpenCV中学习KNearest和SVM功能。我有每个数字的100个样本(即图像)。我想和他们一起训练OpenCV示例附带的示例letter_recog.py。...
  • 补充:由于很多同学找我要原数据集和代码,所以我上传到了资源里,https://download..net/download/zugexiaodui/10913834初学机器学习,第一步是做一个简单的手写数字识别,我选用的是MNIST数据集(用其他数据集也...
  • 本项目利用python以及opencv实现信用卡的数字识别前期准备导入工具包定义功能函数模板图像处理读取模板图像 cv2.imread(img)灰度化处理 cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)二值化 cv2.threshold()轮廓 - 轮廓信用...
  • 读取视频帧,对每帧图像进行二值化处理、获取连通区域,通过设定连通区域的最小内接矩形的最小高度和长宽比范围,筛选合适的连通区域从而完成对手写数字的定位,接着通过k-NN算法对手写数字进行分类识别,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,867
精华内容 40,346
关键字:

python数字识别

python 订阅