【閑魚服務】
基于YOLOv11訓練無人機視角Visdrone2019數據集
- Visdrone2019數據集介紹
- 數據集格式
- 數據預處理
- yolov11模型訓練
- 數據分布情況可視化
- 訓練結果
Visdrone2019數據集介紹
VisDrone 數據集 是由中國天津大學機器學習和數據挖掘實驗室 AISKYEYE 團隊創建的大規模基準。它包含用于與無人機圖像和視頻分析相關的各種計算機視覺任務的,經過仔細標注的真實數據。
VisDrone 由 288 個視頻片段(包含 261,908 幀)和 10,209 張靜態圖像組成,這些數據由各種無人機載攝像頭拍攝。該數據集涵蓋了廣泛的方面,包括地點(中國 14 個不同的城市)、環境(城市和鄉村)、物體(行人、車輛、自行車等)和密度(稀疏和擁擠的場景)。該數據集是在不同的場景以及天氣和光照條件下,使用各種無人機平臺收集的。這些幀通過手動方式進行了標注,包含超過 260 萬個目標的邊界框,例如行人、汽車、自行車和三輪車。此外,還提供了場景可見性、物體類別和遮擋等屬性,以更好地利用數據。
類別:
??0:Pedestrian(行人)
??1:People(人群)
??2:Bicycle(自行車)
??3:Car(汽車)
??4:Van(廂式貨車)
??5:Truck(卡車)
??6:Tricycle(三輪車)
??7:Awning-tricycle(帶棚三輪車)
??8:Bus(公交車)
??9:Motor(摩托車)
數據集格式
- 邊界框左上角的x坐標
- 邊界框左上角的y坐標
- 邊界框的寬度
- 邊界框的高度
- GROUNDTRUTH文件中的分數設置為1或0。1表示在計算中考慮邊界框,而0表示將忽略邊界框。
- 類別:忽略區域(0)、行人(1)、人(2)、自行車(3)、汽車(4)、面包車(5)、卡車(6)、三輪車(7)、雨篷三輪車(8)、公共汽車(9)、摩托車(10),其他(11)。
- GROUNDTRUTH文件中的得分表示對象部分出現在幀外的程度(即,無截斷=0(截斷比率0%),部分截斷=1(截斷比率1%°′50%))。
- GROUNDTRUTH文件中的分數表示被遮擋的對象的分數(即,無遮擋=0(遮擋比率0%),部分遮擋=1(遮擋比率1%°′50%),重度遮擋=2(遮擋率50%~100%))。
數據預處理
將數據處理成yolo的格式
yolo格式如下:
visdrone2yolo.py
import os
from pathlib import Path
import argparsedef visdrone2yolo(dir):from PIL import Imagefrom tqdm import tqdmdef convert_box(size, box):# Convert VisDrone box to YOLO xywh boxdw = 1. / size[0]dh = 1. / size[1]return (box[0] + box[2] / 2) * dw, (box[1] + box[3] / 2) * dh, box[2] * dw, box[3] * dh(dir / 'labels').mkdir(parents=True, exist_ok=True) # make labels directorypbar = tqdm((dir / 'annotations').glob('*.txt'), desc=f'Converting {dir}')for f in pbar:img_size = Image.open((dir / 'images' / f.name).with_suffix('.jpg')).sizelines = []with open(f, 'r') as file: # read annotation.txtfor row in [x.split(',') for x in file.read().strip().splitlines()]:if row[4] == '0': # VisDrone 'ignored regions' class 0continuecls = int(row[5]) - 1 # 類別號-1box = convert_box(img_size, tuple(map(int, row[:4])))lines.append(f"{cls} {' '.join(f'{x:.6f}' for x in box)}\n")with open(str(f).replace(os.sep + 'annotations' + os.sep, os.sep + 'labels' + os.sep), 'w') as fl:fl.writelines(lines) # write label.txtif __name__ == '__main__':# Create an argument parser to handle command-line argumentsparser = argparse.ArgumentParser()parser.add_argument('--dir_path', type=str, default=r'E:\datasets\visdrone2019', help='visdrone數據集路徑')args = parser.parse_args()dir = Path(args.dir_path)# Convertfor d in 'VisDrone2019-DET-train', 'VisDrone2019-DET-val', 'VisDrone2019-DET-test-dev':visdrone2yolo(dir / d) # convert VisDrone annotations to YOLO labels
yolov11模型訓練
VisDrone.yaml
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Crack-seg dataset by Ultralytics
# Documentation: https://docs.ultralytics.com/datasets/segment/crack-seg/
# Example usage: yolo train data=crack-seg.yaml
# parent
# ├── ultralytics
# └── datasets
# └── crack-seg ← downloads here (91.2 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: D:/Desktop/XLWD/dataset/VisDrone2019/visdrone2019/VisDrone2019-DET-train # dataset root dir
train: images/train # train images (relative to 'path') 3717 images
val: images/val # val images (relative to 'path') 112 images
test: images/test # test images (optional)
# test: test/images # test images (relative to 'path') 200 imagesnc: 10
# Classes
names:0: pedestrian1: people2: bicycle3: car4: van5: truck6: tricycle7: awning-tricycle8: bus9: motor
訓練腳本 train.py
from ultralytics import YOLO# import os
# os.environ['CUDA_LAUNCH_BLOCKING'] = '1'
# # 消除異步性,但是會帶來性能的損失
if __name__ == '__main__':# Load a COCO-pretrained YOLO11n model# model = YOLO("yolo11n.pt")model = YOLO(r"D:/SSJ/Work/ultralytics-main/yolo11n.pt",task='detect') # yolo11n-seg.pt segment# model = YOLO(r"D:/SSJ/Work/ultralytics-main/yolo11n.pt",task='detect')# model = YOLO(r"D:/SSJ/Work/ultralytics-main/runs/detect/train30/weights/best.pt",task='detect')# # Train the model on the COCO8 example dataset for 100 epochsresults = model.train(data="D:/Desktop/XLWD/dataset/ultralytics-8.3.39/demo/insulatorAndPersonDetect.yaml", epochs=100, batch=64,device=0,workers = 2)# imgsz=320,
數據分布情況可視化
數據特點:數據不同類別的數量不均衡,小目標較多
訓練結果
可以看出最終的結果只有car的識別準確率比較高,其余的都相對較低,當然這是由于訓練不充分導致的。
訓練過程中的loss以及準確率如上,雖然最終準確率停留在0.45左右,但是已經比其他文章里的效果要好得多了,畢竟才訓練了100個epoch。