人工智能技術(shù)及應用 課件 ch5-攝像頭模糊檢測_第1頁
人工智能技術(shù)及應用 課件 ch5-攝像頭模糊檢測_第2頁
人工智能技術(shù)及應用 課件 ch5-攝像頭模糊檢測_第3頁
人工智能技術(shù)及應用 課件 ch5-攝像頭模糊檢測_第4頁
人工智能技術(shù)及應用 課件 ch5-攝像頭模糊檢測_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

5攝像頭模糊檢測SMART+FUTUREChapter05本章目錄數(shù)據(jù)采集與標注01模型訓練02模型量化03項目源碼分析部署與測試04本章總體介紹本章主要介紹了關(guān)于本實驗的數(shù)據(jù)集采集與標注,其中包括素材預處理,劃分,形成多個數(shù)據(jù)集。采用深度學習框架PyTorch進行模型訓練,通過Aim可視化進行管理。模型量化包括onnx及的模型轉(zhuǎn)換,推理及驗證,并對兩種模型進行了對比。然后對項目的源碼進行剖析,介紹不同組件的作用及具體的代碼,方便讀者根據(jù)自己的需要增加其他組件。最后進行項目部署和測試。整體流程圖如圖所示,通過流程圖可以有個整體的解決思路。本章總體介紹在進行攝像頭模糊檢測具體場景應用時,首先應考慮分類方法問題,尤其是線性回歸方法是否適用的問題;在計算損失函數(shù)時,需要對預測值遠遠偏離真實值的對象進行懲罰,懲罰宜適度,需要在過擬合(懲罰力度過大)和欠擬合(懲罰力度不夠)之間達到平衡。一般來講,攝像頭模糊檢測場景應用時并不推薦聚類方法,這是因為聚類方法雖然不需要訓練集,但是其準確率較低。由此可見,運用有監(jiān)督的圖片分類方法產(chǎn)生離散的結(jié)果,是攝像頭模糊檢測應用場景的優(yōu)選。那么需要解決的問題就變成了:1)訓練一個自己的分類器(后面也叫分類模型);2)驗證并選擇最優(yōu)的分類模型;3)預測樣本是屬于哪一類,此時輸出變量通常取有限個離散值,即需要的類別數(shù)。注意:多分類問題也是可以轉(zhuǎn)化為二分類問題的:具體就是將某類標記為正類,其余類標記為負類。5.1數(shù)據(jù)集采集與標注5.1.1素材采集對于人類肉眼來講,識別攝像頭是否模糊、是否遮擋、是否正常是特別容易的,首先肉眼平時就能大量接觸這類圖像,我們對其特征有著十分深刻的認識,因此遇到這類問題的第一印象是這個場景非常容易識別的,但是對于計算機視覺算法來講就不是一回事了。下面是可能會出現(xiàn)的問題及對應的解決辦法:1)攝像頭的硬件參數(shù)可能影響最終的成像效果,直接影響著分類器(分類模型)的結(jié)果,因此要選定一款攝像頭,從訓練到測試部署都得用該攝像頭及該攝像頭錄制的素材。2)在像素層面上,光照的影響不能不考慮,尤其是夜間無燈光的情況下,極容易與遮擋混淆。因此最好選取能夠補光的攝像頭拍攝的素材進行訓練。3)素材量很重要的,模糊、遮擋、正常的素材都需要足夠,且覆蓋常用場景,做到各類樣本量均衡。4)不同場景也會影響最終的識別效果,例如雨天雨水導致的模糊及各種燈光直射導致的光斑都能認為是模糊,但實際場景中一旦兩者結(jié)合極容易識別成遮擋,這是無法避免的,只能在數(shù)據(jù)集預標注時統(tǒng)一標準。5)尺度問題,送入分類器(分類模型)的圖片可能存在部分遮擋的情況,若在原圖中截取一部分和整張圖上resize后再送入網(wǎng)絡(luò)的判別結(jié)果可能存在差異。同時送入模型的圖片size不能過小,不然提取到的特征不足以區(qū)分各類別。5.1數(shù)據(jù)集采集與標注

