人工智能技術(shù)及應(yīng)用 課件 ch3-硬件部署與工具介紹_第1頁
人工智能技術(shù)及應(yīng)用 課件 ch3-硬件部署與工具介紹_第2頁
人工智能技術(shù)及應(yīng)用 課件 ch3-硬件部署與工具介紹_第3頁
人工智能技術(shù)及應(yīng)用 課件 ch3-硬件部署與工具介紹_第4頁
人工智能技術(shù)及應(yīng)用 課件 ch3-硬件部署與工具介紹_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

3硬件部署與工具介紹IntroductiontoHardwareDeploymentandToolsChapter03學(xué)習(xí)目標(biāo)硬件介紹01工具介紹02模型量化和推理03課后習(xí)題043.1硬件介紹

3.1.1主機(jī)AIBOX是一款為加速視頻AI(ArtificialIntelligence,人工智能)處理能力設(shè)計的硬件(如圖3-1所示),內(nèi)置高能效NPU(Neural-networkProcessingUnits,嵌入式神經(jīng)網(wǎng)絡(luò)處理器),適用于各類深度學(xué)習(xí)模型的加速推理。雙核Cortex-A35,最高頻率1.6GHz,峰值NPU算力高達(dá)3.0TOPs(TeraOperationsPerSecond,每秒鐘能處理的萬億次數(shù),1TOPs代表處理器每秒鐘可進(jìn)行一萬億次),支持OpenCL/OpenVX,支持INT8/INT16/FP16支持TensorFlow、Caffe、ONNX、Darknet模型。2GBDDR3內(nèi)存,8GB高速eMMC4.51存儲器。AIBOX主機(jī)外觀圖3.1硬件介紹

3.1.2RK1808K芯片簡介AIBOX主要的模塊是瑞芯微公司出的RK1808K:CPU:雙核Cortex-A35,最高頻率1.6GHzNPC:3TOPsforINT8/300GOPsforINT16/100GFLOPsforFP16支持OpenCL/OpenVX支持INT8/INT16/FP16支持TensorFlow、Caffe、ONNX、Darknet模型存儲:800MHz32-bitLPDDR2/LPDDR3/DDR3/DDR3L/DDR4支持SerialSPINOR/NANDFlash,EMMC視頻處理器:1080p@60FPSH.264解碼1080p@30FPSH.264編碼3.1硬件介紹

3.1.2RK1808K芯片簡介圖像處理器:支持2MP,AE/AWB/AF視頻輸入:4-lane,MIPI-CSI,支持VirtualChannel支持BT.601/BT.656/BT.1120顯示:4-lane,MIPI-DSI,最大到1920*1080bitParallelRGBpanel,最大到1280*720其他接口:支持USB3.0/PCIe2.1內(nèi)置2-ch&8-chI2S&8-chPDM,內(nèi)置VAD支持千兆以太網(wǎng)8xUART/3xSPI/6xI2C/11xPWM/4xSARADC封裝:BGA14*14,F(xiàn)CCSP420LDRK1808系列BlockDiagram3.1硬件介紹

3.1.3接口1)線束接口攝像頭接口:3路AHD視頻,支持1080p、720p分辨率。以太網(wǎng)接口:2路Eth網(wǎng)絡(luò)接口,支持100Mbps傳輸速度。其中ETH1網(wǎng)線

接口用ssh訪問,用ssh訪問時需要一個航空轉(zhuǎn)網(wǎng)線的接口。

顯示屏接口:1路HDMI輸出。線束接口顯示屏及其接口2)USB接口:1路USB調(diào)試口,支持ADB調(diào)試。3)SD卡接口:1路SD卡接口,支持Fat、vFat、Ext2、

Ext3、Ext4文件系統(tǒng)。3.1硬件介紹

3.1.4電源連接1)電源24V供電

下圖是AIBox的電源線,電源線是改造之后的電源線,兩者都可使用。2)5VUSB供電,但USB供電帶不動AHD攝像頭,需要接AHD攝像頭使用時用

電源供電。3.2工具介紹

3.2.1MobaXtermMobaxterm是一款遠(yuǎn)程管理工具,可以讓用戶在Windows操作系統(tǒng)中使用多個實用工具和遠(yuǎn)程連接功能,它結(jié)合了許多其他的網(wǎng)絡(luò)工具,以幫助用戶輕松管理遠(yuǎn)程計算機(jī)。這款軟件簡單易用,速度快,支持SSH、Telnet、SFTP、RDP和VNC等多種遠(yuǎn)程協(xié)議,同時還支持MSWindows系統(tǒng)本地X11映射。在MobaXterm官網(wǎng):/下載自己所需要的版本。MobaXterm提供了兩個版本,一個是HomeEdition(家庭版),另一個是ProfessionalEdition(專業(yè)版)。家庭版是免費的,而專業(yè)版需要購買。如果你只需要基本的連接功能,那么家庭版足以滿足需求。3.2工具介紹

