首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用YOLOv10进行自定义目标检测

使用YOLOv10进行自定义目标检测

作者头像
Color Space
发布于 2024-07-25 10:39:34
发布于 2024-07-25 10:39:34
66700
代码可运行
举报
运行总次数:0
代码可运行

视觉/图像重磅干货,第一时间送达

YOLO(You Only Look Once)是一种流行的物体检测算法,以其速度和准确性而闻名。与涉及生成区域提案然后对其进行分类的多阶段过程的传统方法不同,YOLO 将物体检测框架化为单个回归问题,只需一次评估即可直接从完整图像中预测边界框和类别概率。

YOLOv10是 YOLO 系列的一项进步,在速度、准确性和效率方面均比以前的版本有所改进。主要功能包括:

  • 单次检测:YOLO 在网络的单次前向传递中检测物体,因此速度极快。
  • 统一架构:模型在训练和测试期间看到整个图像,从而实现更好的上下文理解。
  • 改进的锚点和损失函数:YOLOv10 使用更好的锚框生成和改进的损失函数来实现更精确的边界框预测。

使用YOLOv10进行自定义对象检测

自定义对象检测涉及在特定数据集上训练 YOLOv10 模型,该数据集可能包含预训练模型未涵盖的各种对象。此过程涉及几个关键步骤:

  • 设置环境:安装必要的库和依赖项。
  • 准备数据集:以 YOLO 格式构建数据集并应用数据增强来提高模型鲁棒性。
  • 配置YOLOv10模型:准备配置文件并设置模型。
  • 训练 YOLOv10 模型:使用先进的训练技术来优化性能。
  • 评估模型性能:使用各种指标评估模型。
  • 推理和可视化:在新图像上测试模型并可视化结果。
  • 微调和超参数优化:进一步优化模型以获得更好的准确性和性能。

1. 设置环境

首先,确保您已经安装了必要的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install ultralytics
pip install matplotlib
pip install albumentations

2. 准备并扩充数据集

确保您的数据集结构正确并实现数据增强。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from glob import glob
import albumentations as A
import cv2

# Example augmentation pipeline using Albumentations
augmentation_pipeline = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.Rotate(limit=10, p=0.2),
A.MotionBlur(p=0.2),
A.HueSaturationValue(p=0.2),
])

# Function to apply augmentations and save augmented images
def augment_and_save(image_dir, label_dir, output_dir):
image_paths = glob(os.path.join(image_dir,*.jpg’))
for image_path in image_paths:
image = cv2.imread(image_path)
augmented = augmentation_pipeline(image=image)
augmented_image = augmented[‘image’]
image_name = os.path.basename(image_path)
cv2.imwrite(os.path.join(output_dir, image_name), augmented_image)

augment_and_save(‘path_to_train_images’, ‘path_to_train_labels’, ‘path_to_augmented_images’)

3. 配置YOLOv10模型

准备YOLO格式的数据集配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# data.yaml
train: ../train/images
val: ../val/images

nc: 2 # number of classes
names: [‘class1’, ‘class2’]

4. 训练YOLOv10模型

利用混合精度训练和学习率调度器等先进的训练技术。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from ultralytics import YOLO

# Load a YOLOv10 model pre-trained on COCO dataset
model = YOLO(‘yolov10.pt’)

# Train the model with advanced settings
results = model.train(
data=’data.yaml’,
epochs=100,
imgsz=640,
batch=16,
lr0=0.01,
momentum=0.9,
weight_decay=0.0005,
optimizer=SGD,
patience=10,
img_weights=True,
augment=True,
precision=’mixed’
)

# Save the model weights
model.save(‘custom_yolov10_advanced.pt’)

5. 评估模型性能

评估模型并使用 mAP、精度、召回率和 F1 分数等指标。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Evaluate the model
metrics = model.val()

# Print the metrics
print(f”mAP: {metrics[‘mAP’]})
print(f”Precision: {metrics[‘precision’]})
print(f”Recall: {metrics[‘recall’]})
print(f”F1-Score: {metrics[‘f1’]})

6. 推理和可视化

使用模型进行推理并可视化结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
from PIL import Image

# Load the custom-trained model
model = YOLO(‘custom_yolov10_advanced.pt’)

# Perform inference on a new image
img_path = ‘path_to_new_image.jpg’
results = model.predict(img_path)

# Display the image with predictions
img = Image.open(img_path)
plt.imshow(img)
plt.axis(‘off’)
plt.show()