需要訓練的素材來源可以有多個不同的渠道,可以在internet上尋找公開數(shù)據(jù)集下載、在計算機的屏幕上截取、從視頻文件中捕捉(使用ffmpeg逐幀截取)、利用手機或攝像機數(shù)碼相機等便攜設(shè)備。

但由于該項目需要部署在特定的設(shè)備上,且主要是通過攝像頭進行識別,因此我們需要用指定的攝像頭獲取對應的素材進行訓練,可以將錄制的視頻導出并使用ffmpeg軟件將視頻文件截取成一張張圖片,圖片的格式分為矢量圖和位圖,一般都是截取為JPEG壓縮的位圖。采集步驟: 1)選取攝像頭,視項目而定。 2)選取錄制地點,視項目部署地點而定。 3)設(shè)備通電,各連接線連接完成。 4)針對白天黑夜不同光照條件下,多次嘗試可能存在的情形。 5)導出視頻,運用ffmpeg按幀截取視頻并保存。導出的素材如圖所示,其中左上圖為模糊類素材、右上圖和左下圖為遮擋類素材,右下為正常類圖片:5.1數(shù)據(jù)集采集與標注5.1.2素材預處理分類問題的歸類方法如下:1)確定好標準,每一類有明顯的參照標準,不同類間有明確的分解標準。例如本項目中遮擋即一半以上認為是遮擋,畫面看不清背景的設(shè)置為模糊,當因為遮擋而看不清背景的可參照2)自行決定如何處理。2)對于模棱兩可的數(shù)據(jù),設(shè)置統(tǒng)一處理方法,可以棄用,也可以統(tǒng)一標注。例如本項目就可直接棄用。將歸類好的素材進行One-hot編碼,One-hot編碼又叫一位有效編碼,主要是采用N位狀態(tài)寄存器來對N個狀態(tài)進行編碼,每個狀態(tài)都由他獨立的寄存器位,并且在任意時候只有一位有效。因為該項目中模糊、遮擋、正常這三個特征值并不連續(xù),而是離散的、無序的,因此我們規(guī)定分類的三個變量經(jīng)過編碼后為:模糊->0遮擋->1正常->2將分類變量作為二進制向量表示的好處在于:1)將離散的屬性映射到歐式空間上的某個點,解決分類器難以處理屬性數(shù)據(jù)的問題。2)一定程度上擴充特征,計算特征距離時更合理。注意:onehot編碼前提是必須各類別互相獨立。5.1數(shù)據(jù)集采集與標注5.1.3素材劃分確認好編碼方式后即需要創(chuàng)建dataset文件夾,文件夾的目錄結(jié)構(gòu)如下:.├──0├──1└──2“0”文件夾代表模糊素材存放文件夾,“1”文件夾代表遮擋素材存放文件夾,2文件夾代表正常素材存放文件夾。素材量需要均衡,素材量少的類別的素材盡量不低于素材量多的類別的素材的1/3,如果不能符合要求盡量通過特定場景進行多次采集。編碼后的數(shù)據(jù)集需要分為下面三個部分:1)訓練集(Trainingset):是用于模型訓練的數(shù)據(jù)樣本,一般設(shè)置訓練集的數(shù)量為整個數(shù)據(jù)集數(shù)量的70%。2)驗證集(Validationset):是模型在擬合訓練集過程中單獨留出的樣本集,它包含在訓練集內(nèi),作用是幫助微調(diào)模型的超參數(shù)及初步評估模型的分類能力,一般設(shè)置驗證集的數(shù)量為整個數(shù)據(jù)集數(shù)量的10%。3)測試集(Testset):是用來最終評估模型的泛化能力。注意測試集不得作為調(diào)參等算法相關(guān)選擇的依據(jù),一般設(shè)置測試集的數(shù)量為整個數(shù)據(jù)集數(shù)量的20%。5.1數(shù)據(jù)集采集與標注5.1.4小結(jié)經(jīng)過上面的步驟可以得到采集好并且歸類好的素材,此時前期的素材準備就已經(jīng)完成,其中文件夾的名稱即為對應的類別,這邊需要注意的是不同類別間的素材量需要在同一個數(shù)量級上,以免出現(xiàn)類間不均衡現(xiàn)象。同時需要保證同一類之前場景盡量不同,保證樣本的多樣性。5.2模型訓練模糊檢測訓練模塊主要采用深度學習框架PyTorch進行訓練,版本為2.0.1。PyTorch環(huán)境的搭建第三章已有教程,不再贅述。此處可以將依賴包寫入requirements.txt中,然后使用pipinstall-rrequirements.txt自動安裝,也可以加-i指定安裝源,國內(nèi)有如豆瓣源、阿里源、清華源等可以加速安裝,但前提是該數(shù)據(jù)源需要有該版本的安裝包。模型搭建部分第三章已有教程,不再贅述。如圖所示是給模塊版本號,供讀者參考。5.2模型訓練5.2.1數(shù)據(jù)載入首先我們需要將圖片轉(zhuǎn)化成模型的輸入數(shù)據(jù),即torch對應的Dataset對象,實現(xiàn)這個步驟有以下兩種辦法:

