百度文庫旋轉驗證碼識別

???最近研究了一下圖像識別,一直找到很好的應用場景,今天我就發現可以用百度的旋轉驗證碼來做一個實驗。沒想到效果還挺好,下面就是實際的識別效果。

1、效果演示

2、如何識別

2.1準備數據集

首先需要使用爬蟲,對驗證碼圖片進行采集,盡量每一種類型都要采集到。

2.2圖像矯正

接下來對采集的數據進行人工校正

2.3數據清洗

(1)對數據進行進行旋轉,達到增加數據量的目的。

(2)對數據進行灰度化處理,將三維圖片降為二維。

(3)對圖片大小進行resize,可以提高訓練速度。

# 圖片轉換部分,得到x
picture = Picture(path=img_path)
# 圖像灰度化處理
temp_img = picture.gray()
# 圖像resize
temp_img = temp_img.resize((50, 50), Image.LANCZOS)
# 獲取y
word = img_path.split('\\')[-1].split('-')[0]# 結果包裝成列表,保證x,y是一個整體,不被打亂
res = [np.array(temp_img),np.array(word)]
# 將結構給全局變量
result_list.append(res)
# 記錄完成數量
complete_list.append(img_path)
2.4劃分訓練集與測試集

一般訓練集占數據量的80%,測試集占總數據量的20%,當然也可以根據自己的情況調整比例。

2.5訓練模型

這里可以使用CNN神經網絡模型進行訓練,效果非常不錯。

2.6實戰測試

下面直接上代碼。其中的滑動系數可能需要自行調整,這個變動不會太頻繁,可能幾個月某度變一次。