# Optionally, draw bounding boxes on the image
preds = results.pred[0].numpy()
for box in preds:
plt.gca().add_patch(plt.Rectangle((box[0], box[1]), box[2]-box[0], box[3]-box[1], fill=False, edgecolor=’red’, linewidth=2))
plt.show()

7. 微调和超参数优化

尝试不同的超参数和微调技术。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
from ultralytics import YOLO

# Define a function for hyperparameter optimization
def hyperparameter_optimization(trials=50):
for trial in range(trials):
# Randomly sample hyperparameters
lr0 = 10**np.random.uniform(-4, -2)
momentum = np.random.uniform(0.8, 0.99)
weight_decay = 10**np.random.uniform(-5, -3)

# Train the model with sampled hyperparameters
model = YOLO(‘yolov10.pt’)
results = model.train(
data=’data.yaml’,
epochs=50,
imgsz=640,
batch=16,
lr0=lr0,
momentum=momentum,
weight_decay=weight_decay,
optimizer=SGD,
patience=10,
img_weights=True,
augment=True
)

# Evaluate the model
metrics = model.val()
print(f”Trial {trial + 1}/{trials} — mAP: {metrics[‘mAP’]}, Precision: {metrics[‘precision’]}, Recall: {metrics[‘recall’]}, F1-Score: {metrics[‘f1’]})

# Run hyperparameter optimization
hyperparameter_optimization()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
请问大神,如果要跑bluestore的fio怎么跑?
请问大神,如果要跑bluestore的fio怎么跑?
回复回复点赞举报
推荐阅读
JUC学习之共享模型上
两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?
大忽悠爱学习
2021/12/20
4650
JUC学习之共享模型上
偏向锁批量重偏向与批量撤销
批量重偏向:当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,会导偏向锁重偏向的操作。 批量撤销:在多线程竞争剧烈的情况下,使用偏向锁将会降低效率,于是乎产生了批量撤销机制。 JVM的默认参数值: intx BiasedLockingBulkRebiasThreshold = 20 默认偏向锁批量重偏向阈值 intx BiasedLockingBulkRevokeThreshold = 40 默认偏向锁批量撤销阈值 批量重偏向 测试代码: pu
@阿诚
2021/02/04
1.6K0
面试专题:Synchronized 锁的升级过程(锁/对象状态)及底层原理
这个面试题其实涉及到的底层知识比较多,在Java中都知道synchronized,这是一个关键字,为什么使用了之后,可以结果多线程安全问题。里面内部流程是怎样的呢?加锁是加在哪里?金三银四越来越卷,面试官不再是,单纯的问如何解决线程安全,有没有使用过synchronized,而是想知道synchronized底层的知识点。本文就深入讲解synchronized底层原理,对象加锁是如果一步一步实现的。
小明爱吃火锅
2024/02/18
1.5K0
面试专题:Synchronized 锁的升级过程(锁/对象状态)及底层原理
JUC学习笔记——共享模型之管程
但是如果是多线程,就会因为上下文切换的缘由导致部分步骤出现交杂(我们给出正数示例):
秋落雨微凉
2022/11/18
7580
JUC学习笔记——共享模型之管程
多线程五 锁的膨胀过程
上一篇中,涉及到了锁升级的过程,也对其锁的升级有了一个大概的了解:单线程持有,在jvm延迟偏向的时间内是轻量级锁,之后为偏向锁,出现多个线程交替执行,对同一资源加锁会升级为轻量级锁,多个线程竞争拿不到锁会升级为重量级锁。在上一篇的基础上再进一步的了解锁升级的过程。
用针戳左手中指指头
2021/01/29
3090
多线程四 并发中锁的原理
偏向锁就是在运行过程中,对象的锁偏向某个线程,即在开启偏向锁的情况下,某个线程获得锁,当该线程下次想要获得锁时,不需要再获取锁(忽略synchronized关键字),直接执行代码
用针戳左手中指指头
2021/01/29
6170
多线程四 并发中锁的原理
Synchronized 原理与锁升级
锁对象为 this,校验锁对象就是 this 改造一下上方的同步方法,用 synchronized 加上锁对象的方式来校验锁对象就是 this
程序员NEO
2023/09/30
2760
Synchronized 原理与锁升级
synchronized 底层如何实现?什么是锁升级、降级?
synchronized 代码块是由一对 monitorenter/monitorexit 指令实现的,Monitor 对象是同步的基本实现单元。
王小明_HIT
2020/05/08
1.5K0
synchronized 底层如何实现?什么是锁升级、降级?
15000字、6个代码案例、5个原理图让你彻底搞懂Synchronized
本篇文章将围绕synchronized关键字,使用大量图片、案例深入浅出的描述CAS、synchronized Java层面和C++层面的实现、锁升级的原理、源码等
菜菜的后端私房菜
2024/07/15
5801
synchronized底层实现知多少?synchronized加锁还会升级?
线程2将count减到了97,线程3、线程1在某一刻也做了count--,但是结果却也是97,说明他们在做count--的时候并不知道有别的线程也操作了count。
行百里er
2020/12/02
4530
synchronized底层实现知多少?synchronized加锁还会升级?
synchronized锁详解
    如:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?(针对这个问题进行分析)