1)使用torchvision的ImageFolder函數(shù);

2)繼承Dataset寫一個自己的載入數(shù)據(jù)函數(shù);這兩個方法都包含圖片預處理過程,即:更多的transforms的一系列增強選項詳見增強方法的詳細介紹見3.5.1章節(jié)。雖然上文已經(jīng)介紹了如何編寫Python腳本來劃分數(shù)據(jù)集,但是實際使用中也可以省略此操作,我們以沒有劃分的數(shù)據(jù)集為例,自己編寫一個載入的函數(shù)。classImageFolder(Dataset):#初始化,繼承參數(shù)def__init__(self,root,transform=None,target_transform=None,loader=default_loader):#TODO#1.Initializefilepathorlistoffilenames.#找到root的文件和索引classes,class_to_idx=find_classes(root)#保存路徑下圖片文件路徑和索引至imgsimgs=make_dataset(root,class_to_idx)iflen(imgs)==0:raise(RuntimeError("Found0imagesinsubfoldersof:"+root+"\n""Supportedimageextensionsare:"+",".join(IMG_EXTENSIONS)))

5.2模型訓練

self.root=rootself.imgs=imgsself.classes=classesself.class_to_idx=class_to_idxself.transform=transformself.target_transform=target_transformself.loader=loader

def__getitem__(self,index):"""Args:index(int):IndexReturns:tuple:(image,target)wheretargetisclass_indexofthetargetclass.

"""#TODO#1.Readonedatafromfile(e.g.usingnumpy.fromfile,PIL.Image.open).#2.Preprocessthedata(e.g.torchvision.Transform).#3.Returnadatapair(e.g.imageandlabel).#這里需要注意的是,第一步:readonedata,是一個datapath,target=self.imgs[index]#這里返回的是圖片路徑,而需要的是圖片格式img=self.loader(path)#將圖片路徑加載成所需圖片格式ifself.transformisnotNone:img=self.transform(img)ifself.target_transformisnotNone:target=self.target_transform(target)returnimg,targetdef__len__(self):#returnthetotalsizeofyourdataset.returnlen(self.imgs)5.2模型訓練然后將所需要的幾個其它函數(shù)補齊,這些都可以通過torchvision庫查找到,若你的torchvision并不支持imagefolder載入,下面這些代碼將幫助你更快的實現(xiàn)。具體見代碼清單5-3,這里僅展示部分代碼#判斷是不是圖片文件defis_image_file(filename):#只要文件以IMG_EXTENSIONS結(jié)尾,就是圖片#注意any的使用returnany(filename.endswith(extension)forextensioninIMG_EXTENSIONS)

#結(jié)果:classes:['0','1','2','3','4','5','6','7','8','9']#classes_to_idx:{'1':1,'0':0,'3':3,'2':2,'5':5,'4':4,'7':7,'6':6,'9':9,'8':8}deffind_classes(dir):'''

