前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 SKIL 和 YOLO 构建产品级目标检测系统

使用 SKIL 和 YOLO 构建产品级目标检测系统

作者头像
AI研习社
发布2018-11-30 15:11:13
1.2K0
发布2018-11-30 15:11:13
举报
文章被收录于专栏:AI研习社AI研习社

本文为 AI 研习社编译的技术博客,原标题 : Building a Production Grade Object Detection System with SKIL and YOLO 翻译 | 三岁小孩、史帝夫•布朗 校对、整理 | 志豪 原文链接: https://blog.skymind.ai/building-a-production-grade-object-detection-system-with-skil-and-yolo/

在本文中,我们采用最新的神经网络实现目标检测,使用SKIL平台构建产品级目标检测系统。

建立一个产品级的计算机视觉系统很难,因为有很多因素需要考虑:

  • 我们如何构建网络来进行预测?
  • 我们以什么方式存储模型以便可以更新或回退旧版本?
  • 随着客户的需求增长,我们如何提供模型预测?

除此之外,我们需要考虑在实际中使用来目标检测系统带来复杂结果的情况。

本文将引导您完成整个开发周期,并为您提供可以根据自己的目标,进行修改的程序。 它还将让您了解以下技术:

  • SKIL的原生TensorFlow模型导入功能
  • 使用计算机视觉目标检测程序

现在让我们深入研究计算机视觉和目标检测的基础知识。

什么是目标检测?

计算机视觉中的目标检测可以被定义为在图像中找到具有“零到多个目标”在每张图像中。 每个对象预测都有边界框和类别概率分布。

以下是最近的三篇关于目标检测的重要论文:

  1. Faster R-CNN
  2. SSD: Single Shot MultiBox Detector
  3. YOLO ("You Only Look Once") v2

以前的方法处理类似任务的包括Haar Cascades,但与这些新方法相比,这种方法要慢得多。我们将重点关注下面的YOLO v2网络。

使用YOLO网络,我们将单个神经网络应用于完整图像。该网络将图像划分为区域并预测每个区域的边界框和概率。

这些边界框由预测概率加权,其中每个对象由具有四个变量的边界框标记:对象的中心(bx,by),矩形高度(bh),矩形宽度(bw)。

我们可以从头开始训练YOLO网络,但这需要大量的工作(以及昂贵的GPU时间)。作为工程师和数据科学家,我们希望尽可能多地利用预先构建的库和机器学习模型,因此我们将使用预先训练的YOLO模型,使我们的应用程序更快,更低成本地投入生产。

在 SKIL 的模型服务器上部署预训练模型

在之前的一篇Oreilly博客)上,我们谈论了如何:

整合神经网络模型和卷积神经网络模型到一个已经可以产品化的企业版应用中对于它本身而言是一个很大的挑战,已经从建模任务中分离开来了。

这个SKIL的平台被设计用来解决这里描述的一些问题。在这篇文章中,我们看一下如何借助SKIL来导入外部已经建立好的原生TensorFlow格式的模型,并且在SKIL模型服务器上使用这些模型来进行预测。

在这里,我们将使用原始作者的在COCO数据集上训练得到的YOLOv2模型。我们在这个例子中使用的YOLO模型设置的版本是基于我们在COCO数据集上训练的YOLOv2架构。它可以识别80种不同的类别。

权重取自以下链接,并列在YOLOv2 608x608下。

  • 权重
  • CFG

我们采用了这个模型并将其转换为TensorFlow格式(protobuff,.pb),以便将其导入SKIL进行推理服务。为了使本教程更简单,我们在Github repo上托管了转换后的模型,供用户下载。

部署实时的目标检测预测服务

机器学习从业者经常会很关心机器学习的建模方面,不会太关心涉及到将模型产品化来完成整个环节。在最一般的情况下,我们需要考虑到在机器学习建模和模型推理之间的区别,在模型训练后提供预测。

https://twitter.com/benhamner/status/674767904882057216

“真实世界中的机器学习系统中只有一小部分是由机器学习代码组成的...”

