yolov11训练数据集教程val.py
时间: 2025-07-08 12:55:38 浏览: 4
### YOLOv11 训练数据集教程与 `val.py` 使用方法
#### 关于 YOLOv11 的背景介绍
YOLO系列算法不断演进,从最初的YOLOv1到最新的版本,在性能和易用性方面都有显著提升。尽管当前讨论的是YOLOv11,但许多基础概念仍然适用于较早的版本[^1]。
#### 准备训练数据集
为了准备用于YOLOv11的数据集,通常需要完成以下几个方面的配置:
- **标签格式转换**:确保图像对应的标注文件遵循YOLO所需的格式,即每张图片对应一个`.txt`文件,其中每一行表示一个边界框及其类别索引。
- **划分数据集**:将整个数据集划分为训练集、验证集以及测试集三部分。一般推荐的比例为70%训练集、20%验证集、10%测试集,但这并非固定不变,可根据具体需求调整。
- **编写数据清单文件**:创建包含所有样本路径列表的文字文档(如train.txt, val.txt),以便模型能够读取这些信息来进行相应的操作。
#### 编写或修改 `val.py`
由于官方可能并未提供现成的`val.py`脚本给YOLOv11使用者,可以根据已有资源自行构建此功能模块。以下是基于现有YOLO架构下如何实现的一个简单示例[^3]:
```python
import argparse
from pathlib import Path
from models.experimental import attempt_load
from utils.datasets import create_dataloader
from utils.general import check_img_size, non_max_suppression, scale_coords, xyxy2xywh
from utils.metrics import ap_per_class, box_iou
from utils.torch_utils import select_device
def main(opt):
device = select_device(opt.device)
# 加载预训练权重并初始化网络结构
model = attempt_load(weights=opt.weights, map_location=device)
with open(opt.data) as f:
data_dict = yaml.load(f, Loader=yaml.SafeLoader)
nc = int(data_dict['nc']) # number of classes
dataloader = create_dataloader(
path=data_dict["val"],
imgsz=imgsz,
batch_size=batch_size,
stride=int(model.stride.max()), # model stride
pad=0.5,
rect=True)[0]
names = model.module.names if hasattr(model, 'module') else model.names
seen = 0
iouv = torch.linspace(0.5, 0.95, 10).to(device) # iou vector for [email protected]:0.95
niou = iouv.numel()
s = ('%20s' + '%11s' * 6) % (
'Class', 'Images', 'Targets', 'P', 'R', '[email protected]', '[email protected]:.95')
p, r, f1, mp, mr, map50, map = 0., 0., 0., 0., 0., 0., 0.
loss = torch.zeros(3, device=device)
jdict, stats, ap, ap_class = [], [], [], []
for batch_i, (img, targets, paths, shapes) in enumerate(dataloader):
img = img.to(device, non_blocking=True)
img = img.float() / 255.0
pred = model(img)[0]
target_cls = []
for t in targets[:, :]:
cls = int(t[0])
bbox = list(map(float, t[1:]))
target_cls.append(cls)
preds = non_max_suppression(pred, conf_thres=conf_thres, iou_thres=iou_thres, multi_label=False)
correct = []
detected = []
for si, pred in enumerate(preds):
labels = targets[targets[:, 0] == batch_i][:, :]
nl = len(labels)
tcls = labels[:, 0].tolist()
if len(pred) == 0:
continue
predn = pred.clone().cpu()
scale_coords(img.shape[2:], predn[:, :4], shapes[si][0])
correct.extend([False]*len(pred))
if nl:
detected_set = set()
ious = box_iou(labels[:, 1:], predn[:, :4]).T
x = np.where((ious >= iou_thres) & (~np.isin(np.arange(len(pred)), detected)))[0]
if x.shape[0]:
matches = [[x[i]] for i in range(x.shape[0])]
unique_matches = {k:v[-1] for k,v in groupby(sorted(matches))}
for mi, di in unique_matches.items():
detected_set.add(di.item())
detected.extend(list(detected_set))
correct[list(unique_matches.keys())] = True
stats.append((
correct,
pred[:, 4],
pred[:, 5:].argmax(dim=1),
tcls
))
stats = [torch.cat(x, dim=0).cpu().numpy() for x in zip(*stats)]
tp, fp, p, r, f1, ap, f1_index = ap_per_class(*stats)
AP50_F1_max_idx = f1.mean(0).argmax()
precision, recall, F1_score = p[:, AP50_F1_max_idx], r[:, AP50_F1_max_idx], f1[:, AP50_F1_max_idx]
mean_precision, mean_recall, mean_f1 = precision.mean(), recall.mean(), F1_score.mean()
print(s)
print('%20s' + '%11.3g' * 6 % (
"All", seen, nt.sum(), mean_precision*100, mean_recall*100, ap[:, 0].mean()*100, ap.mean()*100))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default='yolov5s.pt', help='model.pt path(s)')
parser.add_argument('--data', type=str, default='./data/coco.yaml', help='*.yaml path')
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
opt = parser.parse_args()
main(opt)
```
上述代码展示了如何通过PyTorch加载模型并对验证集中的一批数据执行预测过程的一部分逻辑。需要注意的是实际应用时还需要考虑更多细节处理,比如多线程加速、内存管理等优化措施[^2]。
阅读全文
相关推荐

