返回dir下的類別名,classes:所有的類別,class_to_idx:將文件中str的類別名轉(zhuǎn)化為int類別classes為目錄下所有文件夾名字的集合#os.listdir:以列表的形式顯示當前目錄下的所有文件名和目錄名,但不會區(qū)分文件和目錄。#os.path.isdir:判定對象是否是目錄,是則返回True,否則返回False#os.path.join:連接目錄和文件名classes=[dfordinos.listdir(dir)ifos.path.isdir(os.path.join(dir,d))]#sort:排序classes.sort()#將文件名中得到的類別轉(zhuǎn)化為數(shù)字class_to_idx['3']=3class_to_idx={classes[i]:iforiinrange(len(classes))}returnclasses,class_to_idx#class_to_idx:{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}#如果文件是圖片文件,則保留它的路徑,和索引至images(path,class_to_idx)5.2模型訓練然后調(diào)用剛創(chuàng)建的ImageFolder

orig_set=ImageFolder(root='xxxxx/xxxxxxxxxx',transform=tran)#yourdataset將數(shù)據(jù)集劃分為訓練集、驗證集、測試集n=len(orig_set)#所有數(shù)據(jù)集數(shù)量n_test=int(0.2*n)#取20%作為測試集test_dataset=torch.utils.data.Subset(orig_set,range(n_test))train_dataset=torch.utils.data.Subset(orig_set,range(n_test,n))#劃分

最后將數(shù)據(jù)載入train_loader=torch.utils.data.DataLoader(dataset=train_dataset,batch_size=batch_size,

num_workers=0,shuffle=True)test_loader=torch.utils.data.DataLoader(dataset=test_dataset,

batch_size=batch_size,num_workers=0,

shuffle=False)5.2模型訓練通過上面的torch.utils.data.DataLoader載入數(shù)據(jù),可以自動將數(shù)據(jù)分成多個batch,順序是否打亂由shuffle決定。同時該函數(shù)提供多個線程處理數(shù)據(jù)集,即num_workers=x,x是一個int類型的整數(shù),是加載數(shù)據(jù)(batch)的線程數(shù)目。當加載一個batch的時間小于數(shù)據(jù)訓練的時間時,GPU每次訓練完可以直接取到下一個batch的數(shù)據(jù),無需額外的等待,因此并不需要多余的worker,即使增加worker也不會影響訓練速度;當加載一個batch的時間大于數(shù)據(jù)訓練的時間時,GPU每次訓練完都需要等待下一個batch的數(shù)據(jù),因此此時需要增加worker來加快模型訓練。5.2模型訓練5.2.2訓練策略

網(wǎng)絡(luò)初始化共有3個方法:·默認初始化,創(chuàng)建網(wǎng)絡(luò)實例的時候會默認初始化;·Finetune初始化,一般用于遷移學習?!ぷ远x初始化,可以看一個例子。

fromtorch.nnimportinitdefweigth_init(net):forminnet.modules():

#isinstance()是Python中的一個內(nèi)建函數(shù)。是用來判斷一個對象的變量類型。

#初始化卷積層ifisinstance(m,nn.Conv2d):init.xavier_uniform_(m.weight.data)init.constant_(m.bias.data,0)

#初始化歸一化層elifisinstance(m,nn.BatchNorm2d):init.constant_(m.weight.data,1)init.constant_(m.bias.data,0)

#初始化全連接層elifisinstance(m,nn.Linear):init.normal_(m.weight.data,std=1e-3)init.constant_(m.bias.data,0)#實例化一個網(wǎng)絡(luò)model=_MyNet(num_classes)#初始化1model.apply(weigth_init)#初始化2#weigth_init(model)

