- 模型路径,名字为版本的文件夹,识别的类数目nc在这里修改:E:\ultralytics\ultralytics\cfg\models\
- 模型运行的参数修改,包括batch_size、使用设备编号等:E:\ultralytics\ultralytics\cfg\default.yaml
- 数据集存放路径:E:\ultralytics\ultralytics\dataset
- 设置数据集路径,就是在存放数据集的文件夹下新建一个yaml文件写:E:\ultralytics\ultralytics\dataset\cell\cell.yaml
- 结果输出目录:E:\ultralytics\runs
- 数据集路径指定文件的示例:
# polarbody
train: E:\ultralytics\ultralytics\dataset\polarbody\train
val: E:\ultralytics\ultralytics\dataset\polarbody\valid
test: E:\ultralytics\ultralytics\dataset\polarbody\test
# Classes
names:
0: polarbody
- 训练(以目标检测为例):
文件:E:\ultralytics\ultralytics\models\yolo\detect\train.py
需增加的代码示例:
from ultralytics.utils import DEFAULT_CFG, RANK
def train(cfg=DEFAULT_CFG, use_python=False):
"""Train a YOLO segmentation model based on passed arguments."""
model = cfg.model or 'yolov8s.pt'
data = cfg.data or r'E:\ultralytics\ultralytics\dataset\polarbody\polarbody.yaml'
device = cfg.device if cfg.device is not None else ''
args = dict(model=model, data=data, device="cpu", epochs=300)
trainer = DetectionTrainer(overrides=args)
trainer.train()
if __name__ == '__main__':
train()
- 评估(以目标检测为例):
文件:E:\ultralytics\ultralytics\models\yolo\detect\val.py
需增加的代码示例:自己看着来,参考训练和评估就能写出来
- 预测(以目标检测为例):
文件:E:\ultralytics\ultralytics\models\yolo\detect\predict.py
需增加的代码示例:
from ultralytics.utils import ASSETS, DEFAULT_CFG, ops
def predict(cfg=DEFAULT_CFG, use_python=False):
"""Runs YOLO object detection on an image or video source."""
model = cfg.model or r'E:\ultralytics\runs\detect\train12\weights\best.pt'
source = r"E:\ultralytics\ultralytics\dataset\polarbody\test\images"
args = dict(model=model, source=source)
if use_python:
from ultralytics import YOLO
YOLO(model)(**args)
else:
predictor = DetectionPredictor(overrides=args)
predictor.predict_cli()
if __name__ == '__main__':
predict()
- 【辅助】
- 训练集、验证集、测试集分割代码:
import os
import random
import shutil
# 原数据集目录
root_dir = r'E:\ultralytics\ultralytics\dataset\polarbody'
# 划分比例
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1
# 设置随机种子
random.seed(42)
# 拆分后数据集目录
split_dir = r'E:\ultralytics\ultralytics\dataset\polarbody'
os.makedirs(os.path.join(split_dir, 'train/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'train/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/labels'), exist_ok=True)
# 获取图片文件列表
image_files = os.listdir(os.path.join(root_dir, 'images'))
label_files = os.listdir(os.path.join(root_dir, 'labels'))
# 随机打乱文件列表
combined_files = list(zip(image_files, label_files))
random.shuffle(combined_files)
image_files_shuffled, label_files_shuffled = zip(*combined_files)
# 根据比例计算划分的边界索引
train_bound = int(train_ratio * len(image_files_shuffled))
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))
# 将图片和标签文件移动到相应的目录
for i, (image_file, label_file) in enumerate(zip(image_files_shuffled, label_files_shuffled)):
if i < train_bound:
shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file))
shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'train/labels', label_file))
elif i < valid_bound:
shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file))
shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'valid/labels', label_file))
else:
shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file))
shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'test/labels', label_file))