DCD Project: Vehicle Plate Number Recognition for Unmanned Parking System

Theresia Londong

2023-05-10

Photo by <a href="https://unsplash.com/@john_matychuk?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">John Matychuk</a> on <a href="https://unsplash.com/photos/yvfp5YHWGsc?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>

Photo by John Matychuk on Unsplash

Introduction

Background

Lahan parkir adalah sebuah kebutuhan yang terus bertambah seiring berjalannya waktu di Indonesia, utamanya di kota-kota besar. Sebagai negara dengan populasi lebih dari 250 juta jiwa, Indonesia telah menjadi pasar utama untuk industry automobil di ASEAN. Menurut laporan Asean Automotive Federation untuk penjualan kendaraan roda empat atau lebih di wilayah Asia Tenggara selama 2022, Indonesia keluar menjadi negara dengan penjualan mobil terbesar yang mencangkup 30% dari total pasar di kawasan ASEAN, yaitu 1.048.040 unit dari 3.424.935 unit [1]

Uniknya, dalam beberapa kasus, kantong-kantong parkir di kota-kota besar yang sebenarnya ditujukan untuk mengurangi kemacetan akibat parkir liar di badan jalan, malah menjadi penyumbang kemacetan akibat penumpukan kendaraan di pintu masuk maupun pintu keluar area parkir [2], [3].

Photo from <a href="https://mstt.ugm.ac.id/lima-titik-mal-dan-hotel-perparah-kemacetan-di-sleman/">Republika.co.id</a>

Photo from Republika.co.id

Selain arus masuk dan keluar kendaraan yang tinggi, proses check-in dan check-out yang masih manual atau kurang efisien ditengarai menjadi akibat utama penumpukan tersebut. Otomasi sistem melalui teknologi unmanned parking system diharapkan dapat menjawab permasalahan penumpukan tersebut dengan perbaikan arus layanan parkir, meningkatkan efisiensi sumber daya, dan utamanya meningkatkan user-experience secara keseluruhan.

Problem Statement

Merangkum masalah - masalah klasik yang kerap muncul pada oprasional lahan parkir pada umumnya seperti: + Lambatnya proses check-in dan check-out yang rawan menimbulkan penumpukan kendaraan di titik-titik keluar/masuk gedung/lahan parkir + Penggunakan kertas sebagai tiket parkir yang rawan resiko kehilangan atau berpindah tangan + Kebutuhan sumber daya yang lebih untuk mengoperasikan lahan parkir + Pengalaman pengguna layanan parkir yang kerap harus menghabiskan banyak waktu untuk berputar-putar mencari lahan parkir kosong, hal tersebut tentu saja tidak efisien dalam hal waktu pengguna dan konsumsi bahan bakar kendaraan.

Project Idea

  • Meningkatkan efisiensi layanan parkir dengan automasi proses check-in dan check-out untuk mempercepat proses di titik - titik yang rawan menimbulkan penumpukan kendaraan
  • Meminimalkan penggunakan kertas sebagai tiket parkir (paperless), untuk mengurangi resiko kehilangan
  • Meminimalkan kontak untuk pemesanan dan pembayaran (contactless)
  • Meningkatkan pengalaman pengguna dengan menambahkan fitur pemesanan lot parkir khusus (seperti untuk kasus pengguna dengan disabilitas, atau lot parkir untuk mobil listrik) serta alokasi lot parkir otomatis sejak proses check-in

Solusi serupa yang pernah dikembangkan dan akan menjadi salah satu acuan dalam pengembangan model ini adalah seperti dapat ditemukan dalam artikel berikut [4].

Problem Scope

Pada projek kali ini, akan digunakan dataset berupa kumpulan gambar kendaraan dari China yang tersedia secara umum dan dapat diakses di [5]. Kelebihan dataset gambar ini adalah ukurannya yang seragam sehingga menyerupai hasil tangkapan kamera yang akan terpasang di pintu keluar dan masuk lahan parkir sebagai objek pengambilan gambar untuk kemudian diproses dengan model DeppLearning kita.