5.2模型訓練一般選擇何種初始化有以下幾個原則:·自己的數(shù)據(jù)量比較少,但是和finetune的網(wǎng)絡(luò)數(shù)據(jù)相似度很高,這個時候就需要選擇finetune初始化,修改最后面的幾層即可?!ぷ约旱臄?shù)據(jù)量少,相似度也低,那么只需要保留淺層卷積的權(quán)重,然后重新訓練,具體保留層數(shù)視情況而定。·自己的數(shù)據(jù)量很大,相似度也很高,這是最理想的情況,只需要微調(diào)就可以了,一般只需要修改學習率即可,一般這種情況下主干網(wǎng)絡(luò)的學習率并不需要很大,學習率可以每層單獨設(shè)置,視情況而定?!ぷ约旱臄?shù)據(jù)量很大,相似度很低,這個時候直接用默認初始化或者自定義初始化即可。5.2模型訓練5.2.3模型保存可分為完整保存和僅保存權(quán)重,僅保存權(quán)重的好處在于速度快,占空間小,缺點是每次都需要定義模型結(jié)構(gòu)。#完整保存模型torch.save(model,'1.pt')#載入模型#model_dict=torch.load('1.pt')#僅保存模型權(quán)重torch.save(model.state_dict(),'1.pt')#載入模型權(quán)重#model_dict=model.load_state_dict(torch.load('1.pt'))5.2模型訓練5.2.4可視化大部分項目使用tensorboard可視化,本項目簡單介紹下如何使用Aim可視化。Aim可以在幾分鐘內(nèi)記錄、搜索和比較100項實驗,相較TensorBoard或MLFlow而言速度更快,這對于實驗管理的新手而言非常方便,其交互界面如圖所示。5.2模型訓練如圖所示,在訓練腳本所在文件目錄下輸入Aimup,再將顯示的網(wǎng)址在瀏覽器打開即可,得到如圖所示界面。5.2模型訓練5.2.5小結(jié)通過制定上面訓練策略,就可以開始訓練步驟。進入對應的Python環(huán)境,在train.py文件的目錄下運行:pythontrain.py然后通過aim界面的準確率和loss變化微調(diào)參數(shù)即可,一般來說訓練過程中的Loss開始會有極速下降的過程,在這之后會進入到斜坡緩慢下降,最后減小學習率會再次得到一個快速下降的過程。初始學習率、訓練的Epoch數(shù)、減小學習率都需要通過實驗得到,這些主要是觀察訓練Loss曲線、模型在訓練集和測試集上面的準確率變化曲線,考慮到數(shù)據(jù)集的大小、數(shù)據(jù)特征的分布、素材的特征是否明顯等因素,然后靠經(jīng)驗和手感來調(diào)整。5.3模型量化5.3.1onnx轉(zhuǎn)換本節(jié)介紹如何將上文中保存的模型轉(zhuǎn)換成onnx以及如何使用onnx模型進行推理。1)如何將模型轉(zhuǎn)化為onnximportosimporttorchfromtorch.autogradimportVariableimportnet#導出onnx模型的文件名onnx_path="model.onnx"defconvert():#定義網(wǎng)絡(luò)結(jié)構(gòu)model=_MyNet(num_classes)#模型切換到測試模式model.eval()#載入權(quán)重model.load_state_dict(torch.load(r'1.pth'),False)#注意矩陣的尺寸與訓練尺寸一致torch.onnx.export(model,Variable(torch.randn(1,3,224,224)),onnx_path,export_params=True,verbose=True)if__name__=='__main__':convert()5.3模型量化5.3.1onnx轉(zhuǎn)換2)如何使用onnx進行推理具體代碼見代碼清單5-7,這里僅展示部分代碼。#類別數(shù)labels=['0','1','2']定義一個onnx類classONNXModel():def__init__(self,onnx_path): """:paramonnx_path:"""self.onnx_session=onnxruntime.InferenceSession(onnx_path)

self.input_name=self.get_input_name(self.onnx_session)self.output_name=self.get_output_name(self.onnx_session)defget_output_name(self,onnx_session): """output_name=onnx_session.get_outputs()[0].name:paramonnx_session::return:"""

5.3模型量化Onnx模型性能驗證

我們從圖可以看出,訓練集的準確率比測試集的準確率要低一些。通常而言,訓練集準確率和測試集準確率并不直接掛鉤。本項目的原因主要有以下幾點:

·訓練集和測試集的分布無法保證相同;

·因為有數(shù)據(jù)增強的存在,預處理會導致訓練集的分布產(chǎn)生不同程度變化;

