人工智能技術(shù)及應(yīng)用 課件 ch6-行人檢測(cè)實(shí)踐_第1頁(yè)
人工智能技術(shù)及應(yīng)用 課件 ch6-行人檢測(cè)實(shí)踐_第2頁(yè)
人工智能技術(shù)及應(yīng)用 課件 ch6-行人檢測(cè)實(shí)踐_第3頁(yè)
人工智能技術(shù)及應(yīng)用 課件 ch6-行人檢測(cè)實(shí)踐_第4頁(yè)
人工智能技術(shù)及應(yīng)用 課件 ch6-行人檢測(cè)實(shí)踐_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

6行人檢測(cè)實(shí)踐HISTORYOFDEVELOPMENTChapter06本章目錄數(shù)據(jù)采集與標(biāo)注01模型訓(xùn)練02模型轉(zhuǎn)換與量化03項(xiàng)目落地與部署046行人檢測(cè)實(shí)踐本章主要介紹的是基于目標(biāo)檢測(cè)的行人識(shí)別,行人檢測(cè)主要用于保障車輛盲區(qū)的安全,尤其是商用車,由于車身龐大,存在較多盲區(qū),且車長(zhǎng)帶來(lái)的內(nèi)輪差也會(huì)讓行人不經(jīng)意間就進(jìn)入了車輛的危險(xiǎn)區(qū)域。行人檢測(cè)利用攝像頭照射車輛盲區(qū),一旦有行人進(jìn)入盲區(qū)則對(duì)司機(jī)和行人進(jìn)行提醒。整個(gè)項(xiàng)目主要流程如圖所示,本章節(jié)也會(huì)按照該順序依次講解整個(gè)流程。6.1數(shù)據(jù)集采集與標(biāo)注6.1.1素材采集數(shù)據(jù)來(lái)源主要有兩個(gè):1)公開(kāi)數(shù)據(jù)集行人檢測(cè)是一個(gè)應(yīng)用范圍比較廣的項(xiàng)目,行人標(biāo)簽也是各大數(shù)據(jù)集中常見(jiàn)的標(biāo)簽,前期沒(méi)有足夠的“財(cái)力”和“精力”去收集、標(biāo)注素材的情況下,使用公開(kāi)數(shù)據(jù)集訓(xùn)練是一個(gè)不錯(cuò)的辦法。除了深度學(xué)習(xí)界人盡皆知的coco、voc數(shù)據(jù)集,還有不少可以用來(lái)訓(xùn)練的帶有行人標(biāo)簽的公開(kāi)數(shù)據(jù)集,其實(shí)相比coco、voc數(shù)據(jù)集,這些數(shù)據(jù)集會(huì)更加符合本實(shí)踐項(xiàng)目的場(chǎng)景。數(shù)據(jù)集:CaltechPedestrianDetectionBenchmark存放地址:/Image_Datasets/CaltechPedestrians/數(shù)據(jù)集:TheCityscapesDataset存放地址:/數(shù)據(jù)集:TheEuroCityPersonsDataset存放地址:https://eurocity-dataset.tudelft.nl/2)自主采集如果有私家車,并且裝了行車記錄儀,可以從行車記錄儀中導(dǎo)出視頻作為素材,如果沒(méi)有,那么在視頻網(wǎng)站搜索行車記錄儀,也能獲取到他人上傳的行車記錄儀視頻,挑選清晰度較高的視頻下載即可。6.1數(shù)據(jù)集采集與標(biāo)注針對(duì)以上幾點(diǎn)標(biāo)注要求,給出幾個(gè)標(biāo)注的示例。1)如下左圖人多雜亂,盡可能標(biāo)記人能識(shí)別的人,遠(yuǎn)處雜亂無(wú)法區(qū)分輪廓的人不做標(biāo)記。2)如上右圖左邊遠(yuǎn)處騎車可以辨別人形,需要標(biāo)記;右邊兩人雖有重疊但依舊可以單獨(dú)區(qū)分開(kāi),需要分開(kāi)標(biāo)記;中間的人手臂部分超出身體輪廓太多,僅標(biāo)記身體部分;中間偏右的黑色人群無(wú)法區(qū)分不做標(biāo)記。6.1數(shù)據(jù)集采集與標(biāo)注針對(duì)以上幾點(diǎn)標(biāo)注要求,給出幾個(gè)標(biāo)注的示例。3)如下左圖對(duì)于這類已經(jīng)動(dòng)態(tài)模糊比較嚴(yán)重的情況,不需要標(biāo)記(圖中框只是展示下),否則會(huì)對(duì)訓(xùn)練造成干擾。4)如上右圖被護(hù)欄擋住的行人,如果某些角度隔著護(hù)欄依舊可以看到腿需要標(biāo)注全身,若護(hù)欄將腿完全擋住,則僅標(biāo)記身體露出的部分。6.1數(shù)據(jù)集采集與標(biāo)注針對(duì)以上幾點(diǎn)標(biāo)注要求,給出幾個(gè)標(biāo)注的示例。5)如下左圖人行道上的行人和騎車的人雖然被柱子和樹(shù)遮擋,但依舊可以辨別為人,需要標(biāo)記,但標(biāo)記露出的部分,不要將柱子標(biāo)記進(jìn)去;對(duì)于騎車的人不要刻意去標(biāo)記車的部分,把人的輪廓標(biāo)記全,框里面盡量是人的信息。6)如上右圖中間騎車帶人雖然有兩個(gè)人,但已經(jīng)完全重疊,只需要標(biāo)記一個(gè)即可。6.1數(shù)據(jù)集采集與標(biāo)注6.1.3小結(jié)素材是一切深度學(xué)習(xí)項(xiàng)目的基礎(chǔ),行人識(shí)別的項(xiàng)目在素材采集和標(biāo)注方面難度并不算太大。前期使用廣大公開(kāi)數(shù)據(jù)集的行人素材,也可以讓算法得到一個(gè)不錯(cuò)的效果,但倘若要把效果做到更好,在素材方面則需要用更多真實(shí)的場(chǎng)景進(jìn)行擴(kuò)充。如今市面上還有很多素材標(biāo)注公司,他們不光提供素材標(biāo)注的服務(wù),同時(shí)出售素材或者按需求采集素材,如果項(xiàng)目時(shí)間緊迫但有足夠的預(yù)算,找他們幫忙也是一個(gè)不錯(cuò)的選擇。6.2模型訓(xùn)練6.2.1模型設(shè)計(jì)思想本實(shí)驗(yàn)使用SSD的目標(biāo)檢測(cè)網(wǎng)絡(luò),在正式進(jìn)入項(xiàng)目之前,簡(jiǎn)單介紹下其設(shè)計(jì)思想。若想了解詳細(xì)細(xì)節(jié),可以參考論文《SSD:SingleShotMultiBoxDetector》。SSD是一種引人注目的目標(biāo)檢測(cè)結(jié)構(gòu),它結(jié)合了直接回歸框和分類概率的方法,又利用大量的預(yù)選框來(lái)提升識(shí)別準(zhǔn)確度。ssd在預(yù)測(cè)階段不僅僅使用最后一層的特征映射,而是取出中間層的特征,在不同尺寸的特征映射上對(duì)結(jié)果進(jìn)行預(yù)測(cè),雖然增加運(yùn)算量,但使檢測(cè)結(jié)果具有更多個(gè)可能性,從而提升精度。如圖所示是ssd的模型,從圖中可以看出SSD的主干網(wǎng)絡(luò)為VGG網(wǎng)絡(luò),作者在VGG-16的基礎(chǔ)上,將FC6和FC7層轉(zhuǎn)化為卷積層,去掉了所有的Dropout層和FC8層,添加了Conv6,Conv7,Conv8和Conv9層。6.2模型訓(xùn)練為了從特征獲取預(yù)測(cè)結(jié)果,分別取出conv4的第三層卷積特征、fc7卷積特征,conv6的第二次卷積特征,conv7的第二次卷積特征,conv8的第二次卷積特征和conv9的第二次卷積特征,共六個(gè)特征層作為有效特征層如圖所示。對(duì)獲取到的每個(gè)有效特征層做一次num_anchorsx4的卷積和一次num_anchorsxnum_classes的卷積,num_anchors指的是該特征層每一個(gè)特征點(diǎn)所擁有的先驗(yàn)框數(shù)量。上述提到的六個(gè)特征層,每個(gè)特征層的每個(gè)特征點(diǎn)對(duì)應(yīng)的先驗(yàn)框數(shù)量分別為4、6、6、6、4、4。其中num_anchorsx4的卷積用于預(yù)測(cè)該特征層上每一個(gè)網(wǎng)格點(diǎn)上每一個(gè)先驗(yàn)框的變化情況;num_anchorsxnum_classes的卷積用于預(yù)測(cè)該特征層上每一個(gè)網(wǎng)格點(diǎn)上每一個(gè)預(yù)測(cè)對(duì)應(yīng)的種類。利用num_anchorsx4的卷積對(duì)每一個(gè)有效特征層對(duì)應(yīng)的先驗(yàn)框進(jìn)行調(diào)整可以獲得預(yù)測(cè)框。6.2模型訓(xùn)練SSD解碼過(guò)程可以分為兩部分:(1)將每個(gè)網(wǎng)格的中心點(diǎn)加上它對(duì)應(yīng)的x_offset和y_offset,加完之后的記過(guò)就是預(yù)測(cè)框的中心;(2)利用h和w調(diào)整先驗(yàn)框獲得預(yù)測(cè)框的寬和高。獲得預(yù)測(cè)框的中心和寬高時(shí),便可以在圖片上繪制預(yù)測(cè)框了。但是想要獲得最終的預(yù)測(cè)結(jié)果,還要對(duì)每一個(gè)預(yù)測(cè)框在進(jìn)行得分排序與非極大抑制篩選,這一部分基本上時(shí)目標(biāo)檢測(cè)領(lǐng)域通用的部分。實(shí)現(xiàn)代碼見(jiàn)代碼清單6-3,這里僅展示部分代碼importnumpyasnpimporttorchfromtorchimportnnfromtorchvision.opsimportnmsclassBBoxUtility(object):

