Syencil / mobile-yolov5-pruning-distillation

mobilev2-yolov5s剪枝、蒸馏,支持ncnn,tensorRT部署。ultra-light but better performence!
MIT License
821 stars 163 forks source link

常见的一些问题汇总 #38

Open Syencil opened 3 years ago

Syencil commented 3 years ago
  1. 问:为什么有时候训练mAP会变成0? 答:这要分情况讨论,我看大多数就是loss->0,val的map->0,这是很明显的overfit了。可以参考一下原来写的csdn文章

  2. 问:torch.nn.modules.module.ModuleAttributeError: 'Model' object has no attribute 'module' 答:这是原git挖的坑。你以为的模型加载->直接读取权重,恢复模型,构建梯度关系。实际上的模型加载->从yaml中构建一个随机权重的模型->得到梯度关系->加载每一层保存的权重。前者用在纯前向推理,后者用在需要梯度关系的时候,比如剪枝。还有就是保证原始工程结构,注意export PATH=$PWD

  3. 问:yolo5s的预训练权重没了怎么办? 答:我现在手上也没了。不过这个git主要是用更轻量的mobilev2-yolo5s,所以这里大家也可以来尝试一下。如果需要用yolov5,还是用他们最新的,对着我这个改改代码还是很轻松的Readme中有一个网盘链接,可以试一下

  4. 问:recall低或者precision低 答:和阈值有关,所以我这里只关注map作为中间指标。如果再剪枝或者蒸馏中出现map降低,也是很正常的,和你的数据集以及策略都有关,毕竟每个论文都是吹自己是sota。还需要自己鉴别。

  5. 问:剪枝之后的模型能保存yaml文件吗?可不可以蒸馏或者进行ncnn转换? 答:可以,但是没必要用yaml文件。这个时候你直接加载模型就行了,参考ft(finetune)模式。如果你很介意,那你就写个逆向的脚本就行了,不难,锻炼一下自己。

  6. 问:模型训练的细节,剪枝蒸馏参考的文献等 答:基本都在readme中有写,细节直接看代码就好了,不难,就当作学习。补充一下,剪枝是韩松的基于bn层剪枝,蒸馏则是用了针对一阶段、二阶段、分类网络等等的方式,具体细节肯定和原文有出入,但是差异不大注意鉴别。还有就是不要问我为什么不用什么什么方法,我不可能帮你实验完所有的,你可以自己动手。我所选的都是具有代表性的,很经典的方法,但是不一定最好。

  7. 问:yolov5在你这里剪枝蒸馏有一些bug 答:一针对yolov5我没有具体测试过,别人作者都还在更新呢,肯定是有bug的。二我这个项目主要是想做个更轻量的模型出来,但是我能保证只要按照我的步骤一步一步肯定能复现出来,我连随机数种子都给你们了>_<。

  8. 问:mobilev2-yolo5s收敛慢,但是yolo5s就很快? 答:别人在coco上预训练过的,参数量和计算量是我的两倍,capacity就很大。我这个就backbone用的imagenet权重,head全部随机初始化,收敛慢很正常,capacity小导致精度低也很正常。本身轻量化的思路就是从整体结构设计、剪枝、蒸馏、量化这4个点来做的。你要拿着yolov5x训练完了再做轻量化我也没得说,这也是个思路。

wwj1980 commented 3 years ago

RuntimeError: CUDA out of memory. 调整哪些参数,降低计算量?

Syencil commented 3 years ago

RuntimeError: CUDA out of memory. 调整哪些参数,降低计算量?

batchsize

MoXQian commented 3 years ago

mobilev2-yolo5s的预训练权重怎么找不到了呀