__author__ = "dengxinyan"import os
import sys
import time
import base64
import random
import requests
from PIL import Image
from io import BytesIO
sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains#PIL圖片保存為base64編碼
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)return base64_str# 根據鏈接下載旋轉圖片
def get_img(url):header = {"Host": "passport.baidu.com","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0","Accept": "image/webp,*/*","Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding": "gzip, deflate, br","Connection": "keep-alive","Referer": "https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fcl%3D3%26tn%3Dbaidutop10%26fr%3Dtop1000%26wd%3D%25E6%25B6%2588%25E9%2598%25B2%25E6%2588%2598%25E5%25A3%25AB%25E8%25BF%259E%25E5%25A4%259C%25E7%25AD%2591%25E5%259D%259D%25E5%25BA%2594%25E5%25AF%25B9%25E6%25B4%25AA%25E5%25B3%25B0%25E8%25BF%2587%25E5%25A2%2583%26rsv_idx%3D2%26rsv_dl%3Dfyb_n_homepage%26hisfilter%3D1&logid=8309940529500911554&signature=4bce59041938b160b7c24423bde0b518&timestamp=1624535702","Cookie": "BAIDUID=A0621DC238F4D936B38F699B70A7E41F:SL=0:NR=10:FG=1; BIDUPSID=A0621DC238F4D9360CD42C9C31352635; PSTM=1667351865; HOSUPPORT=1; UBI=fi_PncwhpxZ%7ETaKAanh2ue0vFk6vHMY02DgvigILJIFul8Z1nzMr9do3SYLtjAUqHSpUz7LvOKV27cIr18-YJryP0Q8j92oo93%7E6hGa0CLdraAlaHUZG-0PW9QrpZkW7MTyUn-yrAq7OmSRBIJ7%7E8gM9pv-; USERNAMETYPE=2; SAVEUSERID=3cd458184c56c2fe28174e594101f074d63463446d; HISTORY=0ece87e30ec8ecccd52ff3d5c42f98002a893bfb73ff358893; BDUSS_BFESS=NOcWd6YWJRbmFVUVBBaWVkaHJNSm5tRUpUaUVMaTNHOHcwZVVaVDdsYXlLZmxrSVFBQUFBJCQAAAAAAAAAAAEAAAC13Mct0KHQwl9keHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKc0WSynNFkRD; H_WISE_SIDS=219946_216846_213346_219942_213039_230178_204909_230288_110085_236307_243888_244730_245412_243706_232281_249910_247148_250889_249892_252577_234296_253427_253705_240590_254471_179345_254689_254884_254864_253213_255713_254765_255939_255959_255982_107317_256062_256093_256083_255803_253993_256257_255661_256025_256223_256439_256446_254831_253151_256252_256196_256726_256739_251973_256230_256611_256996_257068_257079_257047_254075_257110_257208_251196_254144_257290_251068_256095_257287_254317_251059_251133_254299_257454_257302_255317_255907_255324_257481_244258_257582_257542_257503_255177_257745_257786_257937_257167_257904_197096_257586_257402_255231_257790_258193_258248_258165_8000084_8000115_8000114_8000126_8000140_8000149_8000166_8000172_8000178_8000181_8000185_8000204; ZFY=SxMcCdU3pSsmienZSgA2BTmHLR9S6caVmiP5Ic:Awuz0:C; BAIDUID_BFESS=A0621DC238F4D936B38F699B70A7E41F:SL=0:NR=10:FG=1; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1690961642,1692328306; STOKEN=01dbff3d6ff696219b39c9fb730c31c34e032c0eebff4fe535d2f1dde0c7b45b; BDUSS=NOcWd6YWJRbmFVUVBBaWVkaHJNSm5tRUpUaUVMaTNHOHcwZVVaVDdsYXlLZmxrSVFBQUFBJCQAAAAAAAAAAAEAAAC13Mct0KHQwl9keHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALKc0WSynNFkRD; PTOKEN=92e828db8120372a7baa2557ea4ec476; MAWEBCUID=web_VYfxPuQDaKjEzVgXMFgoHouACkpXyjcDpcWwhATKqELuuwEtNy; __bid_n=18a4ab547aa11525d249ea",}response = requests.get(url=url,headers=header)if response.status_code == 200:img = Image.open(BytesIO(response.content))# 將圖片轉換成base64字符串并返回return PIL_base64(img)# 驗證碼識別接口
def shibie(img_base64):url = "http://www.detayun.cn/openapi/verify_code_identify/"data = {# 用戶的key"key":"JxSfP4E1yfcmJZB6ynOB",# 驗證碼類型"verify_idf_id":"16",# 樣例圖片"img_base64":img_base64,"img_byte": None,# 中文點選,空間語義類型驗證碼的文本描述(這里缺省為空字符串)"words":""}header = {"Content-Type": "application/json"}# 發送請求調用接口response = requests.post(url=url, json=data, headers=header)print(response.text)return int(str(response.json()['data']['res_str']).replace('順時針旋轉','').replace('度',''))if __name__ == '__main__':# 加載防檢測jswith open('.\webdriver\stealth.min.js') as f:js = f.read()options = webdriver.ChromeOptions()driver = webdriver.Chrome(executable_path='.\webdriver\chromedriver.exe', options=options)driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js})# 訪問百度首頁driver.get('https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fcl%3D3%26tn%3Dbaidutop10%26fr%3Dtop1000%26wd%3D%25E6%25B6%2588%25E9%2598%25B2%25E6%2588%2598%25E5%25A3%25AB%25E8%25BF%259E%25E5%25A4%259C%25E7%25AD%2591%25E5%259D%259D%25E5%25BA%2594%25E5%25AF%25B9%25E6%25B4%25AA%25E5%25B3%25B0%25E8%25BF%2587%25E5%25A2%2583%26rsv_idx%3D2%26rsv_dl%3Dfyb_n_homepage%26hisfilter%3D1&logid=8309940529500911554&signature=4bce59041938b160b7c24423bde0b518&timestamp=1624535702')# 等待滑塊出現WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//div[contains(@class,"passMod_slide-btn")]'))yzm_button = driver.find_element_by_xpath('//div[contains(@class,"passMod_slide-btn")]')time.sleep(1)move_x = 100# 等待驗證碼出現WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//img[contains(@class,"passMod_spin-background")]'))img_src = driver.find_element_by_xpath('//img[contains(@class,"passMod_spin-background")]').get_attribute('src')# 下載圖片并轉化為base64img_base64 = get_img(img_src)# 識別圖片旋轉角度move_x = shibie(img_base64)# 通過旋轉角度 * 滑動系數 = 滑動距離move_x = move_x * 0.661# 開始滑動action = ActionChains(driver)action.click_and_hold(yzm_button).perform()  # 鼠標左鍵按下不放action.move_by_offset(move_x, 0).perform()action.release().perform()  # 釋放鼠標time.sleep(2)# 第二次滑動# 等待滑塊出現WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//div[contains(@class,"passMod_slide-btn")]'))yzm_button = driver.find_element_by_xpath('//div[contains(@class,"passMod_slide-btn")]')time.sleep(1)move_x = 100# 等待驗證碼出現WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//img[contains(@class,"passMod_spin-background")]'))img_src = driver.find_element_by_xpath('//img[contains(@class,"passMod_spin-background")]').get_attribute('src')# 下載圖片并轉化為base64img_base64 = get_img(img_src)# 識別圖片旋轉角度move_x = shibie(img_base64)# 通過旋轉角度 * 滑動系數 = 滑動距離move_x = move_x * 0.661# 開始滑動action = ActionChains(driver)action.click_and_hold(yzm_button).perform()  # 鼠標左鍵按下不放action.move_by_offset(move_x, 0).perform()action.release().perform()  # 釋放鼠標

3、總結

這個旋轉驗證碼非常有特色,而且有很大的難度。特別是在標記訓練圖片的時候,非常耗費時間。

現在我也把識別模型封裝成了接口,感興趣的小伙伴可以免費使用:得塔云

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718225.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718225.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718225.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

區塊鏈媒體發布推廣10個熱門案例解析-華媒舍

區塊鏈技術的發展已經引起了媒體的廣泛關注,越來越多的區塊鏈媒體紛紛發布推廣相關的熱門案例。本文將介紹10個成功的區塊鏈媒體推廣案例,并分享它們的成功秘訣,幫助讀者更好地了解區塊鏈媒體推廣的方法與技巧。 隨著區塊鏈技術的成熟和應用場…

第二證券:富時羅素擴容 A股引入國際增量資金

日前,英國富時羅素指數公司(FTSE Russell,簡稱“富時羅素”)公布的全球股票指數(FTSE Global Equity Index Series)半年度指數檢查陳述顯現,將新調入A股76只、調出1只。此前,富時羅素…

Leetcode 3049. Earliest Second to Mark Indices II

Leetcode 3049. Earliest Second to Mark Indices II 1. 解題思路2. 代碼實現3. 算法優化 題目鏈接:3049. Earliest Second to Mark Indices II 1. 解題思路 這道題我看貌似難度報表,比賽的時候貌似只有36個人搞定了這道題目,然后最快的人…

【LeetCode】升級打怪之路 Day 12:單調隊列

今日題目: 239. 滑動窗口最大值 | LeetCode 今天學習了單調隊列這種特殊的數據結構,思路很新穎,值得學習。 Problem:單調隊列 【必會】 與單調棧類似,單調隊列也是一種特殊的數據結構,它相比與普通的 que…

Get Your Back Covered! Coverage, CodeCov和Tox

1. Coverage - 衡量測試的覆蓋率 我們已經掌握了如何進行單元測試。接下來,一個很自然的問題浮現出來,我們如何知道單元測試的質量呢?這就提出了測試覆蓋率的概念。覆蓋率測量通常用于衡量測試的有效性。它可以顯示您的代碼的哪些部分已被測試過,哪些沒有。 coverage.py …

Arm平臺下各種memcpy優化對比<二>

因memcpy導致tda4vm上的h264解碼占CPU較高而改棄&#xff0c;從網上找到各種memcpy的優化代碼&#xff0c;在一起做了個運行速度對比&#xff0c;請查收&#xff1b; #include <stdio.h> #include <stdlib.h> /* rand, srand */ #include <string.h> #i…

智慧公廁:打造智慧城市的環衛明珠

在城市建設中&#xff0c;公共衛生設施的完善和智能化一直是重要環節。而智慧公廁作為智慧城市建設的重要組成部分&#xff0c;發揮著不可替代的作用。本文以智慧公廁源頭實力廠家廣州中期科技有限公司&#xff0c;大量精品案例現場實景實圖&#xff0c;解讀智慧公廁如何助力打…

【數據結構】B樹

1 B樹介紹 B樹&#xff08;英語&#xff1a;B-tree&#xff09;&#xff0c;是一種在計算機科學自平衡的樹&#xff0c;能夠保持數據有序。這種數據結構能夠讓查找數據、順序訪問、插入數據及刪除的動作&#xff0c;都在對數時間內完成。B樹&#xff0c;概括來說是一個一般化的…

MySQL高可用性攻略:快速搭建MySQL主從復制集群 !

MySQL高可用性攻略&#xff1a;快速搭建MySQL主從復制集群 &#xff01; MySQL基礎知識&#xff1a;介紹MySQL數據庫的基本概念和常用命令&#xff0c;如何創建數據庫、表、用戶和權限管理等。 MySQL安裝教程&#xff1a;Centos7 安裝MySQL5.7.29詳細安裝手冊 MySQL數據類型&…

【大廠AI課學習筆記NO.63】模型的維護

說是模型的維護&#xff0c;其實這堂課都是在講“在工業環境中開發和部署機器學習模型的流程”。 上圖來自于我的筆記思維腦圖&#xff0c;已經上傳&#xff0c;要鏈接的訪問的主頁查看資源。 一路走來&#xff0c;我們學習了數據管理、模型學習、模型驗證、模型部署等重要的步…

arm板運行程序時尋找動態庫的路徑設置

問題&#xff1a;error while loading shared libraries: libQt5Widgets.so.5: cannot open shared object file&#xff1f; 第一種方法---- 解決&#xff1a; ①復制需要用到的arm庫到板子上。 ②pwd指令獲取該庫的絕對路徑&#xff0c;把路徑復制到/etc/ld.so.conf文件 ③輸…

Leetcoder Day37| 動態規劃part04 背包問題

01背包理論基礎 面試掌握01背包&#xff0c;完全背包和重背包就夠用了。 背包問題的理論基礎重中之重是01背包&#xff0c;一定要理解透&#xff01; 01 背包 有n件物品和一個最多能背重量為w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的價值是value[i] 。每件物品…

隱式馬爾科夫算法

隱式馬爾科夫算法 隱式馬爾科夫算法概述算法使用HMM 模型參數設置HMM 模型分類1. Gaussian HMM2. Multinomial HMM3. GMM HMM 其他機器學習算法&#xff1a;機器學習實戰工具安裝和使用 隱式馬爾科夫算法概述 隱式馬爾科夫算法是一種用于處理時序數據的強大工具&#xff0c;其…

css通過calc動態計算寬度

max-width: calc(100% - 40px) .m-mj-status-drawing-info-data{ display: inline-block; margin: 10px; min-width: 200px; padding: 10px;border-radius: 10px; background: #ddd;max-width: calc(100% - 40px);word-wrap: break-word;white-space: pre-line;}我開發的chatg…

計算機二級(Python)真題講解每日一題:《字典字符查找》

描述???????????????????????????????????????????????????????????????????????????????????????????????????????????????? 在右側的答題模板中&#xf…

Crash 實例

1.spinlock原理 為了解決這個spinlock的不公平問題&#xff0c;linux 2.6.25內核以后&#xff0c;spinlock采用了一種"FIFO ticket-based"算法的spinlock機制&#xff0c;可以很好的實現先來先搶占的思想。具體的做法如下&#xff1a; (1)、spinlock的核心字段有ow…

C語言-柔性數組成員的使用

文章目錄 摘要柔性數組成員基本使用細節探究 零長度數組-定長數組-變長數組 摘要 本文先介紹柔性數組成員(flexible array member)的基本使用&#xff0c;然后介紹其內存結構。最后&#xff0c;補充了一些數組相關的其他概念。 柔性數組成員 基本使用 參考: 【C語言內功修煉…

[項目設計] 從零實現的高并發內存池(一)

&#x1f308; 博客個人主頁&#xff1a;Chris在Coding &#x1f3a5; 本文所屬專欄&#xff1a;[高并發內存池] ?? 前置學習專欄&#xff1a;[Linux學習] ? 我們仍在旅途 ? 目錄 前言 項目介紹 1.內存池 1.1 什么是內存池 池化技術 內存池 1.2 為什…

word使用bib添加參考文獻

文章目錄 安裝TexLive安裝bibtex4word使用在word中添加參考文獻使用bibtex4word在word中添加參考文獻設置參考文獻格式為畢業論文格式 參考 安裝TexLive 從下載地址下載鏡像iso文件texlive2023.iso雙擊打開iso鏡像文件運行 install-tl-windows.bat點擊安裝非常非常非常耐心地安…

Shell學習 - 2.20 Shell exit命令:退出當前進程

exit 是一個 Shell 內置命令&#xff0c;用來退出當前 Shell 進程&#xff0c;并返回一個退出狀態&#xff1b;使用$?可以接收這個退出狀態&#xff0c;這一點已在《Shell $?》中進行了講解。 exit 命令可以接受一個整數值作為參數&#xff0c;代表退出狀態。如果不指定&…