专栏首页大龄程序员的人工智能之路使用TensorFlow一步步进行目标检测(5)

使用TensorFlow一步步进行目标检测(5)

本教程进行到这一步,您选择了预训练的目标检测模型,转换现有数据集或创建自己的数据集并将其转换为TFRecord文件,修改模型配置文件,并开始训练模型。接下来,您需要保存模型并将其部署到项目中。

将检查点模型(.ckpt)保存为.pb文件

回到TensorFlow目标检测文件夹,并将export_inference_graph.py文件复制到包含模型配置文件的文件夹中。

python export_inference_graph.py --input_type image_tensor --pipeline_config_path ./rfcn_resnet101_coco.config --trained_checkpoint_prefix ./models/train/model.ckpt-5000 --output_directory ./fine_tuned_model

这将创建一个新目录fine_tuned_model,里面名为frozen_inference_graph.pb的模型就是您训练出来的模型。

在项目中使用模型

我在本教程中一直在研究的项目是创建一个红绿灯分类器。在Python中,我将此分类器实现为一个类。 在类的初始化部分,我创建了一个TensorFlow会话,这样就不需要在每次需要分类时创建它。

class TrafficLightClassifier(object):
   def __init__(self):
       PATH_TO_MODEL = 'frozen_inference_graph.pb'
       self.detection_graph = tf.Graph()
       with self.detection_graph.as_default():
           od_graph_def = tf.GraphDef()
           # Works up to here.
           with tf.gfile.GFile(PATH_TO_MODEL, 'rb') as fid:
               serialized_graph = fid.read()
               od_graph_def.ParseFromString(serialized_graph)
               tf.import_graph_def(od_graph_def, name='')
           self.image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
           self.d_boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
           self.d_scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
           self.d_classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
           self.num_d = self.detection_graph.get_tensor_by_name('num_detections:0')
       self.sess = tf.Session(graph=self.detection_graph)

在该类中,我创建了一个函数,该函数对图像进行分类,并返回图像中分类的边界框、分数和类别。

def get_classification(self, img):
   # Bounding Box Detection.
   with self.detection_graph.as_default():
       # Expand dimension since the model expects image to have shape [1, None, None, 3].
       img_expanded = np.expand_dims(img, axis=0)  
       (boxes, scores, classes, num) = self.sess.run(
           [self.d_boxes, self.d_scores, self.d_classes, self.num_d],
           feed_dict={self.image_tensor: img_expanded})
   return boxes, scores, classes, num

此时,您需要过滤低于指定分数阈值的结果。结果会自动从最高分数到最低分数排序,因此这很容易实现。通过上面的函数返回分类结果,就是这样,您做到了!

您可以在下图中看到我实现的红绿灯分类器。

我最初创建本教程是因为我很难找到有关如何使用Object Detection API的资讯。我希望通过阅读本教程,您可以启动项目,让项目快速实现,这样您可以将更多时间集中在您真正感兴趣的内容上!

相关文章

  1. 使用TensorFlow一步步进行目标检测(1)
  2. 使用TensorFlow一步步进行目标检测(2)
  3. 使用TensorFlow一步步进行目标检测(3)
  4. 使用TensorFlow一步步进行目标检测(4)

本文分享自微信公众号 - 云水木石(ourpoeticlife),作者:云水木石

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何将自己开发的模型转换为TensorFlow Lite可用模型

    对于开发者来说,在移动设备上运行预先训练好的模型的能力意味着向边界计算(edge computing)迈进了一大步。[译注:所谓的边界计算,从字面意思理解,就是...

    云水木石
  • [机器学习实战札记] NumPy基础

    <<机器学习实战>>一书非常注重实践,对每个算法的实现和使用示例都提供了python实现。在阅读代码的过程中,发现对NumPy有一定的了解有助于理解代码。特别是...

    云水木石
  • 使用Google AI Open Images进行对象检测

    作者:Atindra Bandi, Alyson Brown, Sagar Chadha, Amy Dang, Jason Su,翻译:云水木石

    云水木石
  • Clojure 学习入门(13)—— binding

    Clojure里面是不支持变量的。Binding跟变量有点像,但是在被赋值之前是不允许改的,包括:全局binding, 线程本地(thread local)bi...

    阳光岛主
  • FME转换器介绍之(二)

    做数据处理,经常要在各个平台转来转去的。在从一个平台转向另一个平台进行处理的时候,就涉及到数据如何在平台中进行交换的问题了。在平台之间,可以使用如SHP、TAB...

    数据处理与分析
  • 2018,如何从小白升级到大牛程序员呢?

    关键时刻,第一时间送达! KS Knowledge Sharing 知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与...

    企鹅号小编
  • 2018,如何从小白升级到大牛程序员呢?

    写在前面 2017已经悄悄的走了,2018也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来。俗话说一年之计在于春,虽说距立春还有一个多月,我觉...

    互扯程序
  • 科学瞎想系列之五十五 绝缘处理

    搞电机的宝宝们都知道,绝缘处理是电机制造非常关键的环节,电机常见的绝缘处理工艺有浸渍烘焙、绝缘浇注、多胶系统的模压固化等。其中绝缘浇注多用于微特电机; 多胶系...

    标准答案
  • Python使用numpy和pandas模拟转盘抽奖游戏

    之前写过一个类似的代码,不过都是用的Python内置对象,详见几行Python代码模拟轮盘抽奖游戏,本文再提供一个使用numpy和pandas实现的代码。 问题...

    Python小屋屋主
  • 重磅译制 | 更新:MIT 6.S094自动驾驶课程第3讲(1)卷积神经网络

    大数据文摘

扫码关注云+社区

领取腾讯云代金券