基于YOLOv8的車牌檢測與識別(CCPD2020數據集)

前言

本篇博客主要記錄在autodl服務器中基于yolov8實現車牌檢測與識別,以下記錄實現全過程~

yolov8源碼:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

一、環境配置

1、第一步:配置yolov8環境

使用云服務器autoDL

二、數據集準備

數據集下載地址:https://github.com/detectRecog/CCPD

1、數據集介紹

? ? ? ? CCPD2020數據集是一個大型的、多樣化的、經過仔細標注的中國城市車牌開源數據集。CCPD數據集主要分為CCPD2019數據集和CCPD2020(CCPD-Green)數據集。CCPD2019數據集車牌類型僅有普通車牌(藍色車牌),CCPD2020數據集車牌類型僅有新能源車牌(綠色車牌)。CCPD數據集沒有專門的標注文件,每張圖片的文件名就是該圖像對于的數據標注。? ??

數據集圖片命名規則:

025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg1. 025:車牌區域占整個畫面的比例;
2. 95_113: 車牌水平和垂直角度, 水平95°, 豎直113°
3. 154&383_386&473:標注框左上、右下坐標,左上(154, 383), 右下(386, 473)
4. 86&473_177&454_154&383_363&402:標注框四個角點坐標,順序為右下、左下、左上、右上
5. 0_0_22_27_27_33_16:車牌號碼映射關系如下: 第一個0為省份 對應省份字典provinces中的’皖’,;第二個0是該車所在地的地市一級代碼,對應地市一級代碼字典alphabets的’A’;后5位為字母和文字, 查看車牌號ads字典,如22為Y,27為3,33為9,16為S,最終車牌號碼為皖AY339S

省份:[“皖”, “滬”, “津”, “渝”, “冀”, “晉”, “蒙”, “遼”, “吉”, “黑”, “蘇”, “浙”, “京”, “閩”, “贛”,
“魯”, “豫”, “鄂”, “湘”, “粵”, “桂”, “瓊”, “川”, “貴”, “云”, “藏”, “陜”, “甘”, “青”, “寧”,
“新”]

地市:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’,
‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’,‘X’, ‘Y’, ‘Z’]

車牌字典:[‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’,
‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’,‘Y’, ‘Z’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’,
‘6’, ‘7’, ‘8’, ‘9’]
?

CCPD2019數據集包含將近30萬張圖片、圖片尺寸為720x1160x3,共包含8種類型圖片,每種類型、數量及類型說明如下表:

2、數據集制作

第一步:新建datasets目錄,將數據集上傳

第二步:解壓數據集,根據以下目錄結構制作訓練集、驗證集和測試集:

代碼如下:

import shutil
import cv2
import osdef txt_translate(path, txt_path):print(path)print(txt_path)for filename in os.listdir(path):# print(filename)list1 = filename.split("-", 3)  # 第一次分割,以減號'-'做分割subname = list1[2]list2 = filename.split(".", 1)subname1 = list2[1]if subname1 == 'txt':continuelt, rb = subname.split("_", 1)  # 第二次分割,以下劃線'_'做分割lx, ly = lt.split("&", 1)rx, ry = rb.split("&", 1)width = int(rx) - int(lx)height = int(ry) - int(ly)  # bounding box的寬和高cx = float(lx) + width / 2cy = float(ly) + height / 2  # bounding box中心點img = cv2.imread(path + filename)if img is None:  # 自動刪除失效圖片(下載過程有的圖片會存在無法讀取的情況)print(path + filename)os.remove(path + filename)continuewidth = width / img.shape[1]height = height / img.shape[0]cx = cx / img.shape[1]cy = cy / img.shape[0]txtname = filename.split(".", 1)txtfile = txt_path + txtname[0] + ".txt"# 綠牌是第0類,藍牌是第1類with open(txtfile, "w") as f:f.write(str(0) + " " + str(cx) + " " + str(cy) + " " + str(width) + " " + str(height))if __name__ == '__main__':# det圖片存儲地址trainDir = r"/root/ultralytics/datasets/CCPD2020/ccpd_green/train/"validDir = r"/root/ultralytics/datasets/CCPD2020/ccpd_green/val/"testDir = r"/root/ultralytics/datasets/CCPD2020/ccpd_green/test/"# det txt存儲地址train_txt_path = r"/root/ultralytics/datasets/platedata/labels/train/"val_txt_path = r"/root/ultralytics/datasets/platedata/labels/val/"test_txt_path = r"/root/ultralytics/datasets/platedata/labels/test/"txt_translate(trainDir, train_txt_path)txt_translate(validDir, val_txt_path)txt_translate(testDir, test_txt_path)

