精华内容
下载资源
问答
  • 或者怎样才能阅读数字文档中的文本,如发票、法律文书等。 但它到底是如何工作的呢? 这篇文章是关于在自然场景图像中进行文本识别的光学字符识别(OCR)。我们将了解为什么这是一个棘手的问题,用于解决的方法,...

    我们生活在这样一个时代:任何一个组织或公司要想扩大规模并保持相关性,就必须改变他们对技术的看法,并迅速适应不断变化的环境。我们已经知道谷歌是如何实现图书数字化的。或者Google earth是如何使用NLP来识别地址的。或者怎样才能阅读数字文档中的文本,如发票、法律文书等。

    但它到底是如何工作的呢?

    这篇文章是关于在自然场景图像中进行文本识别的光学字符识别(OCR)。我们将了解为什么这是一个棘手的问题,用于解决的方法,以及随之而来的代码。

    But Why Really?

    在这个数字化的时代,存储、编辑、索引和查找数字文档中的信息比花几个小时滚动打印/手写/打印的文档要容易得多。

    此外,在一个相当大的非数字文档中查找内容不仅耗时;在手动滚动文本时,我们也可能会错过信息。对我们来说幸运的是,电脑每天都在做一些人类认为只有自己能做的事情,而且通常表现得比我们更好。

    从图像中提取文本有许多应用。其中一些应用程序是护照识别、自动车牌识别、将手写文本转换为数字文本、将打印文本转换为数字文本等。

    挑战

    在讨论我们需要如何理解OCR面临的挑战之前,我们先来看看OCR。

    在2012年深度学习热潮之前,就已经有很多OCR实现了。虽然人们普遍认为OCR是一个已解决的问题,但OCR仍然是一个具有挑战性的问题,尤其是在无约束环境下拍摄文本图像时。

    我谈论的是复杂的背景、噪音、不同的字体以及图像中的几何畸变。正是在这种情况下,机器学习OCR工具才会大放异彩。

    OCR问题中出现的挑战主要是由于手头的OCR任务的属性。我们通常可以把这些任务分为两类:

    结构化文本——类型化文档中的文本。在一个标准的背景,适当的行,标准的字体和大多数密集的文本。

    非结构化文本——自然场景中任意位置的文本。文本稀疏,没有合适的行结构,复杂的背景,在图像中的随机位置,没有标准的字体。

    许多早期的技术解决了结构化文本的OCR问题。但是这些技术不适用于自然场景,因为自然场景是稀疏的,并且具有与结构化数据不同的属性。

    在本文中,我们将更多地关注非结构化文本,这是一个需要解决的更复杂的问题。正如我们所知,在深度学习的世界里,没有一个解决方案可以适用于所有人。我们将看到解决手头任务的多种方法,并将通过其中一种方法进行工作。

    用于非结构化OCR任务的数据集

    有很多英文的数据集,但是很难找到其他语言的数据集。不同的数据集提供了不同的任务需要解决。下面是一些通常用于机器学习OCR问题的数据集示例。

    SVHN数据集

    街景门牌号数据集包含73257用于训练,26032用于测试,531131作为额外的训练数据。数据集包括10个标签,它们是数字0-9。数据集与MNIST不同,因为SVHN具有不同背景下的门牌号图像。数据集在每个数字周围都有包围框,而不是像MNIST中那样有几个数字图像。

    场景文本数据集

    该数据集包含3000张不同设置(室内和室外)和光照条件(阴影、光线和夜晚)的图像,文本为韩文和英文。有些图像还包含数字。

    Devanagri字符数据集

    这个数据集为我们提供了来自25个不同的本地作者在Devanagari脚本中获得的36个字符类的1800个样本。还有很多类似的例子,例如汉字,验证码,手写单词。

    阅读文本

    任何典型的机器学习OCR管道都遵循以下步骤:

    预处理

    • 从图像中去除噪声

    • 从图像中删除复杂的背景

    • 处理图像中不同的亮度情况

    这些是在计算机视觉任务中预处理图像的标准方法。在本博客中,我们不会关注预处理步骤。

    文本检测

    文本检测技术需要检测图像中的文本,并在具有文本的图像部分周围创建和包围框。标准的目标检测技术也可以使用。

    滑动窗口技术

    可以通过滑动窗口技术在文本周围创建边界框。然而,这是一个计算开销很大的任务。在这种技术中,滑动窗口通过图像来检测窗口中的文本,就像卷积神经网络一样。我们尝试使用不同的窗口大小,以避免错过具有不同大小的文本部分。有一个卷积实现的滑动窗口,这可以减少计算时间。

    单步和基于区域的探测器

    有单步头检测技术,如YOLO(只看一次)和基于区域的文本检测技术,用于图像中的文本检测。

    滑动窗口不同的是,YOLO是一种单步技术,只通过一次图像来检测该区域的文本。

    基于区域的方法分一般都会分为两个步骤。

    首先,网络提出可能有测试的区域,然后对有文本的区域进行分类。

    EAST(高效精准场景文本检测)

    是一种基于本文的非常鲁棒的文本检测深度学习方法。值得一提的是,它只是一种文本检测方法。它可以找到水平和旋转的边界框。它可以与任何文本识别方法结合使用。

    本文的文本检测管道排除了冗余和中间步骤,只有两个阶段。

    一种是利用全卷积网络直接生成单词或文本行级别的预测。生成的预测可以是旋转的矩形或四边形,通过非最大抑制步骤进一步处理,得到最终的输出。

    EAST可以检测图像和视频中的文本。该算法在720p图像上以13FPS的速度实时运行,具有较高的文本检测精度。这种技术的另一个好处是,它的实现可以在OpenCV 3.4.2和OpenCV 4中使用。我们将看到这个EAST模型的应用,以及文本识别。

    文字识别

    一旦我们检测到有文本的包围框,下一步就是识别文本。有几种识别文本的技术。我们将在下一节讨论一些最好的方法。

    CRNN

    卷积递归神经网络(Convolutional Neural Network, CRNN)是将CNN、RNN和CTC(Connectionist Temporal Classification, Connectionist Temporal Classification)三种方法结合起来,用于基于图像的序列识别任务,例如场景文本识别和OCR。网络架构取自于2015年发表的论文。

    这种神经网络结构将特征提取、序列建模和转录集成到一个统一的框架中。该模型不需要字符分割。卷积神经网络从输入图像(文本检测区域)中提取特征。利用深层双向递归神经网络对标签序列进行预测,预测结果具有一定的相关性。转录层将RNN生成的每一帧转换成标签序列。转录有两种模式,即无词典转录和基于词典的转录。在基于字典的方法中,最高可能的标签序列将被预测。

    机器学习OCR与Tesseract

    Tesseract最初是在1985年至1994年在惠普实验室开发的。2005年,它由惠普公司开源。根据维基百科,

    在2006年,Tesseract被认为是当时最精确的开源OCR引擎之一。

    Tesseract的功能主要限于结构化文本数据。在非结构化的文本中,它的性能会很差,并且有很大的噪声。自2006年以来,谷歌赞助了Tesseract的进一步开发。

    基于深度学习的方法对非结构化数据有更好的处理效果。Tesseract 4通过基于LSTM网络(一种递归神经网络)的OCR引擎增加了基于深度学习的能力,该引擎专注于线条识别,但也支持Tesseract 3的遗留Tesseract OCR引擎,该引擎通过识别字符模式工作。最新稳定版4.1.0于2019年7月7日发布。这个版本在非结构化文本上也更加精确。

    我们将使用一些图像来展示EAST方法的文本检测和Tesseract 4的文本识别。让我们看看下面代码中的文本检测和识别。

    ##Loading the necessary packages  
    import numpy as np 
    import cv2 
    from imutils.object_detection import non_max_suppression 
    import pytesseract 
    from matplotlib import pyplot as plt#Creating argument dictionary for the default arguments needed in the code. 
    args = {"image":"../input/text-detection/example-images/Example-images/ex24.jpg", "east":"../input/text-detection/east_text_detection.pb", "min_confidence":0.5, "width":320, "height":320}
    

    在这里,我首先处理必要的包。OpenCV包使用EAST模型进行文本检测。tesseract包用于识别检测到的文本框中的文本。

    确保tesseract版本>= 4。Tesseract的安装请大家自行百度。

    以下是一些参数的含义:

    image:用于文本检测和识别的输入图像的位置。

    east:具有预先训练的east检测器模型的文件的位置。

    min_confidence:最小置信值预测的几何形状在该位置的置信值的最小概率得分

    width:图像宽度应该是32的倍数,这样EAST模型才能正常工作

    height:图像高度应该是32的倍数,这样EAST模型才能正常工作

    图像处理

    #Give location of the image to be read.
    #"Example-images/ex24.jpg" image is being loaded here. args['image']="../input/text-detection/example-images/Example-images/ex24.jpg"
    image = cv2.imread(args['image'])#Saving a original image and shape
    orig = image.copy()
    (origH, origW) = image.shape[:2]# set the new height and width to default 320 by using args #dictionary.  
    (newW, newH) = (args["width"], args["height"])#Calculate the ratio between original and new image for both height and weight. 
    #This ratio will be used to translate bounding box location on the original image. 
    rW = origW / float(newW)
    rH = origH / float(newH)# resize the original image to new dimensions
    image = cv2.resize(image, (newW, newH))
    (H, W) = image.shape[:2]# construct a blob from the image to forward pass it to EAST model
    blob = cv2.dnn.blobFromImage(image, 1.0, (W, H),
    	(123.68, 116.78, 103.94), swapRB=True, crop=False)
    

    加载预先训练的EAST模型并定义输出层

    # load the pre-trained EAST model for text detection 
    net = cv2.dnn.readNet(args["east"])# We would like to get two outputs from the EAST model. 
    #1. Probabilty scores for the region whether that contains text or not. 
    #2. Geometry of the text -- Coordinates of the bounding box detecting a text
    # The following two layer need to pulled from EAST model for achieving this. 
    layerNames = [
    	"feature_fusion/Conv_7/Sigmoid",
    	"feature_fusion/concat_3"]
    

    EAST模型前向传播

    #Forward pass the blob from the image to get the desired output layers
    net.setInput(blob)
    (scores, geometry) = net.forward(layerNames)
    

    从EAST模型预测中解码边框函数

    ## Returns a bounding box and probability score if it is more than minimum confidence
    def predictions(prob_score, geo):
    	(numR, numC) = prob_score.shape[2:4]
    	boxes = []
    	confidence_val = []	# loop over rows
    	for y in range(0, numR):
    		scoresData = prob_score[0, 0, y]
    		x0 = geo[0, 0, y]
    		x1 = geo[0, 1, y]
    		x2 = geo[0, 2, y]
    		x3 = geo[0, 3, y]
    		anglesData = geo[0, 4, y]		# loop over the number of columns
    		for i in range(0, numC):
    			if scoresData[i] < args["min_confidence"]:
    				continue			(offX, offY) = (i * 4.0, y * 4.0)			# extracting the rotation angle for the prediction and computing the sine and cosine
    			angle = anglesData[i]
    			cos = np.cos(angle)
    			sin = np.sin(angle)			# using the geo volume to get the dimensions of the bounding box
    			h = x0[i] + x2[i]
    			w = x1[i] + x3[i]			# compute start and end for the text pred bbox
    			endX = int(offX + (cos * x1[i]) + (sin * x2[i]))
    			endY = int(offY - (sin * x1[i]) + (cos * x2[i]))
    			startX = int(endX - w)
    			startY = int(endY - h)			boxes.append((startX, startY, endX, endY))
    			confidence_val.append(scoresData[i])	# return bounding boxes and associated confidence_val
    	return (boxes, confidence_val)
    

    我们只解码水平边界框。

    通过非最大抑制得到最终的边界框

    # Find predictions and  apply non-maxima suppression
    (boxes, confidence_val) = predictions(scores, geometry)
    boxes = non_max_suppression(np.array(boxes), probs=confidence_val)
    

    现在我们已经得到了边界框。我们如何从检测到的边界框中提取文本?Tesseract可以实现。

    生成带有边界框坐标和框中可识别文本的列表

    # initialize the list of results
    results = []# loop over the bounding boxes to find the coordinate of bounding boxes
    for (startX, startY, endX, endY) in boxes:
    	# scale the coordinates based on the respective ratios in order to reflect bounding box on the original image
    	startX = int(startX * rW)
    	startY = int(startY * rH)
    	endX = int(endX * rW)
    	endY = int(endY * rH)	#extract the region of interest
    	r = orig[startY:endY, startX:endX]	#configuration setting to convert image to string.  
    	configuration = ("-l eng --oem 1 --psm 8")
        ##This will recognize the text from the image of bounding box
    	text = pytesseract.image_to_string(r, config=configuration)	# append bbox coordinate and associated text to the list of results 
    	results.append(((startX, startY, endX, endY), text))
    

    上面的代码部分已经将边界框坐标和相关文本存储在一个列表中。我们会看到它在图像上的样子。

    在我们的示例中,我们使用了Tesseract的特定配置。tesseract配置有多个选项。

        l: language, chosen English in the above code.
        oem(OCR Engine modes):
        0 Legacy engine only.
        1 Neural nets LSTM engine only.
        2 Legacy + LSTM engines.
        3 Default, based on what is available.
        psm(Page segmentation modes):
        0 Orientation and script detection (OSD) only.
        1 Automatic page segmentation with OSD.
        2 Automatic page segmentation, but no OSD, or OCR. (not implemented)
        3 Fully automatic page segmentation, but no OSD. (Default)
        4 Assume a single column of text of variable sizes.
        5 Assume a single uniform block of vertically aligned text.
        6 Assume a single uniform block of text.
        7 Treat the image as a single text line.
        8 Treat the image as a single word.
        9 Treat the image as a single word in a circle.
        10 Treat the image as a single character.
        11 Sparse text. Find as much text as possible in no particular order.
        12 Sparse text with OSD.
        13 Raw line. Treat the image as a single text line, bypassing hacks that are Tesseract-specific.
    

    我们可以根据我们的图像数据选择特定的Tesseract配置。

    显示带有边框和可识别文本的图像

    #Display the image with bounding box and recognized text
    orig_image = orig.copy()# Moving over the results and display on the image
    for ((start_X, start_Y, end_X, end_Y), text) in results:
    	# display the text detected by Tesseract
    	print("{}\n".format(text))	# Displaying text
    	text = "".join([x if ord(x) < 128 else "" for x in text]).strip()
    	cv2.rectangle(orig_image, (start_X, start_Y), (end_X, end_Y),
    		(0, 0, 255), 2)
    	cv2.putText(orig_image, text, (start_X, start_Y - 30),
    		cv2.FONT_HERSHEY_SIMPLEX, 0.7,(0,0, 255), 2)plt.imshow(orig_image)
    plt.title('Output')
    plt.show()
    

    结果

    上面的代码使用OpenCV EAST模型进行文本检测,使用Tesseract进行文本识别。Tesseract的PSM已相应地设置。需要注意的是,Tesseract的检测需要清晰的图像。

    在我们当前的实现中,由于其实现的复杂性,我们没有考虑旋转边界框。但是在文本旋转的实际场景中,上面的代码不能很好地工作。此外,当图像不是很清晰时,Tesseract将很难正确识别文本。

    通过上述代码生成的部分输出如下:


    该代码可以为以上三个图像提供良好的结果。文字清晰,文字背后的背景在这些图像中也是统一的。

    这个模型在这里表现得很好。但是有些字母识别不正确。可以看到,边框基本上是正确的。但是我们当前的实现不提供旋转边界框。这是由于Tesseract不能完全识别它。

    这个模型在这里表现得相当不错。但是有些文本在边界框中不能正确识别。数字1根本无法检测到。这里有一个不一致的背景,也许生成一个统一的背景会有助于这个案例。同样,24没有被正确识别。在这种情况下,填充边界框可能会有所帮助。

    在上面的例子中,背景中有阴影的样式化字体似乎影响了结果。

    我们不能指望OCR模型是100%准确的。尽管如此,我们已经通过EAST模型和Tesseract取得了良好的结果。添加更多的过滤器来处理图像可能有助于提高模型的性能。
    作者:Rahul Agarwal

    展开全文
  • 下面是我写代码,但我方法是计算每一行字符个数,提取最后一位,但是面对不同类型文件,应用性不强,最好能分成三列拆分(有可能有文件小数位数不同)怎样修改呢,谢谢各位。 int main() { Cluster ...
  • ![图片说明](https://img-ask.csdn.net/upload/201805/29/1527562299_248373.png)怎样数字信号异步采样后得到神经网络输入,直方图特征提取那里具体过程不会,刚开始学神经网络,请指教。
  • 这里我大概介绍一下怎样将一副包含多个字符的图片进行去噪处理进而分割出单个字符,关于opencv中怎样使用ANN详见OpencvANN神经网络使用示例。原始图: 效果图: 下面介绍一下处理步骤,1.载入

    最近尝试利用神经网络做数字字符识别,大概做了一下。整体很简陋,就是先对测试图片做下预处理,然后通过重采样提取特征,最后通过神经网络进行训练和识别。感兴趣的可以点击这里 了解一下,欢迎多多指教。

    这里我大概介绍一下怎样将一副包含多个字符的图片进行去噪处理进而分割出单个字符,关于opencv中怎样使用ANN详见Opencv中ANN神经网络使用示例

    原始图:
    原始图
    效果图:
    RESULT

    下面介绍一下处理步骤,

    1.载入图像并作灰度化

    2.二值化并作反色处理

    3.提取外轮廓

    4.根据轮廓大小去除噪声

    5.再次查找轮廓并根据轮廓找出其boundingRect

    6.将boundingRect分别保存为图像即可。

    好,这样就基本结束了。直接上源码:

    //--------------------------------------【程序说明】-------------------------------------------
    //      程序说明:基于ANN的数字字符识别系统
    //      程序描述:
    //      开发测试所用操作系统: Windows 7 64bit
    //      开发测试所用IDE版本:Visual Studio 2010
    //      开发测试所用OpenCV版本: 2.4.8
    //------------------------------------------------------------------------------------------------
    
    #include <opencv2/opencv.hpp>  //头文件
    using namespace cv;  //包含cv命名空间
    //#include <fstream>
    //using namespace std;  
    
    
    void main( )
    {    
        //载入图像  
        Mat srcImage = imread("scanDigit.bmp");
        imshow("【原始图】",srcImage);//显示载入的图片
        //灰度化
        Mat grayImage;
        cvtColor(srcImage, grayImage, CV_RGB2GRAY);//RGB图像的灰度化
        imshow("【灰度图】",grayImage);
    //  imwrite("grayImage.jpg",grayImage);//保存图片
        //二值化
        Mat biImage;
        threshold(grayImage, biImage, 200, 255, CV_THRESH_BINARY_INV ); //对灰度图进行二值化处理,前景变为白色后findContours()寻找外轮廓才好用
        imshow("【二值化图】",biImage);
    //  imwrite("biImage.jpg",biImage);
    /*
        //查看图片数据
        ofstream outImage("imagedata.txt", ios::out | ios::binary);    
        for( unsigned int nrow = 0; nrow < srcImage.rows; nrow++)  
        {  
            for(unsigned int ncol = 0; ncol < srcImage.cols; ncol++)  
            {  
                uchar val = srcImage.at<unsigned char>(nrow,ncol);    
                outImage << (int(val) > 200 ? 1 :0) ; //File3<<int(val)<< endl ;
            }   
            outImage << endl ;  
        }  
        outImage.close(); 
    */
        //去除噪声
        Mat contourImage(biImage.rows, biImage.cols, CV_8UC1, Scalar(0, 0, 0)); 
        Mat noiseRemoveImage = biImage.clone(); 
        vector<vector<Point> > contours;
        vector<Vec4i> hierarchy;
        findContours( biImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
        for(int i = 0; i< contours.size(); i++ )
        {
            Scalar color( 255, 255, 255 );
            drawContours( contourImage, contours, i, color, 1, 8, hierarchy, 1);//绘制轮廓
    //      printf("轮廓[%d]的面积: %.2f\n", i, contourArea(contours[i]));
            if (contourArea(contours[i]) < 20)          //此处面积20为经验值
            {
                drawContours( noiseRemoveImage, contours, i, Scalar(0, 0, 0), -1, 8, hierarchy, 0);
            }
        }
        imshow( "外轮廓图", contourImage );
        imshow( "去除噪声图", noiseRemoveImage );
    /*
        //先做反色处理
        Mat dstImage;
        bitwise_not(srcImage, dstImage);
        imshow( "反色图", dstImage );
    */
    /*
        //整体倾斜度调整
        Mat rotMat(2, 3, CV_32FC1);
        Mat rotateImage(noiseRemoveImage.rows, noiseRemoveImage.cols, noiseRemoveImage.type(), Scalar(0, 0, 0));    
        Point center = Point(noiseRemoveImage.cols/2, noiseRemoveImage.rows/2);
        double angle = 2.1;//此处指定旋转角度
        //  double angle = slopeImage(noiseImage);
        double scale = 1;
        rotMat = getRotationMatrix2D(center, angle, scale);
        warpAffine(noiseRemoveImage, rotateImage, rotMat, rotateImage.size(),INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
        imshow( "旋转图", rotateImage );
    */
    /*
        //对图像进行膨胀操作
        Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));//定义核
        Mat dilateImage = srcImage.clone();
        morphologyEx(srcImage, dilateImage, MORPH_DILATE, element);
        imshow( "膨胀图", dilateImage);
    */
        //字符分割并作尺寸归一化处理
        Mat SegmentationImage = noiseRemoveImage.clone();
        vector<vector<Point> > segcontours;
        vector<Vec4i> seghierarchy;
        findContours( noiseRemoveImage, segcontours, seghierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
        Mat characterImage;
        Mat dstImage;
        char name[50];
        for (int i = 0; i < segcontours.size(); i++)
        {
            Rect rect = boundingRect(Mat(segcontours[i]));
    //      rectangle(SegmentationImage, rect.tl(), rect.br(), Scalar(255, 0, 0));  //将每个方框显示
            //将每个字符的尺寸归一化并保存为图片
            Mat roi = SegmentationImage(rect);
            resize(roi,characterImage,Size(32, 64 ),(0,0),(0,0),INTER_NEAREST);
            //再反色处理
            bitwise_not(characterImage, dstImage);
            sprintf(name, "TestData\\%d.jpg", i);
            imwrite(name,dstImage); 
        }
        imshow( "分割图", SegmentationImage);
        //等待任意按键按下
        waitKey(0);
    }  
    
    

    如果想了解整个project,欢迎访问https://github.com/NodYoung/ANNDigitRec

    展开全文
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示...
  • 实例111 在图片中写入文字 163 实例112 局部图片复制 165 实例113 波形图绘制 166 4.2 图形转换 168 实例114 BMP转换成JPG格式 168 实例115 JPG转换成BMP格式 170 实例116 位图转化为WMF 171 实例...
  • 对于计算机来说,怎么用数字进行特征提取是非常重要,即使图像进行了一定改变,但也会保留原始图特征 比如把这三个特征提取出来,叫做卷积核,或者特征提取器,用于在输入图寻找相应特征 下面介绍一下,...

    卷积神经网络其实是一个函数,也可以说它是一个黑箱,输入是一个二维的像素阵列,也就是图片,输出就是这个图片是什么
    在这里插入图片描述
    就是将这些经过平移,旋转,局部加粗等的图像辨别出来,抗干扰性很强
    在这里插入图片描述
    对于计算机来说,怎么用数字进行特征提取是非常重要的,即使图像进行了一定的改变,但也会保留原始图的特征
    在这里插入图片描述
    比如把这三个特征提取出来,叫做卷积核,或者特征提取器,用于在输入图中寻找相应的特征
    在这里插入图片描述
    下面介绍一下,卷积核是怎样判断特征的,让卷积核与图片对应相乘,得出结果为九个一的矩阵,将这些得出来的数做平均值
    在这里插入图片描述
    在这里插入图片描述
    这就表示绿框中的的值和卷积核的特征完全一致
    在这里插入图片描述
    那么如果卷积核与图像的其他部分做卷积运算呢
    当该卷积核与中间部分进行卷积时,情况如下:
    在这里插入图片描述
    它加起来平均值为0.55,表示他俩不一样,但仍保留了0.55的特征,把所有的数据算出来是这样的,颜色越浅表示相似度越高
    在这里插入图片描述
    用不同的卷积核可以把不同的特征提取出来
    在这里插入图片描述
    因为实际的识别涉及到的特征和图片很大,所以要将得到的矩阵缩小,把一部分的矩阵得出的数用一个数字表示,这也叫做池化
    在这里插入图片描述
    也就是在可接受范围内牺牲一部分值,池化有两种方式,一是取最大值,二是取平均值,应用都非常广
    在这里插入图片描述
    以取最大值为例,将上面的矩阵缩小,得到的特征仍会保留,如果计算需要,在外圈补零
    在这里插入图片描述
    接下来使用激活函数将上面矩阵的负数全部抹成零,经过卷积,抹零(激活函数是relu),池化,得到:
    在这里插入图片描述
    以上过程可以进行多次

    全连接层
    将得到的矩阵排成一列
    在这里插入图片描述
    每一个像素点都有权重,把判断x的权重加起来,就可以得到一个概率,这是要通过训练得到的

    在这里插入图片描述
    x的概率是0.92,o的概率是0.51,所以认为图的特征是x
    全连接网络可以放好多层
    在这里插入图片描述

    用大量图片去训练模型,通过反向传播的方法,将它与真实的结果进行比较,然后将神经网络的结果与真实结果的误差进行计算,这叫损失函数,我们的目标就是将损失函数降到最低(求导获得最低值),通过将卷积核和权重进行微调使得误差函数最小,他会将误差一层层反馈回去,所以叫反向传播。
    经过大量训练,他就自动学会了选择卷积核和选择权重,这就是机器学习。

    展开全文
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 0016 使用快捷键打开对象观察器中的“...”按钮 11 1.5 其他相关应用技巧 11 0017 安装合适的Delphi版本 11 0018 熟练掌握Delphi中的菜单项 12 0019 构成Delphi项目的主要文件 12 0020 如何在程序中调用...
  • 比如上面的 URL 协议中的分割字符,等特殊含义的字符。 而不安全的字符,非 ASCII 的 Unicode(中文等) 字符,就会通过转义去处理,使用 % 。先不展开,感觉字符、编码...
  • 实例267 从Access数据库提取图片 345 实例268 向SQL Server数据库录入多媒体文件 346 实例269 从SQL Server数据库提取多媒体文件 347 实例270 向SQL Server存储Word文档 348 实例271 从SQL Server...
  • Delphi程序开发范例宝典(第3版)》.part1 《delphi程序开发范例宝典(第3版)》全面...实例265 从access数据库提取图片 345 实例266 向sql server数据库录入多媒体文件 346 实例267 从sql server数据库提取多媒体...
  • 实例实例105 在图片中写入文字 133 实例106 局部图片复制 135 实例107 波形图绘制 137 3.2 图形转换 138 实例108 bmp转换成jpg格式 138 实例109 jpg转换成bmp格式 140 实例110 位图转化为wmf...
  • VB技巧10页

    2008-03-16 18:44:38
    利用键盘精确移动控件和设置控件尺寸 按字母或数字顺序排列列表框中的列表项. Tag属性的妙用. 利用VB产生屏幕变暗的效果. 使两个列表框(ListBox)的选项同步 获得WinX下文件的短文件名 使指定窗口...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 实例161 ...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 商务智能架构图表

    2011-10-21 19:47:31
    数据可视化在发展过程,科学和工程领域的应用衍生出了分支:科学可视化——“利用计算机图形学来创建视觉图像,帮助人们理解科学技术概念或结果的那些错综复杂而又往往规模庞大的数字表现形式”。 在计算机诞生...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...
  • 实例155 如何在图片中移动文字 220 4.7 图像动画 221 实例156 动画背景窗体 221 实例157 随鼠标移动图像 223 实例158 十字光标定位 224 实例159 抓取鼠标指针形状 225 实例160 图像上下对接显示 226 ...

空空如也

空空如也

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

怎样提取图片中的数字