yzqxy / Yolov8_obb_Prune_Track

GNU General Public License v3.0
181 stars 14 forks source link

剪枝出现不匹配模型层名称问题 #5

Open GalSang17 opened 1 year ago

GalSang17 commented 1 year ago

elif m in [C2fPruned]:

model.4和6的cf2为n=2层数更多需要注意规则

        if named_m_base == 'model.4' or named_m_base == 'model.6':
            args_list=[]
            for q in range(n):
                named_m_cv1_bn = named_m_base + ".{}.cv1.bn".format(q)
                named_m_cv2_bn = named_m_base + ".{}.cv2.bn".format(q)

                from_to_map[named_m_cv2_bn] = fromlayer[f]

                cv1in = ch[f]

                cv1out = int(maskbndict[named_m_cv1_bn].sum())
                cv2out = int(maskbndict[named_m_cv2_bn].sum())

                c3fromlayer = [named_m_cv1_bn]

                named_m_bottle_cv1_bn = named_m_base + ".{}.m.0.cv1.bn".format(q)
                named_m_bottle_cv2_bn = named_m_base + ".{}.m.0.cv2.bn".format(q)

                bottle_cv1out = int(maskbndict[named_m_bottle_cv1_bn].sum())
                bottle_cv2out = int(maskbndict[named_m_bottle_cv2_bn].sum())

                bottle_args = []
                #Bottleneck_C2f的传参,int(cv1in/2)是该模块的split操作
                bottle_args.append([int(cv1out/2), bottle_cv1out, bottle_cv2out])
                from_to_map[named_m_bottle_cv1_bn] = c3fromlayer[0]
                from_to_map[named_m_bottle_cv2_bn] = named_m_bottle_cv1_bn
                c3fromlayer.append(named_m_bottle_cv2_bn)

                from_to_map[named_m_cv2_bn] = [c3fromlayer[-1], named_m_cv1_bn]
                if q ==0:
                    args = [cv1in, cv1out, cv2out, n, args[-1]]
                    args.insert(3, bottle_args)
                    args_list.append(args)
                    from_to_map[named_m_cv1_bn] = fromlayer[f]
                else:
                    args = [args_list[0][2], cv1out, cv2out, n, args[-1]]
                    args.insert(3, bottle_args)
                    args_list.append(args)
                    from_to_map[named_m_cv1_bn] = named_m_base + ".0.cv2.bn"

            c2 = cv2out
            fromlayer.append(named_m_cv2_bn)    
            print('args_list',args_list)
            n = 2

这块代码的的处理部分会抛错,错误信息是Traceback (most recent call last): File "prune.py", line 858, in main(opt) File "prune.py", line 831, in main run_prune(*vars(opt)) File "/home/yangyang/miniconda3/envs/py38/lib/python3.8/site-packages/torch/autograd/grad_mode.py", line 28, in decorate_context return func(args, **kwargs) File "prune.py", line 509, in run_prune pruned_model = ModelPruned(maskbndict=maskbndict, cfg=pruned_yaml, ch=3).cuda() File "/home/yangyang/Code/YOLOv8-OBB/models/yolo_prune.py", line 154, in init self.model, self.save,self.from_to_map = parse_pruned_model(self.maskbndict,deepcopy(self.yaml), ch=[ch]) # model, savelistW File "/home/yangyang/Code/YOLOv8-OBB/models/yolo_prune.py", line 339, in parse_pruned_model cv1out = int(maskbndict[named_m_cv1_bn].sum()) KeyError: 'model.4.0.cv1.bn',如果我修改了这个错误信息后prune.py中的assert pruned_model_state.keys() == modelstate.keys()这块的断言也会出现问题,请问需要怎么处理,代码是9月6号16:30分后拉取的,应该是最新的,期待回复!

yzqxy commented 1 year ago

elif m in [C2fPruned]: #model.4和6的cf2为n=2层数更多需要注意规则 if named_m_base == 'model.4' or named_m_base == 'model.6': args_list=[] for q in range(n): named_m_cv1_bn = named_m_base + ".{}.cv1.bn".format(q) named_m_cv2_bn = named_m_base + ".{}.cv2.bn".format(q)

                from_to_map[named_m_cv2_bn] = fromlayer[f]

                cv1in = ch[f]

                cv1out = int(maskbndict[named_m_cv1_bn].sum())
                cv2out = int(maskbndict[named_m_cv2_bn].sum())

                c3fromlayer = [named_m_cv1_bn]

                named_m_bottle_cv1_bn = named_m_base + ".{}.m.0.cv1.bn".format(q)
                named_m_bottle_cv2_bn = named_m_base + ".{}.m.0.cv2.bn".format(q)

                bottle_cv1out = int(maskbndict[named_m_bottle_cv1_bn].sum())
                bottle_cv2out = int(maskbndict[named_m_bottle_cv2_bn].sum())

                bottle_args = []
                #Bottleneck_C2f的传参,int(cv1in/2)是该模块的split操作
                bottle_args.append([int(cv1out/2), bottle_cv1out, bottle_cv2out])
                from_to_map[named_m_bottle_cv1_bn] = c3fromlayer[0]
                from_to_map[named_m_bottle_cv2_bn] = named_m_bottle_cv1_bn
                c3fromlayer.append(named_m_bottle_cv2_bn)

                from_to_map[named_m_cv2_bn] = [c3fromlayer[-1], named_m_cv1_bn]
                if q ==0:
                    args = [cv1in, cv1out, cv2out, n, args[-1]]
                    args.insert(3, bottle_args)
                    args_list.append(args)
                    from_to_map[named_m_cv1_bn] = fromlayer[f]
                else:
                    args = [args_list[0][2], cv1out, cv2out, n, args[-1]]
                    args.insert(3, bottle_args)
                    args_list.append(args)
                    from_to_map[named_m_cv1_bn] = named_m_base + ".0.cv2.bn"

            c2 = cv2out
            fromlayer.append(named_m_cv2_bn)    
            print('args_list',args_list)
            n = 2