制作之后文件夾結構:

3、配置文件修改

第一步:在/root/ultralytics/ultralytics/cfg/datasets下復制COCO128數據集,重命名為CCPD2020.yaml

更改內容如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/detect/coco/
# Example usage: yolo train data=coco128.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── coco128  ← downloads here (7 MB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
#path: ../datasets/coco128  # dataset root dir
train: /root/ultralytics/datasets/platedata/images/train  # train images (relative to 'path') 128 images
val: /root/ultralytics/datasets/platedata/images/val  # val images (relative to 'path') 128 images
test: /root/ultralytics/datasets/platedata/images/test  # test images (optional)# Classes
names:0: license_plate# Download script/URL (optional)
#download: https://ultralytics.com/assets/coco128.zip

第二步:將/root/ultralytics/ultralytics/cfg/models/v8/yolov8.yaml下的nc改為1

第三步:修改/root/ultralytics/train_v8.py文件,更改內容如下:

4、開始訓練

運行python train_v8.py

訓練結果:

5. 車牌識別

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/16154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/16154.shtml
英文地址,請注明出處:http://en.pswp.cn/web/16154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學習:基礎語句

目錄 條件語句 循環語句 for 循環 while 循環 break continue 條件語句 Python提供了 if、elif、else 來進行邏輯判斷。格式如下: Pythonif 判斷條件1: 執行語句1... elif 判斷條件2: 執行語句2... elif 判斷條件3: 執行語句3... else: 執行語句4…

C# 集合(六) —— 自定義集合Collection類

總目錄 C# 語法總目錄 集合六 Collection 1. 自定義集合Collection其他 1. 自定義集合Collection Collection可以對添加刪除元素或者添加刪除屬性進行事件響應。 class Person {public string name;public int age;public Person(){this.name "";this.age 0;}pub…

ubuntu 硬盤轉移

我插了兩個 文件系統: ubuntu 硬盤轉移: sudo dd if/dev/sdX1 of/dev/sdY1 bs128K convnoerror,sync statusprogressdd 的意思是DiskToDisk,if 是輸入文件系統,of是輸出文件系統。 bs是每次傳遞的數據大小。 注意:接…

mysql-主從同步原理

AB復制(重點) 一、什么是主從復制? 1、主從同步也叫AB復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;主數據庫一般是準實時的業務數據庫。 2、主從復制的作用 1.做數據的熱備,作為后備數據庫,…

如何用MySQL的SQL語句來讀寫硬盤目錄文件

