首页 > 其他分享 >AI打游戏-伍(游戏,启动!)

AI打游戏-伍(游戏,启动!)

时间:2023-09-17 10:55:05浏览次数:79  
标签:__ 游戏 AI image cv2 打游戏 boxes x1 cls

目标

  • 使用代码调用yolo模型,并解析预测结果
  • 读取游戏视频预测结果,并可视化
  • 读取游戏窗口预测结果,并可视化
  • 根据预测结果,模拟操作鼠标操作

步骤

官方文档

代码预测静态图片

  • 读取游戏截图,送入yolo网络预测
  • 解析预测结果
import cv2
from ultralytics import YOLO

model = YOLO('runs/detect/train/weights/best.pt')
image = cv2.imread('E:\\ai-play-game\\project-1-at-2023-09-13-17-05-6275bec0\\images\\0d332b6a-8100.jpg')
# 预测结果(返回列表,因为同时输入一组图片)
result = model(image)[0]

print(f"result.names: {result.names}")
print(f"result.boxes: {result.boxes}")
# 观察打印结果,可以找到不同的输出类型:xywh,xywhn,xyxy,xyxyn

# 如果使用GPU训练,则tensor在GPU中,先使用.cpu()转到内存中才能使用
# 由于opencv框选标记使用xyxy,刚好可以使用result.boxes.data
# 内容格式:[[x1,y1,x2,y2,置信值,类别]]
print(f"坐标信息:{result.boxes.data.cpu().numpy().tolist()}")

可视化预测结果

  • 打印坐标不够直观,使用opencv显示出结果
  • 读取视频代码
import cv2

def main():
    image = cv2.imread('E:\\ai-play-game\\project-1-at-2023-09-13-17-05-6275bec0\\images\\0d332b6a-8100.jpg')
    # 显示图片
    cv2.imshow("image", image)
    # 显示5秒或按"Esc"键退出
    if cv2.waitKey(5000) & 0xFF == 27:
        cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
  • 加上yolo后
import cv2
from ultralytics import YOLO

# 加载模型
model = YOLO('runs/detect/train/weights/best.pt')
# 类别对应的名字,及rgb颜色
clazz_dict = {
    0: ('hellhound', (255, 0, 0)),
    1: ('samurais', (0, 255, 0)),
    2: ('player', (0, 0, 255)),
    3: ('fireflies', (255, 255, 0)),
}


def ai_boxes(image):
    """
    增加ai识别的框
    :param image: 图片像素张量
    :return: 增加显示后的张量
    """
    result = model(image)[0]
    boxes = result.boxes.data.cpu().numpy().tolist()
    for x1, y1, x2, y2, conf, cls in boxes:
        x1, y1, x2, y2, cls = int(x1), int(y1), int(x2), int(y2), int(cls)
        cls_name, cls_rgb = clazz_dict[cls]
        # 增加框
        cv2.rectangle(image, (x1, y1), (x2, y2), cls_rgb, 1)
        # 增加文字
        cv2.putText(image, cls_name, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 0.5, cls_rgb, 1)
    return image


def main():
    image = cv2.imread('E:\\ai-play-game\\project-1-at-2023-09-13-17-05-6275bec0\\images\\0d332b6a-8100.jpg')
    image = ai_boxes(image)
    # 显示图片
    cv2.imshow("image", image)
    # 显示5秒或按"Esc"键退出
    if cv2.waitKey(5000) & 0xFF == 27:
        cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

可视化解析视频

  • 将来源替换成视频
  • 读取视频代码
import cv2

def main():
    cap = cv2.VideoCapture("E:\\ai-play-game\\2023-09-12 23-27-51.mp4")
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            cv2.imshow("video", frame)
        # 按"Esc"键退出
        if cv2.waitKey(1) & 0xFF == 27:
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
  • 加上YOLO后
import cv2
from ultralytics import YOLO

# 加载模型
model = YOLO('runs/detect/train/weights/best.pt')
# 类别对应的名字,及rgb颜色
clazz_dict = {
    0: ('hellhound', (255, 0, 0)),
    1: ('samurais', (0, 255, 0)),
    2: ('player', (0, 0, 255)),
    3: ('fireflies', (255, 255, 0)),
}


def ai_boxes(image):
    """
    增加ai识别的框
    :param image: 图片像素张量
    :return: 增加显示后的张量
    """
    result = model(image)[0]
    boxes = result.boxes.data.cpu().numpy().tolist()
    for x1, y1, x2, y2, conf, cls in boxes:
        x1, y1, x2, y2, cls = int(x1), int(y1), int(x2), int(y2), int(cls)
        cls_name, cls_rgb = clazz_dict[cls]
        # 增加框
        cv2.rectangle(image, (x1, y1), (x2, y2), cls_rgb, 2)
        # 增加文字
        cv2.putText(image, cls_name, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 1, cls_rgb, 2)
    return image


def main():
    cap = cv2.VideoCapture("E:\\ai-play-game\\2023-09-12 23-27-51.mp4")
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            frame = ai_boxes(frame)
            cv2.imshow("video", frame)
        # 按"Esc"键退出
        if cv2.waitKey(1) & 0xFF == 27:
            break

    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

