国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集

這篇具有很好參考價(jià)值的文章主要介紹了基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

前言

本項(xiàng)目基于CCPD數(shù)據(jù)集和LPR(License Plate Recognition,車(chē)牌識(shí)別)模型,結(jié)合深度學(xué)習(xí)和目標(biāo)檢測(cè)等先進(jìn)技術(shù),構(gòu)建了一個(gè)全面的車(chē)牌識(shí)別系統(tǒng),實(shí)現(xiàn)了從車(chē)牌檢測(cè)到字符識(shí)別的端到端解決方案。

首先,我們利用CCPD數(shù)據(jù)集,其中包含大量的中文車(chē)牌圖像,用于模型的訓(xùn)練和驗(yàn)證。這個(gè)數(shù)據(jù)集的豐富性有助于模型更好地理解不同場(chǎng)景下的車(chē)牌特征。

接著,我們引入LPR模型,這是一種專(zhuān)門(mén)設(shè)計(jì)用于車(chē)牌識(shí)別的模型。通過(guò)深度學(xué)習(xí)技術(shù),LPR模型可以學(xué)習(xí)和識(shí)別不同類(lèi)型的車(chē)牌,無(wú)論是小轎車(chē)、卡車(chē)還是摩托車(chē)。

在模型設(shè)計(jì)中,我們使用目標(biāo)檢測(cè)技術(shù),讓模型能夠自動(dòng)定位和框選出圖像中的車(chē)牌區(qū)域。這樣,系統(tǒng)可以在不同圖像中準(zhǔn)確地找到車(chē)牌,并且不受不同角度、光照等因素的影響。

通過(guò)將車(chē)牌區(qū)域提取出來(lái),我們將其輸入到LPR模型中,進(jìn)行字符識(shí)別。模型將車(chē)牌上的字符識(shí)別出來(lái),從而實(shí)現(xiàn)了完整的車(chē)牌識(shí)別功能。

綜合上述技術(shù),本項(xiàng)目實(shí)現(xiàn)了一個(gè)端到端的車(chē)牌識(shí)別系統(tǒng),能夠高效準(zhǔn)確地檢測(cè)和識(shí)別車(chē)牌,無(wú)論是在不同的場(chǎng)景還是在各種環(huán)境下。這種系統(tǒng)在交通管理、安防監(jiān)控等領(lǐng)域具有重要的應(yīng)用價(jià)值。

總體設(shè)計(jì)

本部分包括系統(tǒng)整體結(jié)構(gòu)圖和系統(tǒng)流程圖。

系統(tǒng)整體結(jié)構(gòu)圖

系統(tǒng)整體結(jié)構(gòu)如圖所示。
基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

系統(tǒng)流程圖

系統(tǒng)流程如圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別
APP中應(yīng)用的算法流程包括車(chē)牌粗定位、車(chē)牌精定位、快速傾斜矯正和無(wú)分割端到端字符識(shí)別的算法描述及流程,如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

運(yùn)行環(huán)境

本部分包括 Python 環(huán)境、OpenCV 環(huán)境和 Andriod 環(huán)境。

Python 環(huán)境

在清華TUNA開(kāi)源鏡像站https://mirrors.tuna.tsinghua.edu.cn/下載Miniconda 3.4.7.12版本,根據(jù)自己的操作系統(tǒng)選擇相應(yīng)的版本。

在開(kāi)始菜單中打開(kāi)Anaconda Prompt ( miniconda3),進(jìn)入命令行終端,并輸入以下命令:

conda create -n tensorflow python=3.7#創(chuàng)建虛擬環(huán)境
conda install tensorflow-gpu #若沒(méi)有獨(dú)立GPU,可以選擇安裝CPU版本,去掉參數(shù)即可
conda install opencv-python=3.4.6
conda install pandas
#conda默認(rèn)安裝TensorFlow的2.1.0 stable版本
#其他常見(jiàn)的數(shù)據(jù)科學(xué)庫(kù)如numpy在創(chuàng)建虛擬環(huán)境時(shí)或者安裝TensorFlow
#若未安裝,可以自行用conda或pip命令安裝

OpenCV環(huán)境

進(jìn)入OpenCV官網(wǎng)的release頁(yè)面https://opencv.org/releases/中下載OpenCV 3.4.6 版本的Windows和Android兩個(gè)包,并解壓。