SKIL可以使得团队可以将不同的工作流分开,比如从部署推理服务中的建模过程。SKIL也可以使得运维工程师可以更加关注于管理横向扩展的模型推理服务,然后数据科学团队可以更加关注于通过进一步的训练来提升模型的性能。在推理方面,我们有3个主要的方法来部署推理服务:

  1. 经典的联机事物处理过程风格的单一交易推理请求贯穿整个网络(缓慢但是富有弹性)。
  2. 大规模的批量推理请求联机事物推理过程风格;比如使用保存在Spark中的HDFS中的一百万记录来进行推理,一条记录一次推理)。
  3. 一个客户端请求最近的模型的副本到本地缓存中,然后省去许多本地副本中的许多推理的网络需求。

在这个教程中,我们将关注最基础的推理类型,我们会构建一个基于REST 贯穿整个网络中的推理请求来获取远程客户端应用返回的预测结果。

将YOLO TensorFlow模型加载到SKIL模型服务器中

本节假设您已经设置了 SKIL 。如果不这样做,请查看我们的快速入门。) 现在我们可以登录SKIL并导入上面提到的TensorFlow protobuff(.pb)文件。

1.登录SKIL

2.选择左侧工具栏上的“部署”选项

3.单击“新部署”按钮

4.在新创建的部署屏幕的模型部分中,选择“导入”并找到我们创建的.pb文件

5.对于占位符选项:

  • 输入占位符的名称:“输入”(确保在输入名称后按“输入”)
  • 输出占位符的名称:“输出”(确保在输入名称后按“输入”)

6.点击“导入模型”

7.单击端点上的“开始”按钮

页面需要几秒钟才能报告端点已成功启动。页面将端点列为正在运行后,您将可以从页面上列出的端点访问该模型。端点URI看起来像:

代码语言:javascript
复制
http://localhost:9008/endpoints/tf2/model/yolo/default/

现在我们需要一个客户端应用程序来查询此端点并获得对象检测预测。

构建对象检测客户端应用程序

为了模拟一个真实的用例,我们已经包含了一个示例客户端应用程序,它不仅仅是对SKIL模型服务器进行REST调用。我们在下面的代码部分中显示了SKIL客户端代码的一些关键部分。

