目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
flyfish
文章目录
- 目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
- 前言
- 模型版本
- 库的版本
- 示例程序的编译环境
- 模型的转换
- 库的制作
- 主要接口部分
- 模型初始化部分
- 推理的输入输出
- CMakeList的配置
- 示例部分
前言
源码下载地址在文章末尾
将模型和重要代码全部封装到库中,生成静态库a或者动态库so,如果是windows下就是lib或者dll。
上层应用程序使用库和一个头文件,对于应用程序开发者,模型和重要代码是不可见的,达到加密的目的。
如需更多的加密方法,请参考nihui的 如何加密ncnn模型
此repo包括C++编写的库qt_android_ncnn_lib和Android调用库示例qt_android_ncnn_example
此代码演示如何模型如何加密的,Android是如何调用的。
模型版本
YOLOV5 6.2
库的版本
该示例部署环境是arm64-v8a,应用于android
opencv4.6.0 下载地址
ncnn20220420 下载地址
这里选的是CPU版本的静态库
代码目录如下
示例程序的编译环境
使用Qt C++开发的Android程序
Qt 6.2.3
Qt Creator 6.0.2
android-ndk-r21e
整个编写代码过程不涉及Java,只有C++
代码目录如下
准备工作
模型的转换
当一个YOLOv5 6.2模型训练完成后
1 先使用该repo导出onnx格式
shaoshengsong/yolov5_62_export_ncnn (github.com)
2 再按照该文档将onnx格式的模型转换为ncnn格式
https://flyfish.blog.csdn.net/article/details/127669328
3 最后ncnn 的 ncnn2mem 工具将ncnn模型转换为 param.bin + bin形式
$ncnn2mem yolov5s_6.2.param yolov5s_6.2.bin yolov5s_6.2.id.h yolov5s_6.2.mem.h
主要使用yolov5s_6.2.id.h 和yolov5s_6.2.mem.h这两个文件
库的制作
以静态库为例
在YOLOv5类的实现文件加入
#include "yolov5s_6.2.id.h"
#include "yolov5s_6.2.mem.h"
这两个文件对上层应用开发者不可见
配置如下
主要接口部分
public:int init(int bgr_rgb,float prob_threshold,float nms_threshold);int inference(const cv::Mat& bgr, std::vector<Object>& objects);cv::Mat draw_objects(const cv::Mat& bgr, const std::vector<Object>& objects);private:ncnn::Net * model_;int bgr_rgb_=0;//输入图片的通道顺序 0:bgr 1:rgbfloat prob_threshold_ = 0.25f;float nms_threshold_ = 0.45f;
模型初始化部分
int YOLOv5::init(int bgr_rgb,float prob_threshold,float nms_threshold)
{bgr_rgb_=bgr_rgb;//输入图片的通道顺序 0:bgr 1:rgbprob_threshold_ = prob_threshold;nms_threshold_ = nms_threshold;//reference https://github.com/Tencent/ncnn/wiki/ncnn-load-modelmodel_ = new ncnn::Net();model_->load_param(yolov5s_6_2_param_bin);model_->load_model(yolov5s_6_2_bin);return 0;}
yolov5s_6_2_param_bin 和yolov5s_6_2_bin这两个变量在
yolov5s_6.2.mem.h中原型分别是
static const unsigned char yolov5s_6_2_bin[]
static const unsigned char yolov5s_6_2_param_bin[]
推理的输入输出
ex.input(yolov5s_6_2_param_id::BLOB_images, in_pad);
ex.extract(yolov5s_6_2_param_id::BLOB_output, out);
ex.extract(yolov5s_6_2_param_id::BLOB_353, out);
ex.extract(yolov5s_6_2_param_id::BLOB_367, out);
CMakeList的配置
cmake_minimum_required(VERSION 3.14)
project(yolov5lib LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)include_directories(
${CMAKE_SOURCE_DIR}/opencv4.6.0/native/jni/include/opencv2
${CMAKE_SOURCE_DIR}/opencv4.6.0/native/jni/include
${CMAKE_SOURCE_DIR}/ncnn20220420/include
${CMAKE_SOURCE_DIR}/ncnn20220420/include/ncnn)set(STATIC_LIBS${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_calib3d.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_gapi.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_objdetect.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_core.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_highgui.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_photo.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_dnn.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_imgcodecs.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_stitching.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_features2d.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_imgproc.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_video.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_flann.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_ml.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/staticlibs/arm64-v8a/libopencv_videoio.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtbb.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libIlmImf.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibjpeg-turbo.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibtiff.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtegra_hal.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libade.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibopenjp2.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibwebp.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libcpufeatures.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibpng.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libquirc.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libittnotify.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/liblibprotobuf.a${CMAKE_SOURCE_DIR}/opencv4.6.0/native/3rdparty/libs/arm64-v8a/libtbb.a${CMAKE_SOURCE_DIR}/ncnn20220420/lib/libncnn.a)add_library(yolov5lib STATICYOLOv5.cppYOLOv5.hyolov5s_6.2.id.hyolov5s_6.2.mem.h
)
target_link_libraries(yolov5lib PRIVATE ${STATIC_LIBS})
target_compile_definitions(yolov5lib PRIVATE YOLOv5_LIBRARY)
编译结果,输出库libyolov5lib.a
其他部分详看
示例部分
提供给示例代码包括一个YOLOv5.h和libyolov5lib.a库
看不到模型了,因为模型已经在libyolov5lib.a文件中
yolov5_.init(1,0.25,0.45); //初始化
std::vector<Object> objects;
yolov5_.inference(orig_img, objects);//推理
cv::Mat ret= yolov5_.draw_objects(orig_img, objects);//结果显示
推理结果存储在objects中,ret用于图像显示。
本文源码地址
https://github.com/shaoshengsong/qt_android_ncnn_lib_encrypt_example
目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例相关推荐
- 目标检测 YOLOv5 - 模型的样子
目标检测 YOLOv5 - 模型的样子 flyfish 文章目录 目标检测 YOLOv5 - 模型的样子 开始加载模型文件 模型的层 模型的属性 模块的名称以及模块本身 模型的权重 模型权重的名字和权 ...
- 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等
目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等 flyfish 文中包括了YOLOv5作者分享的提高模型指标小技巧和吴恩达(Andrew Ng)在做缺陷检测项目( ste ...
- 目标检测 YOLOv5 - v6.2版本模型在瑞芯微 Rockchip设备从训练到C++部署实践
目标检测 YOLOv5 - v6.2版本模型在瑞芯微 Rockchip设备从训练到C++部署实践 flyfish 源码地址 https://github.com/shaoshengsong/rockc ...
- 《深度学习与目标检测 YOLOv5》
<深度学习与目标检测 YOLOv5> flyfish 基础 深度学习基础 - 向量 深度学习基础 - 累加符号和连乘符号 深度学习基础 - 最大似然估计 深度学习基础 - 朴素贝叶斯 深度 ...
- 目标检测 YOLOv5 - 卷积层和BN层的融合
目标检测 YOLOv5 - 卷积层和BN层的融合 即Conv2d和 BatchNorm2d融合 flyfish 为了减少模型推理时间,YOLOv5源码中attempt_load已经包括两层的合并,主要 ...
- 目标检测 YOLOv5 anchor设置
目标检测 YOLOv5 anchor设置 1 anchor的存储位置 1.1 yaml配置文件中例如 models/yolov5s.yaml # anchors anchors:- [10,13, 1 ...
- 目标检测 YOLOv5 自定义网络结构
目标检测 YOLOv5 自定义网络结构(YOLOv5-ShuffleNetV2) flyfish 版本:YOLOv5:v5 具体已经借鉴的自定义网络结构包括 YOLOv5-MobileNetV3 Mo ...
- 目标检测 YOLOv5网络v6 0版本总结
目标检测 YOLOv5网络v6.0版本总结 YOLOv5对比YOLOv4 输入端:在模型训练阶段,提出了Mosaic数据增强.自适应锚框计算.自适应图片缩放等: Backbone网络:融合其它检测算法 ...
- 深度学习目标检测YOLOV5的主要过程梳理和工程部署的具体手段
一.YOLOV5训练数据基本格式以及格式的相互转换(labimg标注数据格式) 1.1 VOC数据格式 基本图片数据集,每张图片对应的.xml标注文件,类别classes.txt文件. 其中.xml的 ...
最新文章
- C# 四舍五入round函数使用的代码
- [HNOI2007]分裂游戏
- Hybris Commerce Product字段名列表
- oracle导入初始数据死机,Sqoop导入Oracle数据至hive卡死在hive.HiveImport: Connecting to jdbc:hive2不执行...
- 第七季2:MP4v2库的移植与播放实战
- ios 画线平滑_iOS 画贝塞尔曲线 连续曲线 平滑曲线 曲线图表
- C#LeetCode刷题之#62-不同路径(Unique Paths)
- javascript匿名函数及闭包深入理解及应用
- cvs数据导入工具 oracle_oracle数据库的导入导出
- GBin1推荐:jQuery的滚动插件Waypoints
- 关于结构体嵌套的字节大小的问题
- IMEI修改(IMEI第十五位验证码的计算)
- mysql同时满足升序和降序_mysql中的升序和降序以及一个字段升序和一个字段降序...
- VS2019++QT5.12.10+PCL1.11.1+VTK8.2.0+opencv(camke3.18.0)环境搭配及演示实例
- ui效果图生成html,四步制作一个高大上的iPhone效果图模版 UI呀-学UI设计网
- js代码中for循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting ‘className‘)
- 记一次 .NET 某制造业 MES 系统崩溃分析
- oracle分组查询取第一条数据,160804、oracle查询:取出每组中的第一条记录
- 基于C语言的网络编程笔记分享
- 亲测好用!这4个免费的二维码生成器,制作简单易上手