YOLOV8实战-和平精英敌我检测

YOLOV8实战,从环境配置、数据准备、数据标注、模型训练、模型导出到源码分享

  • 前言:
  • 效果展示
    • ==图片展示==
    • ==视频展示==
  • 简介:
    • **【YOLOV8是啥?】**
    • **【YOLOV8能干啥?有啥应用场景?】**
  • 一、环境准备
    • 1、新建一个虚拟环境
    • 2、配置第三方库
    • 3、另外我们需要通过克隆仓库到本地来获得yolov8最新版本。
    • 4、下载一个预训练模型包
    • 5、环境测试
      • 测试代码
  • 二、数据集制作
    • ①【视频帧提取代码】
    • ②【图片标注】
    • ③【切分数据集】
      • 切分数据集代码:
  • 三、训练文件配置
      • 新建配置文件代码:
  • 四、开始训练
    • 方法一:命令行训练
    • 方法二:代码训练
  • 五、实时检测
    • 代码:
  • 六、模型推理,pt转换成onnx模型
    • 推理代码:
  • 七、源码
    • 源码链接:

前言:

最近刷到有大佬用目标检测在做害虫密度检测,不明觉厉,心想有时间了我也要去琢磨琢磨物体检测,前几天又有人找我帮忙做cf的敌我检测,这回可是下了决心要磕一磕这个技术了,网上写YOLOV8的教程不少,但是从数据集制作、标注、训练、应用的详细教程往往不在一篇文章中,借鉴起来不是那么方便,所以我把自己摸索路上的一些笔记记录在这个平台,一来是备份,方便我将来自己寻找,二来嘛如果将来有人有相同的需求时也能有个参照

效果展示

图片展示

在这里插入图片描述

视频展示

和平精英敌我检测

简介:

【YOLOV8是啥?】

YOLOv8是Ultralytics的最新版本YOLO。作为最先进的 SOTA 模型,YOLOv8 建立在以前版本成功的基础上,引入了新功能和改进,以增强性能、灵活性和效率。

【YOLOV8能干啥?有啥应用场景?】

有应用场景能帮我们更好的掌握这项技术哦,比如我就是从病虫害检测和敌我检测开始入手学习的。
YOLOv8 支持全方位的视觉 AI 任务,包括检测、分割、姿势估计、跟踪和分类。这种多功能性使用户能够在不同的应用程序和域中利用YOLOv8的功能。模型中只需要设定不同的训练模型,就可以得到不同的检测结果。

接下来进入教程了

一、环境准备

1、新建一个虚拟环境

在Anaconda Prompt里面输入以下指令新建环境

conda create --name YOLOV8_1 python=3.9

上面代码里的–name是新建的环境名称,指定python版本为3.9,可按需更改

新建完成后,输入以下代码进入新建的虚拟环境

activate YOLOV8_1

2、配置第三方库

在虚拟环境里输入以下指令下载ultralytic库labelimg库,其中调用YOLOV8在ultralytic库,数据标注要用到labelimg库

pip install ultralyticspip install labelimg

3、另外我们需要通过克隆仓库到本地来获得yolov8最新版本。

github地址:,链接直达

 https://github.com/ultralytics/ultralytics

git

4、下载一个预训练模型包

github地址:,链接直达

https://github.com/ultralytics/assets/releases/tag/v8.2.0

在这里插入图片描述

网站上提供了s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大),模型下载好之后和你的代码放在同级文件夹下

5、环境测试

环境准备到这里就差不多了,接下来执行代码测试一下环境搭建是否成功

测试代码


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 / fpsnum = 0while(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: enemy1: self2: team3: 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 YOLOif __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"):breakelse:# 如果视频结束则退出循环break# 释放视频捕获对象并关闭显示窗口
cap.release()
cv2.destroyAllWindows()

接下来把我们训练好的模型拿来跑一跑实时检测,发现欠缺的地方还蛮多的,如果扩充训练集和epoch,模型效果应该会更好

六、模型推理,pt转换成onnx模型

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的网络隔离功能 netns

Network Namespace&#xff08;netns&#xff09; 是Linux内核提供的一项实现网络隔离的功能&#xff0c;它能隔离多个不同的网络空间&#xff0c;并且各自拥有独立的网络协议栈。通过 namespace 可以隔离容器的进程 PID、文件系统挂载点、主机名等多种资源&#xff0c;它可以为…

vscode调试Electron+ts

调试Electronjs 调试Electronjs: https://www.electronjs.org/zh/docs/latest/tutorial/debugging-vscode 调试Electronts 首先看一下&#xff0c;我的目录结构。目录结构决定了launch.json中的路径部分。我将在项目根目录下进行调试&#xff0c;项目根目录下包含electron代码…

数据可视化(十一):Pandas餐饮信息表分析——交叉表、离群点分析,多维分析等高级操作

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

golang创建式设计模式------单例模式

目录导航 1.单例模式1)什么是单例模式 2)使用场景3)实现方式1.懒汉式单例模式2.饿汉式3.双重检查式4.sysc.Once式 4)实践案例5)优缺点分析 1.单例模式 1)什么是单例模式 单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法&#…

