




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
項(xiàng)目9綜合應(yīng)用:火情識(shí)別算法研發(fā)及部署教學(xué)目標(biāo)能力目標(biāo)使用YOLOv8訓(xùn)練D-Fire數(shù)據(jù)集,完成火情檢測任務(wù)學(xué)會(huì)根據(jù)訓(xùn)練日志分析模型效果,并且進(jìn)行算法調(diào)優(yōu)掌握模型轉(zhuǎn)換的意義,了解主流的推理框架學(xué)會(huì)使用ONNX、OpenVINO和TensorRT推理框架進(jìn)行模型推理部署知識(shí)目標(biāo)掌握目標(biāo)檢測算法研發(fā)、優(yōu)化、應(yīng)用解決實(shí)際問題的動(dòng)手能力學(xué)會(huì)使用ONNX、OpenVINO、TensorRT框架進(jìn)行模型推理了解深度學(xué)習(xí)算法開發(fā)流程,具備數(shù)據(jù)處理、算法訓(xùn)練、算法調(diào)優(yōu)、模型轉(zhuǎn)換、推理部署全流程開發(fā)的能力工程目錄圖9-1是項(xiàng)目的主要文件和目錄結(jié)構(gòu)。其中utils目錄主要為整個(gè)項(xiàng)目用到的工具模塊,包括劃分?jǐn)?shù)據(jù)集、創(chuàng)建數(shù)據(jù)yaml文件、nms處理等;cfg目錄下面為本項(xiàng)目使用到的配置文件,一般為yaml格式pretrained_models目錄為本項(xiàng)目算法開發(fā)使用到的YOLOv8預(yù)訓(xùn)練模型;logs為算法訓(xùn)練過程中自動(dòng)創(chuàng)建的目錄,用于存放每次訓(xùn)練的日志和產(chǎn)生的模型;dataset目錄下為D-Fire開源數(shù)據(jù)集經(jīng)過YOLO格式轉(zhuǎn)換后的數(shù)據(jù),包括圖片和標(biāo)簽文件;deploy目錄為本項(xiàng)目重點(diǎn)內(nèi)容,主要為算法模型轉(zhuǎn)換和推理部署相關(guān)的代碼文件。另外,train.py和predict.py分別為模型訓(xùn)練和推理的腳本文件。圖9-1項(xiàng)目的主要文件和目錄結(jié)構(gòu)+--project9-1/|+--dataset/||+--dfiredataset/|||+--labels/||||+--test/||||+--train/||||+--val/|||+--images/||||+--test/||||+--train/||||+--val/|+--utils/||--data_utils.py||--create_yaml.py||--__init__.py||--split_data.py|+--pretrained_models/||--yolov8s.pt||--yolov8l.pt||--yolov8m.pt|+--logs/||+--train3/||+--train/||+--train2/|--predict.py|--train.py|+--deploy/||--onnxexport.py||--openvinoexport.py||--tensorrtexport.py||--yolov8runtimedeploy.py||+--onnxmodels/|||--yolov8m-best.pt|||--yolov8n-best.pt|||--yolov8s-best.pt||+--tensorrtmodels/|||--yolov8m-best.onnx|||--yolov8n-best.onnx|||--yolov8s-best.onnx||+--openvinomodels/|||--yolov8m-best.pt|||--yolov8n-best.pt|||--yolov8s-best.pt|||--yolov8n-best.onnx|||--yolov8s-best.onnx|||+--yolov8n-best_openvino_model/||||--yolov8n-best.xml||||--metadata.yaml||||--yolov8n-best.bin|||+--yolov8s-best_openvino_model/||||--metadata.yaml||||--yolov8s-best.xml||||--yolov8s-best.bin|+--cfg/||--fire_smok_detect.yaml||--yolov8.yaml目錄2推理框架及模型轉(zhuǎn)換1火情識(shí)別模型訓(xùn)練3火情識(shí)別模型部署目錄2推理框架及模型轉(zhuǎn)換3火情識(shí)別模型部署1火情識(shí)別模型訓(xùn)練1.火情識(shí)別模型訓(xùn)練任務(wù)目標(biāo)了解D-Fire開源數(shù)據(jù)集并且使用該數(shù)據(jù)集進(jìn)行項(xiàng)目開發(fā)根據(jù)實(shí)際任務(wù)選擇合理的YOLOv8算法模型修改算法工程配置,編寫代碼使用GPU啟動(dòng)訓(xùn)練學(xué)會(huì)分析訓(xùn)練指標(biāo)數(shù)據(jù)并且調(diào)整相應(yīng)超參數(shù)實(shí)現(xiàn)算法調(diào)優(yōu)1.1D-Fire數(shù)據(jù)集-基本情況
D-Fire是一個(gè)專門為火情識(shí)別算法設(shè)計(jì)的數(shù)據(jù)集,共21527張圖片,包括火災(zāi)和煙霧兩種火情事件,每張圖像均已經(jīng)根據(jù)YOLO格式進(jìn)行標(biāo)注。如表9-1所示,原始數(shù)據(jù)集已經(jīng)按照8:2進(jìn)行訓(xùn)練和測試集劃分。在實(shí)際工程中,通常劃分為訓(xùn)練集、驗(yàn)證集,劃分比例并沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),取決于實(shí)際數(shù)據(jù)集的大小。重要的是確保數(shù)據(jù)的隨機(jī)性,以避免數(shù)據(jù)的偏斜或重復(fù)。從表9-2可知,正樣本共有11689張,負(fù)樣本9838張,分布比較均衡。火情目標(biāo)包括火焰和煙霧,訓(xùn)練階段需要提供這兩種目標(biāo)的高質(zhì)量訓(xùn)練數(shù)據(jù),由表9-3可知,本數(shù)據(jù)集中火焰和煙霧目標(biāo)的數(shù)量比較接近,不存在類別數(shù)據(jù)分布不均衡的情況。如果不同類別的數(shù)據(jù)相差比較懸殊甚至不在一個(gè)數(shù)量級的情況,需要考慮通過增加數(shù)據(jù)或者數(shù)據(jù)增強(qiáng)的技術(shù)使得分布平衡。數(shù)據(jù)集圖片數(shù)占比訓(xùn)練1722180%測試430620%表9-1原始數(shù)據(jù)集劃分情況類別圖片數(shù)只有火焰1164只有煙霧5867同時(shí)存在火焰和煙霧4658火焰和煙霧均不存在9838表9-2數(shù)據(jù)集分布情況目標(biāo)框類型目標(biāo)框數(shù)量火焰14692煙霧11865表9-3目標(biāo)框(Boundingboxes)分布情況正樣本(火焰、煙霧)正樣本(火焰、煙霧)正樣本(煙霧)負(fù)樣本負(fù)樣本1.1D-Fire數(shù)據(jù)集-分析
D-Fire├─train│
├─images│
│
├─AoF00000.jpg│
│
└─AoF00002.jpg│
├─labels│
│
├─AoF00000.txt│
│
└─AoF00002.txt└─test│
├─images│
│
├─AoF06723.jpg│
│
├─AoF06724.jpg│
└─labels│
│
├─AoF06723.txt│
│
└─AoF06724.txtD-Fire├─images│
├─AoF00000.jpg│
├─AoF00002.jpg│
├─AoF06723.jpg│
├─AoF06724.jpg│
│
└─labels│
├─AoF00000.txt│
├─AoF00002.txt│
├─AoF06723.txt│
├─AoF06724.txt圖9-1D-Fire數(shù)據(jù)目錄圖9-3處理后的D-Fire數(shù)據(jù)目錄D-Fire數(shù)據(jù)集目錄結(jié)構(gòu)如下(圖9-1),與YOLO數(shù)據(jù)目錄格式存在著差異。本數(shù)據(jù)集需要重新劃分訓(xùn)練集、驗(yàn)證集并且按照YOLOv8工程目錄結(jié)構(gòu)調(diào)整數(shù)據(jù)目錄。考慮到本數(shù)據(jù)集數(shù)量較大,按訓(xùn)練集90%、驗(yàn)證集占10%的比例重新劃分。重新劃分?jǐn)?shù)據(jù)集前需要把train和test文件夾下的圖片和標(biāo)注文本數(shù)據(jù)整合到同一個(gè)文件夾下(如圖9-2),再重新進(jìn)行處理。為了保證圖片和標(biāo)注文本在劃分處理中保持一致性,先對圖片數(shù)據(jù)按比例進(jìn)行隨機(jī)劃分,再根據(jù)劃分的結(jié)果處理標(biāo)注文本數(shù)據(jù)。1.1D-Fire數(shù)據(jù)集-處理代碼
importrandomimportos#定義原始數(shù)據(jù)集路徑data_dir='../datasets/D-Fire/images'#定義劃分后數(shù)據(jù)集保存路徑train_images_dir='../datasets/dFireDataset2/images/train'val_images_dir='../datasets/dFireDataset2/images/val'test_images_dir='../datasets/dFireDataset2/images/test'#定義數(shù)據(jù)集劃分比例train_ratio=0.9val_ratio=0.1#定義統(tǒng)計(jì)指定文件夾下文件數(shù)的方法defcount_files_in_directory(directory):#初始化文件計(jì)數(shù)count=0#列舉文件夾下所有文件和文件夾forfilenameinos.listdir(directory):#獲取完整的文件路徑file_path=os.path.join(directory,filename)#判斷是否是文件而非文件夾ifos.path.isfile(file_path):count+=1returncount#STEP1:劃分圖片數(shù)據(jù)集#獲取原始數(shù)據(jù)集中所有樣本的文件名file_list=os.listdir(data_dir)random.shuffle(file_list)#計(jì)算劃分后的數(shù)據(jù)集大小total_samples=len(file_list)#print(f"total_samples:{total_samples}")train_size=int(train_ratio*total_samples)#print(f"train_size:{train_size}")val_size=int(val_ratio*total_samples)#print(f"val_size:{val_size}")#劃分?jǐn)?shù)據(jù)集train_files=file_list[:train_size]#print(f"train_images_size:{len(train_files)}")val_files=file_list[train_size:(train_size+val_size)]#print(f"val_images_size:{len(val_files)}")#test_files=file_list[(train_size+val_size):total_samples]#print(f"test_images_size:{len(test_files)}")#將樣本復(fù)制到對應(yīng)的文件夾中forfileintrain_files:os.system(f'cp{os.path.join(data_dir,file)}{os.path.join(train_images_dir,file)}')total_train_set=count_files_in_directory(os.path.join(train_images_dir))print(f"Totalnumberoftrain_images:{total_train_set}")forfileinval_files:os.system(f'cp{os.path.join(data_dir,file)}{os.path.join(val_images_dir,file)}')total_val_set=count_files_in_directory(os.path.join(val_images_dir))print(f"Totalnumberofval_images:{total_val_set}")#forfileintest_files:#os.system(f'cp{os.path.join(data_dir,file)}{os.path.join(test_images_dir,file)}')#total_test_set=count_files_in_directory(os.path.join(test_images_dir))#print(f"Totalnumberoftest_images:{total_test_set}")#STEP2:劃分標(biāo)注數(shù)據(jù)集#定義原始數(shù)據(jù)集路徑labels_dir='../datasets/D-Fire/labels'#定義劃分后數(shù)據(jù)集保存路徑train_labels_dir='../datasets/dFireDataset/labels/train'val_labels_dir='../datasets/dFireDataset/labels/val'#test_labels_dir='../datasets/dFireDataset/labels/test'#劃分訓(xùn)練標(biāo)簽數(shù)據(jù)集forfilenameinos.listdir(train_images_dir):file=filename.split('.')[0]label_name=file+".txt"os.system(f'cp{os.path.join(labels_dir,label_name)}{os.path.join(train_labels_dir,label_name)}')total_train_labels=count_files_in_directory(os.path.join(train_labels_dir))print(f"Totalnumberoftrain_labels:{total_train_labels}")#劃分驗(yàn)證標(biāo)簽數(shù)據(jù)集forfilenameinos.listdir(val_images_dir):file=filename.split('.')[0]label_name=file+".txt"os.system(f'cp{os.path.join(labels_dir,label_name)}{os.path.join(val_labels_dir,label_name)}')total_val_labels=count_files_in_directory(os.path.join(val_labels_dir))print(f"Totalnumberofval_labels:{total_val_labels}")#劃分測試標(biāo)簽數(shù)據(jù)集#forfilenameinos.listdir(test_images_dir):#file=filename.split('.')[0]#label_name=file+".txt"#os.system(f'cp{os.path.join(labels_dir,label_name)}{os.path.join(test_labels_dir,label_name)}')#total_test_labels=count_files_in_directory(os.path.join(test_labels_dir))#print(f"Totalnumberoftest_labels:{total_test_labels}")1.2YOLOv8算法模型選擇
YOLOv8是個(gè)模型簇,模型參數(shù)由小到大包括YOLOv8n、YOLOv8s、YOLOv8m、YOLOv8l、YOLOv8x五個(gè)模型,模型參數(shù)量越大,推理速度越慢,精度最高,需要的算力越強(qiáng)。具體情況如下:Modelsize
(pixels)mAPval
50-95Speed
CPUONNX
(ms)Speed
A100TensorRT
(ms)params
(M)FLOPs
(B)YOLOv8n64037.380.40.993.28.7YOLOv8s64044.9128.41.211.228.6YOLOv8m64050.2234.71.8325.978.9YOLOv8l64052.9375.22.3943.7165.2YOLOv8x64053.9479.13.5368.2257.8選擇模型需要根據(jù)實(shí)際條件綜合考慮數(shù)據(jù)集大小、數(shù)據(jù)集復(fù)雜度、部署算力類型、推理實(shí)時(shí)性要求等因素。一般來說,數(shù)據(jù)集在1000張左右的情況優(yōu)先使用輕量級的YOLOv8n,防止過擬合;數(shù)據(jù)集達(dá)到一萬張的情況下優(yōu)先使用YOLOv8s或者YOLOv8m,算法精度相對比YOLOv8n有較大的提升;數(shù)據(jù)集在十萬及以上級別可以使用復(fù)雜性比較高的YOLOv8l或者YOLOv8x。另外,需要檢測的目標(biāo)對象越多,目標(biāo)干擾因素越多需要選擇更大的模型才能保證算法效果。在實(shí)際的工程實(shí)踐中,往往需要嘗試訓(xùn)練幾個(gè)不同參數(shù)級別的模型進(jìn)行評估分析是否能滿足需求。前面已經(jīng)完成數(shù)據(jù)集的處理,共有21527張圖片,目標(biāo)對象為“火焰”和“煙霧”兩種,選用YOLOv8s進(jìn)行訓(xùn)練。下面進(jìn)行火情識(shí)別模型的訓(xùn)練和調(diào)優(yōu)。1.3YOLOv8環(huán)境搭建以及訓(xùn)練項(xiàng)目3已經(jīng)嘗試過使用CPU進(jìn)行小規(guī)模數(shù)據(jù)集的訓(xùn)練,本項(xiàng)目總數(shù)據(jù)量達(dá)到2萬多張,受CPU算力限制,訓(xùn)練時(shí)間比較長,而且能調(diào)整的超參數(shù)范圍有限。在此,選擇使用GPU進(jìn)行訓(xùn)練。值得注意的是使用GPU訓(xùn)練需要關(guān)注以下幾個(gè)超參數(shù)的設(shè)置:device超參數(shù)需要根據(jù)GPU的數(shù)量進(jìn)行設(shè)置,單張GPU(device=0)、兩張GPU(device=0,1)、多張GPU依此類推。batch超參數(shù)表示在更新模型內(nèi)部參數(shù)之前要處理多少張圖像,一般來說,較大的batch可以提高計(jì)算效率,因?yàn)榭梢圆⑿刑幚砀嗟臉颖荆瑫r(shí)也可以減少參數(shù)更新的頻率,使得每次更新的方向更加穩(wěn)定。然而,較小的batch可以更好地利用數(shù)據(jù)集,因?yàn)樵谝粋€(gè)batch中的樣本可能更加多樣化,有助于模型更好地學(xué)習(xí)數(shù)據(jù)的分布特征。在實(shí)際的工程應(yīng)用中,batch值取8的倍數(shù),在算力充足的情況下可以多嘗試不同的值進(jìn)行實(shí)驗(yàn)。epochs超參數(shù)表示訓(xùn)練的周期數(shù),每一個(gè)周期代表對整個(gè)數(shù)據(jù)集進(jìn)行一次完整的訓(xùn)練,調(diào)整該值會(huì)影響訓(xùn)練時(shí)間和模型性能。實(shí)際工程應(yīng)用中可以先迭代100次,查看訓(xùn)練日志中的loss值是否已經(jīng)收斂,若未收斂可增加次數(shù)。執(zhí)行以下指令安裝YOLOv8運(yùn)行環(huán)境,如果已經(jīng)安裝可忽略。pipinstallultralytics1.3YOLOv8環(huán)境搭建以及訓(xùn)練執(zhí)行以下指令安裝YOLOv8運(yùn)行環(huán)境,如果已經(jīng)安裝可忽略。pipinstallultralytics
fromultralyticsimportYOLO
#使用模型配置文件初始化YOLO對象model=YOLO("yolov8s.yaml")#從文件"yolov8s.pt"加載預(yù)訓(xùn)練的YOLO模型權(quán)重model=YOLO('yolov8s.pt')#定義數(shù)據(jù)配置的YAML文件路徑data_yaml="fire_smok_detect.yaml"results=model.train(data=data_yaml,
#數(shù)據(jù)集配置文件的路徑task='detect',#訓(xùn)練任務(wù):'detect'表示目標(biāo)檢測epochs=100,
#設(shè)置訓(xùn)練周期數(shù)為100imgsz=640,
#輸入圖像尺寸為640*640batch=16,
#設(shè)置批量大小為16device='0',
#訓(xùn)練所用設(shè)備('cpu'或'cuda')project='logs',
#訓(xùn)練日志保存路徑optimizer='auto'#自動(dòng)選擇優(yōu)化器)YOLOv8訓(xùn)練模塊已經(jīng)封裝在train()方法中,以下為訓(xùn)練代碼:1.3YOLOv8環(huán)境搭建以及訓(xùn)練-執(zhí)行結(jié)果UltralyticsYOLOv8.1.16Python-3.8.10torch-1.13.1+cu117CUDA:2(NVIDIAA100-SXM4-40GB,40396MiB)第一部分:engine/trainer:task=detect,mode=train,model=yolov8s.pt,data=fire_smok_detect.yaml,epochs=100,time=None,patience=100,batch=16,imgsz=640,save=True,save_period=-1,cache=False,device=2,workers=8,project=logs,name=train5,exist_ok=False,pretrained=True,optimizer=auto,verbose=True,seed=0,deterministic=True,single_cls=False,rect=False,cos_lr=False,close_mosaic=10,resume=False,amp=True,fraction=1.0,profile=False,freeze=None,multi_scale=False,overlap_mask=True,mask_ratio=4,dropout=0.0,val=True,split=val,save_json=False,save_hybrid=False,conf=None,iou=0.7,max_det=300,half=False,dnn=False,plots=True,source=None,vid_stride=1,stream_buffer=False,visualize=False,augment=False,agnostic_nms=False,classes=None,retina_masks=False,embed=None,show=False,save_frames=False,save_txt=False,save_conf=False,save_crop=False,show_labels=True,show_conf=True,show_boxes=True,line_width=None,format=torchscript,keras=False,optimize=False,int8=False,dynamic=False,simplify=False,opset=None,workspace=4,nms=False,lr0=0.01,lrf=0.01,momentum=0.937,weight_decay=0.0005,warmup_epochs=3.0,warmup_momentum=0.8,warmup_bias_lr=0.1,box=7.5,cls=0.5,dfl=1.5,pose=12.0,kobj=1.0,label_smoothing=0.0,nbs=64,hsv_h=0.015,hsv_s=0.7,hsv_v=0.4,degrees=0.0,translate=0.1,scale=0.5,shear=0.0,perspective=0.0,flipud=0.0,fliplr=0.5,mosaic=1.0,mixup=0.0,copy_paste=0.0,auto_augment=randaugment,erasing=0.4,crop_fraction=1.0,cfg=None,tracker=botsort.yaml,save_dir=logs/train5Overridingmodel.yamlnc=80withnc=2
fromnparamsmodulearguments0-11928ultralytics.nn.modules.conv.Conv[3,32,3,2]1-1118560ultralytics.nn.modules.conv.Conv[32,64,3,2]2-1129056ultralytics.nn.modules.block.C2f[64,64,1,True]3-1173984ultralytics.nn.modules.conv.Conv[64,128,3,2]4-12197632ultralytics.nn.modules.block.C2f[128,128,2,True]5-11295424ultralytics.nn.modules.conv.Conv[128,256,3,2]6-12788480ultralytics.nn.modules.block.C2f[256,256,2,True]7-111180672ultralytics.nn.modules.conv.Conv[256,512,3,2]8-111838080ultralytics.nn.modules.block.C2f[512,512,1,True]9-11656896ultralytics.nn.modules.block.SPPF[512,512,5]10-110torch.nn.modules.upsampling.Upsample[None,2,'nearest']11[-1,6]10ultralytics.nn.modules.conv.Concat[1]12-11591360ultralytics.nn.modules.block.C2f[768,256,1]13-110torch.nn.modules.upsampling.Upsample[None,2,'nearest']14[-1,4]10ultralytics.nn.modules.conv.Concat[1]15-11148224ultralytics.nn.modules.block.C2f[384,128,1]16-11147712ultralytics.nn.modules.conv.Conv[128,128,3,2]17[-1,12]10ultralytics.nn.modules.conv.Concat[1]18-11493056ultralytics.nn.modules.block.C2f[384,256,1]19-11590336ultralytics.nn.modules.conv.Conv[256,256,3,2]20[-1,9]10ultralytics.nn.modules.conv.Concat[1]21-111969152ultralytics.nn.modules.block.C2f[768,512,1]22[15,18,21]12116822ultralytics.nn.modules.head.Detect[2,[128,256,512]]Modelsummary:225layers,11136374parameters,11136358gradients,28.6GFLOPs
------------------------------------------------------------------------------------------------------------------------------------------第二部分:Transferred349/355itemsfrompretrainedweightsFreezinglayer'model.22.dfl.conv.weight'AMP:runningAutomaticMixedPrecision(AMP)checkswithYOLOv8n...AMP:checkspassed?train:Scanning/home/project9/dataset/dfiredataset/labels/train...17221images,7871backgrounds,6corrupt:100%|██████████|17221/17221[00:10<00:00,1585.47it/s]train:Newcachecreated:/home/project9/dataset/dfiredataset/labels/train.cachealbumentations:Blur(p=0.01,blur_limit=(3,7)),MedianBlur(p=0.01,blur_limit=(3,7)),ToGray(p=0.01),CLAHE(p=0.01,clip_limit=(1,4.0),tile_grid_size=(8,8))val:Scanning/home/project9/dataset/dfiredataset/labels/val...2152images,983backgrounds,0corrupt:100%|██████████|2152/2152[00:01<00:00,1458.08it/s]val:Newcachecreated:/home/project9/dataset/dfiredataset/labels/val.cachePlottinglabelstologs/train5/labels.jpg...optimizer:'optimizer=auto'found,ignoring'lr0=0.01'and'momentum=0.937'anddeterminingbest'optimizer','lr0'and'momentum'automatically...optimizer:SGD(lr=0.01,momentum=0.9)withparametergroups57weight(decay=0.0),64weight(decay=0.0005),63bias(decay=0.0)Imagesizes640train,640valUsing8dataloaderworkersLoggingresultstologs/train5------------------------------------------------------------------------------------------------------------------------------------------第三部分:Startingtrainingfor100epochs...
EpochGPU_membox_losscls_lossdfl_lossInstancesSize1/1003.59G1.6212.1151.52934640ClassImagesInstancesBox(PRmAP50mAP50-95)all215225900.5730.4790.5120.257......Closingdataloadermosaicalbumentations:Blur(p=0.01,blur_limit=(3,7)),MedianBlur(p=0.01,blur_limit=(3,7)),ToGray(p=0.01),CLAHE(p=0.01,clip_limit=(1,4.0),tile_grid_size=(8,8))......EpochGPU_membox_losscls_lossdfl_loss
InstancesSize
100/1003.66G
0.9270.50071.03627640ClassImages
Instances
Box(P
RmAP50
mAP50-95)all215225900.8070.750.8060.487
100epochscompletedin2.141hours.Optimizerstrippedfromlogs/train5/weights/last.pt,22.5MBOptimizerstrippedfromlogs/train5/weights/best.pt,22.5MB------------------------------------------------------------------------------------------------------------------------------------------第四部分:Validatinglogs/train5/weights/best.pt...UltralyticsYOLOv8.1.16Python-3.8.10torch-1.13.1+cu117CUDA:2(NVIDIAA100-SXM4-40GB,40396MiB)Modelsummary(fused):168layers,11126358parameters,0gradients,28.4GFLOPsClassImages
Instances
Box(PR
mAP50
mAP50-95)all215225900.7950.7560.8060.488smoke215211660.8290.8130.8470.548fire215214240.7610.6990.7650.429Speed:0.1mspreprocess,0.5msinference,0.0msloss,0.3mspostprocessperimageResultssavedtologs/train51.3YOLOv8環(huán)境搭建以及訓(xùn)練-算法效果分析訓(xùn)練結(jié)束后,需要對訓(xùn)練效果進(jìn)行評估分析,在logs文件夾可以找到文件名為“results.png”的圖片(如下圖所示),該圖對訓(xùn)練過程中的數(shù)據(jù)進(jìn)行了可視化。val/box_loss和val/cls_loss曲線分別表示驗(yàn)證數(shù)據(jù)集下框回歸損失值和類別分類損失值的變化過程,隨著訓(xùn)練周期增加,不斷下降;metrics/precision和metrics/recall曲線分別表示精準(zhǔn)率和召回率兩個(gè)指標(biāo)值的變化過程,隨著訓(xùn)練周期增加,不斷上升。在Epoch=50附近趨于穩(wěn)定,說明模型已經(jīng)收斂。再分析圖9-2的PR曲線,精準(zhǔn)率和召回率的值越大,代表算法的效果越好。整體上,煙霧目標(biāo)檢測的曲線處于火焰目標(biāo)檢測曲線上面,所以煙霧檢測效果更好。1.3YOLOv8環(huán)境搭建以及訓(xùn)練-算法模型調(diào)優(yōu)當(dāng)前版本模型已經(jīng)收斂,最終模型的平均準(zhǔn)確率達(dá)到80.6%,仍然存在一定的提升空間。但是,僅僅增加訓(xùn)練周期Epoch值已經(jīng)無法實(shí)現(xiàn)loss損失值繼續(xù)下降或者使得精準(zhǔn)率和召回率上升。影響算法訓(xùn)練效果的因素是多方面的,一般來說,在工程應(yīng)用上可以嘗試以下幾個(gè)方法進(jìn)行調(diào)優(yōu):調(diào)整模型訓(xùn)練的超參數(shù)。常用的超參數(shù)包括:1)優(yōu)化器optimizer,可以配置為SGD,Adam,Adamax,AdamW,NAdam,RAdam,RMSProp,auto等,不同的優(yōu)化器對訓(xùn)練的效果產(chǎn)生影響,YOLO系列算法可以優(yōu)先使用AdamW。2)學(xué)習(xí)率lr0,用于訓(xùn)練過程中更新網(wǎng)絡(luò)權(quán)重,學(xué)習(xí)率太大,梯度容易爆炸,loss的振幅較大,模型難以收斂;學(xué)習(xí)率太小,容易過擬合,也容易陷入“局部最優(yōu)”點(diǎn);在YOLO系列的訓(xùn)練中可以參考設(shè)置為0.0001;3)另外,flipud、fliplr、mosaic、mixup、copy_paste也是常用的數(shù)據(jù)增強(qiáng)超參數(shù),增加訓(xùn)練數(shù)據(jù)的多樣性,提供模型的訓(xùn)練效果。更換更復(fù)雜的模型版本。前面提到過YOLOv8模型參數(shù)量由小到大分為n、s、m、l、x五個(gè)版本,模型參數(shù)量越大表征能力越強(qiáng),可以多嘗試跑幾個(gè)更大的版本進(jìn)行比較。當(dāng)然訓(xùn)練數(shù)據(jù)量較小的情況下,模型參數(shù)量過大,容易出現(xiàn)過擬合現(xiàn)象。清洗訓(xùn)練數(shù)據(jù)集。訓(xùn)練數(shù)據(jù)的質(zhì)量對算法訓(xùn)練的效果也有較大的影響,本項(xiàng)目使用的D-Fire數(shù)據(jù)集存在負(fù)樣本比較多、標(biāo)注不準(zhǔn)確、圖片分辨率過低等問題。經(jīng)過人工清洗減少負(fù)樣本圖片、修正標(biāo)注不準(zhǔn)確的目標(biāo)框后再進(jìn)行訓(xùn)練效果會(huì)有較大的提升。目錄2推理框架及模型轉(zhuǎn)換3火情識(shí)別模型部署1火情識(shí)別模型訓(xùn)練2.推理框架及模型轉(zhuǎn)換
任務(wù)目標(biāo)(1)了解模型工程化必要性及整體流程(2)掌握YOLOv8模型轉(zhuǎn)換為其他格式方法2.1模型訓(xùn)練和推理框架
模型訓(xùn)練和推理是深度學(xué)習(xí)模型開發(fā)過程中的兩個(gè)關(guān)鍵階段,它們使用不同的框架來完成各自的任務(wù)。訓(xùn)練框架用于模型訓(xùn)練階段,更注重計(jì)算能力和靈活性。在這個(gè)階段,模型通過大量的數(shù)據(jù)進(jìn)行學(xué)習(xí),以識(shí)別數(shù)據(jù)中的模式和關(guān)系,常見的訓(xùn)練框架有PyTorch、TensorFlow、Keras、PaddlePaddle,具有以下特點(diǎn):計(jì)算密集型:訓(xùn)練通常需要大量的計(jì)算資源,一般需要使用GPU可擴(kuò)展性:支持分布式訓(xùn)練,以加快訓(xùn)練過程調(diào)試和優(yōu)化:提供工具和接口調(diào)試模型超參數(shù),方便模型調(diào)優(yōu)推理框架用于模型部署和實(shí)際應(yīng)用階段,更注重效率和穩(wěn)定性。在這個(gè)階段,模型已經(jīng)訓(xùn)練完成,需要在實(shí)際應(yīng)用中快速準(zhǔn)確地給出結(jié)果。常用的推理框架有TensorRT、OpenVINO、ONNXRUNTIME、TNN,具有以下特點(diǎn):高效率:推理框架通常優(yōu)化了模型的執(zhí)行效率,以減少延遲和提高響應(yīng)速度。低資源消耗:推理時(shí)對計(jì)算資源的需求通常低于訓(xùn)練階段。高適應(yīng)性:支持在多種平臺(tái)上運(yùn)行,包括服務(wù)器、移動(dòng)設(shè)備和嵌入式系統(tǒng)。穩(wěn)定性:推理框架需要保證模型的穩(wěn)定性和可靠性。2.1模型訓(xùn)練和推理框架
實(shí)際上,訓(xùn)練框架一般也具備模型推理的能力。訓(xùn)練框架大部分的功能體現(xiàn)在更靈活的進(jìn)行算法訓(xùn)練調(diào)優(yōu),依賴的環(huán)境更復(fù)雜,需要安裝的組件更多,對算力資源的要求比較高。但是,模型推理階段往往不需要使用這些組件,造成了資源浪費(fèi)。而且,在邊緣盒子或者終端設(shè)備上,算力資源有限,無法滿足訓(xùn)練框架的部署。推理框架提供更輕量的部署環(huán)境,并且針對不同的芯片進(jìn)行模型網(wǎng)絡(luò)優(yōu)化,具有更高的推理性能。2.2常用推理框架-ONNX通過不同訓(xùn)練框架研發(fā)出來的模型用不同的格式表示。PyTorch通常保存為.pt或.pth文件,TensorFlow通常輸出為.pb格式文件,Keras可以輸出.h5或.hd5格式文件。不同的原始模型格式在選擇不同推理框架進(jìn)行部署時(shí)需要進(jìn)行格式轉(zhuǎn)換。ONNX格式是一個(gè)開放的模型標(biāo)準(zhǔn),用于表示深度學(xué)習(xí)模型,使得模型可以在不同的深度學(xué)習(xí)框架之間靈活轉(zhuǎn)換。主流訓(xùn)練框架輸出的模型均可統(tǒng)一為ONNX格式,基于ONNX格式可以再轉(zhuǎn)換為其他的推理格式。#安裝onnxpipinstallonnx==1.13.1#安裝ONNXRuntimeCPU版本pipinstallonnxruntime#安裝ONNXRuntimeGPU版本pipinstallonnxruntime-gpu以下為ONNX開發(fā)環(huán)境搭建過程:以下代碼實(shí)現(xiàn)PyTorch框架訓(xùn)練出來的.pt格式模型轉(zhuǎn)換為onnx格式:fromultralyticsimportYOLOimportsyssys.path.append("/home/project9/")
defyolo_export():
#定義檢測模型的文件名,這里使用的是PyTorch格式的模型文件DET_MODEL_NAME="deploy/onnxmodels/yolov8n-best.pt"
#加載檢測模型,這里假設(shè)YOLO類能夠處理PyTorch格式的模型model=YOLO(DET_MODEL_NAME)
#導(dǎo)出模型為ONNX格式,指定ONNX操作集版本為12#path參數(shù)指定了導(dǎo)出的ONNX模型文件的存儲(chǔ)路徑model.export(format='onnx',opset=12)
if__name__=='__main__':yolo_export()2.2常用推理框架-ONNX以下為代碼運(yùn)行結(jié)果,在模型文件目錄下出現(xiàn)了后綴為onnx的模型文件yolov8n-best.onnxUltralyticsYOLOv8.1.16
Python-3.8.10torch-1.11.0+cpuCPU(12thGenIntelCore(TM)i7-1255U)Modelsummary(fused):168layers,3006038parameters,0gradients,8.1GFLOPs
PyTorch:startingfrom'../project9/weight/yolov8n-best.pt'withinputshape(1,3,640,640)BCHWandoutputshape(s)(1,6,8400)(6.0MB)
ONNX:startingexportwithonnx1.15.0opset12...ONNX:exportsuccess?2.1s,savedas'../project9/weight/yolov8n-best.onnx'(11.7MB)
Exportcomplete(4.8s)Resultssavedto/home/gao/project9/weightPredict:yolopredicttask=detectmodel=../project9/weight/yolov8n-best.onnximgsz=640Validate:yolovaltask=detectmodel=../project9/weight/yolov8n-best.onnximgsz=640data=fire_smok_detect.yamlVisualize:https://netron.app2.3常用推理框架-OpenVINOOpenVINO(OpenVisualInference&NeuralNetworkOptimization)是由英特爾公司開發(fā)的一款開源庫和工具集,旨在加速深度學(xué)習(xí)推理任務(wù),特別是在邊緣設(shè)備上。OpenVINO工具套件利用了英特爾硬件的架構(gòu)優(yōu)勢,通過自動(dòng)優(yōu)化和精確調(diào)整,實(shí)現(xiàn)深度學(xué)習(xí)模型的高效執(zhí)行。通過OpenVINO,開發(fā)者可以構(gòu)建高性能、低延遲的深度學(xué)習(xí)應(yīng)用,特別是在資源受限的邊緣設(shè)備上,這使得它成為實(shí)現(xiàn)智能邊緣計(jì)算的理想選擇。跨平臺(tái)支持:OpenVINO支持多種操作系統(tǒng)和硬件平臺(tái),包括Windows、Linux、macOS以及各種英特爾體系的嵌入式設(shè)備模型優(yōu)化:OpenVINO提供了模型優(yōu)化器,將訓(xùn)練好的深度學(xué)習(xí)模型轉(zhuǎn)換為優(yōu)化后的IR表示,以適應(yīng)不同的硬件加速器推理加速:利用英特爾硬件的專用指令集進(jìn)行優(yōu)化,推理速度提升顯著支持多種框架:OpenVINO支持從流行的深度學(xué)習(xí)框架(如TensorFlow、PyTorch等)導(dǎo)出的模型或者通過ONNX進(jìn)行格式轉(zhuǎn)換2.3常用推理框架-OpenVINO以下代碼實(shí)現(xiàn)PyTorch框架訓(xùn)練出來的.pt格式模型轉(zhuǎn)換為OpenVINO格式:pipinstallopenvino-dev以下為OpenVINO開發(fā)環(huán)境搭建過程:fromultralyticsimportYOLOfrompathlibimportPathimportsyssys.path.append("/home/project9-1/")
defexport():#定義檢測模型的文件名,這里使用的是PyTorch格式的模型文件DET_MODEL_NAME="deploy/openvinomodels/yolov8s-best.pt"#加載檢測模型det_model=YOLO(DET_MODEL_NAME)#構(gòu)建導(dǎo)出模型的路徑,路徑包括模型原始路徑的父目錄,加上導(dǎo)出目錄和導(dǎo)出的XML文件名det_model_path=Path(f"{DET_MODEL_NAME}_openvino_model/{DET_MODEL_NAME}.xml")#檢查導(dǎo)出的OpenVINO模型XML文件是否存在ifnotdet_model_path.exists():#如果XML文件不存在,則導(dǎo)出OpenVINO格式模型#format="openvino"指定導(dǎo)出格式為OpenVINO#dynamic=True表示導(dǎo)出動(dòng)態(tài)尺寸的模型#half=False表示不使用半精度浮點(diǎn)數(shù),保持模型為全精度浮點(diǎn)數(shù)det_model.export(format="openvino",dynamic=True,half=False)
if__name__=='__main__':export()以下為代碼運(yùn)行結(jié)果,在模型文件目錄下先生成onnx格式文件,再自動(dòng)創(chuàng)建名為“yolov8s-best_openvino_model”的文件夾,并且生成yaml、bin和xml三個(gè)文件。UltralyticsYOLOv8.1.16Python-3.8.10torch-1.11.0+cpuCPU(12thGenIntelCore(TM)i7-1255U)Modelsummary(fused):168layers,11126358parameters,0gradients,28.4GFLOPsPyTorch:startingfrom'../project9/deploy/openvinomodels/yolov8s-best.pt'withinputshape(1,3,640,640)BCHWandoutputshape(s)(1,6,8400)(21.5MB)ONNX:startingexportwithonnx1.15.0opset12...ONNX:exportsuccess?2.0s,savedas'../project9/deploy/openvinomodels/yolov8s-best.onnx'(42.6MB)OpenVINO:startingexportwithopenvino2024.0.0-14509-34caeefd078-releases/2024/0...OpenVINO:exportsuccess?0.8s,savedas'../project9/deploy/openvinomodels/yolov8s-best_openvino_model/'(42.7MB)Exportcomplete(4.9s)Resultssavedto/home/gao/project9/deploy/openvinomodelsPredict:yolopredicttask=detectmodel=../project9/deploy/openvinomodels/yolov8s-best_openvino_modelimgsz=640Validate:yolovaltask=detectmodel=../project9/deploy/openvinomodels/yolov8s-best_openvino_modelimgsz=640data=fire_smok_detect.yamlVisualize:https://netron.app2.4常用推理框架-TensorRTTensorRT是一個(gè)由NVIDIA開發(fā)的深度學(xué)習(xí)推理引擎,它專為優(yōu)化和加速深度學(xué)習(xí)模型的推理過程而設(shè)計(jì)。TensorRT支持多種深度學(xué)習(xí)框架,如TensorFlow、PyTorch、Caffe等,能夠?qū)⑦@些框架訓(xùn)練好的模型轉(zhuǎn)換為TensorRT優(yōu)化過的模型格式。TensorRT的主要特點(diǎn)包括:性能優(yōu)化:TensorRT能夠?qū)δP瓦M(jìn)行深度優(yōu)化,包括層融合、精度校準(zhǔn)、內(nèi)存訪問優(yōu)化等,從而顯著提升模型的推理速度。多精度支持:除了支持標(biāo)準(zhǔn)的FP32精度外,TensorRT還支持FP16和INT8精度,這有助于在保持模型性能的同時(shí)減少計(jì)算資源的消耗。動(dòng)態(tài)形狀支持:TensorRT支持動(dòng)態(tài)輸入形狀,使得模型能夠適應(yīng)不同大小的輸入數(shù)據(jù),增強(qiáng)了模型的靈活性。API豐富:TensorRT提供了豐富的API,便于開發(fā)者進(jìn)行模型轉(zhuǎn)換、優(yōu)化和部署。硬件加速:TensorRT能夠充分利用NVIDIAGPU的硬件加速能力,實(shí)現(xiàn)高效的并行計(jì)算。2.4常用推理框架-TensorRTtensorRT開發(fā)環(huán)境搭建過程比較復(fù)雜,主要分為以下幾個(gè)步驟:STEP1:確認(rèn)系統(tǒng)環(huán)境?檢查Ubuntu發(fā)行版本:使用命令cat/etc/lsb-release?檢查CUDA版本:使用命令
ls-l/usr/local/|grepcudaSTEP2:下載tensorRT安裝包?訪問NVIDIA的TensorRT下載頁面:/tensorrt/download?選擇與CUDA版本、操作系統(tǒng)版本相匹配的TensorRT版本。以上兩步可知運(yùn)行環(huán)境CUDA版本為11.5,操作系統(tǒng)為Ubuntu20.04.5,可選擇TensorRT8.6版本下載。從官網(wǎng)可以了解到Linux系統(tǒng)支持Debian,RPM和TAR三種安裝方式。本項(xiàng)目使用TAR方式安裝。2.4常用推理框架-TensorRTSTEP3:安裝tensorRT安裝包解壓tarxzvfTensorRT-.Linux.x86_64-gnu.cuda-11.8.tar.gz將TensorRT的庫路徑添加到LD_LIBRARY_PATH環(huán)境變量exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/TensorRT-/lib進(jìn)入TensorRT目錄,安裝PythonTensorRTwheel文件(python3.8.10) cdTensorRT-/python&&llpipinstalltensorrt-8.6.1-cp38-none-linux_x86_64.whl?安裝UFF,支持tensorflow模型轉(zhuǎn)化cdTensorRT-/uff/&&llpipinstalluff-0.6.9-py2.py3-none-any.whl?安裝graphsurgeon,支持自定義結(jié)構(gòu)cdTensorRT-/graphsurgeon/&&llpipinstallgraphsurgeon-0.4.6-py2.py3-none-any.whl注意事項(xiàng):確保TensorRT版本與CUDA和cuDNN版本兼容2.4常用推理框架-TensorRT以下代碼實(shí)現(xiàn)兩種算法模型轉(zhuǎn)換成tensorRT專用的engine格式,方法一使用YOLO框架自帶的工具進(jìn)行轉(zhuǎn)換,該方法更簡單,但是只針對YOLO的pt算法模型;方法二使用tensorRT工具進(jìn)行模型轉(zhuǎn)換,該方法需要先把原始模式格式轉(zhuǎn)換為onnx中間表示格式,再轉(zhuǎn)換為engine格式,該方式相對復(fù)雜,可以根據(jù)開發(fā)習(xí)慣選用任意一種方式進(jìn)行轉(zhuǎn)換。fromultralyticsimportYOLOimportsysimporttimeimporttensorrtastrtimportosos.environ['CUDA_MODULE_LOADING']='LAZY'sys.path.append("/home/project9-1/")
defyolo_export(model_path):#加載檢測模型,這里假設(shè)YOLO類能夠處理ONNX格式的模型model=YOLO(model_path)#導(dǎo)出模型為TensorRTengine格式,device=6表示使用第6個(gè)GPU設(shè)備進(jìn)行導(dǎo)出model.export(format='engine',device=6)
deftrt_export(onnx_model_path,engine_model_path):TRT_LOGGER=trt.Logger(trt.Logger.WARNING)convert_start=time.time()withopen(onnx_model_path,'rb')asf:onnx_bytes=f.read()#創(chuàng)建builder和networkbuilder=trt.Builder(TRT_LOGGER)network=builder.create_network(1<<int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))#創(chuàng)建parser并解析ONNX模型parser=trt.OnnxParser(network,TRT_LOGGER)ifnotparser.parse(onnx_bytes):print('FailedtoparsetheONNXmodel')exit()#配置builderconfig=builder.create_builder_config()#config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE,1<<20)config.max_workspace_size=1<<20config.set_flag(trt.BuilderFlag.FP16)#優(yōu)化網(wǎng)絡(luò)builder.max_batch_size=1#根據(jù)需要設(shè)置batchsizeengine=builder.build_engine(network,config)withopen(engine_model_path,'wb')asf:f.write(engine.serialize())convert_end=time.time()print('Ittakes:%fsforconverting.'%(convert_end-convert_start))
if__name__=='__main__':#pt_model_path="deploy/tensorrtmodels/yolov8n-best.pt"onnx_model_path="deploy/tensorrtmodels/yolov8n-best.onnx"engine_model_path="deploy/tensorrtmodels/yolov8n-best.engine"#方法一:使用yolo工具進(jìn)行模型轉(zhuǎn)換(支持pt格式轉(zhuǎn)engine格式)#yolo_export(pt_model_path)#方法二:使用tensorRT工具進(jìn)行模型轉(zhuǎn)換(支持onnx格式轉(zhuǎn)engine格式)trt_export(onnx_model_path,engine_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年證券從業(yè)資格證考試復(fù)習(xí)準(zhǔn)備與知識(shí)整合試題及答案
- 規(guī)范體電子警察系統(tǒng)技術(shù)投標(biāo)文件
- 行政管理師考試發(fā)展方向展望及試題及答案
- 2025年銀行從業(yè)資格考試真題研究試題及答案
- 廣東、上海科學(xué)推理系統(tǒng)課講義-物理部分
- 2025年證券從業(yè)資格證考生須知試題及答案
- 尋找靈感2025年證券從業(yè)考試試題及答案
- 2025年證券從業(yè)資格證知識(shí)框架試題及答案
- 技能 課題 申報(bào)書
- 證券從業(yè)資格證的預(yù)測試題及答案
- 食品小攤販備案卡(樣式)及說明
- 針刀操作安全區(qū)帶
- THBFIA 0004-2020 紅棗制品標(biāo)準(zhǔn)
- GB/T 6072.1-2000往復(fù)式內(nèi)燃機(jī)性能第1部分:標(biāo)準(zhǔn)基準(zhǔn)狀況,功率、燃料消耗和機(jī)油消耗的標(biāo)定及試驗(yàn)方法
- 蘇教版科學(xué)(2017)六年級下冊教學(xué)計(jì)劃及教學(xué)進(jìn)度表
- 測量小燈泡的功率實(shí)驗(yàn)報(bào)告單
- 圖書館建筑設(shè)計(jì)規(guī)范講解課件
- 四川省教師資格認(rèn)定體檢表
- 培養(yǎng)中班幼兒正確使用筷子的研究的結(jié)題報(bào)告
- 湘教版七年級上冊等高線地形圖
- 車間改造合同范文
評論
0/150
提交評論