1. 樣本採集
首先當然是採集圖片了,對接通用模型上懟樣本就是了。
for i in range(100000):
sess.headers = {
"User-Agent": ua.random
}
sess.proxies = get_proxy()
# print(get_proxy())
before_url = "https://www.battlenet.com.cn/login/zh/"
before_resp = sess.get(before_url)
before_html = Selector(before_resp.text)
csrf_token = before_html.xpath('//input[@name="csrftoken"]/@value').extract_first()
session_timeout = before_html.xpath('//input[@name="sessionTimeout"]/@value').extract_first()
captcha_url = "https://www.battlenet.com.cn/login/captcha.jpg"
captcha_resp = sess.get(captcha_url)
captcha_bytes = captcha_resp.content
print(captcha_bytes)
captcha_text = requests.post("http://127.0.0.1:19952/captcha/v3", data=captcha_bytes).json()['message']
payload = {
"accountName": "00000",
"password": ".",
"srpEnabled": "true",
"upgradeVerifier": "",
"useSrp": "true",
"publicA": public_a,
"clientEvidenceM1": client_evidence_m1,
"persistLogin": "on",
"captchaInput": captcha_text,
"csrftoken": csrf_token,
"sessionTimeout": session_timeout
}
resp_submit = sess.post(before_url, data=payload)
if "找不到該暴雪遊戲通行證" in resp_submit.text:
tag = hashlib.md5(captcha_bytes).hexdigest()
name = "{}_{}.png".format(captcha_text, tag)
print('正確')
true_count += 1
with open(os.path.join(target_dir, name), "wb") as f:
f.write(captcha_bytes)
else:
print('錯誤')
false_count += 1
# print(before_resp.text)
print(true_count+false_count, captcha_text, true_count / (true_count+false_count))
採集代碼有所省略,如下圖所示,採集到正確標註的樣本。
2. 訓練
打開訓練工具
(地址:https://github.com/kerlomz/captcha_trainer)
具體教程可參考:https://www.jianshu.com/p/80ef04b16efc
- 首先輸入項目名,按下回車將自動生成如圖後綴
- 在樣本區域內導入第一步收集到的樣本
- 網絡部分會根據導入的樣本自動配置,打包樣本即可,如下圖:
- 打包完成點擊 【開始訓練】即可,如下圖:
- 如圖所示,已經開始訓練
驗證碼使用
部署項目:https://github.com/kerlomz/captcha_platform
編譯版(一鍵部署):https://github.com/kerlomz/captcha_platform/releases
啓動成功如圖:
調用如圖:
如圖可見,單次識別速度在10ms以內,平均8ms,屬業內領先水準。
對接官網測試結果:
測了13次全對,識別率想必差不了。
模型下載
https://github.com/kerlomz/captcha_platform/releases
後記
順便宣傳一波麻瓜OCR識別
https://pypi.org/project/muggle-ocr/1.0/
這是一個OCR和驗證碼皆可識別的本地識別模塊,使用簡單,pip安裝,三行代碼即可調用。
import time
# 第一步:導入包
import muggle_ocr
# 第二步:初始化;model_type 包含了 ModelType.OCR/ModelType.Captcha 兩種
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
# ModelType.Captcha 可識別光學印刷文本
with open(r"test1.png", "rb") as f:
b = f.read()
for i in range(5):
st = time.time()
# 第三步: 調用(識別普通OCR)
text = sdk.predict(image_bytes=b)
print(text, time.time() - st)
# ModelType.Captcha 可識別4-6位驗證碼
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
with open(r"test2.jpg", "rb") as f:
b = f.read()
for i in range(5):
st = time.time()
# 第三步: 調用(識別驗證碼)
text = sdk.predict(image_bytes=b)
print(text, time.time() - st)
喜歡的各位可以加QQ羣:857149419