def__init__(self,num_classes):

self.num_classes=num_classes

...6.2模型訓(xùn)練6.2.2數(shù)據(jù)集制作數(shù)據(jù)集制作采取VOC格式,在project下新建目錄VOCdevkit,整個(gè)數(shù)據(jù)集的目錄結(jié)構(gòu)如下,將標(biāo)簽文件放在VOCdevkit文件夾下VOC_xxx下的Annotation中,將.jpg格式的圖片放在JPEGImages中。VOCdevkit|--VOC_xxx|--JPEGImages存放圖片|--Annotations存放xml標(biāo)注文件|--ImageSets|--Main存放不帶后綴的文件名列表|--subdir2...|--dir2...在完成數(shù)據(jù)集的擺放后,需對(duì)數(shù)據(jù)集進(jìn)行下一步處理,目的是為了獲得訓(xùn)練用的_xxx_train.txt和_xxx_val.txt,在工程下新建voc_annotation.py,腳本見(jiàn)代碼清單6-46.2模型訓(xùn)練6.2.3訓(xùn)練如果訓(xùn)練過(guò)程中存在中斷訓(xùn)練的操作,可以將model_path設(shè)置成logs文件夾下的權(quán)值文件,將已經(jīng)訓(xùn)練了一部分的權(quán)值再次載入。同時(shí)修改下方的凍結(jié)階段或者解凍階段的參數(shù),來(lái)保證模型epoch的連續(xù)性。當(dāng)model_path=''的時(shí)候不加載整個(gè)模型的權(quán)值。此處使用的是整個(gè)模型的權(quán)重,因此是在train.py進(jìn)行加載的,下面的pretrain不影響此處的權(quán)值加載。如果想要讓模型從主干的預(yù)訓(xùn)練權(quán)值開(kāi)始訓(xùn)練,則設(shè)置model_path='',下面的pretrain=True,此時(shí)僅加載主干。如果想要讓模型從0開(kāi)始訓(xùn)練,則設(shè)置model_path='',下面的pretrain=Fasle,F(xiàn)reeze_Train=Fasle,此時(shí)從0開(kāi)始訓(xùn)練,且沒(méi)有凍結(jié)主干的過(guò)程。一般來(lái)講,從0開(kāi)始訓(xùn)練效果會(huì)很差,因?yàn)闄?quán)值太過(guò)隨機(jī),特征提取效果不明顯。網(wǎng)絡(luò)一般不從0開(kāi)始訓(xùn)練,至少會(huì)使用主干部分的權(quán)值,有些論文提到可以不用預(yù)訓(xùn)練,主要原因是他們數(shù)據(jù)集較大且調(diào)參能力優(yōu)秀。如果一定要訓(xùn)練網(wǎng)絡(luò)的主干部分,可以了解imagenet數(shù)據(jù)集,首先訓(xùn)練分類模型,分類模型的主干部分和該模型通用,基于此進(jìn)行訓(xùn)練。6.2模型訓(xùn)練6.2.3訓(xùn)練訓(xùn)練分為兩個(gè)階段,分別時(shí)凍結(jié)階段和解凍階段,顯存不足與數(shù)據(jù)集的大小無(wú)關(guān),提示顯存不足請(qǐng)調(diào)小batch_size收到BatchNorm層影響,batch_size最小為2,不能為1。凍結(jié)階段訓(xùn)練參數(shù),此時(shí)模型的主干被凍結(jié)了,特征提取網(wǎng)絡(luò)不發(fā)生改變,占用的顯存較小進(jìn)隊(duì)網(wǎng)絡(luò)進(jìn)行微調(diào)。解凍階段訓(xùn)練參數(shù),此時(shí)模型的主干不被凍結(jié)了,特征提取網(wǎng)絡(luò)會(huì)發(fā)生改變,占用的顯存較大,網(wǎng)絡(luò)所有的參數(shù)都會(huì)發(fā)生改變。Freeze_Train設(shè)為True,也就是默認(rèn)先凍結(jié)主干訓(xùn)練后解凍訓(xùn)練。num_workers用于設(shè)置是否使用多線程讀取數(shù)據(jù),開(kāi)啟后會(huì)加快數(shù)據(jù)讀取速度,但是會(huì)占用更多內(nèi)存,內(nèi)存較小的電腦可以設(shè)置為2或0。train_annotation_path和val_annotation_path是獲取圖片和標(biāo)簽的路徑。6.2模型訓(xùn)練6.2.3訓(xùn)練運(yùn)行train.py文件,如下左圖可以觀察到已經(jīng)開(kāi)始訓(xùn)練模型。訓(xùn)練完成之后可以觀察到在log文件下,存取了訓(xùn)練過(guò)程中的權(quán)值文件,如上右圖所示。6.2模型訓(xùn)練6.2.4預(yù)測(cè)和評(píng)估訓(xùn)練結(jié)果預(yù)測(cè)需要用到兩個(gè)文件,分別是ssd.py和predict.py,代碼詳見(jiàn)本書(shū)附帶資料,和之前一樣,需要去ssd.py里面修改model_path以及classes_path為自己對(duì)應(yīng)的訓(xùn)練權(quán)重文件和目標(biāo)識(shí)別種類。在此我們選擇上一步訓(xùn)練模型表現(xiàn)最好的權(quán)重,對(duì)應(yīng)設(shè)置如下:"model_path":'logs/best_epoch_weights.pth',"classes_path":'model_data/cls_classes.txt',predict.py代碼如下,該代碼將單張圖片預(yù)測(cè)、攝像頭檢測(cè)、FPS檢測(cè)和目錄遍歷檢測(cè)多功能融為一體,具體測(cè)試模式由參數(shù)mode決定,當(dāng)mode為predict時(shí)表示單張圖片預(yù)測(cè);為video表示視頻檢測(cè),可調(diào)用攝像頭或者視頻進(jìn)行檢測(cè);為fps表示測(cè)試fps,使用的圖片是img里的street.jpg;為dir_predict表示遍歷文件夾進(jìn)行檢測(cè)并保存,默認(rèn)遍歷img文件夾,保存img_out文件夾,為export_onnx表示將模型導(dǎo)出為onnx。6.2模型訓(xùn)練6.2.4預(yù)測(cè)和評(píng)估在終端輸入pythonpredict.py運(yùn)行predict.py。運(yùn)行時(shí)要求輸入待檢測(cè)圖片的路徑,在這里我們把測(cè)試圖片test.jpg放入了img文件夾下,所以這里輸入的路徑為img/test.jpg,預(yù)測(cè)完成之后會(huì)將結(jié)果以img.img(如圖所示)形式保存在工程根目錄下。6.2模型訓(xùn)練6.2.4預(yù)測(cè)和評(píng)估評(píng)估需要用到get_map.py文件,同樣需要設(shè)置model_path和classes_path,設(shè)置方式和預(yù)測(cè)時(shí)的設(shè)置相同。隨后便可以在終端輸入pythonget_map.py運(yùn)行g(shù)et_map.py文件,運(yùn)行時(shí)在終端的顯示如圖所示,從圖中可以看出此模型預(yù)測(cè)出行人這一類別時(shí)的AP值為91.23%,在門限值為0.5的情況下,F(xiàn)1值為0.85,召回率為73.81%,精確度值為99.20%。6.2模型訓(xùn)練6.2.4預(yù)測(cè)和評(píng)估不同門限值對(duì)應(yīng)的F1值、召回率和精確度也對(duì)應(yīng)繪制成了圖片如圖所示,保存至map_out文件夾中。6.3模型轉(zhuǎn)換與量化6.3.1模型轉(zhuǎn)換ONNX(OpenNeuralNetworkExchange)是一種開(kāi)放的深度學(xué)習(xí)模型表示格式,它旨在提供一個(gè)通用的格式,用于在不同的深度學(xué)習(xí)框架之間無(wú)縫地交換模型。所以為了更好完成后續(xù)的部署工作,可將模型轉(zhuǎn)換為onnx格式。具體是在predict.py中調(diào)用了ssd.py的方法convert_to_onnx,其實(shí)現(xiàn)代碼見(jiàn)代碼清單6-7,這里僅展示部分代碼。defconvert_to_onnx(self,simplify,model_path):importonnxself.generate(onnx=True)

