YOLOv8剪枝之后只使用pt模型进行回调训练,不使用yaml

YOLOv8模型的剪枝是一个涉及多个步骤的复杂过程,主要包括稀疏训练、剪枝和微调。以下是YOLOv8剪枝的一般流程:

1. 稀疏训练:

在稀疏训练阶段,通过在训练过程中增加L1正则化约束,筛选出重要的通道。这一步骤可以通过修改`trainer.py`文件,为BN层的权重增加L1正则化项来实现,如在`trainer.py`中添加的代码所示 。

# ========== 新增 ==========
# l1_lambda = 1e-2 * (1 - 0.9 * epoch / self.epochs)  # 可调
# for k, m in self.model.named_modules():
#     if isinstance(m, nn.BatchNorm2d):
#         m.weight.grad.data.add_(l1_lambda * torch.sign(m.weight.data))
#         m.bias.grad.data.add_(1e-2 * torch.sign(m.bias.data))
# ========== 新增 ==========

2. 剪枝:

使用训练后的模型(推荐使用`last.pt`而非`best.pt`)作为剪枝对象。创建`prune.py`文件,编写剪枝代码。剪枝代码需要针对YOLOv8的网络结构进行编写,如果模型有修改,则需要相应地调整剪枝代码 。

3. 检查BN层的bias:

剪枝后,检查BN层的bias是否足够小,如果不满足条件可能需要重新进行稀疏训练 。

4. 设置阈值和剪枝率:

确定全局或局部的剪枝阈值,并设置保持率(例如,`factor = 0.8`表示保留80%的通道)。

5. 剪枝操作:

要注意自己需要剪枝的模型的结构,保证上下层通道数一致,这样才可以进行下一步的验证和训练。

对模型中的卷积层进行剪枝,例如,可以编写函数`prune_conv`来实现对TopConv和BottomConv的剪枝 。

剪枝完成后最好使用下面这行代码验证一下,保证后续微调能够顺利运行

yolo.val() # 剪枝模型进行验证 yolo.val(workers=0)

6. 保存剪枝后的模型:

剪枝完成后,保存模型权重,以便进行进一步的测试或微调 。

7. 微调:

微调可能会出现无法只使用pt模型,即模型训练依然调用了yaml文件的问题,这里需要调整几行代码:

第一步:

# trainer.py中大概545行
self.model = self.get_model(cfg=cfg, weights=weights, verbose=RANK == -1)  # calls Model(cfg, weights)
# ========== 新增该行代码 ==========
self.model = weights
# ========== 新增该行代码 ==========
return ckpt

 第二步:

# model.py文件的大概655行
if not args.get("resume"):  # manually set model only if not resuming


######################上面两行注释掉,添加下面一行#####
self.trainer.model = self.model.train()
##########################修改####################
# self.trainer.model = self.trainer.get_model(weights=self.model if self.ckpt else None, cfg=self.model.yaml)
# self.model = self.trainer.model

 第三步:

# 修改loss.py中188行左右
def bbox_decode(self, anchor_points, pred_dist):
"""Decode predicted object bounding box coordinates from anchor points and distribution."""
    if self.use_dfl:
        # b, a, c = pred_dist.shape  # batch, anchors, channels
        b, a, c = pred_dist.shape
        device = pred_dist.device
        self.proj = self.proj.to(device)
        pred_dist = pred_dist.view(b, a, 4, c // 4).softmax(3).matmul(self.proj.type(pred_dist.dtype))

 这样就可以正常微调训练了

剪枝后,模型的精度可能会下降,因此需要进行微调以恢复精度。微调可以在剪枝后直接进行,或者先导出为ONNX文件,然后在Netron中检查剪枝结果后再进行 。

8. 注意事项:

在进行剪枝操作时,需要区分网络结构和网络权重,因为剪枝后的权重文件结构可能与原始的yaml文件不匹配,可能需要对yaml文件进行修改以满足剪枝后的要求 。

9. 未来工作:

可以考虑不剪枝的层不进行约束,对于低于全局阈值的模块可以整个移除,以及考虑保留通道数对硬件加速的影响 。

请注意,剪枝是一个需要细致操作的过程,需要对YOLOv8的网络结构和ONNX模型的操作非常熟悉。实际操作中可能会遇到许多细节问题,需要在实践中不断调整和优化。
 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
yolov8s模型进行剪枝是通过以下步骤实现的: 1. 首先,需要进行环境准备,包括安装必要的软件和库。 2. 使用YOLOv5进行训练自己的模型。在训练完成后,得到一个训练好的模型文件。 3. 对训练好的模型进行稀疏训练,即使用稀疏训练算法模型进行进一步优化。 4. 在稀疏训练完成后,对模型进行剪枝剪枝是通过删除冗余的参数和层来减少模型的大小和计算量。 5. 剪枝后,可以对网络模型进行微调,以进一步提高模型的性能和精度。 6. 最后,可以测试微调后的模型,评估其在目标检测任务上的表现。 以上是yolov8s模型进行剪枝的主要步骤。如果需要具体的代码和参考资料,可以参考引用和引用中提供的资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Jetson nano部署剪枝YOLOv8](https://blog.csdn.net/qq_40672115/article/details/130175558)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [YOLOv5剪枝✂️| 模型剪枝实战篇](https://blog.csdn.net/weixin_43694096/article/details/127576130)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值