Android環(huán)境

安裝相應(yīng)版本的開(kāi)發(fā)軟件操作如下:

1. 開(kāi)發(fā)軟件和開(kāi)發(fā)包

下載地址為https://developer.android.google.cn/studio/,APP開(kāi)發(fā)使用Android Studio3.5.3版本。

創(chuàng)建NewProject,選擇EmptyActivity->next,在Name輸入框輸入項(xiàng)目名稱(chēng),Package name輸入框中命名項(xiàng)目中java文件包名,Save location中指定項(xiàng)目存儲(chǔ)路徑,Language (語(yǔ)言)選擇]ava,MinimumAPllevel指定項(xiàng)目兼容的最低API版本,設(shè)置后單擊Finish按鈕完成創(chuàng)建。

本項(xiàng)目的Package name命名為com.pcr.lpr。創(chuàng)建Project后,需安裝SDK Platforms和SDKTools。單擊窗口右上方右起第2個(gè)圖標(biāo)安裝。

SDK Platforms只選中Android 9.0 (Pie) ,切換到SDK Tools選項(xiàng)卡,選中下圖中畫(huà)圈選項(xiàng)即可。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

2. JDK設(shè)置

若系統(tǒng)中未安裝JDK,可前往https://www.oracle.com/java/technologies/javase-downloads.html下載,單擊Android Studio,單擊下圖界面右上方方框中的圖標(biāo),打開(kāi)Project Structure,并在JDK Location中填入JDK解壓的文件夾路徑。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

3. NDK設(shè)置

在https://developer.android.google.cn/ndk/downloads/older_releases.html中下載Android-ndk-r14b版本NDK并解壓。

打開(kāi)Project Structure,在彈出的窗口中設(shè)置NDK路徑,如圖17-6所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

模塊實(shí)現(xiàn)

本項(xiàng)目包括3個(gè)模塊:數(shù)據(jù)預(yù)處理、模型訓(xùn)練、APP構(gòu)建,下面分別介紹各模塊的功能及相關(guān)代碼。

1. 數(shù)據(jù)預(yù)處理

從CCPD頁(yè)面https://github.com/detectRecog/CCPD中下載數(shù)據(jù)集,解壓得到圖片數(shù)據(jù)如圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

獲取數(shù)據(jù)集之后,進(jìn)行預(yù)處理。依據(jù)數(shù)據(jù)集圖片名稱(chēng)提供的信息對(duì)車(chē)牌進(jìn)行裁剪,文件名依據(jù)“_”進(jìn)行分割,第4組數(shù)據(jù)是圖片中車(chē)牌的4個(gè)角點(diǎn)坐標(biāo),第5組數(shù)據(jù)是7位車(chē)牌信息,依據(jù)這兩組數(shù)據(jù)可以得到分割后的車(chē)牌圖片和車(chē)牌標(biāo)簽。

正樣本和負(fù)樣本的大小均為150X40,用于Cascade級(jí)聯(lián)分類(lèi)器訓(xùn)練。負(fù)樣本可以隨意裁剪,圖片中沒(méi)有車(chē)牌;正樣本用于訓(xùn)練無(wú)分割車(chē)牌字符識(shí)別。相關(guān)代碼如下:

#裁剪車(chē)牌
import cv2
import hashlib
import os, sys
import pandas as pd
import numpy as np
if not os.path.exists("output"):
    os.mkdir("output")
