Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Tensorflow对象检测在安卓手机上“寻找”皮卡丘

使用Tensorflow对象检测在安卓手机上“寻找”皮卡丘

作者头像
AiTechYun
发布于 2018-03-06 05:54:26
发布于 2018-03-06 05:54:26
2.2K00
代码可运行
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
运行总次数:0
代码可运行

在TensorFlow的许多功能和工具中,隐藏着一个名为TensorFlow对象探测API(TensorFlow Object Detection API)的组件。正如它的名字所表达的,这个库的目的是训练一个神经网络,它能够识别一个框架中的物体。这个库的用例和可能性几乎是无限的。它可以通过训练来检测一张图像上的猫、汽车、浣熊等等对象。本文将用它来实现皮卡丘的检测。

  • TensorFlow对象检测API:https://github.com/tensorflow/models/tree/master/research/object_detection

本文的目的是描述我在训练自己的自定义对象检测模型时所采取的步骤,并展示我的皮卡丘检测技能,以便你可以自己尝试。首先,我将从程序包的介绍开始。其次,我将继续讨论如何将我的皮卡丘图像转换为正确的格式并创建数据集。然后,我将尽可能详细地写关于训练的过程,以及如何评估它。最后,我将演示如何在Python notebook中使用该模型,以及将其导出到安卓手机的过程。

  • 我在这个项目中使用的代码:https://github.com/juandes/pikachu-detection

在应用中的检测的屏幕截图

Tensorflow对象检测API

这个程序包是TensorFlow对对象检测问题的响应——也就是说,在一个框架中检测实际对象(皮卡丘)的过程。它的独特之处在于它能够准确地记录速度和内存使用情况(反之亦然),因此你可以根据你的需要和你的选择平台(手机)来调整模型。这个库包含了许多不被发现的对象检测架构,如SSD(Single Shot MultiBox Detector)、Faster R-CNN(Faster Region-based Convolutional Neural Network)和R-FCN(Region-based Fully Convolutional Networks),以及一些特征提取器,如MobileNet、Inception和Resnet;这些提取器是非常重要的,因为它们在系统的速度/性能平衡中扮演了重要的角色。

此外,该库还提供了一些已经准备好的用于检测的模型,在Google Cloud中进行训练的选项,再加上TensorBoard的支持来监控训练。

既然我们已经了解了这个实验所使用的系统,我将继续解释如何构建你自己的自定义模型。

构建自己的自定义模型

安装 在我们开始之前,请确保你的计算机上安装了TensorFlow。接下来,clone包含对象检测API的repo,链接如下:

  • https://github.com/tensorflow/models

找到“research”目录并执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.

这个过程编译了Protobuf库。

Protobuf下载地址:https://developers.google.com/protocol-buffers/docs/downloads

最后,你需要将库添加到PYTHONPATH中。可以通过执行下面的命令来完成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

有关所需的所有依赖项的更多细节:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md

现在来看看我是如何从许多皮卡丘图像到一个由TensorFlow读取的数据集。

创建数据集并处理图像 创建数据集是成功训练模型所需的众多步骤中的第一步,在本节中,我将介绍完成此任务所需的所有步骤。对于这个项目,我将230个中等大小的皮卡丘的图片下载到一个名为“images”的目录中。为了得到更好的结果,我试图从图像中获得不同角度和形状的皮卡丘,但老实讲,皮卡丘是一个不存在的黄色长耳的小老鼠,所以很难找到大量的合适的图像。

一些被使用的图像

一旦你获得了所有的图像,下一步就是对它们进行标记。这是什么意思? 因为我们在做对象检测,所以我们需要一个关于物体到底是什么的基本事实。为此,我们需要在对象周围画一个边框,让系统知道边框里面的“东西”是我们想要学习的实际对象。我用于这个任务的软件是一个叫RectLabel的Mac应用。

  • RectLabel:https://rectlabel.com/

这就是一个带有边框的图像的样子:

愤怒的皮卡丘。被一个边框包围着

在RectLabel中,你需要为你的图像的每个边框设置一个标签,在我的例子中,标签是“Pikachu”。一旦你对所有图像进行了标记,你就会注意到你有一个名为“annotations”的目录,其中有许多XML文件用来描述每个图像的边框。

分成训练和测试数据集 一旦所有的图像都被贴上了标签,我的下一步就是将数据集分解成一个训练和测试数据集。在图像所在的同一个目录中,我创建了一个名为“train”和“test”的目录,并将大约70%的图像和它们各自的XML添加到“train”目录,剩下的30%添加到“test”目录。

