【YOLOv10应用】简单直接的教程,实现APEX实时人物检测

不是外挂不是外挂不是外挂

前期准备:下载好Anaconda3,pycharm

1.首先去官网下载源码并解压在本地

 源码地址:http://​ https://github.com/THU-MIG/yolov10 ​

2配置环境

下面的cuda是根据显卡2080s安装的!如果有较久的显卡,请根据自己的显卡支持的cuda版本。去官网https://pytorch.org/下载,教程很多不赘述了。                                                                        另外如果下载较慢,可以切换镜像源,或者连手机热点下载(推荐)

win+r,打开cmd,输入命令:

#-n后面是虚拟环境的名称,可以自定义设置
conda create -n yolo_v10 python=3.9

#下面请cd到刚才解压的yolov10-main目录下,例如
cd C:\Users\zjq\Desktop\yolov10\yolov10-main

conda activate yolov10
pip install -r requirements.txt
pip install -e .

#这里的cuda是PyTorch 兼容的 pytorch-cuda,不是完整的 CUDA Toolkit,但是仍然可以用!
conda install pytorch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 pytorch-cuda=11.8 -c pytorch -c nvidia


#数据标注工具也一起安装
pip install LabelImg
#下面是检查是否安装成功GPU的torch
python
import torch
print(torch.cuda.is_available())

安装好环境后,以pycharm项目打开yolov10-main文件,在右下角点击<无解释器>,按照下面的步骤选择好刚才配置的环境。

上述操作后,右下角会显示

3数据集的制作

准备好要训练的图片,建可以自己去截图!

建议玩瓦机可以飞起来截图:)

用下面的脚本重新命名这些图片,具体路径根据自己更改

import os
import cv2

# 图像文件所在的文件夹路径
folder_path = r"C:\Users\zjq\Desktop\apex_datasets"

# 遍历文件夹中的图像文件
count = 1
for filename in os.listdir(folder_path):
    if filename.endswith(('.jpg', '.png', '.bmp')):  # 根据实际图像格式修改
        image_path = os.path.join(folder_path, filename)
        image = cv2.imread(image_path)

        # 新的文件名
        new_filename = f'train_{count}.jpg'  # 这里假设保存为.jpg格式,你可以根据需要修改
        new_image_path = os.path.join(folder_path, new_filename)

        # 保存新的图像
        cv2.imwrite(new_image_path, image)

        count += 1

然后打开cmd命令,执行下面的指令打开LabelImg

conda activate yolo_v10
#上面的操作安装了LabelImg,如果没有安装执行下面这行
pip install LabelImg
#安装成功后
LabelImg

打开如下的界面,执行下述操作后。在View里选择Auto Save mode,然后就开始标注,如何使用请参考其他教程,这里只简单说一下快捷键,A D 切换上一张\下一张图片,W是框

标注好后使用下面的脚本划分数据集,注意替换路径即可

import os
import random
import shutil

# 原数据集目录
root_dir = r'C:\Users\zjq\Desktop\apex_dataset'
# 划分比例
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1

# 设置随机种子
random.seed(42)

# 拆分后数据集目录
split_dir = r'C:\Users\zjq\Desktop\datasets_apex'
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'))
label_files = os.listdir(os.path.join(root_dir, 'labels'))

# 随机打乱文件列表
combined_files = list(zip(image_files, label_files))
random.shuffle(combined_files)
image_files_shuffled, label_files_shuffled = zip(*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, label_file) in enumerate(zip(image_files_shuffled, label_files_shuffled)):
    if i < train_bound:
        shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file))
        shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'train/labels', label_file))
    elif i < valid_bound:
        shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file))
        shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'valid/labels', label_file))
    else:
        shutil.move(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file))
        shutil.move(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'test/labels', label_file))

不想做数据集的可以网上去找或者私信。

4.模型训练

在yolov10-main里创建一个名为datases的文件夹,将划分好的数据集复制进去。                             然后在pycharm里的datases新建apex.yaml文件如下图所示

打开创建好的apex.yaml,敲入下列代码,nc表示类别有几个类写几,names表示类别

# 路径
train: train/
val: valid/
test: test/
# number of classes
nc: 1

# class names
names: [ 'bot']

配置好yaml文件后,去官网下载好预训练权重yolov10s.pt、yolov8n.pt(没有的话会报错)放入yolov10-main文件里。本次实验所选的是轻量化模型yolov10s.pt。
新建一个train.py文件,内容如下,实际根据自己路径替换(下面全是绝对路径),epoch迭代次数自己设置,batch量卡而行!然后运行就可以开始模型训练了!

