版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
7車道線檢測實踐LANELINEINSPECTIONPRACTICEChapter07本章目錄數(shù)據(jù)采集與標注01環(huán)境部署02模型訓(xùn)練03模型的量化04項目部署與落地05本章總體介紹車道線檢測是輔助駕駛中必不可少的一項,它的主要目標是通過計算機視覺和圖像處理技術(shù),從道路圖像中精確提取出車道線的位置和形狀信息。這些提取到的車道線信息可以用于車道保持、車道偏離預(yù)警、自動駕駛路徑規(guī)劃等應(yīng)用。通過實現(xiàn)準確的車道線檢測系統(tǒng),可以提高駕駛安全性,減少交通事故的發(fā)生,并為駕駛員提供更好的駕駛體驗?;谝曈X的車道線檢測方法可以分為:傳統(tǒng)圖像方法和深度學(xué)習(xí)方法兩類。其中傳統(tǒng)的圖像檢測方法可以通過邊緣檢測、濾波或是顏色空間的車道線檢測等方式得到車道線區(qū)域,再結(jié)合相關(guān)圖像檢測算法實現(xiàn)車道線檢測。但面對環(huán)境明顯變化的場景并不能很好的檢測,工作量大且魯棒性差。而深度學(xué)習(xí)的方法有較好的魯棒性,且準確率更高。它大致有基于分類和目標檢測的方法和基于端到端圖像分割的方法等相關(guān)車道線檢測方法。而本書的車道線檢測采用的是UNet的語義分割網(wǎng)絡(luò)。本章總體介紹車道線檢測算法的流程如下圖所示。主要思路是:通過素材采集獲取訓(xùn)練要用的原始數(shù)據(jù),再經(jīng)過標注與生成標簽圖兩個步驟將原始數(shù)據(jù)轉(zhuǎn)化為可以被學(xué)習(xí)訓(xùn)練的素材,然后通過模型訓(xùn)練得到相應(yīng)模型,最后經(jīng)過模型量化、轉(zhuǎn)換和部署等步驟將模型優(yōu)化并轉(zhuǎn)化成可被嵌入式平臺運行的程序。車道線項目流程圖7.1數(shù)據(jù)集采集與標注素材的獲取一般有兩種途徑,一種是自己利用相關(guān)設(shè)備如行車記錄儀獲取,另一種是通過下載公開的數(shù)據(jù)集獲取。車道線檢測相關(guān)的數(shù)據(jù)集有TuSimple、CULane、CurveLanes、BDD100k等。素材標注使用Labelme工具,本項目提供的例程的“數(shù)據(jù)集”文件夾內(nèi)已經(jīng)提供原圖與對應(yīng)標注文件,車道線識別項目對于車道線的標注有以下幾點要求:需要標注的內(nèi)容為圖片中人眼可以識別的車道線,包括實線、虛線、白線和黃線。對于雙線的車道線,兩條分開標注。對于虛線中間沒有車道線的部分進行補足。對于沒有車道線的圖片,直接跳過,不做處理。7.1數(shù)據(jù)集采集與標注下圖是按以上要求所給出的標注示例。車道線項目流程圖相較于分類和目標檢測,語義分割的素材多了一步從標簽文件到分割圖的轉(zhuǎn)換。因為語義分割是像素級別的推理,每個像素點都有其對應(yīng)的標簽,因此在訓(xùn)練中,它的標簽就是和它等大的一張分割圖。7.2環(huán)境部署深度學(xué)習(xí)的框架除了PyTorch外還有TensorFlow框架,本項目在TensorFlow框架下訓(xùn)練,所以在進行本章之前需要進行TensorFlow環(huán)境的搭建,其環(huán)境總體搭建步驟如下:(1)在Ubuntu系統(tǒng)(WSL2、虛擬機或多系統(tǒng))下搭建TensorFlow環(huán)境的docker(2)在docker環(huán)境內(nèi)安裝本項目的相關(guān)庫當然,若有需求也可以在創(chuàng)建一個docker容器后,在其內(nèi)部建立conda的虛擬環(huán)境,然后安裝本項目需要的TensorFlow環(huán)境與相關(guān)庫。7.2環(huán)境部署7.2.1docker環(huán)境部署針對不同的顯卡,需要搭建不同的環(huán)境。本項目以30系顯卡為例進行環(huán)境搭建介紹,30系顯卡需要CUDA11.1,可以使用NVIDIA提供的docker鏡像—NVIDIA-TensorFlow。如果沒有安裝過NVIDIA-docker,首先要進行NVIDIA-docker的安裝,它是使用上述鏡像的前提,如下是安裝步驟:$distribution=$(./etc/os-release;echo$ID$VERSION_ID)$curl-s-Lhttps://nvidia.github.io/nvidia-docker/gpgkey|sudoapt-keyadd-$curl-s-Lhttps://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list|sudotee/etc/apt/sources.list.d/nvidia-docker.list$sudoapt-getupdate$sudoapt-getinstall-ynvidia-docker27.2環(huán)境部署7.2.1docker環(huán)境部署接著進行NVIDIA-TensorFlow的docker環(huán)境部署#拉取鏡像nvidia-dockerpullnvcr.io/nvidia/tensorflow:20.10-tf1-py3#創(chuàng)建容器nvidia-dockerrun-d-it-p10022:22-p10500:5000-v/home:/home--namenvidia_tensorflownvcr.io/nvidia/tensorflow:20.10-tf1-py3#-p代表了端口的映射-p宿主機端口:容器端口這里預(yù)留了22可以用于ssh登錄5000后面會用到#進入容器nvidia-dockerexec-itnvidia_tensorflow/bin/bash安裝TensorFlowwheel的索引pipinstallnvidia-index用官方提供的命令安裝依賴的包pipinstallnvidia-tensorflow[horovod]7.2環(huán)境部署7.2.1docker環(huán)境部署下載完成后進入對應(yīng)的目錄,因為這些依賴包安裝存在一定順序,所以按以下順序執(zhí)行指令。若覺得一條一條執(zhí)行繁瑣,可以建一個后綴名為.sh的shell腳本文件,將下列指令復(fù)制進文件后執(zhí)行sh文件名.sh指令提高效率。pipinstallgoogle_pasta-0.2.0-py3-none-any.whlpipinstallnvidia_cublas-4-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cuda_cupti-11.1.69-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cuda_nvcc-11.1.74-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cuda_cupti-11.1.69-cp36-cp36m-linux_x86_64.whlnvidia_cuda_nvcc-11.1.74-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cuda_nvrtc-11.1.74-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cuda_runtime-11.1.74-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cudnn-8.0.70-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cufft-4-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_curand-4-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cusolver-4-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_cusparse-75-cp36-cp36m-linux_x86_64.whl7.2環(huán)境部署7.2.1docker環(huán)境部署pipinstallnvidia_dali_cuda110-0.26.0-1608709-py3-none-manylinux2014_x86_64.whlpipinstallnvidia_dali_nvtf_plugin-0.26.0+nv20.10-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_nccl-2.7.8-cp36-cp36m-linux_x86_64.whlpipinstallnvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlpipinstallnvidia_tensorrt--cp36-none-linux_x86_64.whlpipinstallnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whlpipinstalltensorflow_estimator-1.15.1-py2.py3-none-any.whlpipinstallnvidia_horovod-0.20.0+nv20.10-cp36-cp36m-linux_x86_64.whl此外本項目還需要用到以下幾個Python包,讀者可以使用以下命令安裝或者直接使用項目中的requirements.txt導(dǎo)入。pipinstallscipy==1.1.0-i/simplepipinstallscikit-learn-i/simplepipinstalltqdm-i/simple7.2環(huán)境部署7.2.2安裝TensorFlowObjectDetectionAPITensorFlowObjectDetectionAPI是一個基于TensorFlow構(gòu)建的開源框架,用于目標檢測任務(wù)。它提供了豐富的目標檢測模型,其中包括了一些經(jīng)典的模型架構(gòu),如FasterR-CNN、SSD、Mask-RCNN等,具體可見TensorFlow的GitHub的model倉庫。7.3模型訓(xùn)練項目文件夾為project,項目目錄如圖?!安渴鸫a”文件夾包含的是模型部署的代碼,“權(quán)重轉(zhuǎn)換與量化”包含的是模型量化轉(zhuǎn)換的相關(guān)代碼,本節(jié)介紹“訓(xùn)練代碼”和“數(shù)據(jù)集”文件夾部分,實現(xiàn)數(shù)據(jù)集制作與模型訓(xùn)練與保存。標簽轉(zhuǎn)換程序、數(shù)據(jù)集制作程序和模型及訓(xùn)練程序這三部分對應(yīng)在“訓(xùn)練代碼”文件夾下,分別對應(yīng)的是ldw_draw.py、make_dataset.py和剩下其他程序,目錄結(jié)構(gòu)如圖所示。models內(nèi)存有模型程序,builders內(nèi)存有模型接口程序,utils是相關(guān)的輔助函數(shù)集合,train.py是模型訓(xùn)練程序,ckpt2pb.py是將訓(xùn)練完成后的ckpt文件轉(zhuǎn)換為pb文件的程序,eval.py是評估程序用訓(xùn)練過程中保存的pb文件進行推理。項目目錄結(jié)構(gòu)traincode目錄結(jié)構(gòu)7.3模型訓(xùn)練7.3.1模型設(shè)計思想本項目使用UNet的語義分割網(wǎng)絡(luò),從圖中可以看到,其形狀類似字母“U”所以被稱為UNet。參考論文《U-Net:ConvolutionalNetworksforBiomedicalImageSegmentation》,起初UNet被用于醫(yī)學(xué)領(lǐng)域,而后UNet憑借著突出的效果被廣泛應(yīng)用。UNet本質(zhì)上是一個編碼器和解碼器的結(jié)構(gòu),左邊是特征提取,右邊是采樣恢復(fù)原始分辨率,中間采用跳層鏈接的方式將位置信息和語義信息融合。UNet網(wǎng)絡(luò)結(jié)構(gòu)7.3模型訓(xùn)練7.3.2標簽轉(zhuǎn)換7.1節(jié)中標注完的素材僅僅是多了一個標簽文件,保存了所標注的那些多邊形的類別和位置。而實際在訓(xùn)練中用到的是像素級別的標簽,也就是對于原圖上每個像素點,都會有一個對應(yīng)了類別的標簽,這個時候就需要利用標注文件來生成分割用的標簽圖。本項目提供的標簽轉(zhuǎn)換程序為ldw_draw.py。詳見代碼清單7-1。將對應(yīng)腳本—ldw_draw.sh中的Path參數(shù)配置成讀者自己電腦上的標注圖片的所在目錄,執(zhí)行腳本,結(jié)果如下。image中存放原始圖片;json中存放標注文件;roadmap中存放分割標簽圖片,轉(zhuǎn)換后的目錄結(jié)構(gòu)和圖片經(jīng)過轉(zhuǎn)換后的結(jié)果如圖所示。轉(zhuǎn)換后的目錄結(jié)構(gòu)轉(zhuǎn)換前后對比,原圖(左),轉(zhuǎn)換后圖(右)7.3模型訓(xùn)練7.3.3數(shù)據(jù)集制作在project下的“數(shù)據(jù)集”目錄中放置數(shù)據(jù)集,在“數(shù)據(jù)集”下再建一層子目錄,用于數(shù)據(jù)集分類。這里就以type1、type2為例,將轉(zhuǎn)化完成后的素材文件夾放入子文件夾中。對于本項目提供的例程,需要將“數(shù)據(jù)集”文件夾內(nèi)data文件夾放入“訓(xùn)練代碼”文件夾內(nèi)make_dataset.py所在目錄下,或者讀者可以修改make_dataset.py的相關(guān)路徑。詳見代碼清單7-2。將腳本—make_datase.sh中的dataset參數(shù)配置成data下的子目錄,樣例數(shù)據(jù)集中有兩個子目錄type1、type2,存有上一小節(jié)所轉(zhuǎn)換的相關(guān)素材。input_height和input_width根據(jù)實際情況配置,所演示的項目中是256*128。修改make_datase.sh中的type1、type2后分別執(zhí)行。完成后其目錄結(jié)構(gòu)如圖所示,新增兩個文件夾。數(shù)據(jù)集制作后的目錄結(jié)構(gòu)7.3模型訓(xùn)練7.3.3數(shù)據(jù)集制作新增文件夾的目錄結(jié)構(gòu)如圖所示,test:測試集圖片;test_label:測試機標簽;train:訓(xùn)練集圖片;train_label:訓(xùn)練集標簽;val:驗證集圖片;val_label:驗證集標簽。同時,處理完的素材文件夾會被移動到data/done下面,以便于未來多次制作數(shù)據(jù)集時不會重復(fù)操作。新增文件夾的目錄結(jié)構(gòu)7.3模型訓(xùn)練7.3.4網(wǎng)絡(luò)搭建在“訓(xùn)練代碼”文件夾下models目錄中放置需要搭建的模型文件,這里就以上面提到的UNet為例。本項目提供的例程在models下有一個UNet.py程序。詳見代碼清單7-3。在traincode下builders目錄,本項目提供一個model_builder.py程序作為創(chuàng)建模型總的接口,用于不同類型模型的選擇和搭建。importsys,osimporttensorflowastfimportsubprocess#存放模型的目錄sys.path.append("models")#載入模型的搭建函數(shù)frommodels.UNetimportbuild_unet#自定義模型名稱SUPPORTED_MODELS=["UNet"]#統(tǒng)一的模型搭建接口defbuild_model(model_name,net_input,num_classes,is_training=False):print("Preparingthemodel...") ifmodel_namenotinSUPPORTED_MODELS: raiseValueError("Themodelyouselectedisnotsupported.Thefollowingmodelsarecurrentlysupported:{0}".format(SUPPORTED_MODELS)) network=None #根據(jù)模型名稱調(diào)用對應(yīng)的模型搭建函數(shù)
ifmodel_name=="UNet": network=build_unet(net_input,num_classes,is_training=is_training) else: raiseValueError("Error:themodel%disnotavailable.Trycheckingwhichmodelsareavailableusingthecommandpythonmain.py--help") returnnetwork7.3模型訓(xùn)練7.3.5模型訓(xùn)練訓(xùn)練的代碼由相關(guān)數(shù)據(jù)的讀取、訓(xùn)練參數(shù)設(shè)置、數(shù)據(jù)增強、訓(xùn)練信息顯示及保存、繼續(xù)訓(xùn)練等相關(guān)部分構(gòu)成。在訓(xùn)練開始前,需要對訓(xùn)練進行一些相關(guān)參數(shù)的設(shè)置,其中一些參數(shù)的設(shè)置將會影響訓(xùn)練模型的效果。相關(guān)參數(shù)有:num_epochs:總訓(xùn)練輪數(shù);epoch_start_i:開始輪數(shù),配合繼續(xù)訓(xùn)練使用,程序會自動加載epoch_start_i-1的權(quán)重;validation_step:間隔多少輪驗證一次模型;continue_training:是否繼續(xù)訓(xùn)練;dataset:數(shù)據(jù)集,可配置列表;imgprocess:載入圖片操作,裁剪或者縮放;input_height:網(wǎng)絡(luò)輸入的高;input_width:網(wǎng)絡(luò)輸入的寬;batch_size:每個批次圖片數(shù)量;num_val_images:每次驗證取多少張驗證集中的圖片;h_flip:數(shù)據(jù)增強是否進行水平翻轉(zhuǎn);v_flip:數(shù)據(jù)增強是否進行垂直翻轉(zhuǎn);brightness:數(shù)據(jù)增強是否隨機亮度;color:數(shù)據(jù)增強是否隨機添加顏色;rotation:數(shù)據(jù)增強隨機旋轉(zhuǎn)角度;model:訓(xùn)練的模型;savedir:保存的路徑;7.3模型訓(xùn)練7.3.5模型訓(xùn)練數(shù)據(jù)增強是一種在深度學(xué)習(xí)中廣泛使用的技術(shù),用于擴充訓(xùn)練數(shù)據(jù)集,以提高模型的泛化能力和魯棒性。數(shù)據(jù)增強通過對原始訓(xùn)練數(shù)據(jù)應(yīng)用一系列隨機變換或變形操作,生成額外的訓(xùn)練樣本,從而增加數(shù)據(jù)的多樣性。數(shù)據(jù)增強部分,程序根據(jù)讀者傳入的訓(xùn)練參數(shù),再載入每個批次的圖片時會對圖片進行隨機數(shù)據(jù)增強的操作。詳見代碼清單7-4。損失函數(shù),也稱為目標函數(shù)或代價函數(shù),是深度學(xué)習(xí)模型中的一個關(guān)鍵組成部分。損失函數(shù)用于度量模型的預(yù)測輸出與真實標簽之間的差異或錯誤程度,通過最小化該差異來優(yōu)化模型的參數(shù)。本項目損失函數(shù)部分采用的是focal_loss,其主要側(cè)重于根據(jù)樣本的難易程度給樣本對應(yīng)的損失增加權(quán)重。deffocal_loss(prediction_tensor,target_tensor,weights=None,alpha=0.25,gamma=2):
sigmoid_p=tf.nn.sigmoid(prediction_tensor)#創(chuàng)建一個將所有元素設(shè)置為0的張量
zeros=array_ops.zeros_like(sigmoid_p,dtype=sigmoid_p.dtype)#正樣本損失(車道線)
pos_p_sub=array_ops.where(target_tensor>zeros,target_tensor-sigmoid_p,zeros)#負樣本損失(背景)
neg_p_sub=array_ops.where(target_tensor>zeros,zeros,sigmoid_p)#-ylog(p^)-(1-y)log(1-p^)
per_entry_cross_ent=-alpha*(pos_p_sub**gamma)*tf.log(tf.clip_by_value(sigmoid_p,1e-8,1.0))-(1-alpha)*(neg_p_sub**gamma)*tf.log(tf.clip_by_value(1.0-sigmoid_p,1e-8,1.0))returntf.reduce_mean(per_entry_cross_ent)7.3模型訓(xùn)練7.3.5模型訓(xùn)練載入每個批次的圖片,語義分割的標簽是一張圖,所以在送入網(wǎng)絡(luò)之前要對rgb對應(yīng)的標簽做一次轉(zhuǎn)化,再進行獨熱編碼(one-hot)。defone_hot_it(label,label_values):semantic_map=[]#label_values從csv文件中載入forcolourinlabel_values:equality=np.equal(label,colour)class_map=np.all(equality,axis=-1)semantic_map.append(class_map)semantic_map=np.stack(semantic_map,axis=-1)returnsemantic_map評估指標部分,打印了整體分數(shù)、各類別分數(shù)、F1、IOU。defevaluate_segmentation(pred,label,num_classes,score_averaging="weighted"):flat_pred=pred.flatten()flat_label=label.flatten()#計算全局的分數(shù)
global_accuracy=compute_global_accuracy(flat_pred,flat_label)#計算每個類別的分數(shù)
class_accuracies=compute_class_accuracies(flat_pred,flat_label,num_classes)#計算精確率
prec=precision_score(flat_pred,flat_label,average=score_averaging)#計算召回率
rec=recall_score(flat_pred,flat_label,average=score_averaging)#計算F1f1=f1_score(flat_pred,flat_label,average=score_averaging)#計算IOUiou=compute_mean_iou(flat_pred,flat_label)returnglobal_accuracy,class_accuracies,prec,rec,f1,iou7.3模型訓(xùn)練7.3.5模型訓(xùn)練執(zhí)行文件夾內(nèi)的train.sh腳本后進行訓(xùn)練,其訓(xùn)練部分過程如圖所示。訓(xùn)練過程7.3模型訓(xùn)練7.3.5模型訓(xùn)練訓(xùn)練結(jié)束后將多出一個checkpoints文件夾,如圖所示。訓(xùn)練后文件夾結(jié)構(gòu)checkpoints文件夾中包含了訓(xùn)練過程中的一些保存信息,如圖所示。訓(xùn)練信息保存文件夾結(jié)構(gòu)其中每個文件夾內(nèi)保存了對應(yīng)epoch的訓(xùn)練信息,訓(xùn)練是以ckpt的形式保存模型的,包含三個文件:(1).mate文件保存了當前圖結(jié)構(gòu)(2).data文件保存了當前參數(shù)名和值(3).index文件保存了輔助索引信息7.3模型訓(xùn)練7.3.5模型訓(xùn)練這里需要把ckpt固化成pb模型文件,真正部署的時候,一般不會提供ckpt的模型,而是固化成pb模型。程序見ckpt2pb.py,如圖所示,其中frozen_graph.pb文件就是后續(xù)小節(jié)“模型轉(zhuǎn)換”所需要的模型保存文件。在評估階段會用到數(shù)據(jù)集中的test部分,由于目錄結(jié)構(gòu)類似,所以這一部分的代碼其實就是train中驗證部分給單獨提取出來,用訓(xùn)練過程中保存的pb文件進行推理,代碼詳見eval.py,運行腳本后會從train目錄的checkpoint文件中找到model_checkpoint_path權(quán)重進行評估。run_once參數(shù)的作用在于是否定時對權(quán)重進行評估,eval操作是可以和train同時進行的,因為train會定期保存權(quán)重,對應(yīng)的checkpoint中model_checkpoint_path權(quán)重隨之變化,所以可以實時對權(quán)重進行評估,如圖所示。保存節(jié)點文件夾結(jié)構(gòu)評估結(jié)果7.4模型的量化7.4.1RKNN量化上面的所有步驟完成后,其實如果項目是用在PC端的,那么這個權(quán)重已經(jīng)可以落地了,但是本章節(jié)的最終目標是將它在AIBOX中運行,所以,針對AIBOX的環(huán)境,需要對模型文件進行量化。模型量化所需要用到的RKNN-toolkit的container環(huán)境詳見前面章節(jié)。本書提供的此部分代碼在“權(quán)重轉(zhuǎn)換與量化”文件夾下,結(jié)構(gòu)如圖所示。這部分的作用是將模型轉(zhuǎn)化成RV1808芯片可用的類型,從而實現(xiàn)后續(xù)的部署。其中l(wèi)dw.py是將pb文件轉(zhuǎn)換為RKNN文件的程序,resize_ldw.py是調(diào)整素材的程序,test.py用于生成后的RKNN模型的推理。ret.png是執(zhí)行推理后的結(jié)果,它表示所轉(zhuǎn)化的RKNN模型文件可以實現(xiàn)車道線的檢測,并能看出其檢測效果。RKNN模型轉(zhuǎn)換文件夾結(jié)構(gòu)7.4模型的量化7.4.1RKNN量化其中有一個注意點,就是圖片輸入的順序。車道線檢測的模型,用于輸入網(wǎng)絡(luò)訓(xùn)練的圖片其通道次序為BGR,按照訓(xùn)練和部署需要統(tǒng)一的標準,部署在AIBOX上送入網(wǎng)絡(luò)推理的圖片通道次序也應(yīng)該是BGR。RKNN的量化過程中,程序會讀取一個列表中的圖像送入網(wǎng)絡(luò)量化,內(nèi)部讀取圖片的方式是按照RGB來的,和OpenCV是相反的。所以如果要用BGR的圖片進行量化,在準備數(shù)據(jù)集的時候,如果用OpenCV打開,就要做一步操作,就是BGR2RGB。雖然參數(shù)上是BGR到RGB的轉(zhuǎn)化,但本質(zhì)上是通道變更,當OpenCV將圖片按照RGB的格式保存以后,其他默認以RGB載入圖片的包將圖片加載后,實際得到的就是BGR。首先準備好一批素材用于量化,素材需要盡可能覆蓋所有可能出現(xiàn)的場景,將它們的尺寸調(diào)整為網(wǎng)絡(luò)輸入的大小,并生成文件列表,程序見代碼清單7-5。然后運行l(wèi)dw.py程序?qū)b模型轉(zhuǎn)換為RKNN模型,程序見代碼清單。7.4模型的量化7.4.1RKNN量化量化部分重點要講的是推理的部分,在PC上推理出正確的結(jié)果,那么在部署的時候只需要把對應(yīng)的Python代碼翻譯成C++即可。PC推理的代碼在test.py中,核心代碼片段如下。print('-->Runningmodel')outputs=rknn.inference(inputs=[img])print('done')
nout=len(outputs)foriinrange(np.array(outputs).shape[2]):l1=outputs[0][0][i][0]l2=outputs[0][0][i][1]ifl1>l2:#這里可以參考訓(xùn)練工程中的輸出節(jié)點來理解
#logit=tf.reshape(network,(-1,args.input_height*args.input_width,num_classes),name='logits')
#當通道0的數(shù)值大時則該像素格推理為背景,填充0,黑色
#當通道1的數(shù)值大時則該像素格推力為車道線,填充255,白色
img[i//img_w][i%img_w][0]=0
img[i//img_w][i%img_w][1]=0
img[i//img_w][i%img_w][2]=0else:
img[i//img_w][i%img_w][0]=255
img[i//img_w][i%img_w][1]=255
img[i//img_w][i%img_w][2]=255cv2.imwrite("ret.png",img)7.4模型的量化7.4.1RKNN量化結(jié)合代碼中注釋來解釋。推理后的輸出有4個維度,第一個維度是rk中輸出節(jié)點,當前項目只有一個輸出,所以這一維度是1;第二個維度是圖片的張數(shù),其實也就是batchsize,這里也是1,這兩個維度在本項目中沒有作用;第三個維度是在訓(xùn)練時將圖片的寬高兩個維度給轉(zhuǎn)化成了一維,還是可以按照h*w的排布來解析;第四個維度是通道,這里是對應(yīng)像素點上0通道的值和1通道的值,其實也就是對應(yīng)類別的分數(shù)。在解析的過程中,只需要取分數(shù)大的通道作為當前像素格上的推理結(jié)果即可。下圖為推理過程及推理后的結(jié)果。推理過程推理結(jié)果原圖(左)推理后(右)7.4模型的量化7.4.2小結(jié)通過上述項目的量化過程可以看到,量化是整個過程中必不可少的一環(huán),因為量化在加速推理的同時,也是對硬件環(huán)境的一種適配。其實即便是落地在PC上的項目,原模型可以直接運行的情況下,考慮到性能也會使用例如TensorRT等方式對模型進行量化。在這個階段需要關(guān)心的只是送入網(wǎng)絡(luò)的圖片和網(wǎng)絡(luò)輸出的數(shù)據(jù)解析。為了讓模型在項目部署落地上有最佳的表現(xiàn),訓(xùn)練、量化、落地這三個階段所有的素材、網(wǎng)絡(luò)輸入輸出都必須有統(tǒng)一標準。7.5項目部署與落地經(jīng)過上述幾個環(huán)節(jié)得到RKNN文件后,我們就能將模型移植進RV1808芯片的嵌入式板子中了,這部分就是嵌入式開發(fā)的工作。通過AIBOX的攝像頭得到輸入圖像,經(jīng)過前面得到的模型實現(xiàn)車道線檢測,將其繪制輸出到顯示屏上。其邏輯和上一節(jié)的推理過程類似。此部分代碼例程在“部署代碼”文件夾下,其結(jié)構(gòu)如圖所示。其中build用于camke與make生成文件的存放,build_emv.cm
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東松山職業(yè)技術(shù)學(xué)院《地圖與測量學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東水利電力職業(yè)技術(shù)學(xué)院《草食動物生產(chǎn)學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東石油化工學(xué)院《工程技術(shù)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東汕頭幼兒師范高等??茖W(xué)?!度沼锰沾蓜?chuàng)新設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東培正學(xué)院《商務(wù)公文寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 七年級上冊《第一章 有理數(shù)章末小結(jié)與考點檢測》課件
- 廣東茂名幼兒師范??茖W(xué)校《科技論文撰寫實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 關(guān)愛生命-慢病識別及管理(蘇州衛(wèi)生職業(yè)技術(shù)學(xué)院)學(xué)習(xí)通測試及答案
- 【備戰(zhàn)2021高考】全國2021屆高中地理試題匯編(11月份):E2內(nèi)外力作用對地形的影響
- 【名師一號】2020-2021學(xué)年高中英語(北師大版)必修5隨堂演練:第十四單元綜合測評
- 2023-2024學(xué)年上海市普陀區(qū)三年級(上)期末數(shù)學(xué)試卷
- 小班班本課程《吃飯這件小事》
- 中國特色大國外交和推動構(gòu)建人類命運共同體
- 《風(fēng)電場項目經(jīng)濟評價規(guī)范》(NB-T 31085-2016)
- 室內(nèi)裝飾裝修工程施工組織設(shè)計方案(完整版)
- 消防系統(tǒng)檢測方案(完整版)
- 關(guān)于童話故事的題目
- 工程竣工驗收備案申請表1
- 巢湖地區(qū)地質(zhì)調(diào)查報告 最終版[沐風(fēng)文苑]
- 生產(chǎn)計劃流程內(nèi)容培訓(xùn)工廠生產(chǎn)線管理工作總結(jié)匯報PPT模板
- 印象東城區(qū)少年宮
評論
0/150
提交評論