忧愁的chafry
2022/10/30
6060
synchronized锁详解
4. synchronized详解
  多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。
用户7798898
2020/09/27
5270
4. synchronized详解
并发基石-Markword与锁升级
synchronized关键字是java提供的互斥锁关键字,我们常说的互斥锁一般都是非自旋锁,即竞争不到锁的线程会进入阻塞状态知道被唤醒 今天我们来讲讲java中用来对synchronized进行优化的三种锁,同时会介绍markword对象头 目前我在网上搜到的十几篇博客讲的都有问题,可能有写对的我没搜到. 很多人不经过验证直接把markOop.hpp中的JavaThread*当成ThreadId这是错误的,实际是java线程在C语言的指针 并且未计算过hashCode和计算过hashCode的情况也是不一样的 本篇博客最后会展示使用jol工具,读取展示对象头的结果进行验证 附上openjdk的markOop.hpp链接
歪歪梯
2020/06/19
6382
深入了解Java锁
继 打印Java对象头,我们再深入探索一下Java锁。无锁状态我们就不说了,下面我们一一打印偏向锁、轻量锁,重量锁的对象头。
@阿诚
2021/02/04
4760
synchronized 锁的升级过程
测试代码 static A obj; // -XX:BiasedLockingStartupDelay=0 偏向锁开关 // -XX:+PrintFlagsInitial 打印所有参数 public static void main(String[] args) throws InterruptedException { obj = new A(); // Thread.sleep(60000); System.out.println(ClassLayout.parseInstance(ob
付威
2021/03/07
6950
多线程基础(五):java对象的MarkWord及synchronized锁升级过程
在前面聊过了如何使用synchronized,以及synchronized不同的加锁方式分别锁的是哪些对象。本文对synchronized底层的原理进行深层次的分析。
冬天里的懒猫
2020/09/10
9750
多线程基础(五):java对象的MarkWord及synchronized锁升级过程
[JAVA基础] - JVM对象内存布局及锁的标记位
一、对象布局 1、对象头 1)存储对象自身的运行时数据 hash码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。占位32/64位虚拟机分别占32/64个比特,官方称"Mark Word" 2)类型指针 指向对象的元数据,如果是数组,还会存储数组长度。 2、实例数据 3、对齐填充 要求对象是8的整数倍,对象头已经是8位的整数倍,只填充实例数据即可。 二、Object o = new Object()内存占用情况 占用16个字节 对象头12个字节,对齐填充4个字
夹胡碰
2022/05/19
4760
[JAVA基础] - JVM对象内存布局及锁的标记位
synchronized锁升级原理
KlassWord(下图_klass)占32位 64位系统的Klass Word不是32位,默认64位,开启指针压缩后为32(感谢评论老哥的指出)
CBeann
2023/12/25
1980
synchronized锁升级原理
synchronized的实现原理——对象头解密
并发编程式Java基础,同时也是Java最难的一部分,因为与底层操作系统和硬件息息相关,并且程序难以调试。本系列就从synchronized原理开始,逐步深入,领会并发编程之美。
夜勿语
2020/09/07
6080
面经手册 · 第15篇《码农会锁,synchronized 解毒,剖析源码深度分析!》
这是最近我总能被问到的问题,也确实是。一个初入编程职场的新人,或是一个想重新努力学习的老司机,这也不会,那也不会,总会犯愁从哪开始。
小傅哥
2020/11/04
5740
面经手册 · 第15篇《码农会锁,synchronized 解毒,剖析源码深度分析!》
推荐阅读
相关推荐
JUC学习之共享模型上
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档