日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

利用 Python 深度學(xué)習(xí)識(shí)別滑動(dòng)驗(yàn)證碼缺口

 liqualife 2020-05-04

閱讀本文大概需要 5 分鐘。

在前面寫(xiě)過(guò)一篇文章介紹深度學(xué)習(xí)識(shí)別滑動(dòng)驗(yàn)證碼缺口的文章《利用深度學(xué)習(xí)識(shí)別滑動(dòng)驗(yàn)證碼缺口位置》,在這篇文章里,我們使用華為云 ModelArts 輕松完成了滑動(dòng)驗(yàn)證碼缺口的識(shí)別。但是那種實(shí)現(xiàn)方案依賴于現(xiàn)有服務(wù),是華為云提供的深度學(xué)習(xí)平臺(tái)所搭建的識(shí)別模型,其實(shí)其內(nèi)部是用的深度學(xué)習(xí)的某種目標(biāo)檢測(cè)算法實(shí)現(xiàn)的,如果利用平臺(tái)的話,我們無(wú)需去申請(qǐng) GPU、無(wú)需去了解其內(nèi)部的基本原理究竟是怎么回事,它提供了一系列標(biāo)注、訓(xùn)練、部署的流程。

但用上述方法是有一定的弊端的,比如使用會(huì)一直收費(fèi),另外不好調(diào)優(yōu)、不好更好地定制自己的一些需求等等。所以這里再發(fā)一篇文章來(lái)介紹一下直接使用 Python 的深度學(xué)習(xí)模型來(lái)實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼缺口識(shí)別的方法。

效果

目前可以做到只需要幾百?gòu)埲笨跇?biāo)注圖片即可訓(xùn)練出精度高的識(shí)別模型,并且可擴(kuò)展修改為其他任何樣式的缺口識(shí)別,識(shí)別效果樣例:

樣例

只需要給模型輸入一張帶缺口的驗(yàn)證碼圖片,模型就能輸出缺口的輪廓和邊界信息。

感興趣的可以繼續(xù)向下看具體的實(shí)現(xiàn)流程。

基礎(chǔ)了解

缺口識(shí)別屬于目標(biāo)檢測(cè)問(wèn)題,關(guān)于什么是目標(biāo)檢測(cè)這里就不再贅述了,可以參考之前寫(xiě)的那篇文章。

當(dāng)前做目標(biāo)檢測(cè)的算法主要有兩種路子,有一階段式和兩階段式,英文叫做 One stage 和 Two stage,簡(jiǎn)述如下:

·Two Stage:算法首先生成一系列目標(biāo)所在位置的候選框,然后再對(duì)這些框選出來(lái)的結(jié)果進(jìn)行樣本分類,即先找出來(lái)在哪,然后再分出來(lái)是啥,俗話說(shuō)叫「看兩眼」,這種算法有 R-CNN、Fast R-CNN、Faster R-CNN 等,這些算法架構(gòu)相對(duì)復(fù)雜,但準(zhǔn)確率上有優(yōu)勢(shì)。·One Stage:不需要產(chǎn)生候選框,直接將目標(biāo)定位和分類的問(wèn)題轉(zhuǎn)化為回歸問(wèn)題,俗話說(shuō)叫「看一眼」,這種算法有 YOLO、SSD,這些算法雖然準(zhǔn)確率上不及 Two stage,但架構(gòu)相對(duì)簡(jiǎn)單,檢測(cè)速度更快。

所以這次我們選用 One Stage 的有代表性的目標(biāo)檢測(cè)算法 YOLO 來(lái)實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼缺口的識(shí)別。

YOLO,英文全稱叫做 You Only Look Once,取了它們的首字母就構(gòu)成了算法名,

目前 YOLO 算法最新的版本是 V3 版本,這里算法的具體流程我們就不過(guò)多介紹了,感興趣的可以搜一下相關(guān)資料了解下,另外也可以了解下 YOLO V1-V3 版本的不同和改進(jìn)之處,這里列幾個(gè)參考鏈接。

