当前位置: 首页 > news >正文

用香蕉也能玩电脑游戏—Tensorflow对象检测接口的简单应用

Tensorflow最近发布了用于对象检测的对象检测接口(Object Detection API),能够定位和识别图像中的对象。它能够快速检测图像允许从视频帧甚至网络摄像头进行连续检测。它也可以用于构建鼠标“Tensormouse”,一个使用网络摄像移动光标的应用程序。

你是否曾经想过使用其他物品比如香蕉来移动你的光标?我们现在就可以实现!

TensorMouse是一个小型的开源Python应用程序,它允许你通过在网络摄像头前移动任意物品(如杯子,苹果或香蕉)来移动光标,他可以做电脑鼠标或触控板的替代品。

f3d4a505cbf40f7283fa4f7a0bf83a32cd1e88c1


允许你用香蕉玩游戏

它是如何工作的?
TensorMouse记录来自网络摄像头的图像序列。然后将这些数据输入到Tensorflow对象检测接口中,返回对象的概率和位置的图。然后移动鼠标光标,使光标位置与图像上对象的位置对应。
例如,如果在图像的左上角检测到对象,光标将移动到屏幕的左上角。

应用程序的主要部分按顺序重复以下步骤:

  • 使用OpenCV从网络摄像头进行单帧采集
  • 使用Tensorflow对象检测接口进行对象检测
  • 根据检测到的对象位置移动鼠标光标

1.帧采集
使用Python OpenCV模块捕获来自网络摄像头的帧。它提供了一个跨平台的工具,用于快速的图像采集和缩放。然后将图像缩放到360p以提高性能。

2.对象检测
对象检测用于确定网络摄像头框中所需对象的相对位置。它使用在COCO数据集上训练的Tensorflow对象检测接口固有的Mobilenet神经网络图。该数据集由80个不同的对象组成,主要包括杯子,苹果,餐具等家用物品。

6a4d54ff1fca1147848820bc02545b8226a27832


检测到的具有带有相应概率的对象

如果检测到的对象相应的概率超过指定的阈值(一般为85%),则TensorMouse会将该对象视为检测对象,并计算检测到对象的方框的中心。

3.移动鼠标光标
Python包的pynput为执行鼠标指针的移动提供了跨平台支持。基于检测到的对象的相对位置将光标移动到该位置。意思是如果在图像的左上角检测到物体,光标将移动到屏幕的左上角。

应用程序然后返回到步骤1以从网络摄像头检索下一个图像并重复此过程。

如何使用它
应用程序的源代码发布在我的Gitlab repo中(https://github.com/tadejmagajna/TensorMouse)。

TensorMouse可以在任何主流的(Windows,Linux或MacOS)平台和几乎任何机器上运行,但是要实现良好的帧速率,它需要一个好点的CPU或支持CUDA的显卡。

安装
安装时要确保包依赖关系都已安装好。

  1. 安装Anaconda(我推荐安装它的变种Miniconda)
  2. 从Gitlab复制TensorMouse
  3. 打开终端并导航到项目根目录
  4. conda env create -f environment.yml(Linux / MacOS)或conda env create -f environment-win.yml(Windows)
  5. source activate tensormouse(Linux / MacOS)或activate tensormouse(Windows)
  6. 运行TensorMouse

一旦安装了依赖项并激活环境,我们可以简单地运行TensorMouse:

python tensormouse.py

然后等待约10-20秒,会有绿色消息显示Tensormouse成功启动。

这将运行Tensormouse跟踪其默认对象—杯子。但是你可以通过提供可选参数(obect=”OBJECTNAME”)使其与80个COCO数据集对象中的任意一个配合使用。

你还可以使用CTRL和ALT执行点击和拖动。

使用说明

  • 确保光线充足(Tensormouse在光线不好的情况下表现欠佳)
  • 需要对象保持与摄像头的距离,既不能太近导致占用整个摄像头帧,也不能太远导致检测不到
  • 如果你的对象检测性能较差,请尝试运行应用程序设置让它来检测杯子,它检测杯子时还是挺准的

本文为编译作品,转载请注明出处。更多内容关注微信公众号:atyun_com

相关文章:

  • 《学习opencv》笔记——矩阵和图像操作——cvSetIdentity,cvSolve,cvSplit,cvSub,cvSubS and cvSubRS...
  • JSF导航规则
  • WebBrowser 安全
  • 四种LaunchMode及其使用场景
  • 常用命令及小技巧等
  • 探究redux源码-衍生-中间件思想
  • 内置方法(1)
  • MYSQL汇总
  • online
  • Visual Studio 15.4发布,新增多平台支持
  • 麦克阿瑟天才奖得主解码计算机视觉“原罪”:AI 如何认识人类世界
  • php 二维数组排序/对数组分组
  • php数组·的方法-数组检索
  • 软件选择的起点:目的与需求
  • Loadrunner视频教程汇总
  • ES6指北【2】—— 箭头函数
  • 【css3】浏览器内核及其兼容性
  • Bootstrap JS插件Alert源码分析
  • Java 内存分配及垃圾回收机制初探
  • js 实现textarea输入字数提示
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Promise面试题2实现异步串行执行
  • Vim Clutch | 面向脚踏板编程……
  • webpack+react项目初体验——记录我的webpack环境配置
  • 基于遗传算法的优化问题求解
  • 简单数学运算程序(不定期更新)
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我是如何设计 Upload 上传组件的
  • 小程序开发之路(一)
  • No resource identifier found for attribute,RxJava之zip操作符
  • NLPIR智能语义技术让大数据挖掘更简单
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • python最赚钱的4个方向,你最心动的是哪个?
  • 从如何停掉 Promise 链说起
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ZT)薛涌:谈贫说富
  • (超详细)语音信号处理之特征提取
  • (多级缓存)多级缓存
  • (二)springcloud实战之config配置中心
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (汇总)os模块以及shutil模块对文件的操作
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (十一)c52学习之旅-动态数码管
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (小白学Java)Java简介和基本配置
  • (转)母版页和相对路径
  • (转)一些感悟
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .java 9 找不到符号_java找不到符号
  • .Net 8.0 新的变化
  • .Net Core与存储过程(一)
  • .net Stream篇(六)