Feldraucherkennung basierend auf Yolov8 (1)

Inhaltsverzeichnis

 1.Yolov8 Einführung

2. Einführung in den Rauchdatensatz für Waldbrände

2.1 Aufteilung des Datensatzes

1.2 Holen Sie sich den für yolov8 geeigneten Text über voc_label.py

2.3 Der generierte Inhalt ist wie folgt

3. Analyse der Trainingsergebnisse

4.Serie


 1.Yolov8 Einführung

         Ultralytics YOLOv8 ist die neueste Version des von Ultralytics entwickelten YOLO-Zielerkennungs- und Bildsegmentierungsmodells. YOLOv8 ist ein hochmodernes, hochmodernes (SOTA) Modell, das auf früheren YOLO-Erfolgen aufbaut und neue Funktionen und Verbesserungen einführt, um Leistung und Flexibilität weiter zu verbessern. Es kann auf große Datenmengen trainiert werden und kann auf einer Vielzahl von Hardwareplattformen ausgeführt werden, von CPUs bis hin zu GPUs.

Die konkreten Verbesserungen sind wie folgt:

  1. Backbone : Verwendet immer noch die Idee von CSP, aber das C3-Modul in YOLOv5 wurde durch das C2f-Modul ersetzt, wodurch eine weitere Gewichtsreduzierung erreicht wurde. Gleichzeitig verwendet YOLOv8 weiterhin das in YOLOv5 und anderen Architekturen verwendete SPPF-Modul;

  2. PAN-FPN : Es besteht kein Zweifel, dass YOLOv8 immer noch die Idee von ​​PAN verwendet, aber durch den Vergleich der Strukturdiagramme von YOLOv5 und YOLOv8 können wir sehen, dass YOLOv8 die Faltungsstruktur in der PAN-FPN-Upsampling-Phase in YOLOv5 löscht , und entfernt auch C3 Das Modul wird durch das C2f-Modul ersetzt;

  3. Entkoppelter Kopf : Riechen Sie etwas anderes? Ja, YOLOv8 geht an De Coupled-Head;

  4. Anchor-Free : YOLOv8 hat die vorherige Anchor-Base aufgegeben und die Idee von Anchor-Free verwendet .

  5. Verlustfunktion : YOLOv8 verwendet den VFL-Verlust als Klassifizierungsverlust und den DFL-Verlust + CIOU-Verlust als Klassifizierungsverlust.

  6. Beispielabgleich : YOLOv8 gibt den vorherigen IOU-Abgleich oder die einseitige Anteilszuweisungsmethode auf und verwendet stattdessen die Task-Aligned Assigner-Abgleichsmethode.

Das Framework-Diagramm finden Sie unter folgendem Link: Kurze Zusammenfassung der YOLOv8-Modellstruktur · Problem Nr. 189 · ultralytics/ultralytics · GitHub

2. Einführung in den Rauchdatensatz für Waldbrände

Die Datensatzgröße beträgt 737 Bilder, train:val:test wird zufällig 7:2:1 zugewiesen, Kategorie: Rauch

2.1 Aufteilung des Datensatzes

Holen Sie sich trainval.txt, val.txt, test.txt über split_train_val.py  

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的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.7
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()

1.2 Holen Sie sich den für yolov8 geeigneten Text über voc_label.py

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val']
classes = ["smoke"]   # 改成自己的类别
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
        # 标注越界修正
        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()# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val']
classes = ["smoke"]   # 改成自己的类别
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
        # 标注越界修正
        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 Der generierte Inhalt ist wie folgt

3. Analyse der Trainingsergebnisse

Die Trainingsergebnisse sind wie folgt:

Karte@0,5 0,839

YOLOv8n summary (fused): 168 layers, 3005843 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 4/4 [00:06<00:00,  1.55s/it]
                   all        199        177      0.749      0.859      0.839      0.469

4.Serie

1) Feldraucherkennung basierend auf Yolov8

2) Feldraucherkennung basierend auf Yolov8 (2): Mehrdimensionales kollaboratives Aufmerksamkeitsmodul MCA | Neueste Version im Jahr 2023.9

3) Feldraucherkennung basierend auf Yolov8 (3): dynamische Schlangenfaltung, um heftiges Wachstum zu erreichen | ICCV2023

4) Feldraucherkennung basierend auf Yolov8 (4): Channel Priority Convolution Attention (CPCA) | Neueste Veröffentlichung der Chinesischen Akademie der Wissenschaften im Jahr 2023 

 

Supongo que te gusta

Origin blog.csdn.net/m0_63774211/article/details/133043120
Recomendado
Clasificación