·YOLO V3 論文:https:///media/files/papers/YOLOv3.pdf·YOLO V3 介紹:https://zhuanlan.zhihu.com/p/34997279·YOLO V1-V3 對(duì)比介紹:https://www.cnblogs.com/makefile/p/yolov3.html

數(shù)據(jù)準(zhǔn)備

回歸我們本節(jié)的主題,我們要做的是缺口的位置識(shí)別,那么第一步應(yīng)該做什么呢?

我們的目標(biāo)是要訓(xùn)練深度學(xué)習(xí)模型,訓(xùn)練模型,那我們總得需要讓模型知道要學(xué)點(diǎn)什么東西吧,這次我們做缺口識(shí)別,那么我們需要讓模型學(xué)的就是這個(gè)缺口在哪里。由于一張驗(yàn)證碼圖片只有一個(gè)缺口,要分類就是一類,所以我們只需要找到缺口位置就行了。

好,那模型要學(xué)缺口在哪里,那我們就得提供點(diǎn)樣本數(shù)據(jù)讓模型來(lái)學(xué)習(xí)才行。數(shù)據(jù)怎樣的呢?那數(shù)據(jù)就得有帶缺口的驗(yàn)證碼圖片以及我們自己標(biāo)注的缺口位置。只有把這兩部分都告訴模型,模型才能去學(xué)習(xí)。等模型學(xué)好了,等我們?cè)俳o個(gè)新的驗(yàn)證碼,那就能檢測(cè)出缺口在哪里了,這就是一個(gè)成功的模型。

OK,那我們就開(kāi)始準(zhǔn)備數(shù)據(jù)和缺口標(biāo)注結(jié)果吧。

數(shù)據(jù)這里用的是網(wǎng)易盾的驗(yàn)證碼,驗(yàn)證碼圖片可以自行收集,寫(xiě)個(gè)腳本批量保存下來(lái)就行。標(biāo)注的工具可以使用 LabelImg,GitHub 鏈接為:https://github.com/tzutalin/labelImg,利用它我們可以方便地進(jìn)行檢測(cè)目標(biāo)位置的標(biāo)注和類別的標(biāo)注,如這里驗(yàn)證碼和標(biāo)注示例如下:

標(biāo)注效果

標(biāo)注完了會(huì)生成一系列 xml 文件,你需要解析 xml 文件把位置的坐標(biāo)和類別等處理一下,轉(zhuǎn)成訓(xùn)練模型需要的數(shù)據(jù)。

在這里我先把我整理的數(shù)據(jù)集放出來(lái)吧,完整 GitHub 鏈接為:https://github.com/Python3WebSpider/DeepLearningSlideCaptcha,我標(biāo)注了 200 多張圖片,然后處理了 xml 文件,變成訓(xùn)練 YOLO 模型需要的數(shù)據(jù)格式,驗(yàn)證碼圖片和標(biāo)注結(jié)果見(jiàn) data/captcha 文件夾。

如果要訓(xùn)練自己的數(shù)據(jù),數(shù)據(jù)格式準(zhǔn)備見(jiàn):https://github.com/eriklindernoren/PyTorch-YOLOv3#train-on-custom-dataset。

初始化

上一步我已經(jīng)把標(biāo)注好的數(shù)據(jù)處理好了,可以直接拿來(lái)訓(xùn)練了。

由于 YOLO 模型相對(duì)比較復(fù)雜,所以這個(gè)項(xiàng)目我就直接基于開(kāi)源的 PyTorch-YOLOV3 項(xiàng)目來(lái)修改了,模型使用的深度學(xué)習(xí)框架為 PyTorch,具體的 YOLO V3 模型的實(shí)現(xiàn)這里不再闡述了。