Data gambar ini nantinya akan di-anotasi secara manual untuk menentukan lokasi kotak plat nomor kendaraan dan hasil akhirnya adalah sebuah dataset yang berisikan informasi bverikut :

  • file_name = unique file name
    • file_path = unique file path / lokasi objek
    • width = lebar file gambar dalam pxl
    • height = tinggi file gambar dalam pxl
    • xmin = lokasi plat nomor pada gambar dalam koordinat (x,y)
    • ymin = lokasi plat nomor pada gambar dalam koordinat (x,y)
    • xmax = lokasi plat nomor pada gambar dalam koordinat (x,y)
    • ymax = lokasi plat nomor pada gambar dalam koordinat (x,y)
    • label = variabel target dari model kita yaitu berisikan plat nomor kendaraan

Selanjutnya, model CNN akan digunakan untuk membentuk model DeppLearning guna membaca objek gambar yang sudah tersegmentasi tersebut.

Expected Output

Selain output projek berupa pemodelan DeepLearning dan sebuah dashboard monitoring, keluaran utama yang ingin dicapai adalah peningkatan flow process & user experience secara keseluruhan dalam operasional bisnis lahan parkir yang berdampak positif tidak hanya bagi pengelola tapi juga pengguna layanan.

Business Impact

  • Melalui efisiensi proses parkir pelanggan mulai dari check-in - alokasi lot parkir - check-out serta efisiensi sumber daya dengan unmanned parking system, keluaran utama yang diharapkan adalah penurunan waktu proses check-in dan check-out kendaraan.
  • Selanjutnya adalah sistem paperless, tanpa tiket, yang selain mengurangi konsumsi kertas untuk mencetak tiket parkir juga menurunkan kemungkinan hilangnya tiket parkir.
  • Efisiensi sumber daya dan proses berpengaruh pada operational cost dari bisnis lahan parkir sedangkan peningkatan pengalaman parkir pelanggan akan membawa impact berupa peningkatan kepuasan pelanggan, retention, peluang bisnis premimum seperti parkir berlangganan.
  • Perbaikan alur parkir juga diharapkan mampu membawa dampak positif ke lingkungan sekitar dengan mengurangi potensi kemacetan atau penumpukan kendaraan di pintu masuk dan keluar area parkir.

Namun, hal lain yang perlu dipertimbangkan selain berbagai keuntungan diatas adalah masalah keamanan parkir karena dengan meniadakan lapisan pengaman di pintu keluar seperti tiket fisik, kita dihadapkan pada tantangan baru yaitu bagaimana metode verifikasi kendaraan dikemudikan oleh pengendara yang sah. Beberapa opsi seperti :

  • Untuk kendaraan yang telah melalui proses reservasi, pelanggan bisa memasukkan kode OTP 2 - 4 digit yang dikirimkan melalui aplikasi mobile/SMS ke automatic gate saat kendaraan check-out
  • Mendaftarkan nomor HP dan plat nomor kendaraan ke mobile web perusahaan, agar bisa digunakan untuk mengirim nomor OTP tanpa harus melakukan instalasi aplikasi tambahan
  • Jaminan asuransi kehilangan kendaraan bagi pelanggan yang telah melakukan prosedur pengamanan kendaraan dengan standard yang telah ditentukan serta telah melakukan (minimal) pendaftaran nomor HP+plat nomor kendaraan melalui mobile web perusahaan
  • Penambahan perangkat kamera dan minimalisasi blind-spot di area parkir

Dashboard

Berikut adalah mock-up papan kontrol yang akan diimplementasikan melalui shinyapps :

Unmanned Parking System Check In Flow

Unmanned Parking System Check In Flow

Unmanned Parking System Check In Flow

Unmanned Parking System Check In Flow

Beberapa limitasi dalam fitur yang bisa diimplementasikan pada shinyapps mungkin akan mempengaruhi hasil akhir dari dashboard ini serta perlu diingat bahwa dalam sesi demo akhir nanti karena kita tidak terhubung ke kamera secara live dan real-time, maka proses capture objek gambar akan dilakukan dengan mengunggah gambar secara terpisah.

Improved Process

Check-In Flow