3.2.1MobaXterm選擇右邊的家庭版安裝即可3.2工具介紹

3.2.1MobaXterm下載好Mobaxterm軟件后雙擊打開,點擊Session選項,如左圖所示。然后選擇ssh連接,輸入主機(jī)IP地址,用戶名,端口等信息,即可建立起連接,如右圖所示。MobaXterm設(shè)置ssh連接3.2工具介紹

3.2.1MobaXterm創(chuàng)建好session后,輸入密碼(輸入密碼時并不會顯示,只管輸入后按確定即可,第一次登陸成功后會提示保存密碼,一般選擇同意),就可以連接上虛擬機(jī)了。而且連上虛擬機(jī)之后,它會自動通過FTP也連接到虛擬機(jī),直接拖拽就可以進(jìn)行文件復(fù)制了。登陸后界面主要分兩塊,左邊的是主機(jī)的文件,右邊是終端,如圖所示。勾選左下角的“Followterminalfolder”可以讓兩個的工作路徑保持一致。終端界面介紹3.2工具介紹

3.2.1MobaXterm創(chuàng)建一個session之后,就可以在左側(cè)的session標(biāo)簽里留下它的信息,下次需要連接的時候直接雙擊即可,如上圖所示。文件傳輸和下載可以采用直接拖拽的方式,或者采用鼠標(biāo)右鍵選擇相應(yīng)功能,也可以點擊文件的右鍵,選擇下載或者其他功能,如右圖所示。3.2工具介紹

3.2.2OpenCV移植和使用OpenCV是一個開源的計算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫。OpenCV主要為開發(fā)計算機(jī)視覺程序提供一組公共的底層結(jié)構(gòu)(infrastructure)和加強商業(yè)產(chǎn)品中機(jī)器的感知能力。OpenCV使用BSD許可證(具體可參見維基百科對于BSD許可證的介紹),它可以被商用并可以修改源代碼。OpenCV主要用于圖像的加載和保存,圖像的簡單處理。3.2工具介紹

3.2.2OpenCV移植和使用3.2.2.1OpenCV移植1)下載 #下載opencv gitclone/opencv/opencv.git #下載opencv_contrib gitclone/opencv/opencv_contrib.git #得到opencv目錄和opencv_contrib目錄并列2)版本切換 #將opencv和opencv_contrib從master分支切換到3.4分支 gitcheckout3.43.2工具介紹

3.2.2OpenCV移植和使用3.2.2.1OpenCV移植3)編譯腳本make_opencv.sh在opencv目錄加入make_opencv.sh腳本,內(nèi)容如下:set-x."$(dirname"$0")/config.sh"echo"${PROJECT_DIR}"OPENCV_ROOT=${PROJECT_DIR}/BUILD_DIR=$OPENCV_ROOT/platforms/build_rk1808exportINSTALL_DIR=${PROJECT_DIR}/install_rk1808rm-rf"${BUILD_DIR}"mkdir-p"${BUILD_DIR}"pushd"${BUILD_DIR}"###注意:CMAKE_TOOLCHAIN_FILE需要填寫自己環(huán)境的真實位置cmake-DCMAKE_BUILD_WITH_INSTALL_RPATH=ON\ -DCMAKE_TOOLCHAIN_FILE="/xxx/xxx/rk1808/prebuilts/gcc/linux-x86/aarch64-rk1808.toolchain.cmake"\-DWITH_CUDA=OFF\-DWITH_MATLAB=OFF\-DWITH_WEBP=OFF\-DBUILD_ANDROID_EXAMPLES=OFF\-DBUILD_DOCS=OFF\-DBUILD_PERF_TESTS=OFF\-DBUILD_TESTS=OFF\-DBUILD_ZLIB=ON\-DBUILD_PNG=ON\-DBUILD_JPEG=ON\-DBUILD_TIFF=ON\-DBUILD_opencv_world=ON\-DCMAKE_INSTALL_PREFIX="${INSTALL_DIR}/opencv"\ -DCMAKE_MAKE_PROGRAM=make\../..make-j32makeinstall3.2工具介紹