1.先確保創建表,例如起名Temp CREATE TABLE temp ( id int(11) NOT NULL AUTO_INCREMENT, image mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8; 注意這里的image字段用mediumblog,就可以避免出現data too …

27【Aseprite 作圖】盆栽——拆解

1 橘子畫法拆解 (1)淺色3 1 0;深色0 2 3 就可以構成一個橘子 (2)淺色 2 1;深色1 0 (小個橘子) (3)淺色 2 1 0;深色1 2 3 2 樹根部分 (1)底部畫一條橫線 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

省市區(輸入code) 轉相應省市區工具類(兩種方式)

方式一 通過調用接口(時間高達1s) package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.BufferedReader; import java.io.InputStreamReader; i…

Java 泛型基礎

目錄 1. 為什么使用泛型 2. 泛型的使用方式 2.1. 泛型類 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符號 3.1. 類型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符?的區別。 4. 泛型不變性 5. 泛型編譯時擦除 1. 為什么使用泛型 Java 為…

基于深度學習的入侵檢測系統綜述文獻概述

好長時間不發博客了,不是因為我擺爛了,是我換研究方向了,以后我就要搞科研了。使用博客記錄我的科研故事,邀諸君共同見證我的科研之路。 1、研究方向的背景是什么? (1)互聯網發展迅速&#xff…

Android firebase消息推送集成 FCM消息處理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一個服務,用于處理來自 Firebase 服務器的消息。它有幾個關鍵的方法,你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解釋這些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它們用于不同的情況,取決于你是否通過指針訪問結構體成員。

p->name&#xff1a;這是指針訪問運算符&#xff08;箭頭運算符&#xff09;。當 p 是一個指向結構體的指針時&#xff0c;用 p->name 來訪問結構體的成員。 student* p &stu; // p 是一個指向 student 類型的指針 cout << p->name << endl; // 通過…

基于ssm的蛋糕商城系統java項目jsp項目javaweb

文章目錄 蛋糕商城系統一、項目演示二、項目介紹三、系統部分功能截圖四、部分代碼展示五、底部獲取項目源碼&#xff08;9.9&#xffe5;帶走&#xff09; 蛋糕商城系統 一、項目演示 蛋糕商城管理系統 二、項目介紹 系統角色 : 管理員、用戶 一&#xff0c;管理員 管理員有…

PICO VR眼鏡定制播放器使用說明文檔videoplayerlib-ToB.apk

安裝高級定制播放器 高級定制播放器下載地址:https://download.csdn.net/download/ahphong/89360454 僅限用于PICO G2、G3、G4、NEO系列VR眼鏡上使用, 用途:用于第三方APP(開發者)調用定制播放器播放2D、3D、180、360全景視頻。 VR眼鏡系統請升級到最新版,可在官網下載,…

Mixed-precision計算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】選擇排序以及需要注意的問題

選擇排序的基本思想&#xff1a;每一次從待排序的數據元素中選出最小&#xff08;或最大&#xff09;的一個元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的數據元素排完 。 第一種實現方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金絲雀發布后續 + 聲明式資源管理yaml

目錄 一、K8S常見的發布方式 1.1藍綠發布 1.2灰度發布&#xff08;金絲雀發布&#xff09; 1.3滾動發布 二、金絲雀發布 三、聲明式管理方法 3.1YAML 語法格式 3.1.1查看 api 資源版本標簽 3.1.2查看資源簡寫 3.2YAML文件詳解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊屬性

特殊屬性 will-change will-change 屬性用于向瀏覽器提供提示,表明某個元素或其特定屬性在未來極有可能發生變化。這有助于瀏覽器提前優化相關渲染流程,提升動畫或其他動態效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++內存管理方式

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” C/C內存分布 在這篇文章開始之前&#xff0c;我們先以一道題目來進行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java進階學習筆記27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可變字符串對象&#xff0c;相當于一個容器&#xff0c;它里面裝的字符串是可以改變的&#xff0c;就是用來操作字符串的。 好處&#xff1a; StringBuilder比String更適合做字符串的修改操作&#xff0c;效率會更高&#xff0c;…

在CSDN上成長的感悟,你的粉絲長啥樣?

文章目錄 一、寫作的初衷1. 記錄所學內容2.鞏固所學知識3.分享與幫助4.方便后續查找5.獲取激勵 二、你的粉絲長啥樣&#xff1f;1. 粉絲的特點與困惑2. 關于粉絲&#xff0c;細思極恐 三、繼續前行、堅持初心 在CSDN上寫博文&#xff0c;對于我來說&#xff0c;不僅僅是一個記錄…