Kategoriler
Derin Öğrenme python

Tensorflow ile Plaka Tanıma

Merhaba, bu yazıda Tensorflow Object Detection API kullanarak plaka tanıma sistemi geliştirmeyi anlatacağım.

Yapı

  1. Plakanın nerde olduğunu tesbit etme
  2. Tesbit edilen plaka bölgelerini resimden çıkarma
  3. Plaka üzerindeki sayıları ve harfleri tanıma

İndirilecekler

  1. İlk önce tensorflow ‘un github sayfasından repoyu indirin veya clone layın
  2. Buradan protobuff 3.4.0 versiyonunu indirin
  3. Buradan COCO API ‘yi indirin. COCO API ‘nın nasıl kurulduğunu görmek için bu web sayfasına bakabilirsiniz.
  4. Anaconda yı indirin.

Kurulum

Anaconda prompt ta virtual environment oluşturmak için:

conda create -n plate pip python=3.6.9
activate plate

Virtual environment oluşturduktan sonra ve oluşturulan v.e yi active ettikten sonra aşağıdaki işlemleri sırasıyla yapın.

(plate) pip install --ignore-installed --upgrade tensorflow==1.15.2

Sırasıyla aşağıdaki ilgili kütüphaneleri kurmalısınız.

(plate) conda install -c anaconda protobuf
(plate) pip install pillow
(plate) pip install lxml
(plate) pip install Cython
(plate) pip install contextlib2
(plate) pip install jupyter
(plate) pip install matplotlib
(plate) pip install pandas
(plate) pip install opencv-python

Pyhon path ‘ini ayarlamak için aşağıdaki komutu çalıştırmalısınız.

(plate) set PYTHONPATH=DOSYAKONUMU\models;DOSYAKONUMU\models\research;C:\DOSYAKONUMU\models\research\slim
(plate)cd DOSYAKONUMU\models\research

Bir sonraki kodu çalıştırmadan önce protobuff 3.4.0 ‘ı indirmiş olduğunuzdan emin olmalısınız. Protobuf zip ‘inin içindeki bin/protoc.exe dosyasını alıp dosyakonumu/models/research klasörünün içinde atıp aşağıdaki komutu çalıştırmalısınız.

(plate) protoc --python_out=. .\object_detection\protos\anchor_generator.proto .\object_detection\protos\argmax_matcher.proto .\object_detection\protos\bipartite_matcher.proto .\object_detection\protos\box_coder.proto .\object_detection\protos\box_predictor.proto .\object_detection\protos\eval.proto .\object_detection\protos\faster_rcnn.proto .\object_detection\protos\faster_rcnn_box_coder.proto .\object_detection\protos\grid_anchor_generator.proto .\object_detection\protos\hyperparams.proto .\object_detection\protos\image_resizer.proto .\object_detection\protos\input_reader.proto .\object_detection\protos\losses.proto .\object_detection\protos\matcher.proto .\object_detection\protos\mean_stddev_box_coder.proto .\object_detection\protos\model.proto .\object_detection\protos\optimizer.proto .\object_detection\protos\pipeline.proto .\object_detection\protos\post_processing.proto .\object_detection\protos\preprocessor.proto .\object_detection\protos\region_similarity_calculator.proto .\object_detection\protos\square_box_coder.proto .\object_detection\protos\ssd.proto .\object_detection\protos\ssd_anchor_generator.proto .\object_detection\protos\string_int_label_map.proto .\object_detection\protos\train.proto .\object_detection\protos\keypoint_box_coder.proto .\object_detection\protos\multiscale_anchor_generator.proto .\object_detection\protos\graph_rewriter.proto .\object_detection\protos\calibration.proto .\object_detection\protos\flexible_grid_anchor_generator.proto

Bir sonraki komudu çalıştırmadan önce de COCO API yi düzgün bir şekilde kurup ilgili klasörün içinde attığınızdan emin olmalısınız.

(plate) DOSYAKONUMU\models\research> python setup.py build
(plate) DOSYAKONUMU\models\research> python setup.py install

Artık Tensorflow Object Detection API artık kurulmuş oldu. Şimdi topladığınız versiteni etiketlemek için labelimg ‘i kullanıp plaka bölgelerini etiketleyebilirsiniz. Ben veriseti oluşturmak için google görsellerden, stardford un car verisetinden ve AOLP verisetinden yararlandım.

Eğitime başlamadan önce object_detection klasörü içinde şu dosyalar bulunmalı:

  • training
  • training2
  • inference_graph
  • inference_graph2
  • images
  • images2

Plaka tanıma için 2 tane model oluşturucağız. 1. model plakanın nerde olduğunu tanıyacak 2. model de plaka üzerindeki karakterleri tanıyacak. Bu yüzden sonu 2 ile biten klasörler 2. modele ait olmalı.

Yukardaki verisetlerini etiketlediğiniz zaman sadece 1. modele ait olduğunu göreceksiniz 2. modele ait veriseti oluşturmak için birinci modelin versitesi kullanacağız.

2 images klasörünün içinde train ve test adında 2 klasör bulunmalı. Etiketlediğiniz fotoğrafların %80 ini train e , %20 sini de test setine atmalısınız.

