当前位置:   article > 正文

使用YOLOv3(Python - Keras)实时检测屏幕画面进行目标检测教程(以检测GTA5游戏画面为例子)_yolo对游戏画面实时检测

yolo对游戏画面实时检测

毕业设计项目做了一个在游戏GTA5中实现自动驾驶的项目,其中一个功能是汽车的碰撞检测。为了实现这个功能我首先需要能实现识别汽车,对比了使用了SSD和Faster-RCNN,我选择了YOLOv3来实现这个功能,因为它既有速度又有精度,还非常灵活,简直是工业界良心。

当时在网上查阅相关教程的时候,很多教程只是讲到调用一下文件实现视频文件的检测。然而我需要对屏幕上显示的游戏画面进行检测,所以很多教程都不适用。

现在毕设做好了比较空闲,所以记录一下顺便帮助后来人,这个教程会讲如何用YOLOv3检测屏幕上的画面。

 

本文旨在帮助新手快速上手YOLOv3,不会涉及详细的代码和相应的算法原理,具体YOLO的原理等以后有时间再写篇详细的~

 

1、下载YOLOv3的Keras版(https://github.com/qqwweee/keras-yolo3) 里面有成熟的代码。

2、生成Keras的.h5文件,

需要:

  •  1. yolo网络结构配置文件 .cfg ,如 yolov3.cfg
  •  2. yolo训练好的权重文件 .weights ,如 yolov3.weights

权重文件:https://pjreddie.com/media/files/yolov3.weights,此权重文件包含一些预训练的参数。

网络结构配置文件:项目默认自带了YOLOv3-416的网络的.cfg。如果需要其他网络,则以txt文件打开.cfg文件,将第8行和第9行的参数修改为320或608。

下图为各种YOLOv3版本的准确度和速度对比,根据自己项目的准确度和速度需求,选择自己的网络(改那个.cfg)

下面为官网对比(https://pjreddie.com/darknet/yolo/

 

下载好上述两个文件后,将权重文件放到项目根目录下

3、运行convert.py,将 yolov3.weights转换成Keras能使用的.h5文件

使用方法:

python convert.py yolov3.cfg yolov3.weights yolov3.h5

执行完成示意图

执行完成之后在当前目录下生成yolov3.h5文件,将其重命名为yolo.h5并放入model_data文件夹中。

4、新建grabscreen.py文件,复制以下内容,此文件里实现用Win32API截取屏幕。相比于使用PIL,这种方式截屏速度更快

  1. import cv2
  2. import numpy as np
  3. import win32gui
  4. import win32ui
  5. import win32con
  6. import win32api
  7. def grab_screen(region=None):
  8. hwin = win32gui.GetDesktopWindow()
  9. if region:
  10. left, top, x2, y2 = region
  11. width = x2 - left + 1
  12. height = y2 - top + 1
  13. else:
  14. width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
  15. height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
  16. left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
  17. top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
  18. hwindc = win32gui.GetWindowDC(hwin)
  19. srcdc = win32ui.CreateDCFromHandle(hwindc)
  20. memdc = srcdc.CreateCompatibleDC()
  21. bmp = win32ui.CreateBitmap()
  22. bmp.CreateCompatibleBitmap(srcdc, width, height)
  23. memdc.SelectObject(bmp)
  24. memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
  25. signedIntsArray = bmp.GetBitmapBits(True)
  26. img = np.fromstring(signedIntsArray, dtype='uint8')
  27. img.shape = (height, width, 4)
  28. srcdc.DeleteDC()
  29. memdc.DeleteDC()
  30. win32gui.ReleaseDC(hwin, hwindc)
  31. win32gui.DeleteObject(bmp.GetHandle())
  32. return cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)

5、新建example.py文件,复制以下内容 ,并运行。

  1. import numpy as np
  2. import cv2
  3. import time
  4. from grabscreen import grab_screen
  5. from PIL import Image
  6. from yolo import YOLO
  7. import tensorflow as tf
  8. config = tf.ConfigProto()
  9. config.gpu_options.per_process_gpu_memory_fraction = 0.8 #爆显存的话可以在此调整程序的显存占用情况
  10. session = tf.Session(config=config)
  11. yolo = YOLO()
  12. while True:
  13. image_array = grab_screen(region=(0, 0, 1280, 720))
  14. # 获取屏幕,(0, 0, 1280, 720)表示从屏幕坐标(0,0)即左上角,截取往右1280和往下720的画面
  15. array_to_image = Image.fromarray(image_array, mode='RGB') #将array转成图像,才能送入yolo进行预测
  16. img = yolo.detect_image(array_to_image) #调用yolo文件里的函数进行检测
  17. img = np.asarray(img) #将图像转成array
  18. cv2.imshow('window',cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) #将截取的画面从另一窗口显示出来,对速度会有一点点影响,不过也就截取每帧多了大约0.01s的时间
  19. if cv2.waitKey(25) & 0xFF == ord('q'): #按q退出,记得输入切成英语再按q
  20. cv2.destroyAllWindows()
  21. break

6、检测结果:

左边为GTA5的游戏画面,右边为检测结果,使用一个窗口显示出来

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/128673
推荐阅读
相关标签
  

闽ICP备14008679号