ultralytics 应用教程
ultralytics简介
UltralyticsYOLOv8YOLOv8 基于深度学习和计算机视觉领域的尖端技术,在速度和准确性方面具有无与伦比的性能。其流线型设计使其适用于各种应用,并可轻松适应从边缘设备到云 API 等不同硬件平台。链接
安装教程
作为第三方python包直接调用
#Install the ultralytics package from PyPI
pip install ultralytics
github 源码安装
# 普通安装
git clone https://github.com/ultralytics/ultralytics.git
# 极市平台可以使用托管平台加速下载
git clone https://gitclone.com/github.com/ultralytics/ultralytics.git
cd ultralytics
pip install e .
验证安装
import ultralytics
ultralytics.checks()
Ultralytics YOLOv8.1.23 🚀 Python-3.10.12 torch-2.1.0+cu121 CUDA:0 (Tesla T4, 15102MiB)
Setup complete ✅ (2 CPUs, 12.7 GB RAM, 26.3/78.2 GB disk)
工具使用
- 概览
- 通过参数文件加载模型行
- 通过权重文件加载模型
- 模型训练
- 模型测试
- 模型预测
- 导出ONNX
from ultralytics import YOLO
# 根据yaml文件构建模型
model = YOLO("yolov8n.yaml")
# 加载预训练模型
model = YOLO("yolov8n.pt")
# 使用 'coco8.yaml' 数据集训练3个epochs
results = model.train(data="coco8.yaml", epochs=3)
# 在验证集上评估模型(coco8.yaml中有设置)
results = model.val()
# 利用模型预测一张图像
# result 中包含原始图像、边界框坐标、边界框相对坐标、置信度、类别等
results = model("https://ultralytics.com/images/bus.jpg")
# Export the model to ONNX format
success = model.export(format="onnx")
模型训练
YOLO 模型的训练设置包括训练过程中使用的各种超参数和配置。这些设置会影响模型的性能、速度和准确性。关键的训练设置包括批量大小、学习率、动量和权重衰减。此外,优化器、损失函数和训练数据集组成的选择也会影响训练过程。对这些设置进行仔细的调整和实验对于优化性能至关重要。
模型预测
- 多功能性:能够对图像、视频甚至实时流进行推断。
- 性能:专为实时、高速处理而设计,同时不影响精度。
- 易用性:直观的Python 和CLI 界面,便于快速部署和测试。
- 高度可定制:各种设置和参数可根据您的具体要求调整模型的推理行为
YOLOv8 可以处理不同类型的输入源进行推理,如下表所示。输入源包括静态图像、视频流和各种数据格式。表中还标明了每种输入源是否可以在流模式下使用参数 stream=True ✅.流模式有利于处理视频或实时流,因为它会创建一个结果生成器,而不是将所有帧加载到内存中。
训练环境设置
Ultralytics 库提供了一个功能强大的设置管理系统,可对实验进行精细控制。通过使用 SettingsManager 设在 ultralytics.utils 通过 YAML 模块,用户可以随时访问和修改自己的设置。这些设置存储在 YAML 文件中,可直接在Python 环境中或通过命令行界面 (CLI) 查看或修改。
- 检查设置
from ultralytics import settings
# View all settings
print(settings)
# Return a specific setting
value = settings["runs_dir"]
- 修改设置
from ultralytics import settings
# Update a setting
settings.update({"runs_dir": "/path/to/runs"})
# Update multiple settings
settings.update({"runs_dir": "/path/to/runs", "tensorboard": False})
# Reset settings to default values
settings.reset()
极市平台-安全帽检测
.sh文件
#run.sh
# conda init bash
# conda activate ultralytics
rm -r /project/train/src_repo/dataset
#创建数据集相关文件夹
mkdir /project/train/src_repo/dataset
mkdir /project/train/src_repo/dataset/Annotations
mkdir /project/train/src_repo/dataset/images
mkdir /project/train/src_repo/dataset/ImageSets
mkdir /project/train/src_repo/dataset/labels
mkdir /project/train/src_repo/dataset/ImageSets/Main
cp /home/data/831/*.xml /project/train/src_repo/dataset/Annotations
cp /home/data/831/*.jpg /project/train/src_repo/dataset/images
#执行数据集划分、转换
python /project/train/src_repo/split_train_val.py --xml_path /project/train/src_repo/dataset/Annotations --txt_path /project/train/src_repo/dataset/ImageSets/Main
cp /project/train/src_repo/voc_label.py /project/train/src_repo/dataset
python /project/train/src_repo/dataset/voc_label.py
yolo train model=yolov8n.yaml data=hmel.yaml epochs=200 imgsz=640 lr0 = 0.003 batch = 32 warmup_epochs=10 warmup_bias_lr=0.0001 save_period=5 dropout=0.3 plots=True patience=50 project = /project/train/models name=test0605
split_train_val.py划分训练集与测试集
import os
import random
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--xml_path', type=str, help='input xml label path')
parser.add_argument('--txt_path', type=str, help='output txt label path')
opt = parser.parse_args()
trainval_percent = 1.0
train_percent = 0.9
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
os.makedirs(txtsavepath)
num=len(total_xml)
list=range(num)
ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')
for i in list:
name=total_xml[i][:-4]+'\n'
ftrainval.write(name)
if i%7 == 0:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
voc_label.py 将voc数据(.xml)转换为yolo格式数据(.txt)
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=['train', 'val', 'test']
classes = ['person', 'hat','head']
abs_path = os.getcwd()
def convert(size, box):
dw = 1./(size[0])
dh = 1./(size[1])
x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
w = box[1] - box[0]
h = box[3] - box[2]
x = x*dw
w = w*dw
y = y*dh
h = h*dh
return (x,y,w,h)
def convert_annotation(image_id):
in_file = open('/project/train/src_repo/dataset/Annotations/%s.xml'%( image_id))
out_file = open('/project/train/src_repo/dataset/labels/%s.txt'%(image_id), 'w')
tree=ET.parse(in_file)
root = tree.getroot()
size = root.find('size')
w = int(size.find('width').text)
h = int(size.find('height').text)
for obj in root.iter('object'):
#difficult = obj.find('difficult').text
cls = obj.find('name').text
if cls not in classes :
continue
cls_id = classes.index(cls)
xmlbox = obj.find('bndbox')
b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
bb = convert((w,h), b)
out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
for image_set in sets:
if not os.path.exists('/project/train/src_repo/dataset/labels/'):
os.makedirs('/project/train/src_repo/dataset/labels/')
image_ids = open('/project/train/src_repo/dataset/ImageSets/Main/%s.txt'%(image_set)).read().strip().split()
list_file = open('/project/train/src_repo/dataset/%s.txt'%(image_set), 'w')
for image_id in image_ids:
list_file.write('/project/train/src_repo/dataset/images/%s.jpg\n'%(image_id))
convert_annotation(image_id)
list_file.close()
模型测试
ji.py
import json
import torch
import sys
import numpy as np
import cv2
from pathlib import Path
import pdb
from ultralytics import YOLO
device = torch.device("cuda:0")
# 模型地址一定要和测试阶段选择的模型地址一致!!!
model_path = '/project/ev_sdk/src/models/last.pt'
@torch.no_grad()
def init():
weights = model_path
device = 'cuda:0' # cuda device, i.e. 0 or 0,1,2,3 or
half = True # use FP16 half-precision inference
model = YOLO(model_path)
return model
def process_image(handle=None, input_image=None, args=None, **kwargs):
half = True # use FP16 half-precision inference
conf = 0.3 # confidence threshold
iou = 0.5 # NMS IOU threshold
max_det = 300 # maximum detections per image
# imgsz = [640, 640]
show_conf = True
show_boxes = True
names = {
0: 'person',
1: 'hat',
2: 'head'
}
fake_result = {}
fake_result["model_data"] = {"objects": []}
pred = handle(input_image,conf = conf,iou = iou,max_det = max_det,half = half,show_conf = True,show_boxes=show_boxes,device = device)
for i in range(len(pred[0].boxes)): # per image
xyxy_list = pred[0].boxes.xyxy[i]
conf_list = pred[0].boxes.conf[i]
label = names[int(pred[0].boxes.cls[i])]
fake_result['model_data']['objects'].append({
"xmin": int(xyxy_list[0]),
"ymin": int(xyxy_list[1]),
"xmax": int(xyxy_list[2]),
"ymax": int(xyxy_list[3]),
"confidence": conf_list.cpu().numpy().tolist(),
"name": label
})
return json.dumps(fake_result, indent=4)
if __name__ == '__main__':
# Test API
# img = cv2.imread('/home/data/831/helmet_10809.jpg')
img = '/home/data/831/helmet_10809.jpg'
# img = '/project/train/src_repo/dataset/images/helmet_2556.jpg'
predictor = init()
import time
s = time.time()
fake_result = process_image(predictor, img)
e = time.time()
print(fake_result)
print((e-s))
其他
参考极市平台参考文档