01

随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV。最近,孔哥学习了Ptorch框架,本文就围绕OpenCV与Ptorch框架搭建一个利用目标骨骼关键点检测算法实现FPS类游戏自动瞄准的娱乐项目(该项目仅供学习OpenCV、Ptorch框架、游戏自动化等参考,不得用于非法用途)。

该项目思路大致分为如下步骤:

  1. 利用Pywin32以及OpenCV获取游戏窗口图像
  2. 数据集获取(本文为17骨骼关键点)
  3. 搭建Ptorch训练框架
  4. 利用深度学习Ptorch框架训练识别模型
  5. 搭建模型推理预测框架
  6. 不断把图像送入模型进行目标检测
  7. 根据检测结果获取关键点位置
  8. 利用鼠标键盘自动化实现自瞄

因为学习还在进行,获取图像、搭建框架、获取关键点位置等已经完成,孔哥用了Pytorch框架自带的模型,所以整个项目仅仅不过两百行,但是对屏幕不同分辨率还有一定问题还未解决,故今天先进行思路的大致讲解。

line

01
数据集获取及模型搭建训练

对于深度学习,我们最重要的就是搭建一个比较好的模型并训练出一个比较好的结果,由于最近在学习Ptorch框架,于是就使用了这个框架。

这里我们使用的是17骨骼关键点检测模型,是Ptorch框架自带的模型,是对于真人数据集训练的,但用于游戏也可以给出比较好的结果

该数据集可以识别如下类别,但我们在这里只需要用到“person”

[
    '__BACKGROUND__', 'person', 'bicycle', 'car', 'motorcycle',
    'airplane', 'bus', 'train', 'trunk', 'boat', 'traffic light',
    'fire hydrant', 'N/A', 'stop sign', 'parking meter', 'bench',
    'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant',
    'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A',
    'N/A', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard',
    'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard',
    'surfboard', 'tennis racket', 'bottle', 'N/A', 'wine glass',
    'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
    'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
    'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A',
    'dining table', 'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop',
    'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven',
    'toaster', 'toaster', 'sink', 'refrigerator', 'N/A', 'book', 'clock',
    'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
]

02
获取游戏窗口图像

进行骨骼关键点识别的第一步就是获取图像,我们这里通过pywin32相应的库来进行窗口截图并利用OpenCV返回我们所需格式的图像,这里我转为RGB图像返回。

后续就可以送去模型推理了,由于使用的是Ptorch框架所以后期需要对其预处理转换为Terson格式

03
模型推理框架

模型推理无可厚非就是对实时获取到的游戏界面进行识别给出对应结果。大致步骤如下:

  1. 图片输入模型
  2. 模型给出推理结果
  3. 利用OpenCV制作一个显示框
  4. 框出检测到的目标及绘制关键点
  5. 显示在显示框内

为了加快推理速度,我们使用了CUDA加速。如果不用显卡加速,经过测试,获取图像以及推理一次大概需要3-5ms左右,而用了显卡速度将有很大的提升,大概只需要0.2-0.5ms左右,加速还是很可观的。

04
通过关键点位置实现瞄准

通过Ptorch模型后我们就有了17骨骼关键点的位置坐标了,[0-16]对应标签如下:

['nose', 'left_eye', 'right_eye', 'left_ear',
 'right_ear', 'left_shoulder', 'right_shoulder', 'left_elbow',
 'right_elbow', 'left_wrist', 'right_wrist', 'left_hip', 'right_hip',
 'left_knee', 'right_knee', 'left_ankle', 'right_ankle']

接下来我们就可以通过对应关键点返回的位置坐标进行鼠标模拟操作,比如:

def mouse_point():	#	返回鼠标的实时位置
    pos = win32api.GetCursorPos()
    point = (int(pos[0]), int(pos[1]))
    print("坐标:",point)
    return point

def mouse_move_point(point):	#	移动鼠标到指定point=(x,y)点
    print("屏幕分辨率为:",win32api.GetSystemMetrics(0),win32api.GetSystemMetrics(1))
    nx = point[0] * 1.25 #win32api.GetSystemMetrics(0)
    ny = point[1] * 1.25 # win32api.GetSystemMetrics(1)
    win32api.mouse_event(win32con.MOUSEEVENTF_ABSOLUTE | win32con.MOUSEEVENTF_MOVE, int(nx), int(ny))

def mouse_left_click():	#	模拟鼠标单击左键并松开
    time.sleep(0.05)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

def mouse_right_click():	#	模拟鼠标单击右键并松开
    time.sleep(0.05)
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)

05
总结

以上就是今天要讲的内容,本次主要介绍了Ptorch框架自带模型的使用以及实现目标骨骼关键点检测的大致内容,这只是项目的宏观内容。

如有想要观摩、学习的可以关注《和孔哥一起学》微信公众号,回复“游戏项目1”获取相应资源。后续会为大家更新游戏及Ptorch框架相关的娱乐学习项目。

line
end

点个关注不迷路
觉得孔哥写的对你有帮助?请分享给更多的人
欢迎一起学习!博客平台同步发布,请搜索——和孔哥一起学

dianzan

版权声明:
作者: 和孔哥一起学
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