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

下載本文檔

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

文檔簡介

6行人檢測實踐HISTORYOFDEVELOPMENTChapter06本章目錄數(shù)據(jù)采集與標(biāo)注01模型訓(xùn)練02模型轉(zhuǎn)換與量化03項目落地與部署046行人檢測實踐本章主要介紹的是基于目標(biāo)檢測的行人識別,行人檢測主要用于保障車輛盲區(qū)的安全,尤其是商用車,由于車身龐大,存在較多盲區(qū),且車長帶來的內(nèi)輪差也會讓行人不經(jīng)意間就進(jìn)入了車輛的危險區(qū)域。行人檢測利用攝像頭照射車輛盲區(qū),一旦有行人進(jìn)入盲區(qū)則對司機和行人進(jìn)行提醒。整個項目主要流程如圖所示,本章節(jié)也會按照該順序依次講解整個流程。6.1數(shù)據(jù)集采集與標(biāo)注6.1.1素材采集數(shù)據(jù)來源主要有兩個:1)公開數(shù)據(jù)集行人檢測是一個應(yīng)用范圍比較廣的項目,行人標(biāo)簽也是各大數(shù)據(jù)集中常見的標(biāo)簽,前期沒有足夠的“財力”和“精力”去收集、標(biāo)注素材的情況下,使用公開數(shù)據(jù)集訓(xùn)練是一個不錯的辦法。除了深度學(xué)習(xí)界人盡皆知的coco、voc數(shù)據(jù)集,還有不少可以用來訓(xùn)練的帶有行人標(biāo)簽的公開數(shù)據(jù)集,其實相比coco、voc數(shù)據(jù)集,這些數(shù)據(jù)集會更加符合本實踐項目的場景。數(shù)據(jù)集:CaltechPedestrianDetectionBenchmark存放地址:/Image_Datasets/CaltechPedestrians/數(shù)據(jù)集:TheCityscapesDataset存放地址:/數(shù)據(jù)集:TheEuroCityPersonsDataset存放地址:https://eurocity-dataset.tudelft.nl/2)自主采集如果有私家車,并且裝了行車記錄儀,可以從行車記錄儀中導(dǎo)出視頻作為素材,如果沒有,那么在視頻網(wǎng)站搜索行車記錄儀,也能獲取到他人上傳的行車記錄儀視頻,挑選清晰度較高的視頻下載即可。6.1數(shù)據(jù)集采集與標(biāo)注針對以上幾點標(biāo)注要求,給出幾個標(biāo)注的示例。1)如下左圖人多雜亂,盡可能標(biāo)記人能識別的人,遠(yuǎn)處雜亂無法區(qū)分輪廓的人不做標(biāo)記。2)如上右圖左邊遠(yuǎn)處騎車可以辨別人形,需要標(biāo)記;右邊兩人雖有重疊但依舊可以單獨區(qū)分開,需要分開標(biāo)記;中間的人手臂部分超出身體輪廓太多,僅標(biāo)記身體部分;中間偏右的黑色人群無法區(qū)分不做標(biāo)記。6.1數(shù)據(jù)集采集與標(biāo)注針對以上幾點標(biāo)注要求,給出幾個標(biāo)注的示例。3)如下左圖對于這類已經(jīng)動態(tài)模糊比較嚴(yán)重的情況,不需要標(biāo)記(圖中框只是展示下),否則會對訓(xùn)練造成干擾。4)如上右圖被護欄擋住的行人,如果某些角度隔著護欄依舊可以看到腿需要標(biāo)注全身,若護欄將腿完全擋住,則僅標(biāo)記身體露出的部分。6.1數(shù)據(jù)集采集與標(biāo)注針對以上幾點標(biāo)注要求,給出幾個標(biāo)注的示例。5)如下左圖人行道上的行人和騎車的人雖然被柱子和樹遮擋,但依舊可以辨別為人,需要標(biāo)記,但標(biāo)記露出的部分,不要將柱子標(biāo)記進(jìn)去;對于騎車的人不要刻意去標(biāo)記車的部分,把人的輪廓標(biāo)記全,框里面盡量是人的信息。6)如上右圖中間騎車帶人雖然有兩個人,但已經(jīng)完全重疊,只需要標(biāo)記一個即可。6.1數(shù)據(jù)集采集與標(biāo)注6.1.3小結(jié)素材是一切深度學(xué)習(xí)項目的基礎(chǔ),行人識別的項目在素材采集和標(biāo)注方面難度并不算太大。前期使用廣大公開數(shù)據(jù)集的行人素材,也可以讓算法得到一個不錯的效果,但倘若要把效果做到更好,在素材方面則需要用更多真實的場景進(jìn)行擴充。如今市面上還有很多素材標(biāo)注公司,他們不光提供素材標(biāo)注的服務(wù),同時出售素材或者按需求采集素材,如果項目時間緊迫但有足夠的預(yù)算,找他們幫忙也是一個不錯的選擇。6.2模型訓(xùn)練6.2.1模型設(shè)計思想本實驗使用SSD的目標(biāo)檢測網(wǎng)絡(luò),在正式進(jìn)入項目之前,簡單介紹下其設(shè)計思想。若想了解詳細(xì)細(xì)節(jié),可以參考論文《SSD:SingleShotMultiBoxDetector》。SSD是一種引人注目的目標(biāo)檢測結(jié)構(gòu),它結(jié)合了直接回歸框和分類概率的方法,又利用大量的預(yù)選框來提升識別準(zhǔn)確度。ssd在預(yù)測階段不僅僅使用最后一層的特征映射,而是取出中間層的特征,在不同尺寸的特征映射上對結(jié)果進(jìn)行預(yù)測,雖然增加運算量,但使檢測結(jié)果具有更多個可能性,從而提升精度。如圖所示是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ù)測結(jié)果,分別取出conv4的第三層卷積特征、fc7卷積特征,conv6的第二次卷積特征,conv7的第二次卷積特征,conv8的第二次卷積特征和conv9的第二次卷積特征,共六個特征層作為有效特征層如圖所示。對獲取到的每個有效特征層做一次num_anchorsx4的卷積和一次num_anchorsxnum_classes的卷積,num_anchors指的是該特征層每一個特征點所擁有的先驗框數(shù)量。上述提到的六個特征層,每個特征層的每個特征點對應(yīng)的先驗框數(shù)量分別為4、6、6、6、4、4。其中num_anchorsx4的卷積用于預(yù)測該特征層上每一個網(wǎng)格點上每一個先驗框的變化情況;num_anchorsxnum_classes的卷積用于預(yù)測該特征層上每一個網(wǎng)格點上每一個預(yù)測對應(yīng)的種類。利用num_anchorsx4的卷積對每一個有效特征層對應(yīng)的先驗框進(jìn)行調(diào)整可以獲得預(yù)測框。6.2模型訓(xùn)練SSD解碼過程可以分為兩部分:(1)將每個網(wǎng)格的中心點加上它對應(yīng)的x_offset和y_offset,加完之后的記過就是預(yù)測框的中心;(2)利用h和w調(diào)整先驗框獲得預(yù)測框的寬和高。獲得預(yù)測框的中心和寬高時,便可以在圖片上繪制預(yù)測框了。但是想要獲得最終的預(yù)測結(jié)果,還要對每一個預(yù)測框在進(jìn)行得分排序與非極大抑制篩選,這一部分基本上時目標(biāo)檢測領(lǐng)域通用的部分。實現(xià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,整個數(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ù)集的擺放后,需對數(shù)據(jù)集進(jìn)行下一步處理,目的是為了獲得訓(xùn)練用的_xxx_train.txt和_xxx_val.txt,在工程下新建voc_annotation.py,腳本見代碼清單6-46.2模型訓(xùn)練6.2.3訓(xùn)練如果訓(xùn)練過程中存在中斷訓(xùn)練的操作,可以將model_path設(shè)置成logs文件夾下的權(quán)值文件,將已經(jīng)訓(xùn)練了一部分的權(quán)值再次載入。同時修改下方的凍結(jié)階段或者解凍階段的參數(shù),來保證模型epoch的連續(xù)性。當(dāng)model_path=''的時候不加載整個模型的權(quán)值。此處使用的是整個模型的權(quán)重,因此是在train.py進(jìn)行加載的,下面的pretrain不影響此處的權(quán)值加載。如果想要讓模型從主干的預(yù)訓(xùn)練權(quán)值開始訓(xùn)練,則設(shè)置model_path='',下面的pretrain=True,此時僅加載主干。如果想要讓模型從0開始訓(xùn)練,則設(shè)置model_path='',下面的pretrain=Fasle,F(xiàn)reeze_Train=Fasle,此時從0開始訓(xùn)練,且沒有凍結(jié)主干的過程。一般來講,從0開始訓(xùn)練效果會很差,因為權(quán)值太過隨機,特征提取效果不明顯。網(wǎng)絡(luò)一般不從0開始訓(xùn)練,至少會使用主干部分的權(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)練分為兩個階段,分別時凍結(jié)階段和解凍階段,顯存不足與數(shù)據(jù)集的大小無關(guān),提示顯存不足請調(diào)小batch_size收到BatchNorm層影響,batch_size最小為2,不能為1。凍結(jié)階段訓(xùn)練參數(shù),此時模型的主干被凍結(jié)了,特征提取網(wǎng)絡(luò)不發(fā)生改變,占用的顯存較小進(jìn)隊網(wǎng)絡(luò)進(jìn)行微調(diào)。解凍階段訓(xùn)練參數(shù),此時模型的主干不被凍結(jié)了,特征提取網(wǎng)絡(luò)會發(fā)生改變,占用的顯存較大,網(wǎng)絡(luò)所有的參數(shù)都會發(fā)生改變。Freeze_Train設(shè)為True,也就是默認(rèn)先凍結(jié)主干訓(xùn)練后解凍訓(xùn)練。num_workers用于設(shè)置是否使用多線程讀取數(shù)據(jù),開啟后會加快數(shù)據(jù)讀取速度,但是會占用更多內(nèi)存,內(nèi)存較小的電腦可以設(shè)置為2或0。train_annotation_path和val_annotation_path是獲取圖片和標(biāo)簽的路徑。6.2模型訓(xùn)練6.2.3訓(xùn)練運行train.py文件,如下左圖可以觀察到已經(jīng)開始訓(xùn)練模型。訓(xùn)練完成之后可以觀察到在log文件下,存取了訓(xùn)練過程中的權(quán)值文件,如上右圖所示。6.2模型訓(xùn)練6.2.4預(yù)測和評估訓(xùn)練結(jié)果預(yù)測需要用到兩個文件,分別是ssd.py和predict.py,代碼詳見本書附帶資料,和之前一樣,需要去ssd.py里面修改model_path以及classes_path為自己對應(yīng)的訓(xùn)練權(quán)重文件和目標(biāo)識別種類。在此我們選擇上一步訓(xùn)練模型表現(xiàn)最好的權(quán)重,對應(yīng)設(shè)置如下:"model_path":'logs/best_epoch_weights.pth',"classes_path":'model_data/cls_classes.txt',predict.py代碼如下,該代碼將單張圖片預(yù)測、攝像頭檢測、FPS檢測和目錄遍歷檢測多功能融為一體,具體測試模式由參數(shù)mode決定,當(dāng)mode為predict時表示單張圖片預(yù)測;為video表示視頻檢測,可調(diào)用攝像頭或者視頻進(jìn)行檢測;為fps表示測試fps,使用的圖片是img里的street.jpg;為dir_predict表示遍歷文件夾進(jìn)行檢測并保存,默認(rèn)遍歷img文件夾,保存img_out文件夾,為export_onnx表示將模型導(dǎo)出為onnx。6.2模型訓(xùn)練6.2.4預(yù)測和評估在終端輸入pythonpredict.py運行predict.py。運行時要求輸入待檢測圖片的路徑,在這里我們把測試圖片test.jpg放入了img文件夾下,所以這里輸入的路徑為img/test.jpg,預(yù)測完成之后會將結(jié)果以img.img(如圖所示)形式保存在工程根目錄下。6.2模型訓(xùn)練6.2.4預(yù)測和評估評估需要用到get_map.py文件,同樣需要設(shè)置model_path和classes_path,設(shè)置方式和預(yù)測時的設(shè)置相同。隨后便可以在終端輸入pythonget_map.py運行g(shù)et_map.py文件,運行時在終端的顯示如圖所示,從圖中可以看出此模型預(yù)測出行人這一類別時的AP值為91.23%,在門限值為0.5的情況下,F(xiàn)1值為0.85,召回率為73.81%,精確度值為99.20%。6.2模型訓(xùn)練6.2.4預(yù)測和評估不同門限值對應(yīng)的F1值、召回率和精確度也對應(yīng)繪制成了圖片如圖所示,保存至map_out文件夾中。6.3模型轉(zhuǎn)換與量化6.3.1模型轉(zhuǎn)換ONNX(OpenNeuralNetworkExchange)是一種開放的深度學(xué)習(xí)模型表示格式,它旨在提供一個通用的格式,用于在不同的深度學(xué)習(xí)框架之間無縫地交換模型。所以為了更好完成后續(xù)的部署工作,可將模型轉(zhuǎn)換為onnx格式。具體是在predict.py中調(diào)用了ssd.py的方法convert_to_onnx,其實現(xià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)用時,我們只需在predict.py文件里將mode設(shè)置為export_onnx即可,隨后保存predict.py文件,運行可以發(fā)現(xiàn)在model_data文件夾下生成了對應(yīng)的model.onnx文件。6.3模型轉(zhuǎn)換與量化6.3.2模型量化上面的所有步驟完成后,其實如果項目是用在PC端的,那么這個權(quán)重已經(jīng)可以落地了,但是本章節(jié)的最終目標(biāo)是將它在AIBOX中運行,所以針對AIBOX的環(huán)境,需要對模型文件進(jìn)行量化。模型量化所需要用到的rknn-toolkit的container環(huán)境詳見3.6章節(jié)。首先進(jìn)入rknn-toolkit新建img文件夾存放一批素材用于量化,素材需要盡可能覆蓋所有可能出現(xiàn)的場景,將它們的尺寸調(diào)整為網(wǎng)絡(luò)輸入的大小,并生成文件列表,程序見代碼清單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)練階段會遇到的各個步驟,也是深度學(xué)習(xí)項目中的重要環(huán)節(jié)之一,模型的訓(xùn)練結(jié)果很大程度上會直接影響到項目落地后的用戶體驗。在經(jīng)歷過不同硬件設(shè)備開發(fā)以后就會發(fā)現(xiàn),量化也是整個過程中必不可少的一環(huán),因為量化在加速推理的同時,也是對硬件環(huán)境的一種適配。其實即便是落地在PC上的項目,原模型可以直接運行的情況下,考慮到性能也會使用例如tensorRT等方式對模型進(jìn)行量化。6.4項目落地與部署6.4.1項目工程工程目錄結(jié)構(gòu)如下otest|--sdk_rk1808相關(guān)sdk|--src源碼 |--otest主模塊程序 |--assets模型文件 |--test測試程序|--build_emv.cmake編譯環(huán)境配置,供CMakeLists調(diào)用|--CMakeLists.txt用于生成makefile,各源碼模塊中也有對應(yīng)文件,逐級調(diào)用6.4項目落地與部署源碼讀者可以直接從隨書的資源中獲取,本章節(jié)主要是梳理源碼結(jié)構(gòu)如圖所示,對幾個重要的模塊進(jìn)行講解,幫助讀者更快地理解代碼。視頻源:獲取攝像頭數(shù)據(jù),用測試模塊所配置的回調(diào)函數(shù),向測試模塊回調(diào)傳輸圖像數(shù)據(jù)。測試模塊:向視頻源配置一個用于傳輸圖像的回調(diào)函數(shù),向主模塊配置一個用于傳輸推理結(jié)果的回調(diào)函數(shù)。將視頻源回調(diào)來的圖像數(shù)據(jù)傳給主模塊推理,并將主模塊回調(diào)來的推理結(jié)果提供給繪圖模塊。主模塊:接收圖像數(shù)據(jù),用測試模塊所配置的回調(diào)函數(shù),向測試模塊回調(diào)推理結(jié)果。主模塊是另起線程進(jìn)行異步推理,因為一旦推理的幀率低于視頻源的幀率(25FPS)會導(dǎo)致阻塞。繪圖:繪圖模塊將測試模塊傳輸過來的推理結(jié)果,繪制在畫面上用于展示。6.4項目落地與部署6.4.2源碼解析1)主模塊對模塊進(jì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配置文件中讀取模型文件,若沒有配置這里直接給予了一個默認(rèn)值。初始化推理模塊后,程序可以直接從模型文件里讀取模型的輸入尺寸,然后利用初始化傳入的視頻源尺寸和模型的尺寸初始化rga。6.4項目落地與部署6.4.2源碼解析1)主模塊對rga進(jì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);在對rga初始化的過程中,需要指定原始圖像的信息、原始圖像中需要轉(zhuǎn)換的部分、目標(biāo)圖像的信息,也就是告訴rga,需要從一種圖轉(zhuǎn)換成另一種圖。6.4項目落地與部署6.4.2源碼解析1)主模塊更新最新圖像,代碼見代碼清單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)過rga的轉(zhuǎn)換送入緩沖區(qū)。取名更新也是因為,外部送入圖片和主模塊的推理是異步操作,中間用一個單項緩沖區(qū)連接,外部所傳入的圖片會不斷更新緩沖區(qū),內(nèi)部在推理完成后會從緩沖區(qū)取數(shù)據(jù)。當(dāng)處理的幀率低于視頻幀率時,外部送入的圖片會不斷更新緩沖區(qū)的圖片,從而保證每次推理的圖片都是最近的視頻畫面。6.4項目落地與部署6.4.2源碼解析1)主模塊子線程循環(huá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)運行在子線程中,直到反初始化或者析構(gòu)時收到停止信號才會退出循環(huán)。該函數(shù)主要功能就是從緩沖區(qū)中取出圖片進(jìn)行推理,并將推理的結(jié)果,通過外部傳入的回調(diào)函數(shù)傳遞出去。6.4項目落地與部署6.4.2源碼解析2)推理模塊推理模塊的代碼在ssd_detector.cpp中,主要工作就是調(diào)用rk的接口進(jìn)行圖片的推理,并對推理結(jié)果做后處理后輸出。這部分其實就是將PC上的推理代碼,將Python翻譯成C++即可,讀者可以對照著量化章節(jié)的代碼閱讀源碼,這里不再贅述。6.4項目落地與部署6.4.3部署工程開發(fā)環(huán)境的搭建可以參考3.6.WSL安裝,以下的全部指令都是在WSL下運行。新建build文件夾,并進(jìn)入到build

溫馨提示

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

評論

0/150

提交評論