在上一節中,我們使用了google的開源ocr庫來對字元進行識別,這一節以及下一節我們將要使用機器學習演算法來識別驗證碼。本節的**都在可以找到。
在每次重新整理的時候,會有以上這兩種驗證碼出現。在本節中,為了方便學習k近鄰演算法(簡稱為:knn),選擇第二種來進行破解,因為第二種的字母分割十分容易,每個字母的位置都是固定的。
# coding:utf-8
import requests
import uuid
from pil import image
import os
url = ""
for i in range(100):
resp = requests.get(url)
filename = "./captchas/" + str(uuid.uuid4()) + ".png"
with open(filename, 'wb') as f:
for chunk in resp.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.flush()
f.close()
im = image.open(filename)
if im.size != (48, 20):
os.remove(filename)
else:
print filename
之後,需要人工對字母進行分類,分類好的見recognizer/dataset,我這裡每個字母需要6個樣本,10個字母,總共60個樣本。
也就是說,需要找到要識別的字母在訓練樣本中k個最近的字母,然後找出這k個字母中最多的是某個類的?要識別的也就是該類的。
首先,先定義一下距離如何計算,這裡可以用各種數學上的距離,歐式距離、馬氏距離等等。。
由於我們的已經進行了二值化,為了簡便起見,這裡把兩張的距離定義為:兩張灰度不同的畫素點個數。也就是逐個比較的相對位置上的灰度值,如果不相同,距離就加一。
int
count_distance
(mat mat1, mat mat2)}}
return distance;
}
資料的載入需要乙個陣列和乙個標籤陣列,來記錄陣列相應位置的類別。
載入樣本資料:
void
load_dataset
(mat dataset)
}
載入樣本資料標籤:
void
create_labels
(int labels)
}
載入完資料後,就可以開始實現knn分類了。
1、計算輸入和所有其他的距離
int distances[6*10];
int sorted_distances[6*10];
//count distances
for(int i = 0; i < 6*10 ;i++)
2、對距離進行排序
sort(sorted_distances, sorted_distances+6*10);
3、獲取k個距離最近的的類別
int* k_nearest = new
int[k];
for(int i = 0; i < k; i++)}}
4、利用map記錄所有類別中出現k_nearest的次數
map
labels_map;
for(int i = 0; i < k; i++)
5、得到出現最多的類別
int max_label = -1;
labels_map[max_label] = -1;
map::iterator it;
for(it=labels_map.begin();it!=labels_map.end();++it)
}delete k_nearest;
return max_label;
最後,我們把驗證碼的4個字母分割出來,再進行k近鄰分類,就可以得到識別結果了。
void
recognize
(string path, mat dataset, int labels)
; cout
<
for(int i = 0; i < 4; i++)
cout
<
}
識別:
識別結果:
驗證碼破解技術四部曲之使用K近鄰演算法(三)
在上一節中,我們使用了google的開源ocr庫來對字元進行識別,這一節以及下一節我們將要使用機器學習演算法來識別驗證碼。本節的 都在可以找到。在每次重新整理的時候,會有以上這兩種驗證碼出現。在本節中,為了方便學習k近鄰演算法 簡稱為 knn 選擇第二種來進行破解,因為第二種的字母分割十分容易,每個...
MySQL學習四部曲
網際網路時代,關聯式資料庫中mysql的使用最為廣泛,從而造就了大量的mysql從業人員。曾經使用oracle的網際網路巨頭阿里系也進行了去ioe化,也影響了更多的人想去學習mysql,從事mysql方面的工作。我是從四年前開始接觸mysql的,從之前的工程師工作,到現在的架構工作,再到偶爾的dba...
MySQL學習四部曲
互聯 網時代,關聯式資料庫中mysql的使用最為廣泛,從而造就了大量的mysql從業人員。曾經使用oracle的網際網路巨頭阿里系也進行了去ioe化,也影 響了更多的人想去學習mysql,從事mysql方面的工作。我是從四年前開始接觸mysql的,從之前的工程師工作,到現在的架構工作,再到偶爾的 d...