前言
本項(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)如圖所示。
系統(tǒng)流程圖
系統(tǒng)流程如圖所示。
APP中應(yīng)用的算法流程包括車(chē)牌粗定位、車(chē)牌精定位、快速傾斜矯正和無(wú)分割端到端字符識(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)即可。
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解壓的文件夾路徑。
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所示。
模塊實(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ù)如圖所示。
獲取數(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()
裁剪得到的正樣本,如下圖所示。
裁剪得到的負(fù)樣本,如下圖所示。
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
,刪除下圖方框中的文字。
在左側(cè)Project區(qū)打開(kāi)新引入的Module\build.gradle
,修改compileSdkVersion
和targetSdkVersion
為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.gradle
的android{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.h
和string.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所示。
采用HyperLPR提供訓(xùn)練好的模型,識(shí)別準(zhǔn)確率為95%~97%,下載地址為https://github.com/zeusees/HyperLPR/tree/master。
2. APP測(cè)試結(jié)果
APP界面如下圖所示。
單擊主界面中的相機(jī)圖標(biāo)進(jìn)入相機(jī)界面拍攝帶車(chē)牌圖片,或單擊主界面中的圖片圖標(biāo)進(jìn)入選擇帶車(chē)牌圖片。單擊右上方垃圾桶圖標(biāo)可刪除已導(dǎo)入的圖片,單擊SUBMIT按鈕提交檢測(cè),如下圖所示。
圖片識(shí)別結(jié)果如下圖所示。
單擊“結(jié)果”頁(yè)面右上方圖標(biāo)可保存識(shí)別結(jié)果。保存的記錄可單擊“車(chē)牌識(shí)別”頁(yè)面左上角圖標(biāo)查看,如下圖所示。
測(cè)試示例如圖所示。
工程源代碼下載
詳見(jiàn)本人博客資源下載頁(yè)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-697418.html
其它資料下載
如果大家想繼續(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)!