另外推薦使用 GPU 訓(xùn)練,不然拿 CPU 直接訓(xùn)練速度很慢。我的 GPU 是 P100,幾乎十幾秒就訓(xùn)練完一輪。

下面就直接把代碼克隆下來(lái)吧。

由于本項(xiàng)目我把訓(xùn)練好的模型也放上去了,使用了 Git LFS,所以克隆時(shí)間較長(zhǎng),克隆命令如下:

git clone https://github.com/Python3WebSpider/DeepLearningSlideCaptcha.git

如果想加速克隆,暫時(shí)先跳過(guò)大文件模型下載,可以執(zhí)行命令:

GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/Python3WebSpider/DeepLearningSlideCaptcha.git

環(huán)境安裝

代碼克隆下載之后,我們還需要下載一些預(yù)訓(xùn)練模型。

YOLOV3 的訓(xùn)練要加載預(yù)訓(xùn)練模型才能有不錯(cuò)的訓(xùn)練效果,預(yù)訓(xùn)練模型下載命令如下:

bash prepare.sh

執(zhí)行這個(gè)腳本,就能下載 YOLO V3 模型的一些權(quán)重文件,包括 yolov3 和 weights 還有 darknet 的 weights,在訓(xùn)練之前我們需要用這些權(quán)重文件初始化 YOLO V3 模型。

注意:Windows 下建議使用 Git Bash 來(lái)運(yùn)行上述命令。

另外還需要安裝一些必須的庫(kù),如 PyTorch、TensorBoard 等,建議使用 Python 虛擬環(huán)境,運(yùn)行命令如下:

pip3 install -r requirements.txt

這些庫(kù)都安裝好了之后,就可以開(kāi)始訓(xùn)練了。

訓(xùn)練

本項(xiàng)目已經(jīng)提供了標(biāo)注好的數(shù)據(jù)集,在 data/captcha,可以直接使用。

當(dāng)前數(shù)據(jù)訓(xùn)練腳本:

bash train.sh

實(shí)測(cè) P100 訓(xùn)練時(shí)長(zhǎng)約 15 秒一個(gè) epoch,大約幾分鐘即可訓(xùn)練出較好效果。

訓(xùn)練差不多了,我們可以使用 TensorBoard 來(lái)看看 loss 和 mAP 的變化,運(yùn)行 TensorBoard:

tensorboard --logdir='logs' --port=6006 --host 0.0.0.0

loss_1 變化如下:

loss 變化

val_mAP 變化如下:

mAP 變化

可以看到 loss 從最初的非常高下降到了很低,準(zhǔn)確率也逐漸接近 100%。

另外訓(xùn)練過(guò)程中還能看到如下的輸出結(jié)果:

---- [Epoch 99/100, Batch 27/29] ----+------------+--------------+--------------+--------------+| Metrics | YOLO Layer 0 | YOLO Layer 1 | YOLO Layer 2 |+------------+--------------+--------------+--------------+| grid_size | 14 | 28 | 56 || loss | 0.028268 | 0.046053 | 0.043745 || x | 0.002108 | 0.005267 | 0.008111 || y | 0.004561 | 0.002016 | 0.009047 || w | 0.001284 | 0.004618 | 0.000207 || h | 0.000594 | 0.000528 | 0.000946 || conf | 0.019700 | 0.033624 | 0.025432 || cls | 0.000022 | 0.000001 | 0.000002 || cls_acc | 100.00% | 100.00% | 100.00% || recall50 | 1.000000 | 1.000000 | 1.000000 || recall75 | 1.000000 | 1.000000 | 1.000000 || precision | 1.000000 | 0.800000 | 0.666667 || conf_obj | 0.994271 | 0.999249 | 0.997762 || conf_noobj | 0.000126 | 0.000158 | 0.000140 |+------------+--------------+--------------+--------------+Total loss 0.11806630343198776