Ben kolaylık olsun diye şöyle yaptım. car_dataset_dir ve plaka_dataset_dir adlarında 2 tane klasör oluşturdum %80 ve %20 ayırmadan önce. Yapacağımız işlem aslında etiketleme sonucu oluşan xml dosyalarındaki bounding box kısımlarını alıp onları resimden çıkarmak olacaktır.Bunun için aşağıdaki kod parçasını kullanabilirsiniz.

import os
import cv2
import xml.etree.ElementTree as ET


def read_content(xml_file: str):

    tree = ET.parse(xml_file)
    root = tree.getroot()

    list_with_all_boxes = []

    for boxes in root.iter('object'):

        ymin, xmin, ymax, xmax = None, None, None, None

        for box in boxes.findall("bndbox"):
            ymin = int(box.find("ymin").text)
            xmin = int(box.find("xmin").text)
            ymax = int(box.find("ymax").text)
            xmax = int(box.find("xmax").text)

        list_with_single_boxes = [xmin, ymin, xmax, ymax]
        list_with_all_boxes.append(list_with_single_boxes)

    return list_with_all_boxes


plaka_dataset_dir = os.path.join('./plaka-dataset')
car_dataset_dir = os.path.join('./car-karisik-dataset')

for dirr in os.listdir(car_dataset_dir):
    
    print("---dirr---",dirr)
    if os.path.isdir(car_dataset_dir+'/'+dirr):
        
        for file in os.listdir(car_dataset_dir+'/'+dirr):
            fname = os.path.splitext(file)[0]
            extd =  os.path.splitext(file)[1]

            if extd == '.xml':
                 bb = read_content(car_dataset_dir+'/'+dirr+'/'+file)
                 image = cv2.imread(car_dataset_dir+'/'+dirr+'/'+fname+'.jpg')
                 crop_img = image[bb[0][1]:bb[0][3] , bb[0][0]:bb[0][2]]
                 cv2.imwrite(plaka_dataset_dir+'/'+fname+'.jpg' ,crop_img)
                 
                 
    else:
        pass

Artık plaka_dataset_dir ve car_dataset_dir içindeki dosyalrı images2 ve images in içinde train ve test klasörlerine %80 e %20 oranında dağıtmaya başlayabilirsiniz.

Şimdi ilk modelin eğitimine geçebiliriz. Aynı işlemleride sadece ufak farklarla 2.model için yapabilirsiniz.

(plate) DOSYAKONUMU\models\research\object_detection> python xml_to_csv.py

Bu işlemden sonra images klasöründe 2 adet train_labels.csv ve test_labels.csv adında dosya olmalıdır.

csv dosyalarını .record dosyaları haline dönüştürmek için yukardaki python dosyasını indirip object_detection klasörüne atmalısınız. Eğer başka bir tanıma sistemi geliştirecekseniz bu dosya içindeki class_text_to_int fonksiyonu içindeki if else yapısına sınıf isimlerini yazmanız gerekecek.

python generate_tfrecord.py --csv_input=images\train_labels.csv --image_dir=images\train --output_path=train.record
python generate_tfrecord.py --csv_input=images\test_labels.csv --image_dir=images\test --output_path=test.record

labelmap oluşturma

training klasörü içine bir dosya oluşturmalısınız ve yapısı aşağıdaki gibi olmalı. Bu dosya labelmap.pbtxt olarak kaydedilmeli

item {
id: 1
name: ‘plaka’
}

Şimdi object_detection klasöründe samples/configs klasörüne gidin buradan hangi modeli kullanmak istiyorsanız o modelin .config uzantılı dosyasını kopyalayıp training klasörü içine atmalısınız. Ben faster_rcnn_inception_V2 modelini kullandım.

.config uzantılı dosyayı açın , burada birkaç değişiklik yapmanız gerekecek.

Yukarıda söylemeyi unutmuşum object_deteciton klasörü içinde faster_rcnn_inception_V2 modelinin dosyaları olmalı. Bu klasörü indirmek için tensorflow model zoo ya göz atabilirsiniz.

9. satır : num_classes  1 olmalı

106.satır: “DOSYAKONUMU/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt”

123. ve 125. satırlar: train.record ve labelmap.pbtxt dosyalarının yolları olmalı

130.satır: test klasörü içindeki fotoğrafların sayısını yazmalsınız

135. ve 137. satırlar: test.record ve labelmap.pbtxt dosyalarının yolları olmalı

Not: Bu dosya yollarının yazarken ” ” içinde yazmayı unutmayınız. Ardından eğitim için aşağıdaki komutu çalıştırabilirsiniz.

python model_main.py --logtostderr --train_dir=training/ --pipeline_config_path=training/MODELISMI.config

Bu modeli ortalama 40.000 adımda eğitebilirsiniz. Eğitim sonrası modeli kaydetmek ve inference graph oluşturmak için aşağıdaki komutu çalıştırmalısınız.

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/MODELISMI.config --trained_checkpoint_prefix training/model.ckpt-XXXX --output_directory inference_graph

XXXX olan yere eğitimde kaydedilen en yüksek değerli checkpoint ‘i yazmalısınız.

Bundan sonra modeli test etmek için github sayfasında paylaştığım projeye göz atabilir veya https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 github sayfasından Object_Detection_image.py dosyasını indirip test edebilirsiniz.

Hsu, G.-S.; Chen, J.-C. and Chung, Y.-Z., “Application-Oriented License Plate Recognition,” Vehicular Technology, IEEE Trans., vol.62, no.2, pp.552-561, Feb. 2013