代码语言:javascript
复制
NativeImageLoader imageLoader = new NativeImageLoader(608, 608, 3, new ColorConversionTransform(COLOR_BGR2RGB));
        INDArray imgNDArrayTmp = imageLoader.asMatrix( imgMat );
        INDArray inputFeatures = imgNDArrayTmp.permute(0, 2, 3, 1).muli(1.0 / 255.0).dup('c');

        String imgBase64 = Nd4jBase64.base64String( inputFeatures );
        Authorization auth = new Authorization();
        long start = System.nanoTime();
        String auth_token = auth.getAuthToken( "admin", "admin" );
        long end = System.nanoTime();
        System.out.println("Getting the auth token took: " + (end - start) / 1000000 + " ms");

        System.out.println( "Sending the Classification Payload..." );
        start = System.nanoTime();
        try {

            JSONObject returnJSONObject = 
                    Unirest.post( skilInferenceEndpoint + "predict" )
                            .header("accept", "application/json")
                            .header("Content-Type", "application/json")
                            .header( "Authorization", "Bearer " + auth_token)
                            .body(new JSONObject() //Using this because the field functions couldn't get translated to an acceptable json
                                    .put( "id", "some_id" )
                                    .put("prediction", new JSONObject().put("array", imgBase64))
                                    .toString())
                            .asJson()
                            .getBody().getObject(); //.toString(); 

            try {

                returnJSONObject.getJSONObject("prediction").getString("array");

            } catch (org.json.JSONException je) { 

                System.out.println( "\n\nException\n\nReturn: " + returnJSONObject );
                return;

            }

            end = System.nanoTime();
            System.out.println("SKIL inference REST round trip took: " + (end - start) / 1000000 + " ms");


            String predict_return_array = returnJSONObject.getJSONObject("prediction").getString("array");
            System.out.println( "REST payload return length: " + predict_return_array.length() );
            INDArray networkOutput = Nd4jBase64.fromBase64( predict_return_array );

此示例的SKIL 客户端代码将执行以下任务:

  1. 使用SKIL进行身份验证并获取令牌
  2. Base64编码我们想要预测的图像
  3. 获取auth令牌和base64图像字节,并通过REST将它们发送到SKIL进行推理
  4. Base64解码从SKIL模型服务器返回的结果
  5. 应用TensorFlow模型所需的后推理激活函数(通过YoloUtils类)(特别是)
  6. 在原始图像上渲染输出边界框,如下所示

对于SKIL模型服务器中托管的普通DL4J和Keras模型,我们不必应用后推理激活函数。但是,TensorFlow网络不会自动将激活功能应用于最终层。要完成此示例,我们必须使用提供的 YoloUtils 类方法在客户端代码中应用这些激活函数。

使用以下命令克隆此repo以获取包含的YOLOv2示例应用程序,该应用程序将检索预测并在本地呈现边界框:

代码语言:javascript
复制
git clone git@github.com:SkymindIO/SKIL_Examples.git

然后我们需要专门构建YOLOv2客户端应用程序JAR文件:

代码语言:javascript
复制
cd skil_yolo2_app/client_app
mvn -U package

这将构建一个 skil-example-yolo2-tf-1.0.0.jar 在 ./target 子目录的 client_app/ 子目录中命名的JAR文件。

现在我们有了一个客户端应用程序JAR,我们可以从命令行运行yolo2客户端JAR:

代码语言:javascript
复制
java -jar ./target/skil-example-yolo2-tf-1.0.0.jar --input https://raw.githubusercontent.com/tejaslodaya/car-detection-yolo/master/images/0012.jpg --endpoint http://localhost:9008/endpoints/tf2/model/yolo/default/

说明

  • --input 可以是您选择的任何输入图像(带有file://前缀的本地文件,或带有http://前缀的Internet URI的图像文件)
  • --endpoint parameter是导入TF .pb文件时创建的端点

使用此命令的一个示例是:

代码语言:javascript
复制
java -jar ./target/skil-example-yolo2-tf-1.0.0.jar --input https://raw.githubusercontent.com/tejaslodaya/car-detection-yolo/master/images/0012.jpg --endpoint http://localhost:9008/endpoints/tf2/model/yolo/default/

这个repo将构建一个名为“skil-example-yolo2-tf-1.0.0.jar”的JAR,以便我们可以从命令行运行yolo2客户端JAR:

代码语言:javascript
复制
java -jar ./target/skil-example-yolo2-tf-1.0.0.jar --input [image URI] --endpoint [SKIL Endpoint URI]

此客户端应用程序将允许我们获取任何图像的预测,并在图像上呈现边界框+分类以及在上图中看到。

总结和未来的想法

YOLO演示非常有趣,可以发送您自己的图像以查看它可以选择的内容。如果要引用本地文件系统上的文件,只需在URI中替换 http:// ,file://

如下例所示:

代码语言:javascript
复制
java -jar ./target/skil-example-yolo2-tf-1.0.0.jar --input file:///tmp/beach.png --endpoint [SKIL Endpoint URI]

你会看到YOLO非常善于挑选出微妙的物体,正如我们在下面复杂的街景中所看到的那样。

要了解有关YOLO如何工作的更多信息以及您可以在SKIL上使用它构建的其他内容,请查看以下资源:

理解对象检测中的边界框机制(又名“理解YOLO输出”)

http://christopher5106.github.io/object/detectors/2017/08/10/bounding-box-object-detectors-understanding-yolo.html

针对特定用例进一步培训(专业)YOLO的更多示例:

https://github.com/experiencor/basic-yolo-keras

利用Tiny-YOLO网络构建视频检测系统

http://ramok.tech/2018/01/18/java-autonomous-driving-car-detection/


想要继续查看该篇文章相关链接和参考文献?

戳链接:

http://ai.yanxishe.com/page/TextTranslation/1051

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

本文分享自 AI研习社 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是目标检测?
  • 在 SKIL 的模型服务器上部署预训练模型
  • 部署实时的目标检测预测服务
  • 将YOLO TensorFlow模型加载到SKIL模型服务器中
  • 构建对象检测客户端应用程序
  • 总结和未来的想法
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档