驗證碼破解技術四部曲之使用K近鄰演算法(三)

2021-09-18 02:18:56 字數 2188 閱讀 2618

在上一節中,我們使用了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的次數

maplabels_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...