Penerapan Unmanned Parking System diharapkan selain membawa efek-efek yang disebutkan di atas juga membawa perubahan dalam alur layanan parkir pelanggan mulai dari titik masuk hingga keluar yang lebih seamless sehingga akan meningkatkan kepuasan pelanggan secara umum.

Unmanned Parking System Check In Flow

Unmanned Parking System Check In Flow

Check-Out Flow

Unmanned Parking System Check Out Flow

Unmanned Parking System Check Out Flow

Exploratory Data Analysis

Proses EDA tidak bisa dipisahkan dari persiapan data yaitu proses anotasi / labelling data gambar untuk mendapatkan segmen / lokasi plat nomor kendaraan.

Import Library

Beberapa library penting yang akan digunakan dalam project ini, namun tidak menutup kemungkinan akan bertambah saat memasuki proses implementasi, adalah sbb:

# Load the library xml2
library(xml2)

# Data wrangling
library(tidyverse)
library(dplyr)

# manipulasi data string
library(stringr)

# Manipulasi data gambar
library(imager)

# Deep learning
library(keras)

# Evaluasi Model
library(caret)

#memilih conda env.
use_condaenv('r-tensorflow')

#nomor scientific
options(scipen = 999)

Read Data

Data yang digunakan untuk training model adalah data yang tersedia secara terbuka dan dapat dipertanggungjawabkan dari [5] yang menggunakan data gambar plat nomor kendaraan dari China.

Untuk menggunakan data gambar tersebut dalam model DeepLearning kita, maka data gambar tersebut harus diberikan anotasi. Anotasi bertujuan untuk memberikan label pada gambar, menentukan batasan kotak yang merupakan objek plat nomor kendaraan. Selanjutnya label tersebut akan disimpan dalam format file .xml dengan menggunakan tools yang tersedia secara online seperti MakeSenseAI. Setelah data gambar kita berikan label/anotasi (i.e license_plate) kemudian data tersebut kita eksport ke dalam format VOC XML yang selanjutnya akan kita gunakan sebagai dataset kita untuk model DeepLearning.

Membuat path untuk mengakses data gambar pada folder ‘Asset/G4_annotation’.

file_list <- list.files("Asset/G4_copy_annot/")

head(file_list)
## [1] "A03484.xml" "A11470.xml" "A1A016.xml" "A25577.xml" "A33916.xml"
## [6] "A38188.xml"

Selanjutnya list nama file dalam folder ‘Asset/G4_annotation’ kita gabungkan menjadi path yang utuh dan disimpan dalam bentuk list pada object bernama folder_path.

folder_path <- paste0('Asset/G4_copy_annot/', file_list)

head(folder_path)
## [1] "Asset/G4_copy_annot/A03484.xml" "Asset/G4_copy_annot/A11470.xml"
## [3] "Asset/G4_copy_annot/A1A016.xml" "Asset/G4_copy_annot/A25577.xml"
## [5] "Asset/G4_copy_annot/A33916.xml" "Asset/G4_copy_annot/A38188.xml"
# Mendapatkan nama file
file_name <- map(folder_path, 
                 function(x) paste0(x, list.files(x))
                 ) %>% 
  unlist()

# 6 file name pertama dan terakhir
head(file_name)
## [1] "Asset/G4_copy_annot/A03484.xml" "Asset/G4_copy_annot/A11470.xml"
## [3] "Asset/G4_copy_annot/A1A016.xml" "Asset/G4_copy_annot/A25577.xml"
## [5] "Asset/G4_copy_annot/A33916.xml" "Asset/G4_copy_annot/A38188.xml"
tail(file_name)
## [1] "Asset/G4_copy_annot/S05288.xml" "Asset/G4_copy_annot/S07531.xml"
## [3] "Asset/G4_copy_annot/S23836.xml" "Asset/G4_copy_annot/S25019.xml"
## [5] "Asset/G4_copy_annot/S28107.xml" "Asset/G4_copy_annot/S55645.xml"

Objek folder_path inilah yang nantinya akan kita masukkam pada fungsi custom get_xml_info() dibawah untuk membaca xml file pada folder dan mengekstrak informasi penting didalamnya yang relevan dengan model kita.

