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