h = 40
w = 150
path = r"E:\ccpd_dataset\ccpd_base"  #數(shù)據(jù)集所在路徑
filenames = os.listdir(path)
fp = open("pos_image.txt", "w", encoding="utf-8")
fn = open("neg_image.txt", "w", encoding="utf-8")
#用于存儲(chǔ)圖片的每一位車(chē)牌信息
df = pd.DataFrame(columns=('pic_name', '0', '1', '2', '3', '4', '5', '6'))
#正樣本分割圖片中的車(chē)牌
count = 0
#for img_name in filenames[0:40000]:
#為保證省份全覆蓋,采用全部數(shù)據(jù),而不是40000張
for img_name in filenames:
    #讀取圖片的完整名字
    image_path = os.path.join(path, img_name)
    image = cv2.imread(image_path
    #以“-”為分隔符,將圖片名切分,其中iname[4]為車(chē)牌字符,iname[2]為車(chē)牌坐標(biāo)
    iname = img_name.rsplit('/', 1)[-1].rsplit('.', 1)[0].split('-')
    plateChar = iname[4].split("_")
    #將文件名,七位車(chē)牌寫(xiě)入dataframe中
    new_line = [
        new_name, plateChar[0], plateChar[1], plateChar[2], plateChar[3],
        plateChar[4], plateChar[5], plateChar[6]
    ]
    df.loc[count, :] = new_line
    #crop車(chē)牌的左上角和右下角坐標(biāo)
    [leftUp, rightDown] = [[int(eel) for eel in el.split('&')]
                           for el in iname[2].split('_')]
    #crop圖片
    img = image[leftUp[1]:rightDown[1], leftUp[0]:rightDown[0]]
    height, width, depth = img.shape
    #將圖片壓縮成40*150,計(jì)算壓縮比
    imgScale = h / height
    #(目標(biāo)寬-實(shí)際寬)/2,分別向左、右拓寬,所有除以2
    deltaD = int((w / imgScale - width) / 2)
    #切割寬度向左平移,保證補(bǔ)夠250
    leftUp[0] = leftUp[0] - deltaD
    #切割寬度向右平移,保證補(bǔ)夠250
    rightDown[0] = rightDown[0] + deltaD
    #如果向左平移為負(fù),坐標(biāo)為0
    if (leftUp[0] < 0):
        rightDown[0] = rightDown[0] - leftUp[0]
        leftUp[0] = 0
    #按照高/寬 =40/150的比例切割,注意切割的結(jié)果不是40和250
    img = image[leftUp[1]:rightDown[1], leftUp[0]:rightDown[0]]
    newimg = cv2.resize(img, (w, h))  #resize成40*250
    new_name = 'pic' + str(count + 1).rjust(6, '0')
    cv2.imwrite("../output/pos/" + new_name + '.jpg', newimg)
    #將圖片信息寫(xiě)入.txt文件中
    fp.write('pos/'+new_name +'.jpg'+'1 0 0 150 40' + plateChar + '\n')
    count += 1
df.to_csv('./pos.csv')
fp.close()
#負(fù)樣本圖片中沒(méi)有車(chē)牌
count = 0
for img_name in filenames[400000:80000]:
    #補(bǔ)充完整圖片路徑
    image_path = os.path.join(path, img_name)
    image = cv2.imread(image_path)
    #裁剪不含車(chē)牌的區(qū)域
    new_img = image[0:40, 0:150]
    new_name = 'pic' + str(count + 40001).rjust(6, '0')
    cv2.imwrite("../output/neg/" + new_name + '.jpg', new_img)
    #將圖片信息寫(xiě)入.txt文件中
    fn.write('neg/' + new_name + '.jpg' '\n')
    count += 1
fn.close()

裁剪得到的正樣本,如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

裁剪得到的負(fù)樣本,如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

2. 模型訓(xùn)練

級(jí)聯(lián)分類(lèi)器和無(wú)分割車(chē)牌字符的卷積神經(jīng)網(wǎng)絡(luò)模型的訓(xùn)練,具體過(guò)程如下。

1)訓(xùn)練級(jí)聯(lián)分類(lèi)器

得到正樣本和負(fù)樣本后,在終端中切換到之前下載OpenCV的解壓目錄中\build\x64\vc15\bin\的目錄。以D:\opencv\為例:

cd D:\opencv\build\x64\vc15\bin\

在終端中執(zhí)行如下命令,其中-info填入正樣本.txt文件的路徑;-bg填入負(fù)樣本.txt文件的路徑;-num根據(jù)上一步分割得到的正樣本數(shù)量修改;-W、-h分別為樣本圖片的寬和高,所有樣本圖片的寬高必須一致,故此處填入上一步裁剪車(chē)牌設(shè)置的樣本寬高。

opencv_createsamples.exe -vec pos.vec -info pos_image.txt -bg neg_image.txt -w 150 -h 40 -num 40000

執(zhí)行完畢后生成pos.vec文件,接著在終端中執(zhí)行如下命令:

opencv_traincascade.exe -data xml -vec pos.vec -bg neg_image.txt -numPos 40000 -numNeg 80000 -numStages 15 -precalcValBufSize 5000 -precalcIdxBufSize 5000 -w 150  -h 40  -maxWeakCount 200 -mode ALL -minHitRate 0.990 -maxFalseAlarmRate 0.20

其中-vec填入上一步生成的pos.vec文件路徑,-bg填入負(fù)樣本.txt文件路徑,-numPos-numNeg根據(jù)上一步分割得到的正樣本數(shù)量修改,其他參數(shù)按命令提供的參數(shù)即可。

上述命令執(zhí)行完畢后,會(huì)在樣本目錄下得到訓(xùn)練好的cascade.xml的級(jí)聯(lián)分類(lèi)器文件。

2)訓(xùn)練無(wú)分割車(chē)牌字符識(shí)別模型

無(wú)分割車(chē)牌字符識(shí)別使用卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn),相關(guān)代碼如下:

import numpy as np
import pandas as pd
import pickle
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv2D, Flatten, MaxPooling2D
from tensorflow.keras.models import Model, Sequential
from tensorflow.keras.callbacks import TensorBoard
BATCH_SIZE = 64
def process_info(img_info):
    #處理每條csv中的信息,返回圖片名稱(chēng)和one-hot后的標(biāo)簽
    img_path = img_info[0]
    label = np.zeros([238])  #7*34
    for i in range(7):
        index = int(img_info[i + 1])
        label[i * 34 + index] = float(1)
    return (img_path, label)
def parse_function(filename, label):
    #返回歸一化后的解碼圖片矩陣和標(biāo)簽矩陣
    #讀取文件
    image_string = tf.io.read_file(filename)
    #解碼
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    #變型
    image_resized = tf.image.resize(image_decoded, [150, 40])
    #歸一化
    image_normalized = image_resized / 255.0
    return image_normalized, label
def create_dataset(filenames, labels):
    #創(chuàng)建數(shù)據(jù)集管道
    #補(bǔ)充完整的圖片路徑
    filenames = "D:/DL & ML/output/pos/" + filenames
    #從張量切片創(chuàng)建自定義數(shù)據(jù)集
    dataset = tf.data.Dataset.from_tensor_slices((filenames, labels))
    #并行處理
    dataset = dataset.map(parse_function,
                          num_parallel_calls=tf.data.experimental.AUTOTUNE)
    #數(shù)據(jù)集分批
    dataset = dataset.batch(BATCH_SIZE)
    #在訓(xùn)練時(shí)預(yù)先加載數(shù)據(jù)
    dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
    return dataset
def macro_f1(y, y_hat, thresh=0.5):
    #計(jì)算一個(gè)批次的宏f1分?jǐn)?shù),返回宏f1分?jǐn)?shù)
    y_pred = tf.cast(tf.greater(y_hat, thresh), tf.float32)
    tp = tf.cast(tf.math.count_nonzero(y_pred * y, axis=0), tf.float32)
    fp = tf.cast(tf.math.count_nonzero(y_pred * (1 - y), axis=0), tf.float32)
    fn = tf.cast(tf.math.count_nonzero((1 - y_pred) * y, axis=0), tf.float32)
    f1 = 2 * tp / (2 * tp + fn + fp + 1e-16)
    macro_f1 = tf.reduce_mean(f1)
    return macro_f1
def myModel():
	#自定義模型
model = Sequential()
#兩層卷積一層池化
    model.add(Conv2D(64,(3,3),padding='same', activation='relu',input_shape=[150, 40, 3]))
    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
    model.add(MaxPooling2D())
#兩層卷積一層池化
    model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(128, (3, 3), padding='same', activation='relu'))
    model.add(MaxPooling2D())
#兩層卷積一層池化
    model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
    model.add(Conv2D(256, (3, 3), padding='same', activation='relu'))
    model.add(MaxPooling2D())
	#全連接層
    model.add(Flatten())
    model.add(Dense(1024, activation='relu'))
    model.add(Dense(512, activation='relu'))
    model.add(Dense(238, activation='sigmoid'))
    return model
