赞
踩
最近刷到有大佬用目标检测在做害虫密度检测,不明觉厉,心想有时间了我也要去琢磨琢磨物体检测,前几天又有人找我帮忙做cf的敌我检测,这回可是下了决心要磕一磕这个技术了,网上写YOLOV8的教程不少,但是从数据集制作、标注、训练、应用的详细教程往往不在一篇文章中,借鉴起来不是那么方便,所以我把自己摸索路上的一些笔记记录在这个平台,一来是备份,方便我将来自己寻找,二来嘛如果将来有人有相同的需求时也能有个参照
和平精英敌我检测
YOLOv8是Ultralytics的最新版本YOLO。作为最先进的 SOTA 模型,YOLOv8 建立在以前版本成功的基础上,引入了新功能和改进,以增强性能、灵活性和效率。
有应用场景能帮我们更好的掌握这项技术哦,比如我就是从病虫害检测和敌我检测开始入手学习的。
YOLOv8 支持全方位的视觉 AI 任务,包括检测、分割、姿势估计、跟踪和分类。这种多功能性使用户能够在不同的应用程序和域中利用YOLOv8的功能。模型中只需要设定不同的训练模型,就可以得到不同的检测结果。
接下来进入教程了
在Anaconda Prompt里面输入以下指令新建环境
conda create --name YOLOV8_1 python=3.9
上面代码里的–name是新建的环境名称,指定python版本为3.9,可按需更改
新建完成后,输入以下代码进入新建的虚拟环境
activate YOLOV8_1
在虚拟环境里输入以下指令下载ultralytic库和labelimg库,其中调用YOLOV8在ultralytic库,数据标注要用到labelimg库
pip install ultralytics
pip install labelimg
github地址:,链接直达
https://github.com/ultralytics/ultralytics
github地址:,链接直达
https://github.com/ultralytics/assets/releases/tag/v8.2.0
网站上提供了s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大),模型下载好之后和你的代码放在同级文件夹下
环境准备到这里就差不多了,接下来执行代码测试一下环境搭建是否成功
from ultralytics import YOLO
#加载模型,换成你自己的文件位置,图片也一样
model = YOLO(r"D:\YOLOV8\ultralytics-main\Self_Code\yolov8n.pt"
source=r"C:\Users\user2580185125\Desktop\yolov8博客\测试环境.png"
#进行预测并保存
model.predict(source, save=True, imgsz=640, conf=0.7)
测试效果展示
【原图】
【效果图】
这就代表你的环境搭建好了,我们要进入下一步骤了
我们测试的图片数据来自游戏视频,当然如果你有自己的图片素材也可,爬虫也可,我先录屏自己玩游戏,之后用代码把视频帧提取出来作为我们的原始图片,在这个上面去标注
import os import cv2 import sys import time #遍历指定目录下所有的视频,按照指定时间间隔截取视频帧 def save_frame(time_in_sec, file_path): # 打开视频文件 cap = cv2.VideoCapture(file_path) # 获取视频的帧率 fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的总帧数 total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) duration = total_frames / fps num = 0 while(num < duration): num = num + time_in_sec # 计算指定时间对应的帧数 frame_number = int(num * fps) # 设置视频的当前帧 cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number) # 读取当前帧 ret, frame = cap.read() if ret: timestamp = int(time.time()) # 获取当前时间戳 save_path = f"image\\frame_{frame_number}_{timestamp}.jpg" # 保存当前帧为图片 cv2.imwrite(save_path, frame) print("保存成功:" + save_path) else: print("读取视频帧失败") # 关闭视频文件 cap.release() def traverse_directory(directory): for root, dirs, files in os.walk(directory): for file in files: video_path = os.path.join(root, file) print(video_path) save_frame(2, video_path) if __name__ == '__main__': # 遍历当前目录,这个换成自己的 traverse_directory(r'D:\YOLOV8\ultralytics-main\Self_Code\视频逐帧转为图片\video') print("运行成功")
代码的同级文件夹下要新建一个image文件夹,用来存放图片的,我没写判断语句,没有的话会报错
有了图片我们就可以开始标注了,先激活虚拟环境,在虚拟环境中执行以下代码打开标注软件
labelimg
软件打开之后是这样的
在软件左侧选择你需要打标签的文件夹,记得文件格式选择yolo格式,注意看图片,都圈出来了,之后就可以尽情的标注了,标注好了一张图片就保存一张,这一步比较费眼睛
标注好的数据集需要切分为训练、测试、验证数据集,执行以下代码进行一键切分,代码中需要修改原数据集存放位置和保存位置,另外就是原图片得放在一个images文件夹里面,不然会报错
import os import random import shutil # 原数据集目录 root_dir = r'D:\YOLOV8\ultralytics-main\Self_Code\视频逐帧转为图片' # 划分比例 train_ratio = 0.8 valid_ratio = 0.1 test_ratio = 0.1 # 设置随机种子 random.seed(42) # 拆分后数据集目录 split_dir = r'D:\YOLOV8\ultralytics-main\Self_Code\self_img' 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')) image_files = [file for file in image_files if file[-3:] != 'txt'] # 随机打乱文件列表 # combined_files = list(zip(image_files, label_files)) combined_files = list(image_files) random.shuffle(combined_files) # image_files_shuffled, label_files_shuffled = zip(*combined_files) image_files_shuffled = 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 in enumerate(image_files_shuffled): label_file = f"{image_file.split('.')[0]}.txt" # 复制文件划分数据集,可以将图片和标签放在同一个文件夹下 if i < train_bound: shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file)) shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'train/labels', label_file)) elif i < valid_bound: shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file)) shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'valid/labels', label_file)) else: shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file)) shutil.copy(os.path.join(root_dir, 'images', label_file), os.path.join(split_dir, 'test/labels', label_file)) print('执行完成')
切分好的文件夹层级是这样的
图片
标签
新建一个yaml配置文件,放在训练代码的同级文件夹下,我这里随便取个名字叫cat.yaml,修改里面的文件存放地址,改成你自己的文件地址,names那里你有几个类就写几个类,往下加或者减,按照格式来就行
# 和平精英
train: D:\YOLOV8\ultralytics-main\Self_Code\self_img\train
val: D:\YOLOV8\ultralytics-main\Self_Code\self_img\valid
test: D:\YOLOV8\ultralytics-main\Self_Code\self_img\test
# Classes
names:
0: enemy
1: self
2: team
3: jilifu
另外还需要去修改你预训练模型的配置文件,这个文件是你在github那里下载下来的,图片里圈的很详细怎么找,我用的是yolov,就要去D:\YOLOV8\ultralytics-main\ultralytics\cfg\models\v8文件夹修改yolov8.yaml文件夹,主要是改nc,你有几个类别就改成几我复制了一份文件,改的复制文件的内容,这样下次还能找着源文件
好,准备工作结束,即将开始训练
训练有两种方式,一种是命令行训练,一种是代码训练,我个人更倾向代码训练,这样方便我找训练好的权重文件,这里两种方式都给出了
yolo task=detect mode=train model=yolov8n.yaml data=cat.yaml epochs=300 batch=1
以上参数解释如下:
task:选择任务类型,可选[‘detect’, ‘segment’, ‘classify’, ‘init’]
mode: 选择是训练、验证还是预测的任务蕾西 可选[‘train’, ‘val’, ‘predict’]
model:
选择yolov8不同的模型配置文件,可选yolov8s.yaml、yolov8m.yaml、yolov8l.yaml、yolov8x.yaml
data: 选择生成的数据集配置文件
epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。
batch:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO(r'D:\YOLOV8\ultralytics-main\ultralytics\cfg\models\v8\yolov8_test.yaml')
model.train(model=r'D:\YOLOV8\ultralytics-main\Self_Code\yolov8n.pt',data=r'D:\YOLOV8\ultralytics-main\Self_Code\cat.yaml', epochs=300 , imgsz=640, batch=1, workers=0,
pretrained=False, save_dir=r"D:\YOLOV8\ultralytics-main\Self_Code")
是不是很简单
训练开始了
静静等待训练结束,看看损失函数
因为我这训练集只有58张图片,训练了300个epoch,明显是不够的,检测自己是大概率能检测出来,敌人和队友目前检测效果不是很好
import cv2 from ultralytics import YOLO # 加载YOLOv8模型 model = YOLO(r'D:\YOLOV8\ultralytics-main\Self_Code\runs\detect\train5\weights\best.pt') # 打开视频文件 video_path = r"C:\Users\user2580185125\Desktop\5月11日.mp4" cap = cv2.VideoCapture(video_path) # 循环遍历视频帧 while cap.isOpened(): # 从视频读取一帧 success, frame = cap.read() if success: # 在帧上运行YOLOv8追踪,持续追踪帧间的物体 results = model.track(frame, persist=True) # 输出每次追踪推理结果的boxes,这些参数实际上是和模型直接predict类似的。 print(results[0].boxes) # 在帧上展示结果 annotated_frame = results[0].plot() # 展示带注释的帧 cv2.imshow("YOLOv8 Tracking", annotated_frame) # 如果按下'q'则退出循环 if cv2.waitKey(1) & 0xFF == ord("q"): break else: # 如果视频结束则退出循环 break # 释放视频捕获对象并关闭显示窗口 cap.release() cv2.destroyAllWindows()
接下来把我们训练好的模型拿来跑一跑实时检测,发现欠缺的地方还蛮多的,如果扩充训练集和epoch,模型效果应该会更好
ONNX的主要优势包括:
框架无关性:ONNX允许开发者在PyTorch、TensorFlow、Caffe2等多个流行框架之间自由转换模型。
优化和加速:ONNX提供了一套优化工具,可以减少模型的大小并提高执行效率,特别是在不同硬件上部署时。
广泛的支持:从云计算服务到边缘设备,ONNX都能提供良好的支持,使得模型部署变得更加灵活和广泛。
from ultralytics import YOLO
model = YOLO(r"D:\YOLOV8\ultralytics-main\Self_Code\runs\detect\train\weights\best.pt")
success = model.export(format="onnx", simplify=True) # export the model to onnx format
assert success
print("转换成功")
源码全部公开,感兴趣的朋友可以继续开发
链接:https://pan.baidu.com/s/1Ci5Fpx4iBXRphQhhyR4Sig
提取码:dp18
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。