生成TFRECORD 在数据集的分离之后,唯一缺少的是将我们的图像和它们的XML转换成一个由TensorFlow可读的格式。这种格式被称为“tfrecord”,并且从我们的图像中生成它,需要两个步骤。首先,为了简单起见,两组XML(训练和测试)的数据都被转换为两个CSV文件(再一次,训练和测试),使用的是修改版本的xml_to_csv.py代码。

  • 代码地址:https://github.com/datitran/raccoon_dataset

然后,使用CSV文件,tfrecord数据集是使用脚本generate_tfrecord.py创建的(该脚本也能从上面的代码地址中找到)。请记住,在运行脚本之前,必须在函数class_text_to_int中指定对象的类。

创建标签映射 需要一个“labels”映射,指示标签及其索引。下面就是他们的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
item {
  id: 1
  name: 'Pikachu'
}

将“Pikachu”标签替换为你想用的标签,并且重要的是,总是从index 1开始,因为index 0是预留的。我将这个文件在一个名为“training”的新目录下保存为object-detection.pbtxt。

训练模型

管道(The Pipeline) 完整的训练过程由一个称为“pipeline”的配置文件来处理。管道被划分为五个主要结构,负责定义模型、训练和评估过程参数,以及训练和评估数据集的输入。这条管道的架构是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model {
(... Add model config here...)
}

train_config : {
(... Add train_config here...)
}

train_input_reader: {
(... Add train_input configuration here...)
}

eval_config: {
}

eval_input_reader: {
(... Add eval_input configuration here...)
}

但是!你不必从头开始编写(write)整个管道。事实上,TensorFlow开发人员建议训练应该使用他们自己的和已经训练过的模型作为起点。这背后的原因是从头开始训练一个全新的模型可能需要相当长的时间。因此,TensorFlow提供了几个配置文件(下方),只需要很少的更改就可以使其在新的训练环境中工作。我使用的模型是ssd_mobilenet_v1_coco_11_06_2017。

  • 配置文件:https://github.com/tensorflow/models/tree/master/research/object_detection/samples/configs
  • ssd_mobilenet_v1_coco_11_06_2017模型:http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_11_06_2017.tar.gz

在我的训练中,我使用了配置文件ssd_mobilenet_v1_pets.config作为一个起点。因为我的类的数量只有一个,所以我改变了变量num_classes。num_steps停止训练前,fine_tune_checkpoint指向模型下载的位置,还有train_input_reader和eval_input_reader的变量input_path和label_map_path指向训练和测试数据集与标签映射。

  • ssd_mobilenet_v1_pets.config:https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_mobilenet_v1_pets.config

我不会细讲配置文件的每一个细节,不过,我想解释一下SSD和MobileNet是什么意思。SSD是一种基于单一前馈神经网络的神经网络结构。它被称为“single shot”,因为它可以预测图像的类和在同一步骤中表示检测(称为anchor)的边框的位置。与此相反的是一个架构,它需要一个称为“proposal generator”的第二个组件来预测该框的确切位置。

MobileNet是一个卷积特征提取器,用于在移动设备上工作,用于获取图像的高级特征。一旦准备好了管道,就把它添加到“training”目录中。然后,继续使用下面的命令开始训练:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python object_detection/train.py --logtostderr 
--train_dir=path/to/training/ 
--pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config

在训练期间和之后评估模型 这个库提供了在训练期间和之后评估模型所需的代码。每次训练产生一个新的检查点时,评估工具将使用给定目录中可用的图像进行预测(在我的例子中,我使用了来自测试集中的图像)。要运行评估工具,执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python object_detection/eval.py --logtostderr 
--train_dir=path/to/training/ 
--pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config 
--checkpoint_dir=path/to/training/ --eval_dir=path/to/training/

TensorBoard 通过TensorFlow的可视化平台TensorBoard,可以看到训练和评估阶段的结果。在这里,我们可以监控一些指标,如训练时间、总损失、步骤数等等。很酷的一点是,当模型被训练的时候,TensorBoard也可以工作,这是一个很好的工具,可以确保训练的方向是正确的。

要执行TensorBoard,请执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tensorboard --logdir=path/to/training/

导出模型

训练完成后,下一步是导出模型,以便可以使用它。为了执行这一步,该库提供了名为export_inference_graph.py的脚本。

在导出之前,请确保你在训练目录中有以下文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.ckpt-${CHECKPOINT_NUMBER}.data-00000-of-00001,
model.ckpt-${CHECKPOINT_NUMBER}.index
model.ckpt-${CHECKPOINT_NUMBER}.meta

