yolov 2のナンバープレート検査

9327 ワード

はじめに
        この文章は主にyolov v 2を使って自分の車のナンバープレートの写真データを訓練して、そしてテスト画像の中に存在する車のナンバープレートの領域を枠で出すことができて、つまり車のナンバープレートの検査です.この文章は博文を参考にしました.http://m.blog.csdn.net/qq_34484472/articale/detail/73135354とhttp://blog.csdn.net/zhuiqiuk/article/details/72722227
二、準備工作
        まず正しい配置でダrknetをダウンロードしてください. 使用./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg命令で測定結果が得られます.本文は主に車のナンバープレートの区域を検査するために、darknetの下で新しいフォルダのplateを作ります.imgaeでは、trainとval、picの三つのフォルダを格納し、trinフォルダの下では1296枚の訓練画像、valフォルダの下では196枚の検証画像、picは236枚の検査待ち画像、ピクチャフォーマットはすべてjpgフォーマットで、トレーニングモデルは主にtrinとvalの二つのフォルダを使用します.
yolo v2 之车牌检测_第1张图片
三、ラベルファイルを作成する
        yolov 2はVOC形式のデータセットを使用していますので、ここではまずトレーニングセットと検証セットの写真を表示しなければなりません.各画像に対応するxmlファイルが得られます.その後、xmlファイルをtxtタグファイルに変換します.ここを参考にしてくださいhttp://blog.csdn.net/jesse_mx/articale/detail/53606897 表示ツールLabelImgをインストールし、インストールが完了したら、/labelImg.pyに表示ツールを開き、とりあえずtrinフォルダ内の写真に表示し、plate_イメージフォルダ下にtrain(u)を新規作成します.xmlフォルダは、生成したxmlファイルを保存します.作成したxmlファイルは以下の通りです.
yolo v2 之车牌检测_第2张图片
同じ方法でも、plateにあります.イメージフォルダの下に新しいval_を作成します.xmlフォルダは、検証セットのxml表示ファイルを保存します.このようにVOC形式でマークされたXMLファイルがあります.これからxmlファイルをtxtファイルに変換し、pythonを使って変換し、trin_xmlのxmlファイルを、txtに変換してフォルダtrin_に保存します.txtの下同じように、val_をxmlのxmlファイルを変換してval_に保存します.txtフォルダの下
import xml.etree.ElementTree as ET  
import pickle  
import os  
from os import listdir, getcwd  
from os.path import join  

xml_label_Dir = 'train_xml'        #    xml  
txt_label_Dir = 'train_txt/'          #    txt      

def convert(size, box):        #     
    dw = 1./size[0]  
    dh = 1./size[1]  
    x = (box[0] + box[1])/2.0  
    y = (box[2] + box[3])/2.0  
    w = box[1] - box[0]  
    h = box[3] - box[2]  
    x = x*dw  
    w = w*dw  
    y = y*dh  
    h = h*dh  
    return (x,y,w,h)  
  
if not os.path.exists(txt_label_Dir):   
    os.makedirs(txt_label_Dir)  