# membuat fungsi untuk membaca dan ekstrak informasi dari xml file

get_xml_info <- function(x){
  
   dfs <- read_xml(x)
   file_name <- xml_find_all(dfs, xpath = "//filename") %>% xml_text()
   file_path <- xml_find_all(dfs, xpath = "//path") %>% xml_text()
   width <- xml_find_all(dfs, xpath = "//size/width") %>% xml_text()
   height <- xml_find_all(dfs, xpath = "//size/height") %>% xml_text()
   xmin <- xml_find_all(dfs, xpath = "//object/bndbox/xmin") %>% xml_text()
   ymin <- xml_find_all(dfs, xpath = "//object/bndbox/ymin") %>% xml_text()
   xmax <- xml_find_all(dfs, xpath = "//object/bndbox/xmax") %>% xml_text()
   ymax <- xml_find_all(dfs, xpath = "//object/bndbox/ymax") %>% xml_text()
  
   plate_dfs <- data_frame(file_name, file_path, width, height, xmin, ymin, xmax, ymax)
  
   return(plate_dfs)
}

get_xml_info(folder_path[3])
## Warning: `data_frame()` was deprecated in tibble 1.1.0.
## ℹ Please use `tibble()` instead.
## # A tibble: 1 × 8
##   file_name  file_path              width height xmin  ymin  xmax  ymax 
##   <chr>      <chr>                  <chr> <chr>  <chr> <chr> <chr> <chr>
## 1 A1A016.jpg /dcd-lpr-02/A1A016.jpg 1600  1236   1087  351   1259  422

Karena ukuran data yang sangat besar, maka R secara otomatis akan menyimpan objek plate_dfs dalam bentuk data tibble. Kita bisa menyimpan objek dalam bentuk dataframe dengan fungsi as.data.frame().

# mendapatkan seluruh hasil pembacaan xml file

plate_tibb <- map_df(file_name, get_xml_info)
#simpan dalam objek dataframe 

plate_data <- as.data.frame(plate_tibb)
head(plate_data)
##    file_name              file_path width height xmin ymin xmax ymax
## 1 A03484.jpg /dcd-lpr-02/A03484.jpg  1600   1236  887  258 1072  322
## 2 A11470.jpg /dcd-lpr-02/A11470.jpg  1600   1236  846  246 1022  319
## 3 A1A016.jpg /dcd-lpr-02/A1A016.jpg  1600   1236 1087  351 1259  422
## 4 A25577.jpg /dcd-lpr-02/A25577.jpg  1600   1236 1174  404 1359  480
## 5 A33916.jpg /dcd-lpr-02/A33916.jpg  1600   1236 1063  381 1256  451
## 6 A38188.jpg /dcd-lpr-02/A38188.jpg  1600   1236  829  410 1010  480
str(plate_data)
## 'data.frame':    564 obs. of  8 variables:
##  $ file_name: chr  "A03484.jpg" "A11470.jpg" "A1A016.jpg" "A25577.jpg" ...
##  $ file_path: chr  "/dcd-lpr-02/A03484.jpg" "/dcd-lpr-02/A11470.jpg" "/dcd-lpr-02/A1A016.jpg" "/dcd-lpr-02/A25577.jpg" ...
##  $ width    : chr  "1600" "1600" "1600" "1600" ...
##  $ height   : chr  "1236" "1236" "1236" "1236" ...
##  $ xmin     : chr  "887" "846" "1087" "1174" ...
##  $ ymin     : chr  "258" "246" "351" "404" ...
##  $ xmax     : chr  "1072" "1022" "1259" "1359" ...
##  $ ymax     : chr  "322" "319" "422" "480" ...

Data utama kita yaitu plate_data adalah sebuah dataframe yang terdiri atas 564 pengamatan dengan 8 kolom/variabel yaitu:

  • file_name = unique file name
  • file_path = unique file path / lokasi objek
  • width = lebar file gambar dalam pxl
  • height = tinggi file gambar dalam pxl
  • xmin = lokasi plat nomor pada gambar dalam koordinat (x,y)
  • ymin = lokasi plat nomor pada gambar dalam koordinat (x,y)
  • xmax = lokasi plat nomor pada gambar dalam koordinat (x,y)
  • ymax = lokasi plat nomor pada gambar dalam koordinat (x,y)