這里顯示了訓(xùn)練過(guò)程中各個(gè)指標(biāo)的變化情況,如 loss、recall、precision、confidence 等,分別代表訓(xùn)練過(guò)程的損失(越小越好)、召回率(能識(shí)別出的結(jié)果占應(yīng)該識(shí)別出結(jié)果的比例,越高越好)、精確率(識(shí)別出的結(jié)果中正確的比率,越高越好)、置信度(模型有把握識(shí)別對(duì)的概率,越高越好),可以作為參考。

測(cè)試

訓(xùn)練完畢之后會(huì)在 checkpoints 文件夾生成 pth 文件,可直接使用模型來(lái)預(yù)測(cè)生成標(biāo)注結(jié)果。

如果你沒(méi)有訓(xùn)練自己的模型的話,這里我已經(jīng)把訓(xùn)練好的模型放上去了,可以直接使用我訓(xùn)練好的模型來(lái)測(cè)試。如之前跳過(guò)了 Git LFS 文件下載,則可以使用如下命令下載 Git LFS 文件:

git lfs pull

此時(shí) checkpoints 文件夾會(huì)生成訓(xùn)練好的 pth 文件。

測(cè)試腳本:

sh detect.sh

該腳本會(huì)讀取 captcha 下的 test 文件夾所有圖片,并將處理后的結(jié)果輸出到 result 文件夾。

運(yùn)行結(jié)果樣例:

Performing object detection:        + Batch 0, Inference Time: 0:00:00.044223        + Batch 1, Inference Time: 0:00:00.028566        + Batch 2, Inference Time: 0:00:00.029764        + Batch 3, Inference Time: 0:00:00.032430        + Batch 4, Inference Time: 0:00:00.033373        + Batch 5, Inference Time: 0:00:00.027861        + Batch 6, Inference Time: 0:00:00.031444        + Batch 7, Inference Time: 0:00:00.032110        + Batch 8, Inference Time: 0:00:00.029131
Saving images:(0) Image: 'data/captcha/test/captcha_4497.png' + Label: target, Conf: 0.99999(1) Image: 'data/captcha/test/captcha_4498.png' + Label: target, Conf: 0.99999(2) Image: 'data/captcha/test/captcha_4499.png' + Label: target, Conf: 0.99997(3) Image: 'data/captcha/test/captcha_4500.png' + Label: target, Conf: 0.99999(4) Image: 'data/captcha/test/captcha_4501.png' + Label: target, Conf: 0.99997(5) Image: 'data/captcha/test/captcha_4502.png' + Label: target, Conf: 0.99999(6) Image: 'data/captcha/test/captcha_4503.png' + Label: target, Conf: 0.99997(7) Image: 'data/captcha/test/captcha_4504.png' + Label: target, Conf: 0.99998(8) Image: 'data/captcha/test/captcha_4505.png' + Label: target, Conf: 0.99998

拿幾個(gè)樣例結(jié)果看下:

這里我們可以看到,利用訓(xùn)練好的模型我們就成功識(shí)別出缺口的位置了,另外程序還會(huì)打印輸出這個(gè)邊框的中心點(diǎn)和寬高信息。

有了這個(gè)邊界信息,我們?cè)倮媚承┦侄瓮蟿?dòng)滑塊即可通過(guò)驗(yàn)證了。本節(jié)不再展開(kāi)講解。

總結(jié)

本篇文章我們介紹了使用深度學(xué)習(xí)識(shí)別滑動(dòng)驗(yàn)證碼缺口的方法,包括標(biāo)注、訓(xùn)練、測(cè)試等環(huán)節(jié)都進(jìn)行了闡述。

GitHub 代碼:https://github.com/Python3WebSpider/DeepLearningSlideCaptcha。

歡迎 Star、Folk,如果遇到問(wèn)題,可以在 GitHub Issue 留言。

作者:崔慶才
來(lái)源:公眾號(hào)「崔慶才丨靜覓」

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多