python验证码识别实战2

发布在 Python

上一篇文章中,我们使用sklearn对验证码进行了识别,为了提高识别率,今天来进行进一步优化。

观察验证码后,发现还可以对其进行旋转处理,这个验证码旋转角度在-30~30之间,那么如何判断旋转角度呢?这里我使用最简单粗暴的判断方式——如果旋转后的字符宽度小于旋转之前,则认为是合理的旋转。但这里还有一个问题需要处理,上一篇文章中我们为了简便直接根据固定的宽度对字符进行了分割,但是分割后字符在小图片中的位置不是固定的,需要手动将其放在中心位置。

阅读全文

python验证码识别实战

发布在 Python

陆陆续续的学习了验证码的灰度、二值化、分割等方法,还了解了机器学习中最基本的3个分类方式——KNN、决策树、朴素贝叶斯。基于这些,今天结合这些工具来写一个简单的验证码识别程序,本来想使用现有的库来生成验证码,但无意间发现了之前写某个程序时下载的200个验证码,正好可以拿来练手。另外,虽然之前已经实现了上面3种算法,但这里还是会使用sklearn这个强大的三方库,学习原理是为了知其所以然,有现成工具还是要拿来用的。

阅读全文

朴素贝叶斯

发布在 Python

朴素贝叶斯是贝叶斯决策理论的一部分,贝叶斯概率引入先验知识和逻辑推理来处理不确定命题。又可以称为“条件概率”(Conditional probability),与之相对的则是“频数概率”(frequency probability)。

强烈推荐看阮一峰大牛的这篇文章,看完基本贝叶斯就明白了。

我们把\(P(A|B)\)称为在B条件下A的概率,若只有A、B两个事件那么\(P(A|B)= {P(AB) \over P(B)} \) 。

全概率 公式:
$$P(B)=P(B|A)P(A) + P(B|\overline A)P(\overline A) $$

贝叶斯 公式:

$$P(A|B)={P(B|A) × P(A) \over P(B)}$$

对公式进行变形:

$$P(A|B)={P(A){P(B|A) \over P(B)}}$$