3.2.2OpenCV移植和使用3.2.2.1OpenCV移植4)編譯chmod+xmake_opencv.sh./make_opencv.sh5)編譯結(jié)果在opencv/install_rk1808目錄下生成了opencv目錄(如右圖),包括:開發(fā)中主要使用opencv的inlude頭文件和lib下的libopencv_world.so動態(tài)庫。3.2工具介紹

3.2.2OpenCV移植和使用CMakeLists.txt: cmake_minimum_required(VERSION2.8.11) include_directories(.) #注意:此處填寫真實環(huán)境對應(yīng)的opencv include位置 include_directories(/opencv/path/include) set(DEMO_SRCmain.cpp) #注意:此處填寫真實環(huán)境對應(yīng)的opencvlib位置 set(link_libs/opencv/path/lib/libopencv_world.so) SET(TARGETopencv_test) add_executable(${TARGET}${DEMO_SRC}) target_link_libraries(${TARGET}${link_libs}libc.so)main.cpp:#include<opencv2/opencv.hpp>intmain(intargc,constchar**argv){cv::Matimg;img=cv::imread(argv[1]);cv::imwrite("/userdata/test.jpg",img);return0;}

3.2.2.2OpenCV使用3.2工具介紹3.2.3圖像格式轉(zhuǎn)換和圖像縮放RGA是瑞芯微提供的硬件加速的二維圖像基本操作庫,例如旋轉(zhuǎn)、鏡像、縮放、拷貝、剪裁、格式轉(zhuǎn)換等。為了提高圖像處理的可移植性和可用性,對圖像格式轉(zhuǎn)換和縮放接口進(jìn)行了二次封裝。3.2.3.1接口介紹1)

圖像結(jié)構(gòu)體:enum

Format{HQ_RK_FORMAT_RGBA_8888=0x0,HQ_RK_FORMAT_RGBX_8888=0x1,HQ_RK_FORMAT_RGB_888=0x2,HQ_RK_FORMAT_BGRA_8888=0x3,HQ_RK_FORMAT_RGB_565=0x4,HQ_RK_FORMAT_RGBA_5551=0x5,HQ_RK_FORMAT_RGBA_4444=0x6,HQ_RK_FORMAT_BGR_888=0x7,3.2工具介紹3.2.3.1接口介紹

HQ_RK_FORMAT_YCbCr_422_SP=0x8,

HQ_RK_FORMAT_YCbCr_422_P=0x9,

HQ_RK_FORMAT_YCbCr_420_SP=0xa,

HQ_RK_FORMAT_YCbCr_420_P=0xb,

HQ_RK_FORMAT_YCrCb_422_SP=0xc,

HQ_RK_FORMAT_YCrCb_422_P=0xd,

HQ_RK_FORMAT_YCrCb_420_SP=0xe,

HQ_RK_FORMAT_YCrCb_420_P=0xf,

HQ_RK_FORMAT_BPP1=0x10,

HQ_RK_FORMAT_BPP2=0x11,

HQ_RK_FORMAT_BPP4=0x12,

HQ_RK_FORMAT_BPP8=0x13,

HQ_RK_FORMAT_YCbCr_420_SP_10B=0x20,

HQ_RK_FORMAT_YCrCb_420_SP_10B=0x21,

HQ_RK_FORMAT_UNKNOWN=0x100,};structRgaCfg{

intwidth;

intheight;

intwidth_stride;

intheight_stride;

intformat;

//HAL_TRANSFORM_FLIP_H0x1

//HAL_TRANSFORM_FLIP_V0x2

//HAL_TRANSFORM_ROT_900x4

//HAL_TRANSFORM_ROT_1800x3

//HAL_TRANSFORM_ROT_2700x7

introtation;

//0xFF0100覆蓋;

//0xFF0105混合src+(1-alph)*dst

//0xFF0405混合src*alph+(1-alph)*dst

intblend;

//0x00->0xFF:全透明->全不透明

intalpha;

//圖像截取的位置

Rectrect;};3.2工具介紹3.2.3.1接口介紹2)

創(chuàng)建: RgaInterface*getRgaInstance()3)

初始化: //src:輸入圖像的格式和大小 //dst:輸出圖像的格式和大小 virtualintRgaInit(RgaCfg&src,RgaCfg&dst)4)

反初始化: virtualvoidRgaUninit()5)

圖像轉(zhuǎn)換://srcBuffer:輸入圖像的數(shù)據(jù) //srcLen:輸入圖像的大小 //dstBuffer:輸出圖像的內(nèi)存,不需要函數(shù)外申請內(nèi)存,