这块代码的的处理部分会抛错,错误信息是Traceback (most recent call last): File "prune.py", line 858, in main(opt) File "prune.py", line 831, in main run_prune(*vars(opt)) File "/home/yangyang/miniconda3/envs/py38/lib/python3.8/site-packages/torch/autograd/grad_mode.py", line 28, in decorate_context return func(args, kwargs) File "prune.py", line 509, in run_prune pruned_model = ModelPruned(maskbndict=maskbndict, cfg=pruned_yaml, ch=3).cuda() File "/home/yangyang/Code/YOLOv8-OBB/models/yolo_prune.py", line 154, in init** self.model, self.save,self.from_to_map = parse_pruned_model(self.maskbndict,deepcopy(self.yaml), ch=[ch]) # model, savelistW File "/home/yangyang/Code/YOLOv8-OBB/models/yolo_prune.py", line 339, in parse_pruned_model cv1out = int(maskbndict[named_m_cv1_bn].sum()) KeyError: 'model.4.0.cv1.bn',如果我修改了这个错误信息后prune.py中的assert pruned_model_state.keys() == modelstate.keys()这块的断言也会出现问题,请问需要怎么处理,代码是9月6号16:30分后拉取的,应该是最新的,期待回复!

目前只支持v8n的剪枝,后续会优化其他结构的剪枝

GalSang17 commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

yzqxy commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

GalSang17 commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

image 再次确认了,就是v8n.yaml,配置截图和报错如下 image 不过我稀疏训练结束时验证图片的预测效果好像偏移不对,像这样 image 训练的命令都是按照你的博客来的,单卡训练的

yzqxy commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

image 再次确认了,就是v8n.yaml,配置截图和报错如下 image 不过我稀疏训练结束时验证图片的预测效果好像偏移不对,像这样 image 训练的命令都是按照你的博客来的,单卡训练的

你需要用detect.py来测试效果,模型训完产生的val图片有缩放问题,我没改了。 剪枝这块等我再优化一下结构和命令把,我这样看实在看不出来啥问题

GalSang17 commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

image 再次确认了,就是v8n.yaml,配置截图和报错如下 image 不过我稀疏训练结束时验证图片的预测效果好像偏移不对,像这样 image 训练的命令都是按照你的博客来的,单卡训练的

你需要用detect.py来测试效果,模型训完产生的val图片有缩放问题,我没改了。 剪枝这块等我再优化一下结构和命令把,我这样看实在看不出来啥问题

好呢,那等你的好消息,很优秀的工作^_^!

yzqxy commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

image 再次确认了,就是v8n.yaml,配置截图和报错如下 image 不过我稀疏训练结束时验证图片的预测效果好像偏移不对,像这样 image 训练的命令都是按照你的博客来的,单卡训练的

你需要用detect.py来测试效果,模型训完产生的val图片有缩放问题,我没改了。 剪枝这块等我再优化一下结构和命令把,我这样看实在看不出来啥问题

好呢,那等你的好消息,很优秀的工作^_^!

感谢支持!

yzqxy commented 1 year ago

@yzqxy 我就是用的v8n的yaml文件呢,稀疏训练的配置是这样 image 然后test-p.yaml里面是这样子 image 你看方便加个微信吗,我有一些剪枝的问题想向你请教呢^_^,J-M116

image 我这边n是可行的,你再确认一下,你训练的yaml是不是n,剪枝命令也得是n

image 再次确认了,就是v8n.yaml,配置截图和报错如下 image 不过我稀疏训练结束时验证图片的预测效果好像偏移不对,像这样 image 训练的命令都是按照你的博客来的,单卡训练的

你需要用detect.py来测试效果,模型训完产生的val图片有缩放问题,我没改了。 剪枝这块等我再优化一下结构和命令把,我这样看实在看不出来啥问题

好呢,那等你的好消息,很优秀的工作^_^!

剪枝已经重新优化完,之前确实有点bug,跟现在训的模型结构居然不一样,也是日鬼,现在可以训了