读取游戏窗口

  • pip安装依赖
pip install pywin32
  • 读取窗口代码
import cv2
from ultralytics import YOLO
import win32gui
import numpy as np
from PIL import ImageGrab

def main():
    # 读取游戏窗口,需要先打开游戏
    win_id = win32gui.FindWindow(None, 'Tap Ninja')
    while True:
        # 获取窗口位置信息
        win_bbox = win32gui.GetWindowRect(win_id)
        # 读取窗口位置像素信息
        game_window = np.array(ImageGrab.grab(bbox=win_bbox))
        # 两个库色彩模式不同,转换色彩模式
        image = cv2.cvtColor(game_window, cv2.COLOR_BGR2RGB)

        cv2.imshow("video", image)
        # 按"Esc"键退出
        if cv2.waitKey(1) & 0xFF == 27:
            break
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()
  • 加上YOLO后
import cv2
from ultralytics import YOLO
import win32gui
import numpy as np
from PIL import ImageGrab

# 加载模型
model = YOLO('runs/detect/train/weights/best.pt')
# 类别对应的名字,及rgb颜色
clazz_dict = {
    0: ('hellhound', (255, 0, 0)),
    1: ('samurais', (0, 255, 0)),
    2: ('player', (0, 0, 255)),
    3: ('fireflies', (255, 255, 0)),
}


def ai_boxes(image):
    """
    增加ai识别的框
    :param image: 图片像素张量
    :return: 增加显示后的张量
    """
    result = model(image)[0]
    boxes = result.boxes.data.cpu().numpy().tolist()
    for x1, y1, x2, y2, conf, cls in boxes:
        x1, y1, x2, y2, cls = int(x1), int(y1), int(x2), int(y2), int(cls)
        cls_name, cls_rgb = clazz_dict[cls]
        # 增加框
        cv2.rectangle(image, (x1, y1), (x2, y2), cls_rgb, 2)
        # 增加文字
        cv2.putText(image, cls_name, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 1, cls_rgb, 2)
    return image


def main():
    # 读取游戏窗口,需要先打开游戏
    win_id = win32gui.FindWindow(None, 'Tap Ninja')
    while True:
        # 获取窗口位置信息
        win_bbox = win32gui.GetWindowRect(win_id)
        # 读取窗口位置像素信息
        game_window = np.array(ImageGrab.grab(bbox=win_bbox))
        # 两个库色彩模式不同,转换色彩模式
        image = cv2.cvtColor(game_window, cv2.COLOR_BGR2RGB)

        image = ai_boxes(image)
        cv2.imshow("video", image)
        # 按"Esc"键退出
        if cv2.waitKey(1) & 0xFF == 27:
            break
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

模拟鼠标操作

  • pip安装依赖
pip install pyautogui
  • 由于游戏使用DirectX渲染,pyautogui需要管理员权限才能在游戏中模拟鼠标操作
  • 重新一定要重新使用"管理员"打开IDE !!!
import cv2
from ultralytics import YOLO
import win32gui
import numpy as np
from PIL import ImageGrab
import pyautogui

# 加载模型
model = YOLO('runs/detect/train/weights/best.pt')
# 类别对应的名字,及rgb颜色
clazz_dict = {
    0: ('hellhound', (255, 0, 0)),
    1: ('samurais', (0, 255, 0)),
    2: ('player', (0, 0, 255)),
    3: ('fireflies', (255, 255, 0)),
}


def controller(boxes):
    """
    控制模拟玩家操作
    :param boxes: YOLO预测结果
    """
    player_fire_x = None
    other_x1_list = []
    for x1, y1, x2, y2, conf, cls in boxes:
        if int(cls) == 2:
            # 操作位置:玩家前方一个身位的位置
            player_fire_x = x2 + (x2 - x1)
        else:
            other_x1_list.append(x1)
    if player_fire_x is not None and len(other_x1_list) > 0:
        for x1 in other_x1_list:
            if x1 < player_fire_x:
                # 点击鼠标左键
                pyautogui.click(button='left')
                print("**************************** 点击 ****************************")


def ai_boxes(image):
    """
    增加ai识别的框
    :param image: 图片像素张量
    :return: 增加显示后的张量
    """
    result = model(image)[0]
    boxes = result.boxes.data.cpu().numpy().tolist()
    for x1, y1, x2, y2, conf, cls in boxes:
        x1, y1, x2, y2, cls = int(x1), int(y1), int(x2), int(y2), int(cls)
        cls_name, cls_rgb = clazz_dict[cls]
        # 增加框
        cv2.rectangle(image, (x1, y1), (x2, y2), cls_rgb, 2)
        # 增加文字
        cv2.putText(image, cls_name, (x1, y1), cv2.FONT_HERSHEY_COMPLEX, 1, cls_rgb, 2)
    # 判断位置并控制
    controller(boxes)
    return image


