yolov8本身自带CBAM注意力,在nn/modules/conv.py文件最后面可以找到。
第一步:在conv.py添加名字
第二步:在_init_.py添加名字
第三步:在tasks.py添加名字
第四步:在tasks.py添加配置。715行左右
elif m in {CBAM}:
c1,c2 = ch[f],args[0]
if c2 != nc:
c2 = make_divisible(min(c2,max_channels)*width,8)
args = [c1,*args[1:]]
第五步:复制yolov8.yaml文件重命名为myolov8_Att_CBAM.yaml
第六步:在myolov8_Att_CBAM.yaml里面添加注意力机制,添加的位置不同,效果也不一样,这个需要自研究一下,我添加在了第五层,在head这个部分标红的地方进行了修改,因为我们加了一次,所以这些也需要加一层,
[-1, 1, Conv, [64, 3, 2]]
是一个配置列表,用于定义YOLOv8模型中的一个卷积层。这个列表的每个元素都有特定的含义:
-
-1
:这是输入的索引,表示该层的输入来自于模型的上一层。 -
1
:这是重复的次数,表示这个卷积层只有一层。 -
Conv
:这是该层的类型,表示这是一个卷积层。 -
[64, 3, 2]
:这是一个列表,包含了卷积层的一些参数。64
:这是卷积层的输出通道数。3
:这是卷积核的大小,这里是3x3。2
:这是卷积的步长,这里是2。
所以,[-1, 1, Conv, [64, 3, 2]]
表示的是一个卷积层,它的输入来自于上一层,输出通道数为64,卷积核大小为3x3,卷积步长为2。这个卷积层不进行重复。希望这个解释对你有所帮助!
[[-1, 7], 1, Concat, [1]]
是一个配置列表,用于定义YOLOv8模型中的一个Concat模块。这个列表的每个元素都有特定的含义:
-
[-1, 7]
:这是输入的索引,表示该层的输入来自于模型的上一层(索引为-1)和第7层(索引为7)。 -
1
:这是重复的次数,表示这个Concat模块只有一层。
所以,[[-1, 7], 1, Concat, [1]]表示的是一个Concat模块,它的输入来自于上一层和第7层,拼接的维度是通道维度,这个Concat模块不进行重复。希望这个解释对你有所帮助!
第七步:在根目录下新建一个testmodel.py粘贴下面内容:
# Ultralytics YOLO 🚀, AGPL-3.0 license
import contextlib
from copy import copy
from pathlib import Path
import cv2
import numpy as np
import pytest
import torch
from PIL import Image
from torchvision.transforms import ToTensor
from ultralytics import RTDETR, YOLO
from ultralytics.cfg import TASK2DATA
from ultralytics.data.build import load_inference_source
from ultralytics.utils import (ASSETS, DEFAULT_CFG, DEFAULT_CFG_PATH, LINUX, MACOS, ONLINE, ROOT, WEIGHTS_DIR, WINDOWS,
checks, is_dir_writeable)
from ultralytics.utils.downloads import download
from ultralytics.utils.torch_utils import TORCH_1_9
CFG = 'ultralytics-main/ultralytics/cfg/models/v8/myyolov8_Att_CBAM.yaml'
SOURCE = ASSETS / 'bus.jpg'
def test_model_forward():
"""Test the forward pass of the YOLO model."""
model = YOLO(CFG)
model(source=None, imgsz=32, augment=True) # also test no source and augment
运行过程中可能会报错:如KeyError: 'CBAM',这是yolov8的task.py文件和cuda的不一致造成的
解决方法:复制yolov8的task.py到conda\envs\yolo_track\Lib\site-packages\ultralytics\nn,yolo_track为你的环境名字,把这里面的task.py覆盖掉即可