目录
文章目录
目标检测——基于 YOLOv8 实现图像检测
- 【官网】:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite
- 【官方文档】:Quickstart - Ultralytics YOLOv8 Docs
- 【作者项目源码】:见文章末尾
注:自己用 PyCharm 创建一个空项目,并配置 conda 环境.
安装依赖项
注:最好是 通过 Acaonda 打开 你要安装到的环境,使用以下命令.
Ultralytics
- pip 命令:
pip install ultralytics
- 这里作者已经下载过了,输入命令回车之后会出现以下结果:
其它所需依赖项
- 将官网的requirements.txt文件下载到自己项目的根目录下:
- 输入以下命令安装依赖项:
pip install -r requirements.txt
准备数据集
下载数据集
-
作者自制了游戏原神的数据集game.zip(已标注好,有 YOLO 所需的 yaml 文件):链接:https://pan.baidu.com/s/1HBbGCzSosiZy8j7ydjWoSQ?pwd=e376
-
下载放置到项目根文件夹/datasets即可:
数据集说明
注:
- 这是一个小数据集,作者 手动标注 的,难免有所欠缺,读者可自行更换更好的或自制数据集.
- 如何标注,见作者这篇 CSDN 博客 ——> 使用 labelImg 标注数据_Re.Gin的博客-CSDN博客
- 自制数据集文件夹 格式:
datasets
|--game
|--images
|--train
|--xx1.png
|--val
|--xx2.png
|--labels
|--train
|--xx1.txt
|--val
|--xx2.txt
- game/labels/train/classes.txt为 总分类文件,显示了数据集所有标注的 类别:
训练
注:训练成功后自动生成runs文件夹.
预训练模型
类型 | 准确度 | 耗时长 | 运算次数/秒 |
---|---|---|---|
YOLOv8n | 37.3 | 80.4 | 8.7 |
YOLOv8s | 44.9 | 128.4 | 28.6 |
YOLOv8m | 50.2 | 234.7 | 78.9 |
YOLOv8l | 52.9 | 375.2 | 165.2 |
YOLOv8x | 53.9 | 479.1 | 257.8 |
源码
- 【文件】:train.ipynb
from ultralytics import YOLO
# step 1:设置所需文件路径
pretraining_model_path = 'yolov8n.pt' # 预训练模型路径(若路径下无模型,会自动下载模型)
data_path = 'datasets/game/game.yaml' # 数据集 yaml 路径
# step 2:加载模型
model = YOLO(pretraining_model_path) # load a pretrained model (recommended for training)
# step 3:模型训练
model.train(data=data_path, epochs=300)
结果
验证
注:
- 这里作者制作数据集时由于时间有限,实在是不想自己再找验证集标注了,就从训练集中随机抽取了64张作为了验证集,读者可自行更换验证集.
- 同样,如何标注,见 ——> 使用 labelImg 标注数据_Re.Gin的博客-CSDN博客
源码
from ultralytics import YOLO
# step 1:设置所需文件路径
model_path = 'runs/detect/train2/weights/best.pt' # 模型路径
# step 2:加载模型
model = YOLO(model_path) # load a pretrained model (recommended for training)
# step 3:模型验证
metrics = model.val()
print("模型评估参数表:")
print(metrics.box.maps) # a list contains map50-95 of each category
结果
预测
源码
from ultralytics import YOLO
from PIL import Image
import os
import matplotlib.pyplot as plt
import numpy as np
# step 1:设置所需文件路径
model_path = 'runs/detect/train2/weights/best.pt' # 模型路径
source = 'datasets/game/images/predict' # 推理来源
# step 2:加载模型
model = YOLO(model_path) # load a pretrained model (recommended for training)
# step 3:模型预测
results = model.predict(source=source , save=True)
# step 4:显现预测结果
results_folder = 'runs/detect/predict2' # 结果图片文件夹路径
# 获取结果文件夹中的所有图片文件
result_images = [os.path.join(results_folder, filename) for filename in os.listdir(results_folder) if
filename.endswith((".jpg", ".png", ".jpeg"))]
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用中文字体
# 创建多图显示,每行显示3张照片
num_images = len(result_images)
num_columns = 3 # 每行显示3张照片
num_rows = (num_images + num_columns - 1) // num_columns # 计算行数
fig, axes = plt.subplots(num_rows, num_columns, figsize=(15, 3 * num_rows))
# 批量分类图像并输出结果
for i, ax in enumerate(axes.ravel()):
if i < num_images:
# 获取当前图像的文件名
image_name = os.path.basename(result_images[i])
# 显示图像和判断结果
image = Image.open(result_images[i])
ax.imshow(np.array(image), aspect='auto')
ax.set_title(f"图片名称: {image_name}")
ax.axis("off")
# 自动调整子图布局
plt.tight_layout()
plt.show()