SpursLipu / YOLOv3v4-ModelCompression-MultidatasetTraining-Multibackbone

YOLO ModelCompression MultidatasetTraining
GNU General Public License v3.0
445 stars 136 forks source link

yolov3-mobilenet正常剪枝后精度变为0了。 #41

Closed chenjunson closed 4 years ago

chenjunson commented 4 years ago

模型能够剪枝,剪枝后模型能够被压缩,推理速度也确实变快了,但是剪枝后精度为0,就算percent 0.1精度还是为0。

SpursLipu commented 4 years ago

是不是没有充分稀疏化训练?

chenjunson commented 4 years ago

我也考虑过是否稀疏化不够的问题,但是我的percent 的值只取了0.1,应该来说不管剪枝后的map咋低,也不应该低到0呀。我去尝试着剪枝了一下没有经过稀疏化训练的yolov3模型,percent 的值也只取了0.1,剪后的结果是可以的,剪后模型精度几乎没有下降。yolov3模型在不稀疏化情况下,percent 的值取0.1都能正常剪,而我的那个yolov3-mobilenet经过1200次的稀疏化后,再剪枝结果还是精度为0。

SpursLipu commented 4 years ago

是这样的,基于mobilenet的模型主干网络参数本来已经很少了,其实被剪得大部分通道是在后处理部分,如果同样使用0.1得剪植率,mobilnet会剪更多的后处理部分。我猜测是由于这个原因造成yolov3直接剪植效果还可以。所以还是需要微调的,最后的精度应该以微调的结果为准。

chenjunson commented 4 years ago

你的意思是我的那个yolov3-mobilenet稀疏化不够所以才导致剪枝后的精度为0吗?而哪个yolov3模型因为本身就包含了很多参数所以容易剪。还有就是在之前你给的那个稀疏化训练指令范例中包含了--accumulate 1这个参数指令,但是在train.py中好像没有存在这个参数指令,你可以去看看。

SpursLipu commented 4 years ago

我的意思是你需要微调一下,再看结果。 谢谢提醒,这是之前仓库忘记修改的,我修改一下。

17868380981 commented 4 years ago

我的意思是你需要微调一下,再看结果。 谢谢提醒,这是之前仓库忘记修改的,我修改一下。

你好,问一下,这个工程对yolov3,yolov3-mobilenet都支持剪枝嘛

SpursLipu commented 4 years ago

我的意思是你需要微调一下,再看结果。 谢谢提醒,这是之前仓库忘记修改的,我修改一下。

你好,问一下,这个工程对yolov3,yolov3-mobilenet都支持剪枝嘛

是的,但是yolov3-mobilenet只能normal剪植

17868380981 commented 4 years ago

我的意思是你需要微调一下,再看结果。 谢谢提醒,这是之前仓库忘记修改的,我修改一下。

你好,问一下,这个工程对yolov3,yolov3-mobilenet都支持剪枝嘛

是的,但是yolov3-mobilenet只能normal剪植

对ghost-yolo支持嘛

SpursLipu commented 4 years ago

我的意思是你需要微调一下,再看结果。 谢谢提醒,这是之前仓库忘记修改的,我修改一下。

你好,问一下,这个工程对yolov3,yolov3-mobilenet都支持剪枝嘛

是的,但是yolov3-mobilenet只能normal剪植

对ghost-yolo支持嘛

还没有做,最近会做

chenjunson commented 4 years ago

我进行了一下微调,但是有个报错。我输入的微调指令是:python3 train.py --cfg /yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg --data data/obj.data --weights weights/yolov3_hand_normal_pruning_0.65percent.weights --batch-size 6 报错如下:chenjunsong@chenjunsong-GJ5CN64:~/U-YOLOv3$ python3 train.py --cfg /yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg --data data/obj.data --weights weights/yolov3_hand_normal_pruning_0.65percent.weights --batch-size 6 Apex recommended for faster mixed precision training: https://github.com/NVIDIA/apex Namespace(KDstr=-1, accumulate=2, adam=False, batch_size=6, bucket='', cache_images=False, cfg='./cfg/yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg', data='data/obj.data', device='', epochs=1201, evolve=False, img_size=[320, 640], multi_scale=False, name='', nosave=False, notest=False, prune=-1, pt=False, qlayers=-1, quantized=-1, rect=False, resume=False, s=0.001, single_cls=False, sr=False, t_cfg='', t_weights='', weights='weights/yolov3_hand_normal_pruning_0.65percent.weights') Using CUDA device0 _CudaDeviceProperties(name='GeForce GTX 1060', total_memory=6072MB)

