在上一章,我们已经成功运行了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__': model = YOLO("yolo11n.pt") 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 找到训练好的模型进行测试了