ultralytics-极市平台打榜

本教程详细介绍了如何使用UltralyticsYOLOv8进行安全帽检测。内容涵盖YOLOv8的简介、安装、模型训练与预测,以及在极市平台上的应用。模型训练涉及超参数调整,模型预测强调其实时性和高度可定制性,同时提供了数据集处理和模型测试的脚本。
摘要由CSDN通过智能技术生成

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))

其他

参考极市平台参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云朵不吃雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值