Prepare Data

Selanjutnya, objek plate_data akan kita gunakan dalam pembuatan model DeepLearning. Karena kita telah melakukan anotasi secara mandiri maka dapat dipastikan data kita bersih dari missing values, namun apabila kita ingin memeriksa adanya missing value dalam data kita, dapat menggunakan fungsi is.na().

Dari hasil inspeksi awal pada data plate_data, diketahui beberapa kolom numerik masih terbaca sebagai character sehingga kita perlu merubah tipe data sesuai ke dalam bentuk numerik.

plate_cln <- plate_data %>% mutate_at(c('width', 'height', 'xmin', 'xmax', 'ymin', 'ymax'), as.numeric) %>% 
             add_column(label = '0')

Dapat kita lihat dalam dataframe kita belum memiliki variabel target berupa keterangan plat nomor kendaraan selain pada kolom file_name. Karena kita tahu bahwa plat nomor kendaraan terdiri dari 6 digit, maka kita akan mengekstrak 6 karakter pertama dari data bertipe karakter pada kolom file_name dengan memanfaatkan fungsi str_sub() dari paket stringr, kemudian menyimpannya dalam kolom baru bernama label.

# ekstrak 6 karakter pertama dari kolom file_name
plate_cln$label <- str_sub(plate_cln$file_name, 1, 6)

head(plate_cln) 
##    file_name              file_path width height xmin ymin xmax ymax  label
## 1 A03484.jpg /dcd-lpr-02/A03484.jpg  1600   1236  887  258 1072  322 A03484
## 2 A11470.jpg /dcd-lpr-02/A11470.jpg  1600   1236  846  246 1022  319 A11470
## 3 A1A016.jpg /dcd-lpr-02/A1A016.jpg  1600   1236 1087  351 1259  422 A1A016
## 4 A25577.jpg /dcd-lpr-02/A25577.jpg  1600   1236 1174  404 1359  480 A25577
## 5 A33916.jpg /dcd-lpr-02/A33916.jpg  1600   1236 1063  381 1256  451 A33916
## 6 A38188.jpg /dcd-lpr-02/A38188.jpg  1600   1236  829  410 1010  480 A38188

Sekarang kita telah mendapatkan variabel target kita yaitu kolom label.

Dengan fungsi summary() kita dapat melihat rangkuman statistiks sederhana dari data kita utamanya data bertipe numerikal.

summary(plate_cln)
##   file_name          file_path             width          height    
##  Length:564         Length:564         Min.   :1600   Min.   :1236  
##  Class :character   Class :character   1st Qu.:1600   1st Qu.:1236  
##  Mode  :character   Mode  :character   Median :1600   Median :1236  
##                                        Mean   :1600   Mean   :1236  
##                                        3rd Qu.:1600   3rd Qu.:1236  
##                                        Max.   :1600   Max.   :1236  
##       xmin             ymin            xmax           ymax      
##  Min.   :  91.0   Min.   :173.0   Min.   : 272   Min.   :234.0  
##  1st Qu.: 814.0   1st Qu.:299.0   1st Qu.: 993   1st Qu.:369.0  
##  Median : 956.5   Median :369.0   Median :1134   Median :436.0  
##  Mean   : 939.9   Mean   :359.7   Mean   :1120   Mean   :425.2  
##  3rd Qu.:1104.0   3rd Qu.:413.0   3rd Qu.:1282   3rd Qu.:477.0  
##  Max.   :1403.0   Max.   :474.0   Max.   :1587   Max.   :536.0  
##     label          
##  Length:564        
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

Bisa dilihat bahwa data file gambar kita memiliki ukuran seragam baik lebar maupun tingginya namun tentunya lokasi plat nomor kendaraan dalam gambar yang dinyatakan dalam koordinat cartesian, (x,y), adalah bervariasi dan patut kita analisa lebih lanjut. Hal ini ideal mengingat dalam prakteknya, data yang dihasilkan oleh kamera pada gate ENTRANCE dan EXIT hi lahan parkir adalah seragam secara ukuran.