def main():
    # 读取游戏窗口,需要先打开游戏
    win_id = win32gui.FindWindow(None, 'Tap Ninja')
    while True:
        # 获取窗口位置信息
        win_bbox = win32gui.GetWindowRect(win_id)
        # 读取窗口位置像素信息
        game_window = np.array(ImageGrab.grab(bbox=win_bbox))
        # 两个库色彩模式不同,转换色彩模式
        image = cv2.cvtColor(game_window, cv2.COLOR_BGR2RGB)

        image = ai_boxes(image)
        cv2.imshow("video", image)
        # 按"Esc"键退出
        if cv2.waitKey(1) & 0xFF == 27:
            break
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()

小结

  • 看出识别结果不够准确
  • 提升准确率
    • 调整训练参数
    • 增加训练集样本数量
    • 区分训练集和验证集

总结

  • AI算法不仅是模型训练,还包含了很多上下游工作
  • 通常是以下几个步骤
    • 发现一个问题或者需求,分析解决方案
    • 收集数据
    • 标注数据
    • 模型训练
    • 部署使用
    • 效果监控,收集数据,迭代算法

标签:__,游戏,AI,image,cv2,打游戏,boxes,x1,cls
From: https://www.cnblogs.com/XuXiaoCong/p/17707942.html

相关文章

  • mysql innodb_lock_wait_timeout修改
    一、概述设置mysql事务锁超时时间innodb_lock_wait_timeoutMysql数据库采用InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。二、修改1、查询SHOWVARIABLESLIKE'innodb_lock_wait_timeout';2、session级别修改SETi......
  • IFAction导出的游戏如何在linux程序下运行?
    在linux系统里,应该都自带python环境,把游戏以web方式导出,在文件夹下创建一个python文件(文件后缀以.py结束),把以下代码复制进去,#author:rkey#date:20230904#note:用于解决IFAction导出的web版游戏在linux系统下运行的问题。importtkinterastkfromthreadingimportThrea......
  • Django Wagtail
    DjangoWagtailDjangoWagtail是一个基于Django的CMS框架,下面是配置和使用示例: 安装DjangoWagtail可以使用pip安装DjangoWagtail:  pipinstallwagtail创建Django项目在安装DjangoWagtail之后,可以使用以下命令创建Django项目: django-adminstartprojectmyproj......
  • OpenStack(Train版)-环境准备
    1.1、基本环境准备block1主机IPcontroller1192.168.56.11compute1192.168.56.21block1192.168.56.51block2192.168.56.52Hrorizon192.168.56.61安装操作系统CentOS-7-x86_64基本系统:1VCPU+2048M内存+100G硬盘。网络选择:使用网络地址转换(NAT)。软件包选择:MinimalInstall。关闭......
  • python实现猜拳小游戏
    功能需求假设石头剪刀布分别由1,2,3代表,程序在石头剪刀布中随机生成一个结果,根据用户输入的结果判断用户的输赢。用户输赢和平局否需要打印出结果。石头赢剪刀剪刀赢布布赢石头功能分析1:定义猜拳的手势、名称和结果2:定义一个函数get_user_gesture()获取用户的手势信息,并且需要考虑......
  • 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v10.0版已发布
    关于MobileIMSDKMobileIMSDK是一套专门为移动端开发的开源IM即时通讯框架,超轻量级、高度提炼,一套API优雅支持UDP 、TCP 、WebSocket 三种协议,支持iOS、Android、H5、标准Java平台,服务端基于Netty编写。工程开源地址是:1)Gitee码云地址:https://gitee.com/jackjiang/MobileIM......
  • AI绘画:SD绘画实操过程-完美世界-火灵儿-少女制作教程(附资料及变现)
    资源介绍:大家好,我是小梦,最近一直研究AI绘画领域,总结了一些变现的方式,需要的可以来这里阅读下:AI绘画:无私分享我的AI绘画变现之路,普通人可实操可模仿都是自己经过实操,总结出来的,内容非常的干货,没有任何套路。不久前,耗费了半个月的时间给大家整理分享了StableDiffusion的全面教......
  • wait、sleep、yield、join的区别
    两个概念1、锁队列所有需要竞争同步锁的线程都会放在锁队列中,比如当前对象的锁已经被一个线程得到,则其他线程都需要在这个锁队列中进行等待,当前面的线程释放同步锁后,锁队列中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待CPU资源分配。2、等待队列(wait方法)在调用......
  • GPT之路(八) LangChain - Models入门
    环境:Python3.11.4,LangChain0.0.270,Jupyter Models模型简介官方地址:LangChian-ModelsLangchain所封装的模型分为两类:大语言模型(LLM)聊天模型(ChatModels)Langchain的支持众多模型供应商,包括OpenAI、ChatGLM、ModelScope、HuggingFace等。后面的示例我将以OpenA......
  • The POM for com.xubo:service_base:jar:0.0.1-SNAPSHOT is missing, no dependency i
    报错信息[INFO]Scanningforprojects...[INFO][INFO]------------------------<com.xubo:service_edu>------------------------[INFO]Buildingservice_edu0.0.1-SNAPSHOT[INFO]--------------------------------[jar]---------------------------------[......