RK3399pro 使用TNN日记 2(Linux系统)
RK3399pro 使用TNN日记 2(Linux系统)
- 一、TNN的demo调试
- 1.下载链接
- 2.编译TNN
- 3.从摄像头获取数据图像并检测
- 二.torch模型转tnn
- 暂时目前流程跑通,需要进行另外模型训练工作,先到这里吧。。。。
一、TNN的demo调试
1.下载链接
TNN模型下载链接 model
CSDN下载链接
百度网盘下载链接
提取码:a904
2.编译TNN
简单粗暴
(1) 进入到 TNN_PATH/scripts/
(2) 在终端中运行
./build_aarch64_linux.sh
一般都没有问题的,然后便已完成
(3) 进入到 TNN_PATH/examples/linux,
然后终端中执行 ./build_aarch64_linux.sh
会自动进行编译,然后进入到自动创建的 build目录下面,已经生成可执行文件“demo_arm_linux_facedetector”
(4) 阅读demo的代码可知,需要传参模型文件,可以在 TNN_PATH/model,运行“download_model.sh”下载(也可以在文章开头的链接可以下载)
(5) 至此,下载完demo,运行demo时候把地址传进去就可以了,确保环境没有问题
3.从摄像头获取数据图像并检测
说个建议:最好在PC端安装QT5 或者vscode进行代码测试,在PC端编译TNN和demo的方式和在ARM上一样,选择对应的build_*.sh就可以了。
正式开始:
(1) 首先修改CMakelist.txt,如下,在里面配置一些参数,然后可以使用qt打开这个cmake项目,方便调试
cmake_minimum_required(VERSION 3.1)
project(TNN-demo)
message(${CMAKE_SOURCE_DIR})
#message(${TNN_LIB_PATH})
set(TNN_LIB_PATH "/home/firefly/TNN/TNN-master/scripts/build_aarch64_linux")
set(CMAKE_SYSTEM_NAME Linux)
set(TNN_OPENMP_ENABLE ON)
set(CMAKE_CXX_STANDARD 11)
set(TNN_ARM_ENABLE ON)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
#设置clang编译,也可以不加,使用G++编译就可以了
set(CMAKE_C_COMPILER "/usr/bin/clang") # 填写绝对路径
set(CMAKE_C_FLAGS "-Wall -std=c99")
set(CMAKE_C_FLAGS_DEBUG "-g")
set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")set(CMAKE_CXX_COMPILER "/usr/bin/clang++") # 填写绝对路径
set(CMAKE_CXX_FLAGS "-Wall")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")#配置
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -std=c++11 -fPIC")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -std=c++11 -pthread -fPIC")#指定路径
set(TNNRoot ${CMAKE_CURRENT_SOURCE_DIR}/../../)
set(TNNInclude ${TNNRoot}/include)include_directories(${TNNInclude})
include_directories(${TNNRoot}/third_party/stb)
include_directories(${CMAKE_SOURCE_DIR}/include)
include_directories(${CMAKE_SOURCE_DIR}/../base)
link_directories(${TNN_LIB_PATH})link_libraries(-Wl,--whole-archive TNN -Wl,--no-whole-archive)file(GLOB_RECURSE SRC "${CMAKE_SOURCE_DIR}/../base/*.cc")
find_package(OpenCV REQUIRED)#关联openMP
find_package(OpenMP REQUIRED)
if(OPENMP_FOUND)message("OPENMP FOUND")set(CMAKE_C_FLAGS"${CMAKE_C_FLAGS} $({OpenMP_C_FLAGS}")set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()#add_executable(demo_arm_linux_imageclassify src/image_classify.cc ${SRC})
add_executable(demo_arm_linux_facedetector src/face_detector.cc ${SRC})
target_link_libraries(demo_arm_linux_facedetector ${OpenCV_LIBS} ${TNN_LIB_PATH})
(2) 修改源文件,在 TNN_PATH/examples/linux/src目录下
比如:
修改人脸识别例程,face_detector.cc,直接上代码吧,因为当时一点点修改,也忘了改哪里了,具体可以对比两个代码看。
int main(int argc, char** argv) {cv::TickMeter tm;tm.start();VideoCapture capture;capture.open(0);if(!capture.isOpened())return -1;auto proto_content = fdLoadFile("/home/firefly/model/face_detector/version-slim-320_simplified.tnnproto");auto model_content = fdLoadFile("/home/firefly/model/face_detector/version-slim-320_simplified.tnnmodel");int h = 240, w = 320;if(argc >= 5) {h = std::atoi(argv[3]);w = std::atoi(argv[4]);}auto option = std::make_shared<UltraFaceDetectorOption>();{option->proto_content = proto_content;option->model_content = model_content;option->library_path = "";option->compute_units = TNN_NS::TNNComputeUnitsGPU;option->input_width = w;option->input_height = h;option->score_threshold = 0.95;option->iou_threshold = 0.15;}auto predictor = std::make_shared<UltraFaceDetector>();std::vector<int> nchw = {1, 3, h, w};cout<<"Start Init"<<endl;//Initstd::shared_ptr<TNNSDKOutput> sdk_output = predictor->CreateSDKOutput();CHECK_TNN_STATUS(predictor->Init(option));tm.stop();double time=0;time=tm.getTimeMilli();cout<<"Init Time = "<<time<<"\n--------"<<endl;cout<<"Start Detection"<<endl;while(1){tm.reset();tm.start();cv::Mat frame;capture>>frame;//cvtColor(frame,edges,CVBGR2GRAY)std::vector<int> nchw = {1, 3, 240, 320};cv::resize(frame,frame,Size(320,240));//Predictauto image_mat = std::make_shared<TNN_NS::Mat>(TNN_NS::DEVICE_ARM, TNN_NS::N8UC3,nchw,frame.data);CHECK_TNN_STATUS(predictor->Predict(std::make_shared<UltraFaceDetectorInput>(image_mat), sdk_output));std::vector<FaceInfo> face_info;if (sdk_output && dynamic_cast<UltraFaceDetectorOutput *>(sdk_output.get())) {auto face_output = dynamic_cast<UltraFaceDetectorOutput *>(sdk_output.get());face_info = face_output->face_list;}
// cout<<"Start rectangle"<<endl;cv::Mat resImg=frame;for (int i = 0; i < face_info.size(); i++) {auto face = face_info[i];rectangle(resImg, Rect(face.x1, face.y1, face.x2-face.x1,face.y2-face.y1), CV_RGB(0, 255, 0), 2);}tm.stop();time=0;time=tm.getTimeMilli();int fps=0;fps=tm.getFPS();cout<<"Detection Time = "<<time<<endl;cout<<"Detection FPS = "<<fps<<"\n--------"<<endl;imshow("123",resImg);waitKey(30);}return 0;
}
(3) 根据代码来讲,这个例程由于官方做个一次封装,所以跑起来不难,优化的话比较麻烦,还需要看源码,可以根据qt索引找到对应调用详细看一下。
说下这部分内容吧,比如这个例程,跑通问题不大,检测速度在30ms~80ms,波动挺大的,而且集中在下面这个位置,需要进入源码查看调用,再做修改。
CHECK_TNN_STATUS(predictor->Predict(std::make_shared<UltraFaceDetectorInput>(image_mat), sdk_output));
二.torch模型转tnn
其实这一方面跟着官方文档走,也挺容易的,这里我做了一个torchvision中resnet34模型的转换并调用的demo,稍微整理了一下需要的文件,依然是使用官方封装的TNN模型。
主要问题不大,流程是:
pytorch模型加载 —— 输出onnx模型(torch.onnx.export()) —— 调用TNN/tools/onnx2tnn.py(代码内容比较简单,可以自己看了按需修改)—— 获得tnn模型
下面放个下载链接
CSDN下载
百度网盘 提取码:okdx
暂时目前流程跑通,需要进行另外模型训练工作,先到这里吧。。。。
RK3399pro 使用TNN日记 2(Linux系统)相关推荐
- 巴别塔合约作战终端开发日记2——Linux系统部署项目
1. 安装XShell和Xftp 其中Xshell用于输入Linux命令,Xftp可以方便地进行文件传输. 2. 连接服务器 之后输入用户名密码保存指纹秘钥就可以正常使用了. 服务器就是一台Linux ...
- liunx学习日记(一)---Linux系统的安装
Linux学习日记(一)-Linux系统的安装 一.什么是Linux系统? Linux是一个优秀的操作系统,它是一个源代码开放的操作系统,并且可以在简单且硬件成本低廉的环境下运行.Linux如何产生的 ...
- 【Linux踩坑日记】:ubuntu环境下Linux系统没有网络连接,ifconfig查看发现只有lo,没有以太网eth0连接解决方法
1.问题描述 启动Linux系统后,发现网络无法连接,输入ifconfig命令查看,只有lo本地回环网卡,无法找到eth0网卡,或者是eht0网卡成功激活但是没有显示IP及子网掩码.如下图所示: 输入 ...
- EasyARM-i.MX280A—Linux系统开发板(开发日记1-登录开发板)
今天,心仪的板子终于到了,作为一个外行来说,既有对板子开发的期待,又有对自己技术的担忧.为了记录一下自己的开发过程,同时也是自己的成长过程,特地开了个专栏,我知道这将是一个漫长的过程,我会不断的更新, ...
- barrier linux,Linux系统上启用barrier?
大多数当前流行的Linux文件系统,包括EXT3和EXT4,都将文件系统barrier作为一个增强的安全特性.它保护数据不被写入日记.但是,在许多情况下,我们并不清楚这些barrier是否有用.本文就 ...
- linux系统监控命令汇总
零.Linux系统监控命令速查手册 命令 功能应用 用法举例 free 查看内存使用情况,包括物理内存和虚拟内存 free -h或free -m vmstat 对系统的整体情况进行统计 ...
- caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究
caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究 趁着国庆节期间,梳理一下最近学习的windows下caffe实践经验,废话不多话,直接上干货,本小结简单说下 ...
- linux系统cpu文件,Linux_学堂:当前Linux系统运行的各种参数, 1、CPU 在文件“/proc/ - phpStudy...
学堂:当前Linux系统运行的各种参数 1.CPU 在文件"/proc/stat"里面就包含了CPU的信息.每一个CPU的每一tick用在什么地方都在这个文件里面记着.后面的数字含 ...
- Linux系统监控命令整理汇总-掌握CPU,内存,磁盘IO等找出性能瓶颈
的性能有问题,总之,每到晚上挖站否的主机就出现了不稳定的情况,系统负载忽高忽低.利用服务器日志分析利器:ngxtop和GoAccess也能查出有一些IP一直在不断地扫描服务器端口还有WP后台. 但是, ...
- DAY3:Linux系统常用指令
Linux 操作系统 Linux 常用信息查询 Linux 系统目录结构 1.目录操作命令 2.常用测试命令 3.常用运维命令 4.其他命令 5.nano 编辑器 6.vim 编辑器 7.用户口令管理 ...
最新文章
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充色)实战(dot plot)
- UI高级----Images.xcassets
- DHCP服务器的配置详细说明
- python templates_详解Python的Django框架中的templates设置
- 微课堂 | 欢迎加入核心交流群,往期微课堂的嘉宾都在这里
- RocketMQ 报 invokeSync call timeout
- 个人项目:wc程序(java)
- 使用ZooKeeper编程 - 一个基本教程
- python md5加密
- 职称英语与计算机考试试题,2020年职称计算机考试模拟选择试题及答案.doc
- [大数据]黑马hadoop学习笔记一
- 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
- MySQL 报错1449:The user specified as a definer (’mysql.infoschema‘@’localhost‘) does not exist
- 计算机重装系统后黑屏,电脑重装系统后黑屏怎么办
- 听java技术讲座心得体会_听讲座心得体会范文3篇
- KinectFusion原理介绍
- Unity报错:InvalidOperationException:You are tring to read lnput using the UnityEngine. ……的解决办法
- matlab求基音频率,语音中提取基音频率matlab程序.doc
- 【论文 CCF C】Multi-DQN: An ensemble of Deep Q-learning agents for stock market forecasting
- 江苏华西村海洋工程服务有限公司-船讯网