新聞中心
大家好,我是Snowball。

一、前言
今天給大家分享的實戰(zhàn)項目是常用驗證碼標注&識別,從想法誕生到實現(xiàn)思路,再到編碼實戰(zhàn)的整體過程,這個過程我前后整理了上萬字,計劃分章節(jié)來發(fā)布。言歸正傳,一起來看看今天的內(nèi)容吧!今天這篇內(nèi)容主要講解這篇文章的創(chuàng)作靈感、需求分析和實現(xiàn)思路。
首先介紹一下驗證碼基本概念,驗證碼全稱為全自動區(qū)分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗稱驗證碼,是一種區(qū)分用戶是計算機和人的公共全自動程序。驗證碼的主要目的是強制人機交互來抵御機器自動化攻擊,為了確保服務(wù)器系統(tǒng)的穩(wěn)定和用戶信息的安全,大部分網(wǎng)站采用了驗證碼技術(shù)。圖片驗證碼是目前最常用的一種,本文也主要討論這種驗證碼的識別。
最初,圖片驗證碼識別的想法最初源于12年的大學(xué)階段,當時的學(xué)校教務(wù)系統(tǒng)每次搶課系統(tǒng)就崩潰,而且還要特定時間段跟其他同學(xué)一起搶指定課程,基本搶不到自己想修的課程,那時候就想繞過系統(tǒng)圖片驗證碼通過代碼實現(xiàn)自動搶課,鑒于當時自己編碼能力和技術(shù)能力有限,機器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)相關(guān)框架效果較差,最后以各種條件限制實現(xiàn)不了告終~~
XDM,等等,故事還沒完,時間回到2021年,做為一名勤于搬磚、善于思考學(xué)習(xí)的程序猿,在經(jīng)過幾年社會的毒打后,想著以現(xiàn)在自己的項目經(jīng)驗、學(xué)習(xí)能力和編碼功底,以及行業(yè)內(nèi)機器學(xué)習(xí)、神經(jīng)網(wǎng)絡(luò)等AI技術(shù)的發(fā)展,能不能把多年以來的想法給實現(xiàn),達到圖片驗證碼高正確率識別預(yù)測,訓(xùn)練一個高度可用的CNN模型。在做項目之前經(jīng)過筆者幾天的資料查詢過程中,確信高可用的驗證碼識別模型想法是可以做的,于是開啟了CNN神經(jīng)網(wǎng)絡(luò)等技術(shù)前置知識的漫長學(xué)習(xí)過程。
幾個月過后,項目編碼實戰(zhàn)出爐,效果嘛,自我感覺還行,基本達到高可用,500張訓(xùn)練數(shù)據(jù)圖,CNN模型單個字符97%以上準確率。
這里先貼項目的工程Git地址,有基礎(chǔ)的同學(xué)可以去直接拉取項目下來把玩源碼:
- [Java后臺-通用驗證碼標注系統(tǒng)](https://gitee.com/snowball2dev/DataMarkService)
- [Vue管理后臺模板-通用驗證碼標注系統(tǒng)](https://gitee.com/snowball2dev/DataMarkService-Vue)
- [Python-圖片驗證碼識別模型案例](https://gitee.com/snowball2dev/VerifyCodeRecognize-Python)
- [標注系統(tǒng)線上效果體驗地址](http://139.9.191.103:8084/)
好的,XDM,如果到這里還有興趣往下看的話,那么就請跟隨結(jié)合筆者的學(xué)習(xí)、編碼實戰(zhàn)過程來了解常用的驗證碼識別方法和過程。
二、需求分析
說到圖片驗證碼識別功能,這個功能初步想想也簡單,網(wǎng)上搜一下關(guān)鍵詞,相關(guān)文章和開源項目非常多。以下是github搜索結(jié)果:
乍一看,好像真有免費的午餐,隨便下載個CNN-python項目,改幾行代碼,然后開始瘋狂標注數(shù)據(jù)過程,就能跑出來模型。
筆者自己最初也是這么想的,只求簡單粗暴,于是弄了幾個項目下來跑了之后,發(fā)現(xiàn)代碼是可以用,但是效果非常拉跨,單個字符識別正確率很低,70%不到,4-6個字符那正確率就更低了,基本上達不到高正確率,可用性非常一般。對于一個有追求的程序猿,不可能這么就完事了,于是,這就有了這個項目的整活。
在使用這些開源項目的過程中,發(fā)現(xiàn)下載的項目實現(xiàn)過程大都分為2種思路,第一種無需圖片切割,直接數(shù)據(jù)標注訓(xùn)練模型;第二種為圖片驗證碼進行字符切割,然后為單個字符進行分類訓(xùn)練。項目執(zhí)行的具體過程就不演示了,有興趣的讀者開源自行搗鼓,下面就是筆者自己對2種思路適用方式的實踐思考總結(jié):
1. 第一種無需圖片切割
優(yōu)點:簡單粗暴,通用性強,直接用各種卷積神經(jīng)網(wǎng)絡(luò)模型硬懟圖片驗證碼提取特征,適合知道驗證碼生成的正向代碼過程,用代碼生成圖片驗證碼數(shù)據(jù)給模型訓(xùn)練。
缺點:數(shù)據(jù)量小時模型擬合效果差,需要大量人工標注數(shù)據(jù),不太適合不知道驗證碼生成規(guī)則,少量標注數(shù)據(jù)。
2. 第二種進行字符切割
針對驗證碼生成規(guī)則,分析驗證碼各種背景干擾、噪聲點像素、字體形變和累疊、字符位置隨機及個數(shù)不定、反色等情況,對圖片逆向處理,達到局部字符可切割,降低卷積模型層次,降低數(shù)據(jù)標注量,實現(xiàn)字符分類。
優(yōu)點:可針對單一圖片驗證碼做特殊預(yù)處理,可實現(xiàn)部分字符切割,針對字符小圖進行分類訓(xùn)練,小批量數(shù)據(jù)標注就可以訓(xùn)練模型達到高擬合效果,達到可用
缺點:通用性不強,訓(xùn)練模型只適用特定圖片驗證碼,復(fù)雜驗證碼可能無法切割
XDM,等等,還有一種思路:
筆者自己學(xué)習(xí)OpenCV時想到的,通過圖片預(yù)處理,輪廓檢測,然后對A-Z,0-9字符通過SIFT算法進行特征提取,最后跟需要匹配的字符進行FLANN匹配,理想很豐滿,然后編寫相關(guān)代碼后發(fā)現(xiàn)由于驗證碼的正向生成過程導(dǎo)致字符特征變化太大,并不適合,于是放棄采用該思路,代碼見上述代碼鏈接中的python項目image_match.py。
根據(jù)以上思路總結(jié),根本沒有免費的午餐,好的數(shù)據(jù)和特征工程同等重要,要實現(xiàn)好的效果,都是要根據(jù)具體問題具體分析,所以筆者分析自己的圖片驗證碼識別案例,更適合第二種,另外一點原因大批量標注數(shù)據(jù)人工成本過高,個人不太喜歡。以下將附帶案例詳細介紹第二種識別思路的實現(xiàn)過程。
三、實現(xiàn)思路
根據(jù)需求初步分析,大概可分為四個步驟:
1. 數(shù)據(jù)采集/預(yù)處理:http批量下載,OpenCV API使用學(xué)習(xí),圖片預(yù)處理
2. 數(shù)據(jù)標注:GUI標注功能開發(fā),人工標注數(shù)據(jù)階段,模型訓(xùn)練后預(yù)測數(shù)據(jù)可進行數(shù)據(jù)集補充
3. CNN神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練:windows環(huán)境,cpu/gpu,學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)框架API,微積分、線代、概率論等前置知識,加深對神經(jīng)網(wǎng)絡(luò)模型理解,pytroch框架的使用
4. 項目部署:linux環(huán)境下,標注系統(tǒng)VUE前端部署、標注系統(tǒng)Java后端部署、Python模型部署
以下是Xmind腦圖導(dǎo)出效果:
四、總結(jié)
我是Snowball。這篇內(nèi)容主要講解了常用驗證碼標注&識別的背景知識, 介紹了驗證碼的基本概念,講述了這個文章的的創(chuàng)作靈感、需求分析和實現(xiàn)思路。
小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
本文轉(zhuǎn)載自微信公眾號「Python爬蟲與數(shù)據(jù)挖掘 」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Python爬蟲與數(shù)據(jù)挖掘公眾號。
本文題目:Python項目實戰(zhàn)篇-常用驗證碼標注和識別
文章路徑:http://fisionsoft.com.cn/article/dhippho.html


咨詢
建站咨詢