【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式&#xff1a;静态分配3.3、顺序表的实现方式&#xff1a;动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

通过EXCEL控制PLC启停电机的一种方法

概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步&#xff1a; 添加PLC设备&#xff0c;选择西门子S7-1214C CPU&#xff0c;设置IP地址&#xff1a;192.168.18.18&#xff0c;子网掩码&#xff1a;255.255.255.0。 第2步&#xff1a…

vue3中通过自定义指令实现loading加载效果

前言 在现代Web开发中&#xff0c;提升用户体验一直是开发者们追求的目标之一。其中&#xff0c;一个常见的场景就是在用户与应用程序进行交互时&#xff0c;特别是当进行异步操作时&#xff08;如网络请求&#xff09;&#xff0c;为用户提供即时的反馈&#xff0c;避免用户因…

【循环程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

浅谈电动汽车充电站的电气安全

1 引言 1月14日日上午10点左右&#xff0c;青岛市市北区辽宁路63号公交停车场内&#xff0c;一辆报废公交车突然起火&#xff0c;由于大风天气&#xff0c;大火很快引燃了停在旁边的几辆报废车。消防人员快速赶到&#xff0c;迅速控制住火势。11时30分&#xff0c;停车场内的…

鸿蒙内核源码分析(ELF格式篇) | 应用程序入口并不是main

阅读之前的说明 先说明&#xff0c;本篇很长&#xff0c;也很枯燥&#xff0c;若不是绝对的技术偏执狂是看不下去的.将通过一段简单代码去跟踪编译成ELF格式后的内容.看看ELF究竟长了怎样的一副花花肠子&#xff0c;用readelf命令去窥视ELF的全貌&#xff0c;最后用objdump命令…

Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!

前言 我们之前肯定已经见过了很多文本生成图片、文本生成声音以及AI翻唱歌曲 等多种AI产品&#xff08;模型&#xff09;。 其实音乐和图片从某种意义上来说都是艺术创作的一种形式&#xff0c;它们可以相互配合&#xff0c;共同呈现出一种更加丰富、感性的表达方式。 将图片…

弘君资本:人形机器人概念走强,盛通股份涨停,怡合达、鼎智科技等拉升

人形机器人概念14日盘中拉升走高&#xff0c;到发稿&#xff0c;盛通股份涨停&#xff0c;怡合达、鼎智科技涨约6%&#xff0c;索辰科技、伟创电气、丰立智能等涨超4%。 音讯面上&#xff0c;5月13日&#xff0c;宇树发布人形智能体Unitree G1&#xff0c;身高127cm,体重35kg&…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…

易宝OA-ExecuteQueryForDataSetBinary处sql注入

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;均由使用者本人负责&#xff0c;与作者无关&#xff01;&#xff01;&#…

Centos 安装jenkins 多分支流水线部署前后端项目

1、安装jenkins 1.1 安装jdk 要求&#xff1a;11及以上版本 yum install yum install java-11-openjdk 1.2 安装jenkins 导入镜像 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo出现以下错误 执行以下命令 sudo yum …

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

强化学习——马尔可夫过程的理解

目录 一、马尔可夫过程1.随机过程2.马尔可夫性质3.马尔可夫过程4.马尔可夫过程示例 参考文献 一、马尔可夫过程 1.随机过程 随机过程是概率论的“动态”版本。普通概率论研究的是固定不变的随机现象&#xff0c;而随机过程则专注于那些随时间不断变化的情况&#xff0c;比如天…

R语言两种方法实现随机分层抽样

为了减少数据分布的不平衡&#xff0c;提供高样本的代表性&#xff0c;可将数据按特征分层一定的层次&#xff0c;在每个层次抽取一定量的样本&#xff0c;为分层抽样。分层抽样的特点是将科学分组法与抽样法结合在一起&#xff0c;分组减小了各抽样层变异性的影响&#xff0c;…

C语言指针详解(三)

目录 前言 一. 回调函数是什么&#xff1f; 1.定义 2. 代码示例&#xff1a;计数器 2.1 使用回调函数改造前 2.2 使用回调函数改造后 二. qsort使用举例 1. qsort介绍 2. 使用qsort函数排序整型数据 3. 使用qsort排序结构体数据 三. qsort函数的模拟实现 四. sizeo…