极客之眼团队极客硬件网络技术研究

 找回密码
 注册成为极客之眼的一份子
搜索
查看: 205|回复: 4

OpenCV DNN之YOLO实时游戏对象检测

[复制链接]

2

主题

5 小时

在线时间

39

极客币

注册会员

Rank: 2

积分
63
发表于 2019-9-1 10:28:22 | 显示全部楼层 |阅读模式
附上篇链接 https://www.geekeyes.cn/forum.php?mod=viewthread&tid=999

以google 404 小恐龙为例

效果展示:
APA1BM07A}X1%PY0_Q10`9D.png

本次代码为上次代码进行修改

安装库文件
pip install mss
pip install win32gui
pip install argparse
pip install glob
pip install json
pip install opencv-python
pip install numpy
pip install tqdm
pip install lxml
pip install dasiamrpn


首先   训练需要识别的目标

下载OpenLabeling: https://github.com/Cartucho/OpenLabeling

把训练文件截图好放到 OpenLabling\main\input下

277FJ1G(~)(E`G@L`~}2FTT.png


大概就是这个样子

00002.png

为了识别的准确性可以多截图几个训练图片

在OpenLabeling-master\main\class_list.txt   填写训练标签,一行为一个标签。标签为识别对象的名字

在OpenLabling\main目录下 打开cmd窗口 执行:
  1. python main.py
复制代码

进入OpenLabling工具进行标记识别对象
(本人电脑临时有点毛病,这里就不演示了)

标记完之后 创建一个.py文件 进行汇总
附上代码
  1. import glob, os

  2. # Current directory
  3. current_dir = ## set the absolute path of your training image directory

  4. # Directory where the data will reside, relative to 'darknet.exe'
  5. path_data = 'bot/'

  6. # Percentage of images to be used for the test set
  7. percentage_test = 10;

  8. # Create and/or truncate train.txt and test.txt
  9. file_train = open('train.txt', 'w')  
  10. file_test = open('test.txt', 'w')

  11. # Populate train.txt and test.txt
  12. counter = 1  
  13. index_test = round(100 / percentage_test)  
  14. for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")):  
  15.     title, ext = os.path.splitext(os.path.basename(pathAndFilename))

  16.     if counter == index_test:
  17.         counter = 1
  18.         file_test.write(path_data + 'images/' + title + '.jpg' + "\n")
  19.     else:
  20.         file_train.write(path_data + 'images/' + title + '.jpg' + "\n")
  21.         counter = counter + 1
复制代码
把脚本放到 input文件夹下运行 自动创建两个txt

创建完之后可以使用Notepad++ 把文件改成LF
打开Notepad++ -->视图 -->显示所有字符         编辑 --> 文档格式转换 --> LF
把OpenLabeling-master\main\output\YOLO_darknet的txt文件全部转换为LF
(只是为了在乌班图系统上进行使用)
开始的时候是这种
XNIR_B6FDQCC`C(XTCKXPQ1.png
修改之后是这样的
[~I7T%LD`$LAI%KIDBV6(BE.png

打开虚拟机
安装Darkent  直接执行

  1. git clone https://github.com/pjreddie/darknet
复制代码


进入Darkent文件夹进行编译
  1. cd darknet
  2. make
复制代码

注:这里可能会编译失败  
解决办法 重新安装make 自行百度

下载在ImageNet预训练过的网络参数weight,这里使用YOLOv3-tiny版本
  1. wget https://pjreddie.com/media/files/yolov3-tiny.weights
复制代码
进行测试
  1. ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
复制代码


测试完成之后就可以进行在Darkent框架下训练自己的模型

执行
  1. ./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15
复制代码

生成yolov3-tiny.conv.15  文件
创建bot文件夹进行放入

在cfg文件夹下找到 yolov3-tiny.cfg 文件复制到bot文件夹下 改名为  yolov3-tiny-bot.cfg

修改:
第3行 batch = 11
第4行 subdivision = 8
第127行和第171行 filters = 21  这里的filters =(classes+5)*3
第135行和第177行 classes = 2  这里的classes 为你的标签多少个

在bot文件夹创建一个 bot.data
填写:

classes = 11
train  = bot/train.txt
valid  = bot/test.txt   
names = bot/bot.names
backup = backup/

train.txt和test.txt就是前面我们生成的两个汇总文件,而backup就是我们训练过的weight自动保存的路径。

在bot文件夹创建一个 bot.names
填写 class_list.txt 里的内容:


konglong
shu


保存后再darknet 下执行以下代码开始训练

  1. ./darknet detector train bot/bot.data bot/yolov3-tiny-bot.cfg yolov3-tiny.conv.15
复制代码
训练大概把avg降低0.3左右就可以了

之后把训练好的文件
bot.names
yolov3-tiny-bot_900.weights
yolov3-tiny-bot.cfg拉到windows平台整体项目下创建一个yolo-config放入
之后创建py脚本进行测试这里直接贴出代码
  1. import time
  2. import pyautogui
  3. from win32gui import FindWindow, GetWindowRect
  4. from pynput.keyboard import Key,Controller
  5. import cv2
  6. import mss
  7. import numpy
  8. from PIL import Image
  9. import os
  10. import yolo
  11. min_confidence = 0.3
  12. nm_threshold = 0.3
  13. labelsPath = os.path.sep.join(['yolo-config', "bot.names"])
  14. weightsPath = os.path.sep.join(['yolo-config', "yolov3-tiny-bot_900.weights"])
  15. configPath = os.path.sep.join(['yolo-config', "yolov3-tiny-bot.cfg"])
  16. LABELS = open(labelsPath).read().strip().split("\n")

  17. net = cv2.dnn.readNetFromDarknet(configPath, weightsPath)

  18. key=Controller()

  19. web=(260,400)


  20. def startgame():
  21.     pyautogui.click(web)
  22.     time.sleep(0.03)
  23.     pyautogui.keyDown('space')
  24.     time.sleep(0.03)
  25.     pyautogui.keyUp('space')
  26.     print('game start')


  27. def jump():
  28.     key.release(Key.down)
  29.     key.press(Key.space)
  30.     print('jump')
  31.     time.sleep(0.3)
  32.     key.release(Key.space)
  33.     key.press(Key.down)


  34. startgame()

  35. def yolo_detect(image):
  36.         (H, W) = image.shape[:2]

  37.         ln = net.getLayerNames()
  38.         ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]
  39.         nclass = len(LABELS)
  40.         COLORS = numpy.random.randint(0, 255, size=(nclass, 3), dtype='uint8')
  41.         blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True, crop=False)
  42.         net.setInput(blob)
  43.         start = time.time()
  44.         layerOutputs = net.forward(ln)
  45.         end = time.time()

  46.         boxes = []
  47.         positions = []
  48.         confidences = []
  49.         classIDs = []

  50.         for output in layerOutputs:
  51.                 for detection in output:
  52.                         scores = detection[5:]
  53.                         classID = numpy.argmax(scores)
  54.                         confidence = scores[classID]
  55.                         if confidence > min_confidence:
  56.                                 box = detection[0:4] * numpy.array([W, H, W, H])
  57.                                 (centerX, centerY, width, height) = box.astype("int")
  58.                                 x = int(centerX - (width / 2))
  59.                                 y = int(centerY - (height / 2))
  60.                                 boxes.append([x, y, int(width), int(height)])
  61.                                 confidences.append(float(confidence))
  62.                                 classIDs.append(classID)

  63.         idxs = cv2.dnn.NMSBoxes(boxes, confidences, min_confidence, nm_threshold)

  64.         flag = 0
  65.         if len(idxs) > 0:
  66.                 for i in idxs.flatten():
  67.                         (x, y) = (boxes[i][0], boxes[i][1])
  68.                         (w, h) = (boxes[i][2], boxes[i][3])
  69.                         flag = 1
  70.                         color = [int(c) for c in COLORS[classIDs[i]]]
  71.                         cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
  72.                         position = [(x+w/2) - (W/2), (H/2) - (y+h/2)]
  73.                         positions.append(position)
  74.                         text = "{}: {:.4f} {}".format(LABELS[classIDs[i]], confidences[i], position)
  75.                         #print(box)
  76.                         #print("{}:".format(LABELS[classIDs[i]]), (x,y,w,h))
  77.                         cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
  78.                 if LABELS[classIDs[i]] == 'Dinosaur':
  79.                         NPC = x,y,w,h
  80.                         print(NPC)

  81.         return image, boxes, positions, confidences, classIDs



  82. with mss.mss() as sct:
  83.     while 'Screen capturing':
  84.         window_name = "T-Rex Game. - Google Chrome"
  85.         id = FindWindow(None, window_name)
  86.         bbox = GetWindowRect(id)
  87.         im_array = numpy.array(sct.grab(monitor=bbox))
  88.         im_array = cv2.cvtColor(im_array, cv2.COLOR_BGR2RGB)
  89.         im_array, boxes, positions, confidences, classIDs = yolo_detect(im_array)

  90.         cv2.imshow('GoogleGame', im_array)

  91.         # Press "q" to quit
  92.         if cv2.waitKey(25) & 0xFF == ord('q'):
  93.             cv2.destroyAllWindows()
  94.             break
复制代码

语言表达能力不强 有什么问题可以直接站内私信





回复

使用道具 举报

0

主题

20 小时

在线时间

38

极客币

注册会员

Rank: 2

积分
77
发表于 2019-9-1 12:24:18 | 显示全部楼层
学习了,感谢分享
回复

使用道具 举报

2

主题

2 小时

在线时间

39

极客币

注册会员

Rank: 2

积分
69
发表于 2019-9-1 14:56:44 | 显示全部楼层
啥也不说了,楼主就是给力!
回复

使用道具 举报

3

主题

12 小时

在线时间

95

极客币

注册会员

Rank: 2

积分
161
发表于 5 天前 | 显示全部楼层
极客技术论坛,有你更精彩!
回复

使用道具 举报

3

主题

12 小时

在线时间

95

极客币

注册会员

Rank: 2

积分
161
发表于 4 天前 | 显示全部楼层
极客技术论坛,有你更精彩!
回复

使用道具 举报

本版积分规则

QQ|技术硬件网络论坛|小黑屋|极客之眼团队 ( 滇ICP备18000070号 )

GMT+8, 2019-9-15 20:40 , Processed in 0.087721 second(s), 23 queries .

极客之眼始于丙申年庚子月戊子日——————————至今

快速回复 返回顶部 返回列表