if __name__ == "__main__":
    #讀取數(shù)據(jù)以及預(yù)處理
    img_info = pd.read_csv(r"D:\DL & ML\output\pos.csv")
    train_pic_name = img_info.pic_name
    train_label = np.zeros([len(img_info), 238])
    for i in range(len(img_info)):
        _, train_label[i, ] = process_info(img_info.loc[i])
    #創(chuàng)建網(wǎng)絡(luò)
    model = myModel()
    model.compile(loss='binary_crossentropy',
                  optimizer='adam',
                  metrics=[macro_f1])
    train_ds = create_dataset(train_pic_name, train_label)
    #調(diào)用tensorboard
    tb=TensorBoard(log_dir='logs')
    #訓(xùn)練網(wǎng)絡(luò)
    model.fit(train_ds, epochs=30, callbacks=[tb])
    #保存模型
    model.save("segmention_free.h5")

訓(xùn)練完成后,在代碼文件所在目錄下得到segmention_free.h5模型文件。

3. APP構(gòu)建

APP構(gòu)建相關(guān)步驟如下。

1)導(dǎo)入OpenCV庫(kù)

在A(yíng)ndroid Studiot左側(cè)Project欄 , myApplicationk處右擊→New→Module,創(chuàng)建新模塊。單擊ImportEclipseADTProject,選擇sdk/java目錄,單擊next按鈕完成導(dǎo)入。在界面左側(cè)Project區(qū)打開(kāi)openCVLibrary346\src\main\AndroidManifest.xml,刪除下圖方框中的文字。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

在左側(cè)Project區(qū)打開(kāi)新引入的Module\build.gradle,修改compileSdkVersiontargetSdkVersion為28, 修改minSdkVersion為19。

在左側(cè)Project區(qū)打開(kāi)app\build.gradle , 在dependencies中添加下列語(yǔ)句:

implementation project(path:':openCVLibrary346')

2)導(dǎo)入動(dòng)態(tài)鏈接庫(kù)so文件

app\build.gradleandroid{defaultConfig{}}中添加下列語(yǔ)句:

ndk {
	abiFilters 'armeabi -v7a'
}

創(chuàng)建 app\src\main\jniLibs目錄, 將OpenCV-android-sdk-3.4.6\sdk\native\libs下的armeabi-v7復(fù)制到jniLibs中。

3)引入C++support、用CMake生成鏈接庫(kù)

app\build.gradle的android{defaultConfig{}}中添加下列語(yǔ)句:

externalNativeBuild{
			cmake{
				cppFlags " - std=gnu++11"
			}
}

創(chuàng)建app\src\main\jniLibs目錄。在jniLibs下創(chuàng)建javaWrapper.cpp,引入jni.hstring.h,所有用native聲明的java本地函數(shù)將在該文件中用C++實(shí)現(xiàn)。

創(chuàng)建app\src\main\jniLibs\include目錄,所有.h文件包含在該目錄下。創(chuàng)建app\src\main\jniLibs\src目錄,除javaWrapper.cpp外,所有.cpp文件都包含在該目錄下。在A(yíng)PP目錄下新建File命名為CMakeLists.txt,添加如下代碼:

cmake_minimum_required(VERSION 3.4.1)
include_directories(src/main/jni/include)
include_directories(src/main/jni)
aux_source_directory(src/main/jni SOURCE_FILES)
aux_source_directory(src/main/jni/src SOURCE_FILES_CORE)
list(APPEND SOURCE_FILES ${SOURCE_FILES_CORE})
#修改為自己的opencv-android-sdk的jni路徑
set(OpenCV_DIR D:\\Android\\OpenCV-android-sdk-3.4.6\\sdk\\native\\jni)
#查找包
find_package(OpenCV REQUIRED)
#添加庫(kù)
add_library( #設(shè)置庫(kù)的名稱(chēng)
        lpr
        SHARED
        ${SOURCE_FILES})
find_library( #設(shè)置變量路徑名稱(chēng)
        log-lib
        log)
#將找到的庫(kù)鏈接給lpr庫(kù)
target_link_libraries( #指定目標(biāo)庫(kù)
        lpr
        ${OpenCV_LIBS}
        #將目標(biāo)庫(kù)鏈接到NDK中包含的日志庫(kù)
            ${log-lib})
#在app\build.gradle的android{ }中添加下列代碼
externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
}

4. 導(dǎo)入訓(xùn)練好的模型

創(chuàng)建目錄app\src\main\assets\lpr,將訓(xùn)練好的模型復(fù)制到目錄下。

