You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复AttributeError: 'YOLO'对象无'YOLOv8'属性错误?

修复YOLOv8训练代码中的AttributeError错误

错误根源

你代码中调用model.YOLOv8(cfg='yolov8x.yaml')时出错,是因为model是一个已经实例化的YOLO对象,而非YOLOv8的类。Ultralytics官方YOLOv8库的API设计中,不需要通过YOLOv8子类创建模型,直接使用YOLO类即可加载对应版本的模型。


分步修复方案

1. 修正YOLOv8模型初始化方式

使用Ultralytics官方库的正确初始化代码:

from ultralytics import YOLO

# 从配置文件创建YOLOv8x模型
yolo_model = YOLO('yolov8x.yaml')
# 或者加载预训练权重:yolo_model = YOLO('yolov8x.pt')

说明:Ultralytics的YOLO类会自动识别配置文件对应的模型版本,无需额外指定YOLOv8子类。

2. 移除错误的主干替换逻辑

直接赋值yolo_model.model.backbone = efficientnet会导致模型结构不兼容,YOLOv8的主干网络需通过修改yaml配置文件定义。若要使用EfficientNet作为主干,需手动修改yolov8x.yaml中的backbone模块,替换为EfficientNet的网络结构。

3. 修复数据集加载逻辑

你的数据集代码存在两个核心问题:

  • 数据收集时,val数据被重复添加到train集合中
  • 直接实例化抽象类torch.utils.data.Dataset会报错

修正后的数据集代码:

import torch
from torch.utils.data import Dataset, DataLoader

class DetectionDataset(Dataset):
    def __init__(self, images, targets):
        self.images = images
        self.targets = targets

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        # 转换为PyTorch要求的CHW张量格式
        image = torch.tensor(self.images[idx]).permute(2, 0, 1).float()
        # 确保目标格式符合YOLO要求:(class_id, x_center, y_center, width, height)
        target = torch.tensor(self.targets[idx]).float()
        return image, target

# 重新收集训练/验证数据
train_images = []
train_targets = []
val_images = []
val_targets = []

for phase in ['train', 'valid']:
    image_dir = os.path.join(data_dir, phase, 'images')
    label_dir = os.path.join(data_dir, phase, 'labels')

    for image_path in tqdm(os.listdir(image_dir)):
        image = cv2.imread(os.path.join(image_dir, image_path))
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        label_path = os.path.join(label_dir, image_path.replace('.jpg', '.txt'))
        with open(label_path, 'r') as f:
            labels = []
            for line in f:
                bbox = [float(x) for x in line.split()]
                labels.append([int(bbox[0]), bbox[1], bbox[2], bbox[3], bbox[4]])

        # 分阶段存储数据
        if phase == 'train':
            train_images.append(image)
            train_targets.append(labels)
        else:
            val_images.append(image)
            val_targets.append(labels)

# 创建数据加载器
train_dataset = DetectionDataset(train_images, train_targets)
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_dataset = DetectionDataset(val_images, val_targets)
val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)

4. 修正训练循环的缩进错误

验证阶段的targets处理代码缩进错误,需放在循环内部:

# 修正后的验证逻辑
with torch.no_grad():
    total_correct = 0
    total_samples = 0
    for images, targets in tqdm(val_loader):
        images = images.to(device)
        targets = [target.to(device) for target in targets]  # 缩进至循环内

        outputs = yolo_model(images)
        # 注意:YOLOv8的输出是Results对象,需用官方API解析预测结果

更简洁的官方训练方式

Ultralytics YOLOv8自带完整训练流程,推荐直接使用:

  1. 创建data.yaml配置文件:
train: /content/datasets/u-granada-g-detect-2/train
val: /content/datasets/u-granada-g-detect-2/valid
nc: 2
names: ['knife', 'gun']
  1. 调用官方训练API:
from ultralytics import YOLO

model = YOLO('yolov8x.yaml')
# 启动训练
results = model.train(
    data='data.yaml',
    epochs=100,
    batch=16,
    imgsz=224,
    lr0=0.001,
    device='cuda' if torch.cuda.is_available() else 'cpu'
)
# 验证模型
model.val()
# 保存模型
model.save('yolov8_knife_gun_detector.pt')

内容的提问来源于stack exchange,提问作者Savaş Özcan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:14:56