YOLOv5转NCNN
## update20210608
新增yolov5模型剪枝和NCNN INT8量化。
项目持续更新,主要包括yolov5s模型的剪枝,int8量化,ncnn模型转换和Android移植测试。
基于YOLOv5最新[v5.0 release](https://github.com/ultralytics/yolov5/releases/tag/v5.0),和NCNN官方给出example的差别主要有:
- 激活函数hardswish变为siLu;
- 流程和[详细记录u版YOLOv5目标检测ncnn实现](https://zhuanlan.zhihu.com/p/275989233?utm_source=qq)略微不同
## 编译运行
动态库用的是官方编译好的ncnn-20210507-ubuntu-1604-shared
```
mkdir build
cd build
cmake ..
make -j8
./yolov5 ../bus.jpg
```
可以看到:
<p align="center">
<img src="build/yolov5.jpg">
</p>
## 安卓
参考https://github.com/nihui/ncnn-android-yolov5 ,使用这里转的v5.0分支的ncnn模型。
## Yolov5s剪枝
见https://github.com/midasklr/yolov5prune
稀疏训练+Bn层剪枝,可以获得更加紧凑的模型,这里一次稀疏训练+60%Bn层剪枝,模型从28M降低到7M。
## 流程
以下为yolov5s.pt转NCNN流程,自己训练的模型一样:
## pytorch测试和导出onnx
先测试下yolov5s效果:
```
python detect.py --weights yolov5s.pt --source data/images
```
效果不错:
<p align="center">
<img src="images/bus.jpg">
</p>
导出 onnx,并用 onnx-simplifer 简化模型,这里稍微不同,如果按照[详细记录u版YOLOv5目标检测ncnn实现](https://zhuanlan.zhihu.com/p/275989233?utm_source=qq),那么直接导出来的模型可以看到输出:
```
python models/export.py --weights yolov5s.pt --img 640 --batch 1
```
<p align="center">
<img src="images/Screenshot from 2021-05-22 19-24-44.png">
</p>
可以看到后处理怎么都出来了???
看看models/yolo.py代码发现:
<p align="center">
<img src="images/Screenshot from 2021-05-22 19-47-51.png">
</p>
inference里面不就对应上面onnx模型那部分输出处理后然后torch.cat起来么,这部分处理我们放在代码里面做,所以可以注释这部分:
<p align="center">
<img src="images/Screenshot from 2021-05-22 19-49-54.png">
</p>
这样导出来的模型就是三个输出了:
<p align="center">
<img src="images/Screenshot from 2021-05-22 19-26-13.png">
</p>
ok,输出和[详细记录u版YOLOv5目标检测ncnn实现](https://zhuanlan.zhihu.com/p/275989233?utm_source=qq)对应上了,同时可以看到激活函数silu:
<p align="center">
<img src="images/Screenshot from 2021-05-21 21-01-21.png">
</p>
经过onnx-sim简化一下:
```
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx
```
## 转换和实现focus模块等
后续和[详细记录u版YOLOv5目标检测ncnn实现](https://zhuanlan.zhihu.com/p/275989233?utm_source=qq)一样,ncnn转化后激活函数转为swish,可swish的实现:
```c++
Swish::Swish()
{
one_blob_only = true;
support_inplace = true;
}
int Swish::forward_inplace(Mat& bottom_top_blob, const Option& opt) const
{
int w = bottom_top_blob.w;
int h = bottom_top_blob.h;
int channels = bottom_top_blob.c;
int size = w * h;
#pragma omp parallel for num_threads(opt.num_threads)
for (int q = 0; q < channels; q++)
{
float* ptr = bottom_top_blob.channel(q);
for (int i = 0; i < size; i++)
{
float x = ptr[i];
ptr[i] = static_cast<float>(x / (1.f + expf(-x)));
}
}
return 0;
}
} // namespace ncnn
```
和silu一样,那么就可以正常进行推理了,可能需要注意的就是三个输出节点不要弄错就ok。
## INT8量化
### 1. NCNN源码编译
1. 最新ncnn新增支持int8量化
```
git clone https://github.com/Tencent/ncnn.git
cd ncnn
git submodule update --init
```
2. 增加Focus层
将layer/yolov5focus.cpp/.h 两个文件放在ncnn/src/layer下,然后ncnn/src/CMakeList.txt增加:
```
ncnn_add_layer(YoloV5Focus)
```
3. 编译
不同系统的编译见https://github.com/Tencent/ncnn/wiki/how-to-build
编译完成后会有:
ncnn/build/tools/onnx/onnx2ncnn :用于onnx转ncnn的工具
/ncnn/build/tools/ncnnoptimize 优化工具
ncnn/build/tools/quantize/ncnn2int8 转int8
ncnn/build/tools/quantize/ncnn2table 生成校准表
### 2. 模型量化
参考https://github.com/Tencent/ncnn/wiki/quantized-int8-inference 操作,在ncnn2table工具下,准备我们的检验图片放在images文件夹下,最好是我们训练模型的验证或者测试集,这里使用coco val数据集5k张图片。
然后
```
find images/ -type f > imagelist.txt
./ncnn2table yolov5s-opt.param yolov5s-opt.bin imagelist.txt yolov5s.table mean=[0,0,0] norm=[0.0039215,0.0039215,0.0039215] shape=[416,416,3] pixel=BGR thread=8 method=kl
```
<p align="center">
<img src="images/Screenshot from 2021-06-08 21-47-09.png">
</p>
校准表见INT8/yolov5s.table。
然后转化模型:
```
./ncnn2int8 yolov5s-opt.param yolov5s-opt.bn yolov5s-int8.param yolov5s-int8.bin yolov5s.table
```
转化后的int8模型见yolov5s-int8.param和yolov5s-int8.bin。
### 3. INT8 推理
使用最新的动态库:https://github.com/Tencent/ncnn/releases/tag/20210525
根据你的系统选择。
相关设置:
```
yolov5.opt.num_threads = 8;
yolov5.opt.use_int8_inference = true;
```
FP16模型和INT8模型对比:
<p align="center">
<img src="images/cat.jpg">
</p>
kl和aciq两种量化方式,前者损失会更大。
| | input | inference time | model size |
| ------------- | ----- | -------------- | ---------- |
| yolov5s | 416 | 22 ms | 14.6 M(fp16) |
| yolov5s-prune | 416 | 18 ms | 1.7 M(fp16) |
| yolov5s-int8 | 416 | 52ms | 887.5k(int8) |
目前int8量化后效果还不错,但是推理时间慢了很多,可能原因是int8不针对x86,参考https://github.com/Tencent/ncnn/issues/2974
后续测试arm上加速效果
没有合适的资源?快使用搜索试试~ 我知道了~
yolov5 v5.0 分支的 ncnn.zip
共111个文件
h:27个
cmake:11个
bin:9个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 95 浏览量
2024-11-26
19:43:47
上传
评论
收藏 60.45MB ZIP 举报
温馨提示
yolov5 v5.0 分支的 ncnnYOLOv5转NCNN更新20210608新增yolov5模型剪枝和NCNN INT8量化。项目持续更新,主要包括yolov5s模型的剪枝,int8量化,ncnn模型转换和Android移植测试。基于YOLOv5最新v5.0发布,和NCNN官方给出的例子的差别主要有激活函数hardswish等于siLu流程和详细记录u版YOLOv5目标检测ncnn实现略有不同编译运行动态库用的是官方编译好的ncnn-20210507-ubuntu-1604-sharedmkdir build cd buildcmake ..make -j8./yolov5 ../bus.jpg视野:安卓参考https://github.com/nihui/ncnn-android-yolov5,使用这里转的v5.0分支的ncnn模型。Yolov5s剪枝参见https://github.com/midasklr/yolov5prune 稀疏训练+Bn层剪枝,可以更加紧凑的模型,这里一次稀疏训练+60%Bn层剪枝,模型
资源推荐
资源详情
资源评论
收起资源包目录
yolov5 v5.0 分支的 ncnn.zip (111个子文件)
libncnn.so.1 7.9MB
libncnn.so.1.0.20210525 7.9MB
yolov5s.bin 14.27MB
yolov5s-opt.bin 13.88MB
yolov5s-int8-aciq.bin 7MB
yolov5s-int8.bin 7MB
yolov5s-int8.bin 7MB
yolov5s-int8-aciq.bin 7MB
feature_tests.bin 12KB
CMakeDetermineCompilerABI_CXX.bin 8KB
CMakeDetermineCompilerABI_C.bin 8KB
CMakeCCompilerId.c 16KB
feature_tests.c 688B
caffe2ncnn 1.18MB
cmake.check_cache 85B
Makefile.cmake 7KB
CMakeCXXCompiler.cmake 4KB
ncnn.cmake 3KB
CMakeCCompiler.cmake 2KB
cmake_install.cmake 1KB
ncnnConfig.cmake 1KB
ncnn-release.cmake 796B
DependInfo.cmake 734B
CMakeDirectoryInformation.cmake 651B
CMakeSystem.cmake 406B
cmake_clean.cmake 244B
CMakeCXXCompilerId.cpp 16KB
yolov5.cpp 14KB
yolov5focus.cpp 2KB
feature_tests.cxx 10KB
darknet2ncnn 103KB
.gitignore 14B
mat.h 56KB
c_api.h 14KB
gpu.h 13KB
allocator.h 12KB
simplestl.h 11KB
simpleocv.h 9KB
layer_shader_type_enum.h 8KB
net.h 8KB
vulkan_header_fix.h 8KB
layer.h 6KB
platform.h 6KB
command.h 5KB
option.h 4KB
pipeline.h 3KB
cpu.h 3KB
datareader.h 3KB
pipelinecache.h 3KB
modelbin.h 2KB
paramdict.h 2KB
simpleomp.h 1KB
layer_type_enum.h 1KB
benchmark.h 1KB
blob.h 1KB
yolov5focus.h 1013B
layer_shader_type.h 974B
ncnn_export.h 959B
layer_type.h 954B
CXX.includecache 36KB
depend.internal 7KB
cat.jpg 1.43MB
bus.jpg 483KB
yolov5-int8-aciq.jpg 483KB
yolov5.jpg 482KB
yolov5_ncnn_fp16.jpg 482KB
yolov5-int8-kl.jpg 480KB
bus.jpg 476KB
CMakeOutput.log 43KB
depend.make 12KB
build.make 5KB
flags.make 387B
progress.make 43B
Makefile 5KB
Makefile2 3KB
progress.marks 2B
README.md 6KB
mxnet2ncnn 96KB
ncnn2int8 105KB
ncnn2mem 23KB
ncnn2table 252KB
ncnnmerge 14KB
ncnnoptimize 126KB
yolov5.cpp.o 170KB
onnx2ncnn 378KB
a.out 9KB
a.out 9KB
yolov5s.param 15KB
yolov5s-int8-aciq.param 14KB
yolov5s-int8.param 14KB
yolov5s-int8-aciq.param 14KB
yolov5s-int8.param 14KB
yolov5s-opt.param 14KB
Screenshot from 2021-06-08 21-47-09.png 238KB
Screenshot from 2021-05-22 19-24-44.png 183KB
Screenshot from 2021-05-22 19-49-54.png 140KB
Screenshot from 2021-05-22 19-47-51.png 129KB
Screenshot from 2021-05-22 19-26-13.png 99KB
Screenshot from 2021-06-08 21-48-39.png 89KB
Screenshot from 2021-05-21 21-01-03.png 89KB
共 111 条
- 1
- 2
资源评论
赵闪闪168
- 粉丝: 1549
- 资源: 3077
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功