YOLO+PaddleOCR实现车牌检测识别
YOLO+PaddleOCR實現(xiàn)車牌檢測識別
本篇文章將會使用Keras-YOLOV3來訓(xùn)練自己的車牌檢測的模型,結(jié)合PaddleOCR來識別車牌,最終使用OpenCV將其整體進行串聯(lián)。
技術(shù)簡介
Keras
Keras 是一個用 Python 編寫的高級神經(jīng)網(wǎng)絡(luò) API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為后端運行。Keras 的開發(fā)重點是支持快速的實驗。能夠以最小的時延把你的想法轉(zhuǎn)換為實驗結(jié)果,是做好研究的關(guān)鍵。
Keras中文網(wǎng)
YOLOV3
YOLO是“You Only Look Once”的簡稱,它雖然不是最精確的算法,但在精確度和速度之間選擇的折中,效果也是相當不錯。YOLOv3借鑒了YOLOv1和YOLOv2,雖然沒有太多的創(chuàng)新點,但在保持YOLO家族速度的優(yōu)勢的同時,提升了檢測精度,尤其對于小物體的檢測能力。YOLOv3算法使用一個單獨神經(jīng)網(wǎng)絡(luò)作用在圖像上,將圖像劃分多個區(qū)域并且預(yù)測邊界框和每個區(qū)域的概率。
Keras-YOLOV3 GitHub地址
PaddleOCR
PaddleOCR是百度飛槳下的一款OCR工具庫,使用簡單,識別率高。
飛槳PaddleOCR官網(wǎng)地址
實現(xiàn)過程
整體的實現(xiàn)過程大致為,克隆Keras-YOLOV3源代碼–>下載YOLOV3預(yù)訓(xùn)練權(quán)重–>將YOLOV3預(yù)訓(xùn)練權(quán)重轉(zhuǎn)為Keras所需要的.h5類型的模型文件–>標注數(shù)據(jù)集–>訓(xùn)練模型–>測試模型。以下將為大家詳細介紹實現(xiàn)過程。
環(huán)境搭建
Python環(huán)境
我這里使用的是Anaconda3,Python3.6的版本,可以在Anaconda官網(wǎng)上根據(jù)不同的系統(tǒng)環(huán)境,下載相應(yīng)的軟件版本。基本上都是一鍵安裝,所以安裝過程就不在這里贅述了。
安裝完成后,可以使用
添加清華源,方便后面下載依賴使用。
克隆Keras-YOLOV3
Keras-YOLOV3 GitHub地址如果無法使用Github克隆的話,這里我已經(jīng)將完整的Keras-YOLOV3的代碼拷貝到了Gitee上,方便大家克隆:Keras-YOLOV3 Gitee地址
git clone https://github.com/qqwweee/keras-yolo3.git安裝所需依賴
首先我們需要進入到上一步克隆下來的keras-yolo3目錄中:
cd keras-yolo3使用conda創(chuàng)建虛擬環(huán)境
conda create -n keras-yolov3 python==3.7 # 激活虛擬環(huán)境 conda activate keras-yolov3安裝所需依賴
如果有GPU的同學(xué)請下載tensorflow-gpu的版本
下載yolov3權(quán)重,轉(zhuǎn)換成.h5文件
wget https://pjreddie.com/media/files/yolov3.weights # 下載完后執(zhí)行,將yolov3文件轉(zhuǎn)換成.h5文件 python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5轉(zhuǎn)換完成后,會在model_data/下生成一個yolo.h5的文件
使用PyCharm打開
配置項目的Interpreter
選擇剛剛創(chuàng)建的虛擬環(huán)境,一般情況下會在anaconda3/envs目錄下,根據(jù)實際情況進行配置。
目前的目錄結(jié)構(gòu),且沒有任何報錯,如果依賴報錯,請查驗以上步驟
環(huán)境測試
在keras-yolo3跟目錄下創(chuàng)建一個img目錄,并放上一張自己的圖片,yolov3,目前已有檢測的對象包括:
飛機,自行車,汽車,馬,牛等等。
在這里,我放了一張馬的圖片,進行環(huán)境的測試。
在根目錄下編寫一個測試文件:yolo_test.py
測試結(jié)果:
可以看到以下測試結(jié)果,檢測出了兩匹馬,并且置信度都為1,很準確。
訓(xùn)練數(shù)據(jù)集
創(chuàng)建目錄結(jié)構(gòu)
mkdir -p VOCdevkit/VOC2007/Annotations VOCdevkit/VOC2007/ImageSets/Main VOCdevkit/VOC2007/JPEGImages準備數(shù)據(jù)集
可以在百度圖片中下載汽車并且?guī)в熊嚺频膱D片,并將圖片放到VOCdevkit/VOC2007/JPEGImages目錄下。
編寫腳本對圖片數(shù)據(jù)預(yù)處理,把所有圖片的后綴改成.jpg格式,并將圖片統(tǒng)一轉(zhuǎn)為(416, 416)的大小格式,因為yolov3模型默認輸入的圖片尺寸為(416, 416)。
convert_img.py
數(shù)據(jù)標注
使用labelImg對數(shù)據(jù)進行標注,安裝過程就不再贅述了,請自行查找。
使用快捷鍵w,快速創(chuàng)建選區(qū),并填寫label的名稱
使用快捷鍵d,對標注存儲并且下一張,將標注文件保存到VOCdevkit/VOC2007/Annotations目錄下
以下數(shù)據(jù)以此類推,我這里準備了84張汽車的圖片,進行標注。
劃分數(shù)據(jù)文件
編寫腳本劃分train.txt,test.txt,val.txt數(shù)據(jù)label,只包含圖片文件名部分,8:1:1;生成完之后放到VOCdevkit\VOC2007\ImageSets\Main目錄下
import globdef gen_data_txt(data_list, file_name):with open('VOCdevkit/VOC2007/ImageSets/Main/{}'.format(file_name), 'w') as f:for data in data_list:f.write('{}\n'.format(data[data.rindex('/') + 1:data.rindex('.')]))img_paths = glob.glob('/Users/junweiwang/workerspace/keras-yolo3/VOCdevkit/VOC2007/JPEGImages/*')train_data_paths = img_paths[:int(len(img_paths) * 0.8)] test_data_paths = img_paths[len(train_data_paths):len(train_data_paths) + int((len(img_paths) - len(train_data_paths)) / 2)] val_data_paths = img_paths[len(train_data_paths) + len(test_data_paths):]gen_data_txt(train_data_paths, 'train.txt') gen_data_txt(test_data_paths, 'test.txt') gen_data_txt(val_data_paths, 'val.txt')文件生成后,將文件末尾的空行刪掉。
運行voc_annotation.py文件注意在訓(xùn)練自己的數(shù)據(jù)集時,需要將里面的classes換成自己的,例如,“classes = [“car_license”]”,其他的不需要改變。
執(zhí)行完成后會在根目錄下,生成2007_train.txt,2007_test.txt,2007_val.txt三個文件,需要將文件名中的2007_部分刪除,如:
修改model_data
1.修改“根目錄下\model_data”的目錄中“coco_classes.txt、
voc_classes.txt”這兩個文件,將 car_license 類別填入進去,并且刪除其它的label。
開始訓(xùn)練
由于我的機器沒有GPU,所以是租用了GPU的服務(wù)器,來訓(xùn)練車牌檢測的模型。
也是我意外發(fā)現(xiàn),找到了這個GPU租用服務(wù)的平臺。矩池云官網(wǎng),有需要的可以看看,在此聲明,沒有任何利益關(guān)系。
在根目錄下創(chuàng)建logs\000目錄,用來存放訓(xùn)練完成的權(quán)重文件
將model_data下的yolo.h5文件重命名為yolo_weights.h5
調(diào)整訓(xùn)練參數(shù)batch_size,epochs,由于我這里的數(shù)據(jù)集只有八十多張,比較少,所以把batch_size=1,這里的epochs暫時就不做調(diào)整了。
最后執(zhí)行根目錄下的train.py進行訓(xùn)練,這個過程比較長,請耐心等待。
最終達到loss:13.1307–val_loss:13.5433不再下降,提前結(jié)束訓(xùn)練,在logs/000目錄下有每個階段和最終的權(quán)重文件,將trained_weights_final.h5放到跟目錄的model_data中
模型測試
找一張帶有車牌的汽車圖片進行測試,需要將yolo.py文件中的model_path改為剛剛訓(xùn)練好的模型。
_defaults = {"model_path": 'model_data/trained_weights_final.h5',"anchors_path": 'model_data/yolo_anchors.txt',"classes_path": 'model_data/coco_classes.txt',"score" : 0.3,"iou" : 0.45,"model_image_size" : (416, 416),"gpu_num" : 1,}創(chuàng)建一個測試腳本
from yolo import YOLO from PIL import Imageyolo = YOLO()image = Image.open('img/car02.jpeg') rel_image = yolo.detect_image(image) rel_image.show()yolo.close_session()可以看到車牌位置已經(jīng)被檢測出來了,由于訓(xùn)練的數(shù)據(jù)集數(shù)量有限,其檢測的置信度不是特別高。
車牌識別
車牌識別使用的是飛槳PaddleOCR。首先我們先安裝PaddleOCR的依賴。
pip install --upgrade pip -i https://pypi.douban.com/simple pip install paddlepaddle -i https://pypi.douban.com/simple pip install PaddleOCR -i https://pypi.douban.com/simple修改一下yolo.py文件中的detect_image方法,將外接矩形框的四個點返回,以便截取車牌位置
編寫識別腳本:
可以看到,識別的效果還是很不錯的,如果訓(xùn)練的數(shù)據(jù)集更多一些,效果當然會更好,車牌的檢測也會更準確。
結(jié)語
當然也可以用PaddleOCR中的文字檢測模型來訓(xùn)練車牌檢測,不過其PaddleOCR底層也有一些模型用到了YOLO,所以,在此,使用的YOLO進行車牌檢測訓(xùn)練的。可以根據(jù)此流程舉一反三,通過YOLO做更多內(nèi)容的檢測。
最后放上完整項目的網(wǎng)盤鏈接:
鏈接: https://pan.baidu.com/s/1pC3aEjBCL-74o9EbJDZtjw 提取碼: q68n
總結(jié)
以上是生活随笔為你收集整理的YOLO+PaddleOCR实现车牌检测识别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python输出杨辉三角形,pytho
- 下一篇: MAC上Maven下载及安装