你可能有几个具有相同格式的文件,但是使用不同的检查点数量。因此,只需选择所需的检查点,并执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python object_detection/export_inference_graph.py 
--input_type image_tensor 
--
pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config 
--trained_checkpoint_prefix=path/to/training/model.ckpt-xxxxx 
--output_directory path/to/output/directory

输出将是一个文件,该文件包含一个叫做frozen_inference_graph.pb模型的“冻结(frozen)”版本。

结果

在训练阶段结束时,该模型的精确度为87%,总损失为0.67。然而,在训练过程中,模型的精确度最高达到了95%。尽管如此,精确度最高的模型并没有达到我预期设想的结果。例如,它将许多黄色物体(甚至一些人)归类为皮卡丘。另一方面,我注意到,精确度为87%的模型产生的假阳性结果较少,因而忽略了一些皮卡丘。下面的图片是由TensorBoard制作的总损失和精确度图表。

精确度指标

TensorBoard还会自动评估评估集的一些图像。它真正的好处是,通过使用一个滑块(slider),你可以看到预测的置信(confidence)是如何根据模型的检查点的变化而变化的。

更多的皮卡丘。这种检测是在TensorBoard中进行的

图像检测包包括一个notebook,用来测试TensorFlow提供的预先训练过的模型。然而,这个notebook可以被修改为使用自定义训练模型的frozen版本(我们导出的版本),所以我就这样做了。

  • notebook地址:https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb

下面,你可以看到一些在notebook上的发现。

皮卡丘在锻炼

皮卡丘和lil bro

人类装扮成皮卡丘。没有被检测到

在安卓手机上检测皮卡丘

到目前为止,我们已经对模型进行了训练,并对其进行了评估。现在是时候把它导入安卓手机中了,这样我们就可以用手机摄像头来检测皮卡丘了。然而,这个部分是非常复杂的,所以我会尽可能详细地解释主要步骤。但是,我确信你们中有些人在进行这个操作时会有一些问题,所以如果我的指导不能够帮到你们,我想先道歉。

让我们转到TensorFlow的安卓部分。首先,你需要下载Android Studio。然后,clone上面的提到的TensorFlow的repo,并使用你刚刚clone的TensorFlow的repo中的目录在Android Studio中导入一个的新项目,叫做“Android”。

  • Android Studio下载地址: https://developer.android.com/studio/index.html
  • Android项目:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android

作为补充说明,我还建议通过README对库进行熟悉。README建议将构建变得最简单,并建议将Gradle(一个基于Apache Ant和Apache Maven概念的项目自动化构建工具)构建的nativeBuildSystem变量改变为零,然而,我将其更改为cmake来构建它(没有任何其他的替代方案)。

构建完成后,下一步是将frozen模型添加到“assets”目录中。然后,在那里的文件夹中,创建一个名为“labels”的文件,在第一行中写入???(还记得我说过第一个类是被预留的吗?),在第二行中,写上你的对象的标签(在我的例子中,我的标签为“Pikachu”)。

然后,打开位于“java”目录中的名为“DetectionActitivity.java”的文件;这是应用程序用来执行探测的代码。查找变量TF_OD_API_MODEL_FILE和TF_OD_API_LABELS_FILE,并且在第一个文件中,将其值更改为位于“assets”文件夹中的frozen模型的路径,然后在第二个文件中写入带有标签的文件路径。你应该知道的另一个有用的变量是MINIMUM_CONFIDENCE_TF_OD_API,它是跟踪检测所需的最低置信。

现在我们准备好了! 点击“run”按钮,选择你的安卓设备,然后等待几秒钟,直到该应用安装在手机上。需要注意的一个重要的细节:不是一个,而是四个应用将安装在手机上,然而,我们所包含的检测模型是TF Detect。如果一切顺利的话,应用启动,找到你的对象的一些图片,看看这个模型是否能够检测到它们。以下是我在手机上做的一些检测:

穿着和服的皮卡丘

几个皮卡丘。其中大部分没有被检测到

总结和回顾