由函數(shù)內(nèi)提供 //isSrcBufferDirect:已失效,默認(rèn)即可 virtualintRgaBlit(unsignedchar*srcBuffer,intsrcLen, unsignedchar**dstBuffer,boolisSrcBufferDirect=false)

在圖像轉(zhuǎn)換過程中,只需要一次RgaInit,告訴輸入的圖

像格式和大小、輸出的圖像格式和大小,在圖像輸入輸

出不變的情況下循環(huán)調(diào)用RgaBlit即可得到需要的格式和

大小的圖像。如圖像會隨時改變輸入與輸出的大小或者

格式,則不適合使用RGA處理。3.2工具介紹3.2.3.2轉(zhuǎn)換例子從輸入大小為1280×720,格式為yuv420sp的圖像中截取左上角位置(100,100),大小為800×400的圖像,并把800×400的輸入圖像轉(zhuǎn)換成600×300的RGB888格式輸出,代碼如下所示:RgaInterface*rga=getRgaInstance();if(!rga){

printf("getrgafailed\n");

returnNULL;}RgaCfgmSrcCfg;RgaCfgmDstCfg;mSrcCfg.width=1280;mSrcCfg.height=720;mSrcCfg.format=HQ_RK_FORMAT_YCbCr_420_SP;mSrcCfg.rect.w=800;mSrcCfg.rect.h=400;mSrcCfg.rect.x=100;mSrcCfg.rect.y=100;mDstCfg.width=600;mDstCfg.height=300;mDstCfg.format=HQ_RK_FORMAT_RGB_888;if(rga->RgaInit(mSrcCfg,mDstCfg)<0){

printf("rgainitfailed\n");

deleterga;

returnNULL;}unsignedchar*rgb888Out=NULL;//data是輸入圖像的數(shù)據(jù)//data_size是輸入圖像的大小//rgb888Out得到輸出圖像的數(shù)據(jù)rga->RgaBlit((unsignedchar*)data,data_size,&rgb888Out);3.2工具介紹3.2.4

素材采集整合以上VideoSource、RGA模塊的內(nèi)容,實現(xiàn)素材采集保存的簡單Demo。實時從攝像獲取YUV圖像,通過RGA轉(zhuǎn)換到RGB888格式和指定的大小,使用OpenCV庫保存圖片。//包含RGA頭文件#include"rga_interface.h"http://包含視頻源頭文件#include"video_source_interface.h"http://包含Opencv頭文件#include<opencv2/opencv.hpp>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>intg_exit=0;staticintidx=0;usingnamespaceai;//視頻源回調(diào)類classMyCallback:publicVideoSourceCallback{public:MyCallback(){ //創(chuàng)建一個RGA實例rgaInter=getRgaInstance();}

~MyCallback() { //銷毀RGA if(rgaInter) { deletergaInter; rgaInter=NULL; } }3.2工具介紹3.2.4

素材采集 //配置RGA參數(shù)intsetCFG(constintwidth,constintheight,intsrc_type){ //源圖像寬高srcCfg.width=width;srcCfg.height=height; //源圖像格式if(kVideoSourceFmtYuv420sp==src_type)srcCfg.format=0xe;elseif(src_type==kVideoSourceFmtYuv420p)srcCfg.format=0xf;elseif(src_type==kVideoSourceFmtYuv422sp)srcCfg.format=0xc;//;//RK_FORMAT_YCrCb_422_SP//從源圖像中截取的大小和位置

srcCfg.rect.x=0;srcCfg.rect.y=0;srcCfg.rect.w=width;srcCfg.rect.h=height;//目標(biāo)圖像的寬高和格式dstCfg.width=width;dstCfg.height=height;dstCfg.format=0x2;//RK_FORMAT_RGB_888; //初始化RGArgaInter->RgaInit(srcCfg,dstCfg);printf("RgaInitinitsuccess..\n");return0;}

//視頻源回調(diào)函數(shù),得到攝像頭一幀圖像

的數(shù)據(jù)、寬高和格式virtualvoidOnVideoSourceDataCallback(constunsignedchar*data,constintwidth,constintheight,constVideoSourceFmtsource_type){printf("videocallbackw:%d,h:%d\n",width,height);unsignedchar*bgrout=nullptr;3.2工具介紹3.2.4

素材采集//在第一幀視頻源回調(diào)時,使用寬高信息來初始化RGA,只需要初始化一次if(first_frame){first_frame=false;setCFG(width,height,source_type);}

//根據(jù)圖像類型進(jìn)行圖像轉(zhuǎn)換switch(source_type){casekVideoSourceFmtYuv420p/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtYuv420p");/*code*/break;casekVideoSourceFmtYuv420sp/*constant-expression*/://printf("video_type=%s\n","kVideoSourceFmtYuv420sp");rgaInter->RgaBlit((unsignedchar*)data,width*height*3/2,&bgrout);break;

casekVideoSourceFmtYuv422sp/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtYuv422sp");//rgaInter->RgaBlitrgaInter->RgaBlit((unsignedchar*)data,width*height*2,&bgrout);break;casekVideoSourceFmtJpeg/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtJpeg");break;casekVideoSourceFmtRgb888/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtRgb888");break;casekVideoSourceFmtRgb8888/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtRgb8888");break;casekVideoSourceFmtBgr888/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtBgr888");break;casekVideoSourceFmtRgb565/*constant-expression*/:printf("video_type=%s\n","kVideoSourceFmtRgb565");break;default:printf("video_type=%s\n","unknown");break;}3.2工具介紹3.2.4