这里称P(A)为先验概率(Prior probability),即在B事件发生之前,我们对A事件概率的一个判断。P(A|B)称为后验概率(Posterior probability),即在B事件发生之后,我们对A事件概率的重新评估。P(B|A) / P(B) 称为可能性函数(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

这里以贝叶斯界的”Hello World”为例,判断某种疾病患病概率问题:

已知某种疾病的发病率是0.001,即1000人中会有1个人得病。现有一种试剂可以检验患者是否得病,它的准确率是0.99,即在患者确实得病的情况下,它有99%的可能呈现阳性。它的误报率是5%,即在患者没有得病的情况下,它有5%的可能呈现阳性。现有一个病人的检验结果为阳性,请问他确实得病的可能性有多大?

我们假定阳性概率为P(B),发病的概率为P(A)=0.001,则没得病的概率\(P(\overline A)\)=0.999,确实得病且阳性概率为P(B|A)=0.99,没患病但阳性\(P(B|\overline A)\)=0.05,那么我们要求的问题就是P(A|B)了。

结合上面提到的全概率公式和贝叶斯公式,可以计算出他确实得病的概率仅为0.019,即“假阳性”。

如果把问题改成检验结果为阴性,问其患病的可能性。

我们假定阴性概率为P(B),发病的概率为P(A)=0.001,没得病的概率\(P(\overline A)\)=0.999,确实得病但阴性概率为P(B|A)=0.01,没患病且阴性\(P(B|\overline A)\)=0.95,那么检查为阴性但患病的概率就是:

$$P(A|B)={0.001×0.01 \over {0.01×0.001 + 0.95×0.999}} \approx 0.000011 $$

即便阴性也是有患病几率的,但概率十分低。

还有一个重要的公式叫做 联合概率 ,作用就是在已知多个事件发生的情况下,另一个事件发生的概率:

$$P ={ {P_1P_2…P_n } \over { {P_1P_2…P_n}+{(1-P_1)(1-P_2)…(1-P_n)} } } $$

阅读全文

原文地址,向原作者表示感谢。

我们在Mapado的工作就是收集世界上所有“要做的事”。

为了得到大量数据,我们抓取整个网络,就像Goole做的那样,搜集所有关于演唱会、演出、访问、景点……当我们发现一个有趣的页面,我们就尝试从这个页面提取“好”的数据。

我们面临的一个主要挑战就是如何从垃圾信息中(广告、导航栏、页脚、相关内容……)分离我们感兴趣的内容(标题、简介、图片、日期……)

在这个挑战中,一个任务就是重组在视觉上相近的内容。通常,组成页面主要部分的元素相互之间距离是很近的。

当我们开始进行任务时,很天真的以为可以操作DOM来实现。在DOM中,元素以层级结构存储,所以在同一个父元素中的元素很大可能是相关的。

一个非常有趣的介绍页面分割的论文可以在这里找到 Page Segmentation by Web Content Clustering

阅读全文

10分钟入门Pandas

发布在 菜鸟翻译屋

原文地址,是官网的《10 Minutes to pandas》翻译,代码中添加了个人的一些注释。

通常来说,我们像下面这样来引入包:

1
2
3
4
5
In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: import matplotlib.pyplot as plt

阅读全文

决策树

发布在 Python

决策树是机器学习中一种简单明了的分类算法,用程序语言描述就是if...elif...else...,关键问题则是如何选择合适的特征对数据集进行切割,常见算法有: ID3、C4.5、CART等。

今天主要记录一下ID3这个算法,想使用这个算法首先要了解信息增益,想了解信息增益则要先明白什么是”熵”。熵描述了一个系统的混乱复杂程度,有一个理论叫做”熵增加”,含义就是一个没有外力干涉的系统混乱程度总是增加的,比如一个房间如果没人打扫的话只会越来越混乱,而不会自己变得整洁。

计算熵的公式如下:

$$H=-\sum_{i=i}^{n}P(x_i)log_2P(x_i)$$

其中\(P(x_i)\) 表示P发生的概率。

阅读全文

python验证码识别6:kNN

发布在 Python

什么是kNN?kNN(k-Nearest Neighbors)是机器学习中处理分类问题的一种简单明了的算法。核心精髓就是老祖宗几百年前留下的言语”物以类聚,人以群居”。忘记从哪里看到的一个说法:”你身边最好的6个朋友的平均薪资,就是你的薪资水平。”这就是kNN算法的一个应用了吧,另外我觉得之前几篇给验证码降噪用的连通域算法,分割用的滴水算法,都有kNN的味道在里面。

阅读全文

numpy学习笔记2

发布在 Python

之前一直有个疑惑,为什么要使用numpy?更本质的说,为什么要使用矩阵?矩阵是什么?意味着什么?关于关于矩阵的问题,这里推荐一个系列视频,讲的非常非常好。至于为什么用numpy,从程序的角度来讲,我认为最大的好处就是减少代码量以及提高效率(恩,写此文的时候觉得这是一句废话,但确实困扰了我一阵……)

比如,在学习KNN算法时需要计算欧式距离,公式如下:

$$d=\sqrt{ {({A_0}-{B_0})^2}+{({A_1}-{B_1})^2}+{({A_2}-{B_2})^2}+{({A_3}-{B_3})^2}+… }$$

这里用2维为例,公式变成:

$$d=\sqrt{ {({A_0}-{B_0})^2}+{({A_1}-{B_1})^2} }$$

这货貌似是已知直角三角形直角边求斜边长啊?

阅读全文

关于之前说的滴水算法,一直以为看不懂是因为智商不够,直到上周腾出时间看了原版论文才恍然大悟……之前看的都是“残篇”,怪不得很多地方看的都稀里糊涂的!

所以有英语能力的还是要看一手资料才行啊!否则看二手甚至多手的东西有时候会让人怀疑智商。

这里原版的论文链接 提供给各位,60280.pdf是最最原版的滴水算法,dropfall.pdf是经过改造的《基于惯性的滴水算法》和《基于惯性的大滴水算法》。另外改造版的算法是国人发表的,看的时候一种自豪感油然而生,虽然我也不知道自豪个什么劲……

基于惯性的滴水算法为了解决传统滴水算法遇到有“毛边”的情况,在传统水滴算法基础上多考虑了之前一步的方向。比如周围5个点都是黑或者白时,传统算法是应该向下滴落,但如果之前一步的方向是向右,那么综合考虑后滴落方向就变成了右下。另外,在基于惯性的滴水算法中,“左”是受到“歧视”的。

再进一步,对于类似字母Y这种凹陷情况,把判断范围扩大而不是仅仅考虑某一个像素点,就变成了基于惯性的大滴水算法了。

另外,关于起始点的选择,原版论文中是从上到下、从左到右依次遍历所有像素,找到第一个 左侧为黑色像素、右侧有黑的像素的白色像素点 开始滴落(确实挺拗口,看论文中的图就明白了)。

至于代码,先挖坑病好以后有空再和大家一起讨论分享。

评论和分享

之前提过对于有粘连的字符可以使用滴水算法来解决分割,但智商捉急的我实在是领悟不了这个算法的精髓,幸好有小伙伴已经实现相关代码

我对上面的代码进行了一些小修改,同时升级为python3的代码。

还是以这张图片为例:


7.png

在以前的我们已经知道这种简单的粘连可以通过控制阈值来实现分割,这里我们使用滴水算法。

首先使用之前文章中介绍的垂直投影或者连通域先进行一次切割处理,得到结果如下:


11.png
阅读全文
作者的图片

Roy

微信公众号:hi-roy


野生程序猿


China