替换SlowFast中Detectron2为Yolov8

一 需求

FaceBookReserch中SlowFast源码中检测框是用Detectron2进行目标检测,本文想实现用yolov8替换detectron2

二 实施方案

首先,yolov8 支持有自定义库ultralytics(仅支持yolov8),安装对应库

pip install ultralytics

源码中slowfast/visualization/predictor.py 43行中

if cfg.DETECTION.ENABLE:
       self.object_detector = Detectron2Predictor(cfg, gpu_id=self.gpu_id)

根据ultralytics文档进行定义
创建对应YOLOPredictor类(加入了检测框及其标签,具体见前一篇文章)

class YOLOPredictor:

    def __init__(self, cfg, gpu_id=None):
        # 加载预训练的 YOLOv8n 模型
        self.model = YOLO('/root/autodl-tmp/data/runs/detect/train/weights/best.pt')
        self.detect_names, _, _ = get_class_names(cfg.DEMO.Detect_File_Path, None, None)

    def __call__(self, task):
        """
        Return bounding boxes predictions as a tensor.
        Args:
            task (TaskInfo object): task object that contain
                the necessary information for action prediction. (e.g. frames)
        Returns:
            task (TaskInfo object): the same task info object but filled with
                prediction values (a tensor) and the corresponding boxes for
                action detection task.
        """
        # """得到预测置信度"""
        # scores = outputs["instances"].scores[mask].tolist()
        # """获取类别标签"""
        # pred_labels = outputs["instances"].pred_classes[mask]
        # pred_labels = pred_labels.tolist()
        # """进行标签匹配"""
        # for i in range(len(pred_labels)):
        #     pred_labels[i] = self.detect_names[pred_labels[i]]
        # preds = [
        #     "[{:.4f}] {}".format(s, labels) for s, labels in zip(scores, pred_labels)
        # ]
        # """加入预测标签"""
        # task.add_detect_preds(preds)
        # task.add_bboxes(pred_boxes)
        middle_frame = task.frames[len(task.frames) // 2]
        outputs = self.model(middle_frame)
        boxes = outputs[0].boxes
        mask = boxes.conf >= 0.5
        pred_boxes = boxes.xyxy[mask]
        scores = boxes.conf[mask].tolist()
        pred_labels = boxes.cls[mask].to(torch.int)
        pred_labels = pred_labels.tolist()
        for i in range(len(pred_labels)):
            pred_labels[i] = self.detect_names[pred_labels[i]]
        preds = [
            "[{:.4f}] {}".format(s, labels) for s, labels in zip(scores, pred_labels)
        ]
        """加入预测标签"""
        task.add_detect_preds(preds)
        task.add_bboxes(pred_boxes)

        return task
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
SlowFast模型将ResNet-50替换为ResNeXt-50是可行的。以下是一种可能的实现方法: 1. 首先,导入所需的库和模型: ```python import torch import torchvision.models as models from torchvision.models.resnet import Bottleneck # 导入SlowFast模型 from slowfast.models.video_model_builder import SlowFast ``` 2. 定义ResNeXt-50模型: ```python class ResNeXt(models.ResNet): def __init__(self, block, layers, num_classes=1000, zero_init_residual=False, groups=32, width_per_group=4, replace_stride_with_dilation=None, norm_layer=None): super(ResNeXt, self).__init__(block, layers, num_classes, zero_init_residual, groups, width_per_group, replace_stride_with_dilation, norm_layer) def _forward_impl(self, x): # 前向传播逻辑 x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = torch.flatten(x, 1) x = self.fc(x) return x def _resnext(arch, block, layers, pretrained, progress, **kwargs): model = ResNeXt(block, layers, **kwargs) if pretrained: state_dict = torch.load(pretrained) model.load_state_dict(state_dict) return model def resnext50(pretrained=False, progress=True, **kwargs): return _resnext('resnext50', Bottleneck, [3, 4, 6, 3], pretrained, progress, **kwargs) ``` 3. 替换SlowFast模型的ResNet-50为ResNeXt-50: ```python slowfast = SlowFast(resnet_depth=50, num_classes=400) # 加载预训练的ResNeXt-50模型 resnext = resnext50(pretrained=True) # 替换SlowFast模型的ResNet-50为ResNeXt-50 slowfast.s1_net = resnext ``` 现在,SlowFast模型的ResNet-50已被成功替换为ResNeXt-50。你可以继续使用slowfast进行训练或推理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值