內容
- 背景
- 准備
- 實踐
- 結果
- 總結
- 引用
背景
老規矩,先上代碼吧
代碼所在: https://github.com/BruceDone/darknet_demo
最近在做深度學習相關的項目的時候,了解在現有的深度學習檢測流派里面有one-stage ,two stage 兩種流派,one-stage流派中yolo模型十分的搶眼

OK,在進一步了解了yolo模型之后,發現不僅有提供速度非快的yolo v3 tiny 版本,而且准確率也非常高,頓時想起了之前在上一篇Tensorflow破解驗證碼只是做了一些簡單的分類任務,還沒有正式接觸過物體檢測的任務,這一次項目剛好可以拿過來測試一下自己工程能力,比如網易驗證碼之類的

如圖很輕松將這些字符框出來,然后在進一步的做分類和識別就很容易了
准備
- 系統:ubuntu16.04
- python: 3.6
- cuda: 10.0
- GPU: GeForce GTX 1080
- Darknet :http://github.com/pjreddie/darknet
- labelImg: https://github.com/tzutalin/labelImg
實踐
安裝環境
將cuda ,等環境安裝好,本次將使用gpu訓練,將darknet clone到本地
編譯框架
進入darknet文件夾,修改Makefile
GPU=0 #如果使用GPU改為1
CUDNN=0 #如果使用CUDNN改為1
OPENCV=0 #opencv就不用使用了,下面兩個一樣
OPENMP=0
DEBUG=0
......
C=gcc
CPP=g++
NVCC=nvcc #這里如果編譯報錯,可以換成全路徑
使用命令make ,得到二進制的文件darknet,訓練框架已經准備好了
修改配置
這里重點修改cfg/yolov3-tiny.cfg 文件,本次的模型文件選用小版本的,這樣訓練速度快,而且識別速度也夠快,應對本次的驗證碼定位完全夠了,本次的任務是定位任務,所以分類看來只有一類:文字,這里我們需要修改 配置文件中的幾項
Line 3: set batch=24 → using 24 images for every training step
Line 4: set subdivisions=8 → the batch will be divided by 8
Line 127: set filters=(classes + 5)*3 → in our case filters=18
Line 135: set classes=1 → the number of categories we want to detect
Line 171: set filters=(classes + 5)*3 → in our case filters=18
Line 177: set classes=1 → the number of categories we want to detect
至於為什么fliters = (classes + 5) * 3 ,參考 yolov3 paper: https://pjreddie.com/media/files/papers/YOLOv3.pdf 第2.3節的內容
准備數據
我自己使用selenium的google driver 下載了很多圖片,接下來就是標注數據了
下載並編譯labelimage工具 : https://github.com/tzutalin/labelImg ,安裝完成后如圖開始進行苦逼的標注工作

因為我們這里只有一類內容,所有只有一類框,大概准備了500張訓練數據,120張驗證數據,將原始的圖片文件夾imgs,和label 文件夾准備好,使用代碼data.py 生在訓練能使用的txt訓練文件配置,另外會將label出的xml 文件以規整的形式在圖片文件生成同名的標注文件(darknet的訓練就是這么定義的)
准備配置
在./weights 文件夾下使用使用 darknet53.sh 文件下載我們的預訓練的權重文件,進入data 文件夾,我們准備如下文件
- train.txt – 訓練數據文件,由data.py產生
- char.names – 類別配置文件
- val.txt – 驗證數據文件
- train.data – 訓練配置表
開始訓練
進入darknet 文件夾,使用 命令
./darknet detector train data/train.data cfg/train.cfg weights/darknet53.conv.74 -gpus 1,2,3,4,5,6
1
使用gpu進行並行訓練,一般來說我們看到訓練的loss 達到0.6左右就可以停止了

結果
使用命令
./darknetdetector test train/train.data cfg/train.cfg session/train_final.weights test_imgs/1.jpg -thresh 0.5 -gpus 0
驗證我們訓練好的模型,我們可以看到darknet 文件夾里面會產生一個名為 predictions.jpg 的文件,這就是我們驗證出來的結果文件,我自己這邊手動測試了幾好張,效果都還不錯



到這里我們只是介紹了如何使用深度學習的模型去定位我們要的文字(或者說框),接下來我們可以crop出來我們的文字,然后送到檢測(分類)網絡里面,關於分類的網絡,看下期有時間就進一步做了(有數據增強的彩蛋)
