目錄
1.Yolov8介紹
2.數(shù)據(jù)集介紹
2.1數(shù)據(jù)集劃分
2.2 通過(guò)voc_label.py得到適合yolov8訓(xùn)練需要的
2.3生成內(nèi)容如下
3.訓(xùn)練結(jié)果分析
?4. 道路破損檢測(cè)系統(tǒng)設(shè)計(jì)
4.1?PySide6介紹
4.2?安裝PySide6
?4.3 道路破損檢測(cè)系統(tǒng)設(shè)計(jì)
1.Yolov8介紹
?????????Ultralytics YOLOv8是Ultralytics公司開發(fā)的YOLO目標(biāo)檢測(cè)和圖像分割模型的最新版本。YOLOv8是一種尖端的、最先進(jìn)的(SOTA)模型,它建立在先前YOLO成功基礎(chǔ)上,并引入了新功能和改進(jìn),以進(jìn)一步提升性能和靈活性。它可以在大型數(shù)據(jù)集上進(jìn)行訓(xùn)練,并且能夠在各種硬件平臺(tái)上運(yùn)行,從CPU到GPU。
具體改進(jìn)如下:
-
Backbone:使用的依舊是CSP的思想,不過(guò)YOLOv5中的C3模塊被替換成了C2f模塊,實(shí)現(xiàn)了進(jìn)一步的輕量化,同時(shí)YOLOv8依舊使用了YOLOv5等架構(gòu)中使用的SPPF模塊;
-
PAN-FPN:毫無(wú)疑問(wèn)YOLOv8依舊使用了PAN的思想,不過(guò)通過(guò)對(duì)比YOLOv5與YOLOv8的結(jié)構(gòu)圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結(jié)構(gòu)刪除了,同時(shí)也將C3模塊替換為了C2f模塊;
-
Decoupled-Head:是不是嗅到了不一樣的味道?是的,YOLOv8走向了Decoupled-Head;
-
Anchor-Free:YOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;
-
損失函數(shù):YOLOv8使用VFL Loss作為分類損失,使用DFL Loss+CIOU Loss作為分類損失;
-
樣本匹配:YOLOv8拋棄了以往的IOU匹配或者單邊比例的分配方式,而是使用了Task-Aligned Assigner匹配方式
框架圖提供見鏈接:Brief summary of YOLOv8 model structure · Issue #189 · ultralytics/ultralytics · GitHub
2.數(shù)據(jù)集介紹
道路破損數(shù)據(jù)集大小665,類別一類:pothole,按照8:1:1進(jìn)行數(shù)據(jù)集隨機(jī)生成。
2.1數(shù)據(jù)集劃分
通過(guò)split_train_val.py得到trainval.txt、val.txt、test.txt??
# coding:utf-8
import os
import random
import argparse
parser = argparse.ArgumentParser()
#xml文件的地址,根據(jù)自己的數(shù)據(jù)進(jìn)行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#數(shù)據(jù)集的劃分,地址選擇自己數(shù)據(jù)下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 0.9
train_percent = 0.8
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)
file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')
for i in list_index:
name = total_xml[i][:-4] + '\n'
if i in trainval:
file_trainval.write(name)
if i in train:
file_train.write(name)
else:
file_val.write(name)
else:
file_test.write(name)
file_trainval.close()
file_train.close()
file_val.close()
file_test.close()
2.2 通過(guò)voc_label.py得到適合yolov8訓(xùn)練需要的
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd
sets = ['train', 'val']
classes = ["pothole"] # 改成自己的類別
abs_path = os.getcwd()
print(abs_path)
def convert(size, box):
dw = 1. / (size[0])
dh = 1. / (size[1])
x = (box[0] + box[1]) / 2.0 - 1
y = (box[2] + box[3]) / 2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return x, y, w, h
def convert_annotation(image_id):
in_file = open('Annotations/%s.xml' % (image_id), encoding='UTF-8')
out_file = open('labels/%s.txt' % (image_id), 'w')
tree = ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
difficult = obj.find('difficult').text
#difficult = obj.find('Difficult').text
cls = obj.find('name').text
if cls not in classes or int(difficult) == 1:
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
float(xmlbox.find('ymax').text))
b1, b2, b3, b4 = b
# 標(biāo)注越界修正
if b2 > w:
b2 = w
if b4 > h:
b4 = h
b = (b1, b2, b3, b4)
bb = convert((w, h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for image_set in sets:
if not os.path.exists('labels/'):
os.makedirs('labels/')
image_ids = open('ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
list_file = open('%s.txt' % (image_set), 'w')
for image_id in image_ids:
list_file.write(abs_path + '/images/%s.jpg\n' % (image_id))
convert_annotation(image_id)
list_file.close()
2.3生成內(nèi)容如下
?
3.訓(xùn)練結(jié)果分析
confusion_matrix.png :列代表預(yù)測(cè)的類別,行代表實(shí)際的類別。其對(duì)角線上的值表示預(yù)測(cè)正確的數(shù)量比例,非對(duì)角線元素則是預(yù)測(cè)錯(cuò)誤的部分。混淆矩陣的對(duì)角線值越高越好,這表明許多預(yù)測(cè)是正確的。
?上圖是道路破損檢測(cè)訓(xùn)練,有圖可以看出 ,分別是破損和background FP。該圖在每列上進(jìn)行歸一化處理。則可以看出破損檢測(cè)預(yù)測(cè)正確的概率為67%。
F1_curve.png:F1分?jǐn)?shù)與置信度(x軸)之間的關(guān)系。F1分?jǐn)?shù)是分類的一個(gè)衡量標(biāo)準(zhǔn),是精確率和召回率的調(diào)和平均函數(shù),介于0,1之間。越大越好。
TP:真實(shí)為真,預(yù)測(cè)為真;
FN:真實(shí)為真,預(yù)測(cè)為假;
FP:真實(shí)為假,預(yù)測(cè)為真;
TN:真實(shí)為假,預(yù)測(cè)為假;
精確率(precision)=TP/(TP+FP)
召回率(Recall)=TP/(TP+FN)
F1=2*(精確率*召回率)/(精確率+召回率)
?labels_correlogram.jpg :顯示數(shù)據(jù)的每個(gè)軸與其他軸之間的對(duì)比。圖像中的標(biāo)簽位于 xywh 空間。
?labels.jpg :
(1,1)表示每個(gè)類別的數(shù)據(jù)量
(1,2)真實(shí)標(biāo)注的?bounding_box
(2,1) 真實(shí)標(biāo)注的中心點(diǎn)坐標(biāo)
(2,2)真實(shí)標(biāo)注的矩陣寬高
?P_curve.png:表示準(zhǔn)確率與置信度的關(guān)系圖線,橫坐標(biāo)置信度。由下圖可以看出置信度越高,準(zhǔn)確率越高。
?PR_curve.png :PR曲線中的P代表的是precision(精準(zhǔn)率),R代表的是recall(召回率),其代表的是精準(zhǔn)率與召回率的關(guān)系。
?R_curve.png :召回率與置信度之間關(guān)系
?results.png
?mAP_0.5:0.95表示從0.5到0.95以0.05的步長(zhǎng)上的平均mAP.
?預(yù)測(cè)結(jié)果:
?4. 道路破損檢測(cè)系統(tǒng)設(shè)計(jì)
4.1?PySide6介紹
????????受益于人工智能的崛起,Python語(yǔ)言幾乎以壓倒性優(yōu)勢(shì)在眾多編程語(yǔ)言中異軍突起,成為AI時(shí)代的首選語(yǔ)言。在很多情況下,我們想要以圖形化方式將我們的人工智能算法打包提供給用戶使用,這時(shí)候選擇以python為主的GUI框架就非常合適了。
????????PySide是Qt公司的產(chǎn)品,PyQt是第三方公司的產(chǎn)品,二者用法基本相同,不過(guò)在使用協(xié)議上卻有很大差別。PySide可以在LGPL協(xié)議下使用,PyQt則在GPL協(xié)議下使用。
????????PySide目前常見的有兩個(gè)版本:PySide2和PySide6。PySide2由C++版的Qt5開發(fā)而來(lái).,而PySide6對(duì)應(yīng)的則是C++版的Qt6。從PySide6開始,PySide的命名也會(huì)與Qt的大版本號(hào)保持一致,不會(huì)再出現(xiàn)類似PySide2對(duì)應(yīng)Qt5這種容易混淆的情況。
4.2?安裝PySide6
pip install --upgrade pip
pip install pyside6 -i https://mirror.baidu.com/pypi/simple
基于PySide6開發(fā)GUI程序包含下面三個(gè)基本步驟:
- 設(shè)計(jì)GUI,圖形化拖拽或手?jǐn)];
- 響應(yīng)UI的操作(如點(diǎn)擊按鈕、輸入數(shù)據(jù)、服務(wù)器更新),使用信號(hào)與Slot連接界面和業(yè)務(wù);
- 打包發(fā)布;
?4.3 道路破損檢測(cè)系統(tǒng)設(shè)計(jì)
系統(tǒng)如下,支持圖形輸入,攝像頭,rtsp流等:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-480827.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-480827.html
到了這里,關(guān)于基于Yolov8的道路破損檢測(cè)系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!