for rootDir,dirs,files in os.walk(xml_label_Dir):  
    for file in files:  
        file_name = file.split('.')[0]  
        out_file = open(txt_label_Dir+'%s.txt'%(file_name),'w')  
        in_file = open("%s/%s"%(rootDir,file))  
        tree = ET.parse(in_file)  
        root = tree.getroot()  
        size = root.find('size')  
        w = int(size.find('width').text)  
        h = int(size.find('height').text)  
          
        for obj in root.iter('object'):  
            xmlbox = obj.find('bndbox')  
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))  
            bb = convert((w,h), b)  
            out_file.write("0" + " " + " ".join([str(a) for a in bb]) + '
') #only one class,index 0 out_file.close()
は次に、トレーニングセットピクチャの絶対パスtrin_を得る必要がある.イガイガイpath.txtと検証セットの絶対パスval_イメージ.イメージpath.txtは、以下のpythonコードを使用します.
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

TrainDir = '/home/jyang/darknet/plate_image/train'

out_file = open('train_image_path.txt','w')
for root,dirs,files in os.walk(TrainDir):
    for file in files:
        out_file.write('%s/%s
'%(root,file)) out_file.close()
YOLOは、元のピクチャの絶対パスのサフィックスを直接置き換えることによって、名来で対応するマーカーファイルを見つけたのです.例えば元の画像の絶対パスは/home/uuntu/data/train/1.jpgです.YOLOは、その対応するタグファイルの経路が/home/uuntu/data/train/1.txtであると直接に認識する.ですから、私たちはその前に作成したtxtファイルをそれぞれの画像の経路の下に置いて、間もなくtrin_txt下txtファイルをtrainフォルダの下に置いて、val_txt下のtxtファイルをvalフォルダの下に置いてください.
yolo v2 之车牌检测_第3张图片
plateを見てくださいイメージの下には何がありますか?
yolo v2 之车牌检测_第4张图片
四、プロファイルの変更
(1)namesファイルの作成
      YOLOのマスターディレクトリのdataフォルダの下で、一つを作成します.namesファイル名は任意で、私のはmyClass.namesです.このファイルにはすべてのカテゴリの名前を記入して、各クラスが1行を占めています.私はナンバープレートだけを検査します.だから最初の行にlicenceを書きます.
(2)dataファイルを修正する
     darknetメインディレクトリのcfg/voc.dataファイルを修正しました.修正は以下の通りです.
classes= 1                      #      
train  = /home/jyang/darknet/plate_image/train_image_path.txt        #        
valid  = /home/jyang/darknet/plate_image/val_image_path.txt           #        
names = data/myClass.names
backup = /home/jyang/darknet/plate_image/backup                     #          
(3)cfgファイルの変更
     darknetのメインディレクトリのcfg/yolo-voc.cfgを修正します.
1.[region]層のクラスは1に変更されました.
2.[region]層の上の[convolution]層の中で、filtersの数は(classis+coords+1)*NUMに変更されます.私はここで(1+4+1)*5=30に変更しました.
五、src/yolo.cファイルを修正する
1.13行目をchar*voc_に変更しました.names[]={"licence"}//もしあなたがクラスだったら、このように変えます.もしいくつかの種類があったら、自分は需要によって変えます.
2.第322行draw_detections関数の中で、最後のパラメーターは20からあなたの分類数に変えて、私はここで1です.
3.354行目のデモ関数のうち、最後から3番目のパラメータを20からあなたのクラス数に変えます.ここは1です.
4.17行目をchar*train_に変更しました.イマージュ=「/trinmgaeuplath」
5.18行目をchar*backup_に変更しました.directory=「あなたのパス/backup/」
6.121行目をchar*base=「reults/comp 4_test_」に変更しました.
7.123行目をlist*plist=get_に変更する.paths(「/val image plath.txt」); 
8.209行目をchar*base=「result/comp 4_test_」に変更しました.
9.210行目をlist*plist=get_に変更しました.paths(「/val image plath.txt」);
10.src/yolo_をkersnels.clファイルの62行目のdraw_.detections関数の最後のパラメータは20からあなたのクラス数に変えられます.ここは1です.
11.scripts/voc_label.pyファイルの中で、位置の9行目はclases=[licence]に変えました.
12.src/detector.cファイルの372行目をlist*plist=get_に変更する.paths(「/val image plath.txt」);542行目のoption_find_int関数の最後のパラメータを20から1に変更します.
六、改めてdarknet yoloをコンパイルする
       darknetのメインディレクトリに入り、make clean後make-j 8
七、プリトレーニングファイルcfg/darknet 19_をダウンロードする.448.conv.23
        訓練速度を速くするために、公式に提供されたプリトレーニングモデルをダウンロードして、cfgに保存します.ダウンロードの住所は
http://pjreddie.com/media/files/darknet19_448.conv.23
八、トレーニング
        darknetフォルダでコマンドを実行します.
        ./darknet detector trin cfg/voc.data cfg/yolo-voc.cfg/darknet 19_448.conv.23        システムのデフォルトは45000回のバッチを繰り返します.もし訓練回数を変更する必要があれば、cfg/yolo_に入ります.voc.cfg修正max_batchの値
九、トレーニング過程の出力ロゴ
       この文章から参考する.http://blog.csdn.net/renhanchi/article/details/71077830?locationNum=13&fps=1、以下はこの文章から.
       Region Avg IOU:これは予測されたbboxと実際に表示されたbboxとの交錯を彼らの集合によって割ったものです.この数値が大きいほど、予測の結果が良いことは明らかです.
       Avg Recal:これは平均リコール率を表しています.物体の個数を検出して表示するすべての物体の個数を割るという意味です.
       count:表示されているすべての物体の個数.count=6であれば、recal=0.6667ということは、全部で6つの物体があるということです.(異なるカテゴリを含むかもしれません.これはカテゴリに関係なく)、4つの予測ができました.だから、Recalは4で6=0.6667で割っています.
       一行は上と違って、最初はiterationの回数、そしてtrin loss、そしてavg trin loss、そして学習率、そしてbatchの処理時間、そして全部で何枚の画像を処理しましたか?trin lossとavg train lossに注目して、この二つの値はiterationが増加するにつれて徐々に低下していくはずです.もしlossが数百まで増大するならば、訓練は発散して、もしlossはしばらくの時間で不変ならば、learning rateを下げてあるいはbatchを変えて学習の効果を強化しにくる必要があります.もちろん訓練が十分にできているかもしれません.これは自分で判断します.
十、訓練のモデルを評価する
       3日間訓練しました.反復30000回の価値を得ました.イメージ/backup/下にYOlo-voc_が生成されました.30000.weightはもちろん他の反復回数の権利があります.以下の文を使って一枚の写真をテストできます.
./darknet detector test cfg/voc.data cfg/yolo-voc.cfg plte_イメージ/backup/yolo-voc_30000.weight plate_イメージ/pic/0999.jpg
       表示された検出結果は
        yolo v2 之车牌检测_第5张图片
      訓練の時はトレーニングセットを使うだけで、検査性能を評価して検証セットに使えるようになります.以下の指令を用いて評価する.
      root@computer:/home/ng/darknet鎗/darknet detector recal cfg/voc.data cfg/yolo-voc.cfg plate uイメージ/backup/yolo-voc_30000.weight
      参考の2編目のブログによると、このコマンドを使うと、src/detector.cのvalidate_を呼び出します.detector_recal関数は、しきい値を0.001から0.25に変更し、多すぎるボックスが識別されないようにして、432行のコードを次のように修正します.
fprintf(stderr, "Id:%5d Correct:%5d Total%5d\tRPs/Img: %.2f\tIOU: %.2f\tRecall:%.2f%%\tPrecision:%.2f%%
", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total ,100.*correct/proposals);
でメークを再開した後、運転結果は以下の通りです.

196枚の写真が見られます.正確率は97%以上です.
おわりに
        この文章はただyolov 2を使って車のナンバープレートを検査しました.その後、枠から降りたナンバープレートの写真を識別します.