from ultralytics import YOLOv10
import os
os.environ['KMP_DUPLICATE_LIB_OK']='TRUE'#在Python中设置一个环境变量,解决OpenMP库冲突(可能你的电脑没出错)

# 模型配置文件
model_yaml_path = r"C:\Users\zjq\Desktop\yolov10\yolov10-main\ultralytics\cfg\models\v10\yolov10s.yaml"
# 数据集配置文件
data_yaml_path = r'C:\Users\zjq\Desktop\yolov10\yolov10-main\datasets\apex.yaml'
# 预训练模型
pre_model_name = r'C:\Users\zjq\Desktop\yolov10\yolov10-main\yolov10s.pt'
if __name__ == '__main__':
    # 加载预训练模型
    model = YOLOv10(model_yaml_path).load(pre_model_name)
    # 训练模型
    results = model.train(data=data_yaml_path, epochs=100, batch=4, name='train', device=0)

训练好后在runs/detect/train/weights里找到best.pt,这便是训练好的模型参数文件,下面会用到。

5.模型应用

新建一个predict.py用于测试推理!内容如下,实际路径自己替换,source可以是文件夹,也可以是单张图片,conf是置信度。

from ultralytics import YOLOv10
#加载模型
model = YOLOv10(r"C:\Users\zjq\Desktop\yolov10\yolov10-main\runs\detect\train\weights\best.pt")
results = model.predict(source="train_10.jpg",imgsz=1280,conf=0.3,save=True)

运行后去runs/detect/predict里有推理结果,例如

本次主要实现实时检测APEX游戏里的假人,用到的库如下,在上面的虚拟环境安装即可

pip install opencv-python
pip install pygetwindow
pip install pyautogui

新建一个apex.py文件内容如下,实际路径自己替换

from ultralytics import YOLOv10
import pygetwindow
import cv2
import numpy as np
import torch
from PIL import ImageGrab
#加载模型
model = YOLOv10(r"C:\Users\zjq\Desktop\yolov10\yolov10-main\runs\detect\train\weights\best.pt")#刚刚训练好的

# #获取窗口 旧版本的pygetwindow库用
# window_name = "Apex Legends"
# window = pygetwindow.getWindowTitle(window_name)[0]
# 获取所有窗口
all_windows = pygetwindow.getAllWindows()

# 假设你知道窗口标题,可以通过标题筛选窗口
target_window_title = "Apex Legends"
for window in all_windows:
    if window.title == target_window_title:
        print(f"Found window: {window.title}")
        # 可以对找到的窗口进行操作,比如激活
        window.activate()
        # window = window[0]
        break
else:
    print(f"Window with title '{target_window_title}' not found.")
###

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
cv2.namedWindow("frame", cv2.WINDOW_NORMAL)
cv2.resizeWindow("frame", 1280, 800)
while True:
    if window :
        x, y ,w, h = window.left, window.top, window.width, window.height
        screenshot = ImageGrab.grab(bbox=(x, y, x+w, y+h))
        image_src=cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2RGB)
        size_x, size_y = image_src.shape[1], image_src.shape[0]
        image_det=cv2.resize(image_src, (1920, 1080))
        results = model.predict(source=image_det, imgsz=640, conf=0.7,
                                save=False)


        boxes=results[0].boxes.xywhn
        for box in boxes:
            #坐标转换
            x_coordinate_top_left=int((box[0]-box[2]/2)*size_x)
            y_coordinate_top_left=int((box[1]-box[3]/2)*size_x)
            x_coordinate_bottom_right=int((box[0]+box[2]/2)*size_x)
            y_coordinate_bottom_right=int((box[1]+box[3]/2)*size_y)
            #cv2.rectangle(image_src,(x_coordinate_top_left,y_coordinate_top_left),(x_coordinate_bottom_right,y_coordinate_bottom_right),color=(0,255,0),thickness=3)
            cv2.rectangle(image_src,(x_coordinate_top_left,y_coordinate_top_left-200),(x_coordinate_bottom_right,y_coordinate_bottom_right),color=(0,255,0),thickness=3)

            cv2.imshow("frame", image_src)
            cv2.waitKey(1)
        cv2.imshow("frame", image_src)
        cv2.waitKey(1)
    else:
        break

打开APEX游戏窗口化后进入训练场!运行apex.py文件,效果如下图(下图是双显示器

最后强调一遍不是外挂不是外挂不是外挂,请维护游戏绿色环境,上述仅仅供学习!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值