如何修复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自带完整训练流程,推荐直接使用:
- 创建
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']
- 调用官方训练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
相关产品推荐
相关产品推荐