素材采集//將轉(zhuǎn)換得到的圖像轉(zhuǎn)換成Opencv圖像格式cv::Matbgr_img=cv::Mat(dstCfg.height,dstCfg.width,CV_8UC3,(void*)bgrout);cv::Matimg=bgr_img.clone();charname[64]={0};sprintf(name,"/userdata/image_%d.jpg",idx); //保存圖像intret=cv::imwrite(name,img);printf("save%s%d\n",name,ret);idx++;}virtualvoidOnVideoSourceInitStatus(VideoSourceStatusstatus){}private:RgaInterface*rgaInter=nullptr;RgaCfgsrcCfg;RgaCfgdstCfg;boolfirst_frame=true;};voidsig_exit(intsig){g_exit=1;}intmain(intargc,char**argv){ //ctrl+c程序退出信號處理signal(SIGTERM,sig_exit);signal(SIGINT,sig_exit);

printf("usage:%s/dev/video01280720\n",argv[0]);if(argc!=4)return0;

char*dev=argv[1];intwidth=atoi(argv[2]);intheight=atoi(argv[3]);printf("dev:%s,width:%d,height:%d\n",dev,width,height); //實現(xiàn)VideoSource回調(diào)類MyCallbackcallback;VideoSourceInterface*video_source=VideoSourceInterface::Create(CameraTypeMipi,width,height);if(!video_source)return0;

//初始化VideoSource,內(nèi)部線程開始工作,圖像數(shù)據(jù)從callback中回調(diào)video_source->Init(&callback,kVideoSourceTypeCamera,dev); //等待退出信號while(!g_exit)usleep(100000); //視頻源退出video_source->Uninit();return0;}對應(yīng)的CMakeLists.txt:cmake_minimum_required(VERSION2.8.11)set(so_link_libsvideo_sourcerga_hq)include_directories(./)set(DEMO_SRCmain.cpp)set(EXEC_NAMEvideo_source_rga)add_executable(${EXEC_NAME}${DEMO_SRC})target_link_libraries(${EXEC_NAME}${so_link_libs}libc.so)3.3模型量化和推理

本章節(jié)將會介紹常用的四種框架的模型量化方式,并用圖像分類、目標(biāo)檢測、語義分割來演示推理的過程。模型的轉(zhuǎn)換需要用以下文件:1)和網(wǎng)絡(luò)輸入相同尺寸的實際應(yīng)用場景的圖片,圖片盡可能覆蓋所有可能出現(xiàn)的情況。(本章節(jié)單純介紹轉(zhuǎn)換、量化、模擬,所以僅使用1張圖片進(jìn)行量化,同樣也采用該圖片推理)2)記錄圖片列表的txt文件3)各類模型的文件量化的流程和接口可以直接參考Rockchip_User_Guide_RKNN_Toolkit,本章節(jié)主要是用實際的例子來向作者展示量化和推理過程。量化用到的是rknn的容器,本文中用到的是rknn-toolkit-1.4.0,docker鏡像所在地址xxxxx。#將鏡像文件導(dǎo)入到docker中dockerimportrknn-toolkit-1.4.0-docker.tar.gzrknn_toolkit:1.4.0#創(chuàng)建容器dockerrun-v/home:/home--namerknnrknn_toolkit:1.4.0#-v代表了磁盤的映射-v/宿主機(jī)目錄:/容器目錄#進(jìn)入容器dockerexec-itrknn/bin/bash3.3模型量化和推理3.3.1TensorFlow量化Tenso

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論