在本文中,我解释了使用TensorFlow对象检测库来训练自定义模型的所有必要步骤。在开始的时候,我提供了一些关于这个库的背景信息以及它是如何工作的,接下来是关于如何标记、处理和图像来生成数据集的指南。后来,我把注意力集中在如何进行训练上。在这一节中,我谈到了训练管道,如何使用TensorBoard来评估模型。然后,一旦训练完成,我就完成了导出模型并导入Python notebook和安卓手机的过程。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用 TensorFlow 目标检测 API 发现皮卡丘!
在 TensorFlow 众多功能和工具中,有一个名为 TensorFlow 目标检测 API 的组件。这个库的功能正如它的名字,是用来训练神经网络检测视频帧中目标的能力,比如,一副图像。
AI研习社
2018/07/26
8530
用 TensorFlow 目标检测 API 发现皮卡丘!
TensorFlow:使用Cloud TPU在30分钟内训练出实时移动对象检测器
是否能够更快地训练和提供对象检测模型?我们已经听到了这种的反馈,在今天我们很高兴地宣布支持训练Cloud TPU上的对象检测模型,模型量化以及并添加了包括RetinaNet和MobileNet改编的RetinaNet在内的新模型。本文将引导你使用迁移学习在Cloud TPU上训练量化的宠物品种检测器。
AiTechYun
2018/07/27
4.4K0
TensorFlow:使用Cloud TPU在30分钟内训练出实时移动对象检测器
深度学习入门篇--手把手教你用 TensorFlow 训练模型
该文介绍了如何使用TensorFlow实现YOLO v2神经网络模型对图像进行分类,并给出了代码示例和训练过程的详细步骤。
付越
2017/10/16
9.9K2
深度学习入门篇--手把手教你用 TensorFlow 训练模型
[Tensorflow] 使用SSD-MobileNet训练模型
因为Android Demo里的模型是已经训练好的,模型保存的label都是固定的,所以我们在使用的时候会发现还有很多东西它识别不出来。那么我们就需要用它来训练我们自己的数据。下面就是使用SSD-MobileNet训练模型的方法。
wOw
2018/09/18
14K3
tensorflow object detection API使用之GPU训练实现宠物识别
之前写过几篇关于tensorflow object detection API使用的相关文章分享,收到不少关注与鼓励,所以决定再写一篇感谢大家肯定与支持。在具体介绍与解释之前,首先简单说一下本人测试与运行的系统与软件环境与版本
OpenCV学堂
2019/11/13
2.4K1
Python 数据科学入门教程:TensorFlow 目标检测
你好,欢迎阅读 TensorFlow 目标检测 API 迷你系列。 这个 API 可以用于检测图像和/或视频中的对象,带有使用边界框,使用可用的一些预先训练好的模型,或者你自己可以训练的模型(API 也变得更容易)。
ApacheCN_飞龙
2022/12/01
1.5K0
Python 数据科学入门教程:TensorFlow 目标检测
使用Tensorflow进行实时移动视频对象检测
随着对计算机视觉的用例日益增长的兴趣,例如无人驾驶汽车,面部识别,智能交通系统等,人们希望建立定制的机器学习模型以检测和识别特定对象。
代码医生工作室
2019/10/10
2.4K0
使用Tensorflow进行实时移动视频对象检测
2.运行一个demo
在 Object Detection API 的示例代码中包含了一个训练识别宠物的 Demo,包括数据集和相应的一些代码。虽然本课程中我们会自己准备数据和脚本来进行训练,但是在这之前还需要安装一些库、配置一下环境。在配置完成之后,运行一下这个训练宠物的 Demo,以便检查环境配置是否 OK,同时对训练过程先有个整体的了解,然后再准备自己的数据和训练脚本。 请确保已经安装好了 Python 2.7。 安装 Object Detection API 首先下载 Object Detection API 的代码:
刘盼
2018/03/16
9140
2.运行一个demo
视频识别训练2.3(实现TensorFlow视频识别)
大家好,又见面了,我是你们的朋友全栈君。 盯住梅西:TensorFlow目标检测实战 https://baijiahao.baidu.com/s?id=1581115075233058548&wfr=
全栈程序员站长
2022/09/02
1.2K0
【教程】利用Tensorflow目标检测API确定图像中目标的位置
深度学习提供了另一种解决“Wally在哪儿”(美国漫画)问题的方法。与传统的图像处理计算机视觉方法不同的是,它只使用了少量的标记出Wally位置的示例。 在我的Github repo上发布了具有评估图像和检测脚本的最终训练模型。 Github repo地址:https://github.com/tadejmagajna/HereIsWally 这篇文章描述了使用Tensorflow目标检测API来训练神经网络的过程,并使用围绕它构建的Python脚本来寻找Wally。它由以下步骤组成: 通过创建一组标记训练
AiTechYun
2018/03/06
2.7K0
【教程】利用Tensorflow目标检测API确定图像中目标的位置
tensorflow object detection API 详细实践教程
最近由于研究方向的更换,接触到了目标检测(Object Detection)领域,觉得很有意思,并且阅读了该方向的相关经典文献,包括Fast-RCNN、Faster-RCNN、SSD、YOLO以及RetinaNet等。复现别人代码并且能够得到在公开数据集上和原作者相近甚至相同的实验结果对于我们做研究甚至以后的工作来说是至关重要的。
狼啸风云
2022/06/06
7070
tensorflow object detection API 详细实践教程
如何用TensorFlow和Swift写个App识别霉霉?
在很多歌迷眼里,尤其是喜欢乡村音乐的人,“霉霉”Taylor Swift是一位极具辨识度也绝对不能错过的女歌手。在美国硅谷就有一位非常喜欢 Taylor Swift 的程序媛 Sara Robinson,同时她也是位很厉害的 APP 开发者。喜爱之情难以言表,于是利用机器学习技术开发了一款iOS 应用,可以随时随地识别出 Taylor Swift~~~
猿哥
2019/07/25
13.4K0
教程 | 盯住梅西:TensorFlow目标检测实战
选自Medium 作者:Nicolas Bortolotti 机器之心编译 参与:黄小天、路雪 近日,一篇题为《Following Messi with TensorFlow and Object Detection》的教程文章展示了如何通过 TensorFlow 训练定制的目标检测模型,以专门定位和识别足球巨星梅西;同时作者也希望这一技术有助于催生出足球新战术,提升赛事水平。 我们之前曾把 TensorFlow 与目标检测模型结合使用,但使用的一直是预先设定的传统数据集,比如 COCO。这次的挑战将再高
机器之心
2018/05/08
9820
教程 | 盯住梅西:TensorFlow目标检测实战
TensorFlow 智能移动项目:1~5
本章介绍如何设置开发环境,以使用 TensorFlow 构建所有 iOS 或 Android 应用,本书其余部分对此进行了讨论。 我们不会详细讨论可用于开发的所有受支持的 TensorFlow 版本,OS 版本,Xcode 和 Android Studio 版本,因为可以在 TensorFlow 网站或通过 Google。 相反,我们将在本章中简要讨论示例工作环境,以便我们能够快速了解​​可使用该环境构建的所有出色应用。
ApacheCN_飞龙
2023/04/24
4.8K0
构建对象检测模型
我喜欢深度学习。坦率地说,这是一个有大量技术和框架可供倾注和学习的广阔领域。当我看到现实世界中的应用程序,如面部识别和板球跟踪等时,建立深度学习和计算机视觉模型的真正兴奋就来了。
磐创AI
2020/07/24
1.3K0
构建对象检测模型
使用TensorFlow一步步进行目标检测(4)
到目前为止,我们已选择了预训练模型,找到了现成数据集,也创建了自己的数据集,并将其转换为TFRecord文件。 接下来,我们开始训练模型。
云水木石
2019/07/01
5350
自定义对象检测问题:使用TensorFlow追踪星球大战中的千年隼号宇宙飞船
大多数的大型科技公司(如IBM,谷歌,微软,亚马逊)都有易于使用的视觉识别API。一些规模较小的公司也提供类似的产品,如Clarifai。但没有公司能够提供对象检测。 千年隼号宇宙飞船的检测 以下图
AiTechYun
2018/03/05
1.2K0
自定义对象检测问题:使用TensorFlow追踪星球大战中的千年隼号宇宙飞船
目标检测_1
注:上编的路径尽量使用绝对路径,不要使用相对路径和~符号 可能报错 生成frozen_inference_graph.pb文件 及其他文件
Dean0731
2020/05/08
5370
TensorFlow小程序探索实践
最近业余时间做些创新探索,在微信小程序上实现找到纸或笔记本,定位,然后取到纸上的简笔画,之后进行简笔画识别,找到对应位置(之后可以在此位置上加载对应3d模型,实现ar效果, 对应ar官方案例:https://github.com/bbSpider/miniprogramThree)
EchoROne
2022/12/29
2.1K0
TensorFlow小程序探索实践
Tensorflow 迁移学习 识别中国军网、中国军视网Logo水印
作者bourdakos1整合了tensorflow中的object-detection和slim两个子项目。 设置环境,把当前目录、slim、object_detection 三个目录加到环境变量PYTHONPYTHON。
birdskyws
2018/09/12
1.5K0
Tensorflow 迁移学习 识别中国军网、中国军视网Logo水印
推荐阅读
相关推荐
用 TensorFlow 目标检测 API 发现皮卡丘!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验