Python項目實戰篇——常用驗證碼標註和識別(需求分析和實現思路)

點擊上方“ Python爬蟲與數據挖掘 ”,進行關注

回覆“書籍”即可獲贈Python從入門到進階共10本電子書

願得此身長報國,何須生入玉門關。

    大家好,我是Snowball。

一、前言

    今天給大家分享的實戰項目是常用驗證碼標註&識別,從想法誕生到實現思路,再到編碼實戰的整體過程,這個過程我前後整理了上萬字,計劃分章節來發布。言歸正傳,一起來看看今天的內容吧!今天這篇內容主要講解這篇文章的創作靈感、需求分析和實現思路。


    首先介紹一下驗證碼基本概念,驗證碼全稱爲全自動區分計算機和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗稱驗證碼,是一種區分用戶是計算機和人的公共全自動程序。驗證碼的主要目的是強制人機交互來抵禦機器自動化攻擊,爲了確保服務器系統的穩定和用戶信息的安全,大部分網站採用了驗證碼技術。圖片驗證碼是目前最常用的一種,本文也主要討論這種驗證碼的識別。


    最初,圖片驗證碼識別的想法最初源於12年的大學階段,當時的學校教務系統每次搶課系統就崩潰,而且還要特定時間段跟其他同學一起搶指定課程,基本搶不到自己想修的課程,那時候就想繞過系統圖片驗證碼通過代碼實現自動搶課,鑑於當時自己編碼能力和技術能力有限,機器學習、神經網絡相關框架效果較差,最後以各種條件限制實現不了告終~~


    XDM,等等,故事還沒完,時間回到2021年,做爲一名勤於搬磚、善於思考學習的程序猿,在經過幾年社會的毒打後,想着以現在自己的項目經驗、學習能力和編碼功底,以及行業內機器學習、神經網絡等AI技術的發展,能不能把多年以來的想法給實現,達到圖片驗證碼高正確率識別預測,訓練一個高度可用的CNN模型。在做項目之前經過筆者幾天的資料查詢過程中,確信高可用的驗證碼識別模型想法是可以做的,於是開啓了CNN神經網絡等技術前置知識的漫長學習過程。


    幾個月過後,項目編碼實戰出爐,效果嘛,自我感覺還行,基本達到高可用,500張訓練數據圖,CNN模型單個字符97%以上準確率。


    這裏先貼項目的工程Git地址,有基礎的同學可以去直接拉取項目下來把玩源碼:

[Java後臺-通用驗證碼標註系統](https://gitee.com/snowball2dev/DataMarkService) [Vue管理後臺模板-通用驗證碼標註系統](https://gitee.com/snowball2dev/DataMarkService-Vue)[Python-圖片驗證碼識別模型案例](https://gitee.com/snowball2dev/VerifyCodeRecognize-Python)[標註系統線上效果體驗地址](http://139.9.191.103:8084/)

    好的,XDM,如果到這裏還有興趣往下看的話,那麼就請跟隨結合筆者的學習、編碼實戰過程來了解常用的驗證碼識別方法和過程。


二、需求分析

    說到圖片驗證碼識別功能,這個功能初步想想也簡單,網上搜一下關鍵詞,相關文章和開源項目非常多。以下是github搜索結果:

    乍一看,好像真有免費的午餐,隨便下載個CNN-python項目,改幾行代碼,然後開始瘋狂標註數據過程,就能跑出來模型。


    筆者自己最初也是這麼想的,只求簡單粗暴,於是弄了幾個項目下來跑了之後,發現代碼是可以用,但是效果非常拉跨,單個字符識別正確率很低,70%不到,4-6個字符那正確率就更低了,基本上達不到高正確率,可用性非常一般。對於一個有追求的程序猿,不可能這麼就完事了,於是,這就有了這個項目的整活。


    在使用這些開源項目的過程中,發現下載的項目實現過程大都分爲2種思路,第一種無需圖片切割,直接數據標註訓練模型;第二種爲圖片驗證碼進行字符切割,然後爲單個字符進行分類訓練。項目執行的具體過程就不演示了,有興趣的讀者開源自行搗鼓,下面就是筆者自己對2種思路適用方式的實踐思考總結:

1. 第一種無需圖片切割

   優點:簡單粗暴,通用性強,直接用各種卷積神經網絡模型硬懟圖片驗證碼提取特徵,適合知道驗證碼生成的正向代碼過程,用代碼生成圖片驗證碼數據給模型訓練。

   缺點:數據量小時模型擬合效果差,需要大量人工標註數據,不太適合不知道驗證碼生成規則,少量標註數據。


2. 第二種進行字符切割

   針對驗證碼生成規則,分析驗證碼各種背景干擾、噪聲點像素、字體形變和累疊、字符位置隨機及個數不定、反色等情況,對圖片逆向處理,達到局部字符可切割,降低卷積模型層次,降低數據標註量,實現字符分類。

   優點:可針對單一圖片驗證碼做特殊預處理,可實現部分字符切割,針對字符小圖進行分類訓練,小批量數據標註就可以訓練模型達到高擬合效果,達到可用

   缺點:通用性不強,訓練模型只適用特定圖片驗證碼,複雜驗證碼可能無法切割


    XDM,等等,還有一種思路:


    筆者自己學習OpenCV時想到的,通過圖片預處理,輪廓檢測,然後對A-Z,0-9字符通過SIFT算法進行特徵提取,最後跟需要匹配的字符進行FLANN匹配,理想很豐滿,然後編寫相關代碼後發現由於驗證碼的正向生成過程導致字符特徵變化太大,並不適合,於是放棄採用該思路,代碼見上述代碼鏈接中的python項目image_match.py。


根據以上思路總結,根本沒有免費的午餐,好的數據和特徵工程同等重要,要實現好的效果,都是要根據具體問題具體分析,所以筆者分析自己的圖片驗證碼識別案例,更適合第二種,另外一點原因大批量標註數據人工成本過高,個人不太喜歡。以下將附帶案例詳細介紹第二種識別思路的實現過程。


三、實現思路

    根據需求初步分析,大概可分爲四個步驟:

1. 數據採集/預處理http批量下載,OpenCV API使用學習,圖片預處理

2. 數據標註:GUI標註功能開發,人工標註數據階段,模型訓練後預測數據可進行數據集補充

3. CNN神經網絡模型訓練:windows環境,cpu/gpu,學習神經網絡框架API,微積分、線代、概率論等前置知識,加深對神經網絡模型理解,pytroch框架的使用

4. 項目部署:linux環境下,標註系統VUE前端部署、標註系統Java後端部署、Python模型部署


以下是Xmind腦圖導出效果:



四、總結

    我是Snowball。這篇內容主要講解了常用驗證碼標註&識別的背景知識, 介紹了驗證碼的基本概念講述了這個文章的的創作靈感、需求分析和實現思路。

    小夥伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流羣共同探討學習。

------------------- End -------------------

往期精彩文章推薦:

歡迎大家點贊,留言,轉發,轉載,感謝大家的相伴與支持

想加入Python學習羣請在後臺回覆【入羣

萬水千山總是情,點個【在看】行不行

/今日留言主題/

隨便說一兩句吧~~

本文分享自微信公衆號 - Python爬蟲與數據挖掘(crawler_python)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章