Data Visualisation

xmin

Melihat distribusi nilai X_min dari data gambar kita.

hist(plate_cln$xmin)

Terlihat bahwa dari histogram diatas, distribusi nilai xmin bertipe left-skewed dengan mayoritas data bernilai pixel besar. Dalam kondisi distribusi tidak normal, maka acuan nilai tengah yang dipakai adalah median ketimbang mean karena nilai mean menjadi lebih rawan dalam kondisi kemunculan data pencilan. Dari data ini bisa dilihat bahwa mayoritas posisi plat nomor kendaraan dalam gambar dimulai dari koordinat horizontal (x) 950 pada gambar berukuran lebar 1600. Atau bisa dikatakan bahwa sebagian besar plat nomor kendaraan ada di sisi kanan dari gambar.

xmax

Melihat distribusi nilai X_max dari data gambar kita.

hist(plate_cln$xmax)

Sepertihalnya distribusi nilai xmin, terlihat bahwa dari histogram bahwa distribusi nilai xmax juga bertipe left-skewed dengan mayoritas data bernilai pixel besar. Dalam kondisi distribusi tidak normal, maka acuan nilai tengah yang dipakai adalah median ketimbang mean yang menjadi lebih rawan dalam kondisi kemunculan nilai outliers. Dari data ini bisa dilihat bahwa mayoritas posisi plat nomor kendaraan dalam gambar berakhir pada koordinat horizontal (x) 1130 dalam gambar berukuran lebar 1600.

ymin

Melihat distribusi nilai Y_min dari data gambar kita.

hist(plate_cln$ymin)

Tidak seperti koordinat horisontalnya yang ditunjukkan dalam sumbu X, posisi plat nomor kendaraan secara vertikal pada gambar berukuran tinggi 1236 pixel ternyata memiliki beberapa puncak dalam kurva sebarannya. Dari histogram diatas terlihat bahwa titik paling bawah dari plat nomor terkonsentrasi pada koordinat vertikal bernilai 250 sampai 450.

ymax

Melihat distribusi nilai Y_max dari data gambar kita.

hist(plate_cln$ymax)

Sama seperti distribusi nilai ymin, posisi titik vertikal teratas plat nomor kendaraan pada gambar berukuran tinggi 1236 pixel ternyata juga memiliki beberapa puncak dalam kurva sebarannya. Dari histogram diatas terlihat bahwa titik paling bawah dari plat nomor terkonsentrasi pada koordinat vertikal bernilai 350 sampai 500. Atau dapat dikatakan bahwa mayoritas plat nomor kendaraan pada gambar berlokasi di bawah garis horizontal yang membagi gambar sama besar pada sisi atas - bawahnya, seperti diilustrasikan pada gambar dibawah.

Unmanned Parking System Check Out Flow

Unmanned Parking System Check Out Flow

Sample Images

Plot dari 6 sample gambar yang diambil secara random dari data plate_cln

head(plate_cln$file_name)
## [1] "A03484.jpg" "A11470.jpg" "A1A016.jpg" "A25577.jpg" "A33916.jpg"
## [6] "A38188.jpg"
# Membuat path untuk mengakses file .jpg 

img_path <- paste0('Asset/G4 - Copy/', plate_cln$file_name)
head(img_path)
## [1] "Asset/G4 - Copy/A03484.jpg" "Asset/G4 - Copy/A11470.jpg"
## [3] "Asset/G4 - Copy/A1A016.jpg" "Asset/G4 - Copy/A25577.jpg"
## [5] "Asset/G4 - Copy/A33916.jpg" "Asset/G4 - Copy/A38188.jpg"
#Memilih gambar secara random

set.seed(888)
sample_image <- sample(img_path, 6)

# Load gambar ke R
plate_sample <- map(sample_image, load.image)

# Plot gambar
par(mfrow = c(2, 3)) #  tampilkan dlm 2 x 3 grid gambar
map(plate_sample, plot)

## [[1]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3 
## 
## [[2]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3 
## 
## [[3]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3 
## 
## [[4]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3 
## 
## [[5]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3 
## 
## [[6]]
## Image. Width: 1600 pix Height: 1236 pix Depth: 1 Colour channels: 3

