在上一章,我们已经成功运行了yolo的官方示例,接下来,我们需要训练yolo来让它认识象棋

数据准备

我在手机上完成了一场简单的对局,并且使用adb进行截图,opencv处理后存储到文件夹

这里我使用了DroidCast_raw来进行模拟器截图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import cv2
import os
import requests
import subprocess
import numpy as np

def check_status():
try:
requests.get("http://127.0.0.1:53516/preview")
return True
except requests.RequestException:
return False

def get_clipped_img():
img = requests.get("http://127.0.0.1:53516/preview")
img = cv2.imdecode(np.array(bytearray(img.content)),-1)
height,width = img.shape[:2]
clip = (height - width) / 2
img = img[int(clip-50):int(height-clip+50),0:int(width)]
img = cv2.resize(img, (1080, 1080))# 图片大小,对训练时候的配置影响很大
return img

device = "127.0.0.1:16416"
os.system("adb connect %s" % device)

if check_status():
print("DroidCast_raw is running")
else:
print("try start DroidCast_raw")
os.system("adb -s %s push DroidCast_raw.apk /data/local/tmp" % device)
os.system("adb -s %s forward tcp:53516 tcp:53516" % device)
subprocess.Popen(["adb","-s",device,"shell","CLASSPATH=/data/local/tmp/DroidCast_raw.apk nohup app_process / ink.mol.droidcast_raw.Main --port=53516 &"],shell=True)

count = 1
while True:
print("start catch img %d" % count)
img = get_clipped_img()
cv2.imwrite("./dist/%d.png" % count, img)
count += 1

以上的代码会在dist文件夹里生成带序号的图片

接下来安装 labelImg

注意: labelImg需要在 python<=3.9 的版本上运行,不可在yolo虚拟环境中直接运行

1
2
3
4
conda create -n labelImg python=3.9
conda active labelImg
pip install labelImg
labelImg

现在,出现了这样的一个窗口

我们选择左侧的 Open Dir 选项,打开刚刚保存到的 dist 文件夹,点击左侧的 Create ML 直到变为 YOLO,然后选择 Creat ReactBox 进行标注

全部标注完后,保存进行下一个图片的标注

开始训练

将我们刚刚标注好的数据,选出90%的数据作为训练数据,图片单独放在 train/images 里面,txt单独放在 train/labels 里面。

剩余的10%的数据,我们作为验证数据,图片单独放在 val/images 里面,txt单独放在 val/labels 里面。

我们需要写一个训练配置进行yolo的训练

1
2
3
4
5
6
7
train: 你的训练数据的位置/train/images
val: 你的训练数据的位置/val/images
nc: classes.txt里面的总行数
names:
- classes.txt里面的数据,一行一个,顺序不可改变
- classes.txt里面的数据,一行一个,顺序不可改变
- classes.txt里面的数据,一行一个,顺序不可改变

将上列配置保存到jjchess.yml里。现在,我们可以开始yolo的训练了

1
2
3
4
5
6
7
8
9
10
11
12
from ultralytics import YOLO


if __name__ == '__main__': # 必须有,解决一个多进程bug
model = YOLO("yolo11n.pt")
# 根据自己电脑的配置调整各个参数
# data: 我们刚刚写的jjchess.yml的训练配置文件
# imgsz:只能填之前使用cv2处理图片时候的大小,越大需要的配置越高
# epochs:训练轮数,越多精度越高
# batch: 一轮训练的次数,越大需要的配置越高
# workers: 根据配置调整
results = model.train(data="jjchess.yml", epochs=500, imgsz=1080,batch=8,workers=4)

当出现 Results saved to runs\detect\train 的时候,我们就可以去 你的训练目录\runs\detect\train\weights\best.pt 找到训练好的模型进行测试了