im=torch.zeros(1,3,*self.input_shape).to('cpu')#imagesize(1,3,512,512)BCHWinput_layer_names=["images"]output_layer_names=["output"]

#Exportthemodelprint(f'Startingexportwithonnx{onnx.__version__}.')torch.onnx.export(,調(diào)用時(shí),我們只需在predict.py文件里將mode設(shè)置為export_onnx即可,隨后保存predict.py文件,運(yùn)行可以發(fā)現(xiàn)在model_data文件夾下生成了對(duì)應(yīng)的model.onnx文件。6.3模型轉(zhuǎn)換與量化6.3.2模型量化上面的所有步驟完成后,其實(shí)如果項(xiàng)目是用在PC端的,那么這個(gè)權(quán)重已經(jīng)可以落地了,但是本章節(jié)的最終目標(biāo)是將它在AIBOX中運(yùn)行,所以針對(duì)AIBOX的環(huán)境,需要對(duì)模型文件進(jìn)行量化。模型量化所需要用到的rknn-toolkit的container環(huán)境詳見(jiàn)3.6章節(jié)。首先進(jìn)入rknn-toolkit新建img文件夾存放一批素材用于量化,素材需要盡可能覆蓋所有可能出現(xiàn)的場(chǎng)景,將它們的尺寸調(diào)整為網(wǎng)絡(luò)輸入的大小,并生成文件列表,程序見(jiàn)代碼清單6-8,這里僅展示部分代碼。defmain():img_path="./%s"%(img_flod)out_path="./%s%d_%d"%(img_flod,img_w,img_h)ifnotos.path.exists(out_path):os.mkdir(out_path)txt_file=open("./%s%d_%d.txt"%(img_flod,img_w,img_h),"w")......6.3模型轉(zhuǎn)換與量化6.3.3小結(jié)模型訓(xùn)練階段會(huì)遇到的各個(gè)步驟,也是深度學(xué)習(xí)項(xiàng)目中的重要環(huán)節(jié)之一,模型的訓(xùn)練結(jié)果很大程度上會(huì)直接影響到項(xiàng)目落地后的用戶體驗(yàn)。在經(jīng)歷過(guò)不同硬件設(shè)備開(kāi)發(fā)以后就會(huì)發(fā)現(xiàn),量化也是整個(gè)過(guò)程中必不可少的一環(huán),因?yàn)榱炕诩铀偻评淼耐瑫r(shí),也是對(duì)硬件環(huán)境的一種適配。其實(shí)即便是落地在PC上的項(xiàng)目,原模型可以直接運(yùn)行的情況下,考慮到性能也會(huì)使用例如tensorRT等方式對(duì)模型進(jìn)行量化。6.4項(xiàng)目落地與部署6.4.1項(xiàng)目工程工程目錄結(jié)構(gòu)如下otest|--sdk_rk1808相關(guān)sdk|--src源碼 |--otest主模塊程序 |--assets模型文件 |--test測(cè)試程序|--build_emv.cmake編譯環(huán)境配置,供CMakeLists調(diào)用|--CMakeLists.txt用于生成makefile,各源碼模塊中也有對(duì)應(yīng)文件,逐級(jí)調(diào)用6.4項(xiàng)目落地與部署源碼讀者可以直接從隨書(shū)的資源中獲取,本章節(jié)主要是梳理源碼結(jié)構(gòu)如圖所示,對(duì)幾個(gè)重要的模塊進(jìn)行講解,幫助讀者更快地理解代碼。視頻源:獲取攝像頭數(shù)據(jù),用測(cè)試模塊所配置的回調(diào)函數(shù),向測(cè)試模塊回調(diào)傳輸圖像數(shù)據(jù)。測(cè)試模塊:向視頻源配置一個(gè)用于傳輸圖像的回調(diào)函數(shù),向主模塊配置一個(gè)用于傳輸推理結(jié)果的回調(diào)函數(shù)。將視頻源回調(diào)來(lái)的圖像數(shù)據(jù)傳給主模塊推理,并將主模塊回調(diào)來(lái)的推理結(jié)果提供給繪圖模塊。主模塊:接收?qǐng)D像數(shù)據(jù),用測(cè)試模塊所配置的回調(diào)函數(shù),向測(cè)試模塊回調(diào)推理結(jié)果。主模塊是另起線程進(jìn)行異步推理,因?yàn)橐坏┩评淼膸实陀谝曨l源的幀率(25FPS)會(huì)導(dǎo)致阻塞。繪圖:繪圖模塊將測(cè)試模塊傳輸過(guò)來(lái)的推理結(jié)果,繪制在畫(huà)面上用于展示。6.4項(xiàng)目落地與部署6.4.2源碼解析1)主模塊對(duì)模塊進(jìn)行初始化,代碼見(jiàn)代碼清單6-9,這里僅展示部分代碼。if(item.image_header.width>0anditem.image_header.height>0){///默認(rèn)值constchar*default_model="assets/model.rknn";constchar*default_prior_box="assets/otest_model_box_priors.txt";constchar*default_label_list="assets/otest_model_labels_list.txt";在初始化模塊中,首先從傳入的ini配置文件中讀取模型文件,若沒(méi)有配置這里直接給予了一個(gè)默認(rèn)值。初始化推理模塊后,程序可以直接從模型文件里讀取模型的輸入尺寸,然后利用初始化傳入的視頻源尺寸和模型的尺寸初始化rga。6.4項(xiàng)目落地與部署6.4.2源碼解析1)主模塊對(duì)rga進(jìn)行初始化,代碼見(jiàn)代碼清單6-9,這里僅展示部分代碼。boolret=false;ac::rga::SrcConfigsrc;ac::rga::DstConfigdst;autork_format=Convert2RkFormat(origin_header_.format);if(rk_format>=0){