·數(shù)據(jù)集太小,切分后分布無法保證一致;·訓練集的準確率是每個batch之后產(chǎn)生的,驗證集是每個epoch后產(chǎn)生的,有滯后性。5.3模型量化5.3.2RKNN模型轉(zhuǎn)換以RK1808為例,本項目使用PyTorch2.0.1進行訓練,對應的rknntoolkit的版本是1.6.0,這個時候我們需要打開瑞星微官方文檔,查看當前版本RKNN支持的op操作。/rockchip-linux/rknn-toolkit/blob/v1.6.0/doc/RKNN_OP_Support_V1.6.0.md如果有不支持的op的情況,那么模型轉(zhuǎn)化將會有問題,此時可以自己寫算子替換對應的op,但對個人能力有一定要求。這邊推薦最快捷方便的還是更換對應的op,以適配對應的模型。當查詢op均支持后,動手開始量化。rknntoolkit的鏡像地址為:/s/3eTG3VsY#sharelink/path=%2F,密碼為:rknn,可以下載對應2.0.1的rknntoolkit鏡像。5.3模型量化首先我們需要準備rk量化的圖片,保存在images文件夾下,這些素材需要未經(jīng)過訓練。然后需要檢查源碼內(nèi)訓練素材的通道順序,這時我們需要回頭查看訓練代碼,得到圖像通道順序是RGB。#打開文件withopen(path,'rb')asf:withImage.open(f)asimg:#convert:用于圖像不同模式圖像之間的轉(zhuǎn)換,這里轉(zhuǎn)換為‘RGB’returnimg.convert('RGB')最后需要保證rknn.config內(nèi)設(shè)置的通道順序與訓練素材的通道順序保持一致。[012]表示順序保持一致,即保持RGB不變,運行量化代碼,得到如圖的結(jié)果。5.3模型量化RKNN模型驗證本小節(jié)主要對轉(zhuǎn)化后的RKNN進行二次驗證即測試RKNN模型推理是否合理,測試時需要將上一個腳本中的rknn.build中的預編譯pre_compile設(shè)置為false,即不采用預編譯。預編譯可以起到加速的作用,測試的時候不可開啟預編譯,只有當正式部署時才設(shè)置為True。說到底量化就是將浮點存儲(運算)轉(zhuǎn)換為整型存儲(運算)的一種模型壓縮技術(shù)。兩者模型區(qū)別與權(quán)重對比如兩圖所示,對比一下onnx量化為RKNN模型前后的差異以及第一層權(quán)重的差異,可以看出量化是將onnx中的Conv和BatchNormalization層融合為CONV2D層,且權(quán)重有浮點數(shù)變成了整型數(shù)。5.3模型量化5.3.3小結(jié)本節(jié)主要通過對onnx和RKNN模型測試,驗證模型是否符合要求,以及驗證模型量化過程中的其他原因?qū)е履P娃D(zhuǎn)化前后效果的差異,這一步測試通過后即可進行下一步操作。5.4項目源碼分析部署與測試5.4.1工程目錄結(jié)構(gòu)ctest|--sdk_rk1808相關(guān)sdk|--src源碼 |--ctest主模塊程序 |--assets模型文件 |--ctest_proc.cpp主模塊源文件 |--ctest_proc.h