5.注冊(cè)內(nèi)容提供器、聲明SD卡訪(fǎng)問(wèn)權(quán)限

打開(kāi)app\src\AndroidManifest.xml<application> </application>內(nèi)添加下列代碼:

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.cameraalbumtest.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
</provider>

app\src\res下創(chuàng)建目錄xml,xml中創(chuàng)建file_paths.xml并修改代碼:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
    name="my_images"
    path=""/>
</paths>

Name屬性可以隨意設(shè)置,path為空表示將整個(gè)SD卡進(jìn)行共享,也可修改為使用provider的文件地址。

打開(kāi)app\src\AndroidManifest.xml<application> </application>外添加下列代碼:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

6.配置Lite Pal數(shù)據(jù)庫(kù)

打開(kāi)app\build.gradle,在dependencies內(nèi)添加代碼:

implementation "org.litepal.android:core:2.0.0"

app\src\main\assets內(nèi)創(chuàng)建Android Resource File(安卓資源文件),修改代碼為:

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="CarStore"></dbname>
    <version value="1"></version>
    <list>
        <mapping class="com.pcl.lpr.Cars"/>
    </list>
</litepal>

系統(tǒng)測(cè)試

本部分包含訓(xùn)練分?jǐn)?shù)和損失可視化、APP測(cè)試結(jié)果。

1. 訓(xùn)練分?jǐn)?shù)和損失可視化

無(wú)分割車(chē)牌字符識(shí)別模型訓(xùn)練完成后,在終端中輸入以下命令:

tensorboard --logdir logs # 其中--logdir填寫(xiě)logs目錄的路徑

loss和macro_ f1score的曲線(xiàn)中,橫軸是訓(xùn)練迭代次數(shù),如圖1和圖2所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

圖1 訓(xùn)練loss可視化

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

圖2 訓(xùn)練macro_f1分?jǐn)?shù)可視化

采用HyperLPR提供訓(xùn)練好的模型,識(shí)別準(zhǔn)確率為95%~97%,下載地址為https://github.com/zeusees/HyperLPR/tree/master。

2. APP測(cè)試結(jié)果

APP界面如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

單擊主界面中的相機(jī)圖標(biāo)進(jìn)入相機(jī)界面拍攝帶車(chē)牌圖片,或單擊主界面中的圖片圖標(biāo)進(jìn)入選擇帶車(chē)牌圖片。單擊右上方垃圾桶圖標(biāo)可刪除已導(dǎo)入的圖片,單擊SUBMIT按鈕提交檢測(cè),如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

圖片識(shí)別結(jié)果如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

單擊“結(jié)果”頁(yè)面右上方圖標(biāo)可保存識(shí)別結(jié)果。保存的記錄可單擊“車(chē)牌識(shí)別”頁(yè)面左上角圖標(biāo)查看,如下圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

測(cè)試示例如圖所示。

基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集,深度學(xué)習(xí),圖像識(shí)別,學(xué)習(xí)路線(xiàn),opencv,深度學(xué)習(xí),目標(biāo)檢測(cè),python,andriod,人工智能,圖像識(shí)別

工程源代碼下載

詳見(jiàn)本人博客資源下載頁(yè)


其它資料下載

如果大家想繼續(xù)了解人工智能相關(guān)學(xué)習(xí)路線(xiàn)和知識(shí)體系,歡迎大家翻閱我的另外一篇博客《重磅 | 完備的人工智能AI 學(xué)習(xí)——基礎(chǔ)知識(shí)學(xué)習(xí)路線(xiàn),所有資料免關(guān)注免套路直接網(wǎng)盤(pán)下載》
這篇博客參考了Github知名開(kāi)源平臺(tái),AI技術(shù)平臺(tái)以及相關(guān)領(lǐng)域?qū)<遥篋atawhale,ApacheCN,AI有道和黃海廣博士等約有近100G相關(guān)資料,希望能幫助到所有小伙伴們。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697418.html

到了這里,關(guān)于基于OpenCV+LPR模型端對(duì)端智能車(chē)牌識(shí)別——深度學(xué)習(xí)和目標(biāo)檢測(cè)算法應(yīng)用(含Python+Andriod全部工程源碼)+CCPD數(shù)據(jù)集的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包