版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3硬件部署与工具介绍IntroductiontoHardwareDeploymentandToolsChapter03学习目标硬件介绍01工具介绍02模型量化和推理03课后习题043.1硬件介绍
3.1.1主机AIBOX是一款为加速视频AI(ArtificialIntelligence,人工智能)处理能力设计的硬件(如图3-1所示),内置高能效NPU(Neural-networkProcessingUnits,嵌入式神经网络处理器),适用于各类深度学习模型的加速推理。双核Cortex-A35,最高频率1.6GHz,峰值NPU算力高达3.0TOPs(TeraOperationsPerSecond,每秒钟能处理的万亿次数,1TOPs代表处理器每秒钟可进行一万亿次),支持OpenCL/OpenVX,支持INT8/INT16/FP16支持TensorFlow、Caffe、ONNX、Darknet模型。2GBDDR3内存,8GB高速eMMC4.51存储器。AIBOX主机外观图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内置2-ch&8-chI2S&8-chPDM,内置VAD支持千兆以太网8xUART/3xSPI/6xI2C/11xPWM/4xSARADC封装:BGA14*14,FCCSP420LDRK1808系列BlockDiagram3.1硬件介绍
3.1.3接口1)线束接口摄像头接口:3路AHD视频,支持1080p、720p分辨率。以太网接口:2路Eth网络接口,支持100Mbps传输速度。其中ETH1网线
接口用ssh访问,用ssh访问时需要一个航空转网线的接口。
显示屏接口:1路HDMI输出。线束接口显示屏及其接口2)USB接口:1路USB调试口,支持ADB调试。3)SD卡接口:1路SD卡接口,支持Fat、vFat、Ext2、
Ext3、Ext4文件系统。3.1硬件介绍
3.1.4电源连接1)电源24V供电
下图是AIBox的电源线,电源线是改造之后的电源线,两者都可使用。2)5VUSB供电,但USB供电带不动AHD摄像头,需要接AHD摄像头使用时用
电源供电。3.2工具介绍
3.2.1MobaXtermMobaxterm是一款远程管理工具,可以让用户在Windows操作系统中使用多个实用工具和远程连接功能,它结合了许多其他的网络工具,以帮助用户轻松管理远程计算机。这款软件简单易用,速度快,支持SSH、Telnet、SFTP、RDP和VNC等多种远程协议,同时还支持MSWindows系统本地X11映射。在MobaXterm官网:/下载自己所需要的版本。MobaXterm提供了两个版本,一个是HomeEdition(家庭版),另一个是ProfessionalEdition(专业版)。家庭版是免费的,而专业版需要购买。如果你只需要基本的连接功能,那么家庭版足以满足需求。3.2工具介绍
3.2.1MobaXterm选择右边的家庭版安装即可3.2工具介绍
3.2.1MobaXterm下载好Mobaxterm软件后双击打开,点击Session选项,如左图所示。然后选择ssh连接,输入主机IP地址,用户名,端口等信息,即可建立起连接,如右图所示。MobaXterm设置ssh连接3.2工具介绍
3.2.1MobaXterm创建好session后,输入密码(输入密码时并不会显示,只管输入后按确定即可,第一次登陆成功后会提示保存密码,一般选择同意),就可以连接上虚拟机了。而且连上虚拟机之后,它会自动通过FTP也连接到虚拟机,直接拖拽就可以进行文件复制了。登陆后界面主要分两块,左边的是主机的文件,右边是终端,如图所示。勾选左下角的“Followterminalfolder”可以让两个的工作路径保持一致。终端界面介绍3.2工具介绍
3.2.1MobaXterm创建一个session之后,就可以在左侧的session标签里留下它的信息,下次需要连接的时候直接双击即可,如上图所示。文件传输和下载可以采用直接拖拽的方式,或者采用鼠标右键选择相应功能,也可以点击文件的右键,选择下载或者其他功能,如右图所示。3.2工具介绍
3.2.2OpenCV移植和使用OpenCV是一个开源的计算机视觉和机器学习软件库。OpenCV主要为开发计算机视觉程序提供一组公共的底层结构(infrastructure)和加强商业产品中机器的感知能力。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脚本,内容如下: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需要填写自己环境的真实位置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)编译结果在opencv/install_rk1808目录下生成了opencv目录(如右图),包括:开发中主要使用opencv的inlude头文件和lib下的libopencv_world.so动态库。3.2工具介绍
3.2.2OpenCV移植和使用CMakeLists.txt: cmake_minimum_required(VERSION2.8.11) include_directories(.) #注意:此处填写真实环境对应的opencv include位置 include_directories(/opencv/path/include) set(DEMO_SRCmain.cpp) #注意:此处填写真实环境对应的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图像格式转换和图像缩放RGA是瑞芯微提供的硬件加速的二维图像基本操作库,例如旋转、镜像、缩放、拷贝、剪裁、格式转换等。为了提高图像处理的可移植性和可用性,对图像格式转换和缩放接口进行了二次封装。3.2.3.1接口介绍1)
图像结构体: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)
创建: RgaInterface*getRgaInstance()3)
初始化: //src:输入图像的格式和大小 //dst:输出图像的格式和大小 virtualintRgaInit(RgaCfg&src,RgaCfg&dst)4)
反初始化: virtualvoidRgaUninit()5)
图像转换://srcBuffer:输入图像的数据 //srcLen:输入图像的大小 //dstBuffer:输出图像的内存,不需要函数外申请内存,
由函数内提供 //isSrcBufferDirect:已失效,默认即可 virtualintRgaBlit(unsignedchar*srcBuffer,intsrcLen, unsignedchar**dstBuffer,boolisSrcBufferDirect=false)
在图像转换过程中,只需要一次RgaInit,告诉输入的图
像格式和大小、输出的图像格式和大小,在图像输入输
出不变的情况下循环调用RgaBlit即可得到需要的格式和
大小的图像。如图像会随时改变输入与输出的大小或者
格式,则不适合使用RGA处理。3.2工具介绍3.2.3.2转换例子从输入大小为1280×720,格式为yuv420sp的图像中截取左上角位置(100,100),大小为800×400的图像,并把800×400的输入图像转换成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是输入图像的数据//data_size是输入图像的大小//rgb888Out得到输出图像的数据rga->RgaBlit((unsignedchar*)data,data_size,&rgb888Out);3.2工具介绍3.2.4
素材采集整合以上VideoSource、RGA模块的内容,实现素材采集保存的简单Demo。实时从摄像获取YUV图像,通过RGA转换到RGB888格式和指定的大小,使用OpenCV库保存图片。//包含RGA头文件#include"rga_interface.h"//包含视频源头文件#include"video_source_interface.h"//包含Opencv头文件#include<opencv2/opencv.hpp>#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>intg_exit=0;staticintidx=0;usingnamespaceai;//视频源回调类classMyCallback:publicVideoSourceCallback{public:MyCallback(){ //创建一个RGA实例rgaInter=getRgaInstance();}
~MyCallback() { //销毁RGA if(rgaInter) { deletergaInter; rgaInter=NULL; } }3.2工具介绍3.2.4
素材采集 //配置RGA参数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;//目标图像的宽高和格式dstCfg.width=width;dstCfg.height=height;dstCfg.format=0x2;//RK_FORMAT_RGB_888; //初始化RGArgaInter->RgaInit(srcCfg,dstCfg);printf("RgaInitinitsuccess..\n");return0;}
//视频源回调函数,得到摄像头一帧图像
的数据、宽高和格式virtualvoidOnVideoSourceDataCallback(constunsignedchar*data,constintwidth,constintheight,constVideoSourceFmtsource_type){printf("videocallbackw:%d,h:%d\n",width,height);unsignedchar*bgrout=nullptr;3.2工具介绍3.2.4
素材采集//在第一帧视频源回调时,使用宽高信息来初始化RGA,只需要初始化一次if(first_frame){first_frame=false;setCFG(width,height,source_type);}
//根据图像类型进行图像转换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
素材采集//将转换得到的图像转换成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); //实现VideoSource回调类MyCallbackcallback;VideoSourceInterface*video_source=VideoSourceInterface::Create(CameraTypeMipi,width,height);if(!video_source)return0;
//初始化VideoSource,内部线程开始工作,图像数据从callback中回调video_source->Init(&callback,kVideoSourceTypeCamera,dev); //等待退出信号while(!g_exit)usleep(100000); //视频源退出video_source->Uninit();return0;}对应的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模型量化和推理
本章节将会介绍常用的四种框架的模型量化方式,并用图像分类、目标检测、语义分割来演示推理的过程。模型的转换需要用以下文件:1)和网络输入相同尺寸的实际应用场景的图片,图片尽可能覆盖所有可能出现的情况。(本章节单纯介绍转换、量化、模拟,所以仅使用1张图片进行量化,同样也采用该图片推理)2)记录图片列表的txt文件3)各类模型的文件量化的流程和接口可以直接参考Rockchip_User_Guide_RKNN_Toolkit,本章节主要是用实际的例子来向作者展示量化和推理过程。量化用到的是rknn的容器,本文中用到的是rknn-toolkit-1.4.0,docker镜像所在地址xxxxx。#将镜像文件导入到docker中dockerimportrknn-toolkit-1.4.0-docker.tar.gzrknn_toolkit:1.4.0#创建容器dockerrun-v/home:/home--namerknnrknn_toolkit:1.4.0#-v代表了磁盘的映射-v/宿主机目录:/容器目录#进入容器dockerexec-itrknn/bin/bash3.3模型量化和推理3.3.1TensorFlow量化Tenso
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年医疗AI诊断模型提升方案
- 2026年新能源车企引擎搜索品牌影响力方案
- 酒店运营公司接管方案
- 为2026年智慧城市建设规划的基础设施方案
- 存量商品的运营方案设计
- 汉堡外卖运营方案
- 2026年智慧农业物联网监控系统搭建方案
- 店铺运营预算规划方案
- 2026年零售业供应链仓储优化降本增效项目分析方案
- 新媒体运营方案软件
- 安保管理制度-安保管理制度
- 平安寿险电子合同(标准版)
- Unit4JobsUnitreview(课件)-冀教版英语四年级上册
- 广电基础写作试题及答案
- 在新时代继承和发扬伟大的抗战精神-2025
- 二级物业管理员考试题及答案
- 《高等数学上册》全套教学课件
- 肺癌科普课件
- 玻璃纤维增强塑料(GFRP)技术作业指导书
- 建筑业企业资质标准
- 儿童篮球训练完整教学计划
评论
0/150
提交评论