主模塊對應的頭文件 |--detector.cpp推理模塊源文件 |--detector.h推理對應的頭文件 |--CmakeLists.txt |--test測試程序 |--main.cpp測試程序入口 |--test_draw.hpp結(jié)果繪圖相關(guān) |--CmakeLists.txt|--build_emv.cmake編譯環(huán)境配置,供CMakeLists調(diào)用|--CMakeLists.txt用于生成makefile,各源碼模塊中也有對應文件,逐級調(diào)用|--readme.md編譯參考命令本項目主要分為視頻源、測試程序、主模塊庫函數(shù)、繪圖四個部分組成,從視頻源獲取傳入的實時數(shù)據(jù),測試程序通過回調(diào)函數(shù)讀取實時數(shù)據(jù),主模塊庫函數(shù)通過回調(diào)函數(shù)讀取測試程序傳入的實時數(shù)據(jù)并將識別結(jié)果通過回調(diào)函數(shù)返回給測試模塊,測試程序再將回調(diào)來的推理結(jié)果提供給繪圖模塊,最終形成整套系統(tǒng)。5.4項目源碼分析部署與測試5.4.2源碼分析1)主模塊頭文件定義模型識別結(jié)果的枚舉enumTStatusTag{kBlur=0,///<模糊kCover=1,///<遮擋kClear=2,///<清晰};typedefenumTStatusTagTStatus;定義回調(diào)結(jié)果structTResultTag{intscene_status;///<模型識別結(jié)果,參見TStatusTagintscore;///<識別分數(shù)};typedefstructTResultTagTResult;

定義初始化時需要設(shè)置的相關(guān)內(nèi)容structTInitialItemTag{

charconfig_file[128];///<配置文件路徑(標準的ini文件)

ac::ImageHeaderimage_header;///<圖像頭部數(shù)據(jù)};typedefstructTInitialItemTagTInitialItem;

定義回調(diào)typedefvoid(ac::Object::*Method)(TResultresult);5.4項目源碼分析部署與測試·定義調(diào)用其他對象的方法structTEventTag{

ac::Object*sender;///<對象指針

Methodmethod;///<該對象的public方法};typedefstructTEventTagTEvent;·無參構(gòu)造函數(shù)

TCtestProcInterface(){};·析構(gòu)函數(shù)

virtual~TCtestProcInterface()=0;·初始化模型

virtualintInit(constTInitialItem&item)=0;·反初始化

virtualvoidDeInit()=0;·更新最新畫面

virtualboolUpdate(constvoid*data,unsignedintsize)=0;·設(shè)置狀態(tài)事件

virtualboolSetChangedEvent(constTEvent&OnChanged)=0;·創(chuàng)建對象

TCtestProcInterface*CreateCtestProc();·銷毀創(chuàng)建的對象

voidDestroyCtestProc(TCtestProcInterface*obj);5.4項目源碼分析部署與測試5.4.2源碼分析2)主模塊模塊初始化,從傳入的配置文件ini中讀取模型文件的路徑,如果未傳入則會設(shè)置為默認的路徑。同時模型推理的輸入尺寸可以從模型文件中讀取,后續(xù)更改模型輸入就無須更改源碼,只需要替換模型即可。具體代碼見代碼清單5-12,這里僅展示部分代碼。if(item.image_header.width>0anditem.image_header.height>0){///默認值constchar*default_model="assets/ctest_model.rknn";std::stringmodel=default_model;///從傳入的配置文件中讀取模型ai::IniFileini;boolr=(item.config_file!=nullptr)andini.Load(item.config_file);......5.4項目源碼分析部署與測試反初始化,可以理解為當上述初始化對象銷毀時,需要對其屬性進行釋放。如果不釋放,資源就浪費了,反初始化方法可以釋放初始化對象,減少資源浪費。這里需要注意的是:當要反初始化時候,要把對象設(shè)置為null,不然反初始化方法不會被調(diào)用。voidTCtestProcImpl::DeInit(){if(valid_flag_==true)

{

///反初始化推理deletedetector_;detector_=nullptr;///反初始化RGAautop=rga_prev_;rga_prev_=nullptr;deletep;valid_flag_=false;}}5.4項目源碼分析部署與測試Update函數(shù),供外部調(diào)用,每次調(diào)用都會為主模塊提供最新幀,通過rga轉(zhuǎn)換后寫入緩沖區(qū),而且是不斷寫入。同時主模塊和外部調(diào)用是異步操作,中間靠單項緩沖區(qū)連接,因此每次主模塊調(diào)用的都會是最新的圖片,但具體是否丟幀或重復推理同一幀就得比較模型推理的速度和外部調(diào)用update函數(shù)速度。boolTCtestProcImpl::Update(constvoid*data,unsignedintsize){boolret=false;if(valid_flag_and(callback_.method!=nullptr)and(buffer_!=nullptr)and(notbuffer_->IsFull())and(data!=nullptr)and(size>0)){constauto&prev_pairs=rga_prev_->RgaBlit(reinterpret_cast<constuint8_t*>(data),size,true);///rga的轉(zhuǎn)換結(jié)果

......5.4項目源碼分析部署與測試5.4.2源碼分析3)推理模塊頭文件構(gòu)造函數(shù)TDetector(constchar*model_file);析構(gòu)函數(shù)virtual~TDetector();檢測函數(shù)intDetect(constac::Im

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論