Pemodelan

Data Preporcessing

Dalam pembuatan model Neural Network adalah penting untuk mengetahui dimensi data gambar karena nantinya akan dibutuhkan keseragaman ukuran input data yang dapat dicapai melalui proses modifikasi ukuran data lewat Data Augmentation dengan memanfaatkan fungsi image_data_generator dari TensorFlow. Dalam hal ini kita akan mencoba untuk menyeragamkan data dimensi data menjadi 224 x 224 pixels, membagi ke dalam batches dgn ukuran 32 instances, dan melakukan cross-validation yaitu dengan membagi data kita ke dalam 80:20 proporsi data training dan data untuk validasi.

Pada proses Data Augmentation ini kita melakukan beberapa variasi gambar yaitu rotasi/tilting, flip, zoom, agar data train dapat menegnali variasi dari data2 tersebut dan akibatnya model menjadi lebih robust. Hal ini untuk mengantisipasi berbagai kemungkinan di lapangan yng bisa membuat data gambar kita ter-modikasi, baik secara sengaja maupun tidak, dan menjamin bahwa model kita tetap mampu mengenali dan membaca data gambar. Hasil tangkapan gambar kamera yang mengaktifkan mode ‘mirror’ membuat kita mengaktifkan parameter vertical_flip, atau kamera yang tidak terpasang dengan benar (tilted) bisa mengakibatkan pengambilan gambar yang tidak akurat mulai dari gambar bergeser sampai terbalik 180°, sehingga parameter horizontal-flip kita atur bernilai TRUE.

Selanjutnya adalah proses inputasi pada image generator untuk menghasilkan data tarining dan validasi (cross validation). Disini kita akan menggunakan data dari folder Asset/G4 - Copy/ untuk menghasilkan dataset training dan validasi, dengan proporsi 80:20. Nantinya model akan kita latih dengan data set tersebut dan coba kita evaluasi dengan dataset validasi yang berasal dari induk data yang sama.

Setelah model kita menghasilkan performa yang menjanjikan pada prediksi dengan data validasi, kita akan menggunakan data baru dari folder LPR-master, yang belum pernah dilihat oleh model kita sebelumnya, untuk melakukan prediksi dengan model yang akan kita uji. Data test tersebut adalah data yang benar-benar baru dan belum pernah dipelajari oleh model kita.

Mask RCNN

Selanjutnya, kami menyiapkan Mask RCNN Framework untuk melatih model Deep Learning kami untuk mendeteksi Plat Nomor dari gambar masukan jika disediakan gambar tampak depan Mobil. Sebagai referensi, kita dapat melihat cara implementasi model R-CNN atau Mask R-CNN dari pihak ketiga yang andal yang dibangun di atas kerangka pembelajaran mendalam Keras.

Implementasi pihak ketiga terbaik dari Mask R-CNN adalah Mask R-CNN Project yang dikembangkan oleh Matterport. Proyek ini adalah open source yang dirilis di bawah lisensi permisif (mis. Lisensi MIT) dan kodenya telah digunakan secara luas di berbagai proyek dan kompetisi Kaggle [6].

Kita akan menggunakan pre-trained model Mask R-CNN sebagai titik awal dalam mengembangkan model untuk set data deteksi objek baru. Dalam hal ini, kami akan menggunakan Mask R-CNN yang dilatih untuk masalah deteksi objek MS COCO [7].

Segmentation of Alphanumerical Characters

  • Kita akan menggunakan fungsi pemrosesan gambar openCV.
  • Ekstrak karakter dari pelat menggunakan Thresholding, eroding, dilating, blurring gambar untuk menghilangkan noise sehingga kita memiliki Gambar bebas noise.
  • Gunakan deteksi kontur dan penyetelan parameter untuk mengekstrak karakter

Character Recognition with CNN

  • Kita melatih model CNN untuk mengenali angka dan angka dari data gambar.
  • Lewatkan Karakter yang terdeteksi dari tahapan sebelumnya ke model CNN untuk mengenali Karakter tersegmentasi dari Gambar.