///原始圖片信息src.width=origin_header_.width;src.height=origin_header_.height;src.format=ac::rga::RkFormat(rk_format);在對(duì)rga初始化的過(guò)程中,需要指定原始圖像的信息、原始圖像中需要轉(zhuǎn)換的部分、目標(biāo)圖像的信息,也就是告訴rga,需要從一種圖轉(zhuǎn)換成另一種圖。6.4項(xiàng)目落地與部署6.4.2源碼解析1)主模塊更新最新圖像,代碼見(jiàn)代碼清單6-9,這里僅展示部分代碼。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);......外部調(diào)用update函數(shù),為主模塊更新最新一幀的圖像經(jīng)過(guò)rga的轉(zhuǎn)換送入緩沖區(qū)。取名更新也是因?yàn)?,外部送入圖片和主模塊的推理是異步操作,中間用一個(gè)單項(xiàng)緩沖區(qū)連接,外部所傳入的圖片會(huì)不斷更新緩沖區(qū),內(nèi)部在推理完成后會(huì)從緩沖區(qū)取數(shù)據(jù)。當(dāng)處理的幀率低于視頻幀率時(shí),外部送入的圖片會(huì)不斷更新緩沖區(qū)的圖片,從而保證每次推理的圖片都是最近的視頻畫(huà)面。6.4項(xiàng)目落地與部署6.4.2源碼解析1)主模塊子線程循環(huán)推理,代碼見(jiàn)代碼清單6-9,這里僅展示部分代碼。std::vector<TRectEx>boxes;while(true){///這一行代碼可能阻塞constauto&pairs=buffer_->Read();constauto&img=std::get<0>(pairs);constauto&callback=std::get<1>(pairs);.........run函數(shù)循環(huán)運(yùn)行在子線程中,直到反初始化或者析構(gòu)時(shí)收到停止信號(hào)才會(huì)退出循環(huán)。該函數(shù)主要功能就是從緩沖區(qū)中取出圖片進(jìn)行推理,并將推理的結(jié)果,通過(guò)外部傳入的回調(diào)函數(shù)傳遞出去。6.4項(xiàng)目落地與部署6.4.2源碼解析2)推理模塊推理模塊的代碼在ssd_detector.cpp中,主要工作就是調(diào)用rk的接口進(jìn)行圖片的推理,并對(duì)推理結(jié)果做后處理后輸出。這部分其實(shí)就是將PC上的推理代碼,將Python翻譯成C++即可,讀者可以對(duì)照著量化章節(jié)的代碼閱讀源碼,這里不再贅述。6.4項(xiàng)目落地與部署6.4.3部署工程開(kāi)發(fā)環(huán)境的搭建可以參考3.6.WSL安裝,以下的全部指令都是在WSL下運(yùn)行。新建build文件夾,并進(jìn)入到build

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論