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系统)相关推荐

  1. 巴别塔合约作战终端开发日记2——Linux系统部署项目

    1. 安装XShell和Xftp 其中Xshell用于输入Linux命令,Xftp可以方便地进行文件传输. 2. 连接服务器 之后输入用户名密码保存指纹秘钥就可以正常使用了. 服务器就是一台Linux ...

  2. liunx学习日记(一)---Linux系统的安装

    Linux学习日记(一)-Linux系统的安装 一.什么是Linux系统? Linux是一个优秀的操作系统,它是一个源代码开放的操作系统,并且可以在简单且硬件成本低廉的环境下运行.Linux如何产生的 ...

  3. 【Linux踩坑日记】:ubuntu环境下Linux系统没有网络连接,ifconfig查看发现只有lo,没有以太网eth0连接解决方法

    1.问题描述 启动Linux系统后,发现网络无法连接,输入ifconfig命令查看,只有lo本地回环网卡,无法找到eth0网卡,或者是eht0网卡成功激活但是没有显示IP及子网掩码.如下图所示: 输入 ...

  4. EasyARM-i.MX280A—Linux系统开发板(开发日记1-登录开发板)

    今天,心仪的板子终于到了,作为一个外行来说,既有对板子开发的期待,又有对自己技术的担忧.为了记录一下自己的开发过程,同时也是自己的成长过程,特地开了个专栏,我知道这将是一个漫长的过程,我会不断的更新, ...

  5. barrier linux,Linux系统上启用barrier?

    大多数当前流行的Linux文件系统,包括EXT3和EXT4,都将文件系统barrier作为一个增强的安全特性.它保护数据不被写入日记.但是,在许多情况下,我们并不清楚这些barrier是否有用.本文就 ...

  6. linux系统监控命令汇总

    零.Linux系统监控命令速查手册 命令 功能应用 用法举例     free 查看内存使用情况,包括物理内存和虚拟内存 free -h或free -m     vmstat 对系统的整体情况进行统计 ...

  7. caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究

    caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究 趁着国庆节期间,梳理一下最近学习的windows下caffe实践经验,废话不多话,直接上干货,本小结简单说下 ...

  8. linux系统cpu文件,Linux_学堂:当前Linux系统运行的各种参数, 1、CPU   在文件“/proc/ - phpStudy...

    学堂:当前Linux系统运行的各种参数 1.CPU 在文件"/proc/stat"里面就包含了CPU的信息.每一个CPU的每一tick用在什么地方都在这个文件里面记着.后面的数字含 ...

  9. Linux系统监控命令整理汇总-掌握CPU,内存,磁盘IO等找出性能瓶颈

    的性能有问题,总之,每到晚上挖站否的主机就出现了不稳定的情况,系统负载忽高忽低.利用服务器日志分析利器:ngxtop和GoAccess也能查出有一些IP一直在不断地扫描服务器端口还有WP后台. 但是, ...

  10. DAY3:Linux系统常用指令

    Linux 操作系统 Linux 常用信息查询 Linux 系统目录结构 1.目录操作命令 2.常用测试命令 3.常用运维命令 4.其他命令 5.nano 编辑器 6.vim 编辑器 7.用户口令管理 ...

最新文章

  1. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(自定义填充色)实战(dot plot)
  2. UI高级----Images.xcassets
  3. DHCP服务器的配置详细说明
  4. python templates_详解Python的Django框架中的templates设置
  5. 微课堂 | 欢迎加入核心交流群,往期微课堂的嘉宾都在这里
  6. RocketMQ 报 invokeSync call timeout
  7. 个人项目:wc程序(java)
  8. 使用ZooKeeper编程 - 一个基本教程
  9. python md5加密
  10. 职称英语与计算机考试试题,2020年职称计算机考试模拟选择试题及答案.doc
  11. [大数据]黑马hadoop学习笔记一
  12. 如何将MAPGIS中的文件转换为SHP格式,及坐标系问题
  13. MySQL 报错1449:The user specified as a definer (’mysql.infoschema‘@’localhost‘) does not exist
  14. 计算机重装系统后黑屏,电脑重装系统后黑屏怎么办
  15. 听java技术讲座心得体会_听讲座心得体会范文3篇
  16. KinectFusion原理介绍
  17. Unity报错:InvalidOperationException:You are tring to read lnput using the UnityEngine. ……的解决办法
  18. matlab求基音频率,语音中提取基音频率matlab程序.doc
  19. 【论文 CCF C】Multi-DQN: An ensemble of Deep Q-learning agents for stock market forecasting
  20. 江苏华西村海洋工程服务有限公司-船讯网

热门文章

  1. 偏远的时代covid 19如何迎接下一个技术变革
  2. linux下visual studio code安装cpptools-linux.vsix插件
  3. 《自然语言处理:基于预训练模型的方法》第七章 预训练语言模型-BERT
  4. 松下服务器显示18号报警,松下伺服故障报警代码分析及处理
  5. ArcGIS矢量图层面积计算方法
  6. X509证书结构及解析
  7. R语言统计—配对t检验样本量计算
  8. 大使馆大师傅活动分工和非都市规划
  9. 硬件基础知识笔记(二极管、三极管、MOS管、运放、滤波器、跟随器、整流)
  10. 带通滤波器中心频率计算公式中R是哪个值_LCC-HVDC 交流滤波器选择策略