不是外挂不是外挂不是外挂
前期准备:下载好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文件,效果如下图(下图是双显示器
最后强调一遍不是外挂不是外挂不是外挂,请维护游戏绿色环境,上述仅仅供学习!