Start Tensorboard with "tensorboard --logdir=runs", view at http://localhost:6006/ Traceback (most recent call last): File "train.py", line 511, in train(hyp) # train normally File "train.py", line 94, in train model = Darknet(cfg, quantized=opt.quantized, qlayers=opt.qlayers).to(device) File "/home/chenjunsong/U-YOLOv3/models.py", line 334, in init self.module_defs = parse_model_cfg(cfg) File "/home/chenjunsong/U-YOLOv3/utils/parse_config.py", line 31, in parse_model_cfg mdefs[-1][key] = [int(x) for x in val.split(',')] File "/home/chenjunsong/U-YOLOv3/utils/parse_config.py", line 31, in mdefs[-1][key] = [int(x) for x in val.split(',')] ValueError: invalid literal for int() with base 10: '[-4]'

SpursLipu commented 4 years ago

我进行了一下微调,但是有个报错。我输入的微调指令是:python3 train.py --cfg /yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg --data data/obj.data --weights weights/yolov3_hand_normal_pruning_0.65percent.weights --batch-size 6 报错如下:chenjunsong@chenjunsong-GJ5CN64:~/U-YOLOv3$ python3 train.py --cfg /yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg --data data/obj.data --weights weights/yolov3_hand_normal_pruning_0.65percent.weights --batch-size 6 Apex recommended for faster mixed precision training: https://github.com/NVIDIA/apex Namespace(KDstr=-1, accumulate=2, adam=False, batch_size=6, bucket='', cache_images=False, cfg='./cfg/yolov3-mobilenet/prune_0.65_yolov3-mobilenet.cfg', data='data/obj.data', device='', epochs=1201, evolve=False, img_size=[320, 640], multi_scale=False, name='', nosave=False, notest=False, prune=-1, pt=False, qlayers=-1, quantized=-1, rect=False, resume=False, s=0.001, single_cls=False, sr=False, t_cfg='', t_weights='', weights='weights/yolov3_hand_normal_pruning_0.65percent.weights') Using CUDA device0 _CudaDeviceProperties(name='GeForce GTX 1060', total_memory=6072MB)

Start Tensorboard with "tensorboard --logdir=runs", view at http://localhost:6006/ Traceback (most recent call last): File "train.py", line 511, in train(hyp) # train normally File "train.py", line 94, in train model = Darknet(cfg, quantized=opt.quantized, qlayers=opt.qlayers).to(device) File "/home/chenjunsong/U-YOLOv3/models.py", line 334, in init self.module_defs = parse_model_cfg(cfg) File "/home/chenjunsong/U-YOLOv3/utils/parse_config.py", line 31, in parse_model_cfg mdefs[-1][key] = [int(x) for x in val.split(',')] File "/home/chenjunsong/U-YOLOv3/utils/parse_config.py", line 31, in mdefs[-1][key] = [int(x) for x in val.split(',')] ValueError: invalid literal for int() with base 10: '[-4]'

bug已修复

17868380981 commented 4 years ago

问一下,哪个-pt是加载预训练模型,是所有的格式都能加载嘛??(.weights/.pt/darknet53.conv.74),这些权重都要使-pt为true嘛。

SpursLipu commented 4 years ago

这个不是,-pt是指加载在coco数据集上预训练得模型,你说的这个是在imagenet上的预训练模型

17868380981 commented 4 years ago

这个不是,-pt是指加载在coco数据集上预训练得模型,你说的这个是在imagenet上的预训练模型

那我问一下,imagenet的预训练模型不用设置这个参数嘛。

SpursLipu commented 4 years ago

嗯嗯 不用的

SpursLipu commented 4 years ago

题主提出的问题确实存在我当时没有注意,现已更新。

导致YOLOv3mobilenet剪植后精度为零的原因为: 1、在做BN偏置补偿的时候直接使用了leakyrelu激活函数没有考虑到BN中是用的h_swish() 2、拷贝权重时没有注意到深度可分层的BN权重拷贝。

weixiaolian21 commented 3 years ago

题主提出的问题确实存在我当时没有注意,现已更新。

导致YOLOv3mobilenet剪植后精度为零的原因为: 1、在做BN偏置补偿的时候直接使用了leakyrelu激活函数没有考虑到BN中是用的h_swish() 2、拷贝权重时没有注意到深度可分层的BN权重拷贝。

感谢您的工作,想请教一下您关于mobilenetv3的剪枝用的是哪一个剪枝方法, 剪枝过程中对se模块是怎么处理的?