内有赠书结果 | 使用 SKIL 和 YOLO 构建产品级目标检测系统

2018 年 10 月 26 日 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看起来像:

http://localhost:9008/endpoints/tf2/model/yolo/default/

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


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

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

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示例应用程序,该应用程序将检索预测并在本地呈现边界框:

git clone git@github.com:SkymindIO/SKIL_Examples.git

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

cd skil_yolo2_app/client_app
mvn -U package

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

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

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文件时创建的端点

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

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:

java -jar ./target/skil-example-yolo2-tf-1.0.0.jar --input [image URI] --endpoint [SKIL Endpoint URI]

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


  总结和未来的想法

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

如下例所示:

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

(你没看错,我们已更换为全新域名【ai.yanxishe.com】啦)

今日资源推荐

吴恩达《Machine Learning Yearning》机器学习要领

作为人工智能圈的红人,除了推动已有的机器学习知识落地、帮助在校学生们学习,吴恩达教授自然还有一项重要的使命,就是让更多的人了解机器学习的力量,接受“这种新科技真的可以给你带来更多力量”的观念。 这本书就是这个使命的阐释:它并不是一本传统的、学院式的机器学习教科书,而是把重要理论的介绍、实践技能的介绍、机器学习项目总体开发思考的融汇贯通。 我曾经见过一个比喻:现实世界的问题都是螺丝钉,而深度学习是一把锤子。当我们找不到螺丝刀(非常贴切的解决方案)的时候,我们就用锤子砸螺丝钉(用深度学习硬上)。显然这是讽刺深度学习并不能完善地解决一切 —— 不过,要是连这把锤子都用不好,那还谈什么别的呢?

下载链接:http://ai.yanxishe.com/page/resourceDetail/613


想要获取更多AI领域相关学习资源,可以访问AI研习社资源板块下载,

所有资源目前一律限时免费,欢迎大家前往社区资源中心

http://www.gair.link/page/resources)下载喔~



开奖时间:

恭喜以下五位朋友获得AI研习社联合机械工业出版社华章科技送出的书籍一本,工作人员已进行联系,请注意物流信息。感谢大家的支持,AI研习社以后还会推出更多福利活动等待你的参与!



全球AI+智适应教育峰会

 

免费门票开放申请!

雷锋网联合乂学教育松鼠AI以及IEEE教育工程和自适应教育标准工作组,于11月15日在北京嘉里中心举办全球AI+智适应教育峰会。美国三院院士、机器学习泰斗Michael Jordan、机器学习之父Tom Mitchell已确认出席,带你揭秘AI智适应教育的现在和未来。

扫码免费注册

登录查看更多
2

相关内容

Yolo算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,You Only Look Once说的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而Real-Time体现是Yolo算法速度快。
深度学习目标检测方法及其主流框架综述
专知会员服务
147+阅读 · 2020年6月26日
专知会员服务
31+阅读 · 2020年4月24日
【CVPR2020-谷歌】多目标(车辆)跟踪与检测框架 RetinaTrack
专知会员服务
44+阅读 · 2020年4月10日
KGCN:使用TensorFlow进行知识图谱的机器学习
专知会员服务
81+阅读 · 2020年1月13日
密歇根大学《20年目标检测综述》
专知会员服务
98+阅读 · 2019年10月13日
基于手机系统的实时目标检测
计算机视觉战队
8+阅读 · 2018年12月5日
理解 YOLO 目标检测
AI研习社
21+阅读 · 2018年11月5日
从零开始PyTorch项目:YOLO v3目标检测实现
机器之心
14+阅读 · 2018年4月23日
YOLO升级到v3版,检测速度比R-CNN快1000倍
人工智能头条
10+阅读 · 2018年3月28日
使用SSD进行目标检测:目标检测第二篇
专知
29+阅读 · 2018年1月28日
目标检测技术之Faster R-CNN详解
论智
13+阅读 · 2018年1月25日
深度学习目标检测从入门到精通:第一篇
专知
42+阅读 · 2018年1月24日
论文 | YOLO(You Only Look Once)目标检测
七月在线实验室
14+阅读 · 2017年12月12日
【推荐】YOLO实时目标检测(6fps)
机器学习研究会
20+阅读 · 2017年11月5日
Interpretable CNNs for Object Classification
Arxiv
20+阅读 · 2020年3月12日
Mesh R-CNN
Arxiv
4+阅读 · 2019年6月6日
Learning Recommender Systems from Multi-Behavior Data
Arxiv
11+阅读 · 2018年4月8日
Arxiv
7+阅读 · 2018年1月24日
Arxiv
4+阅读 · 2016年12月29日
VIP会员
相关VIP内容
深度学习目标检测方法及其主流框架综述
专知会员服务
147+阅读 · 2020年6月26日
专知会员服务
31+阅读 · 2020年4月24日
【CVPR2020-谷歌】多目标(车辆)跟踪与检测框架 RetinaTrack
专知会员服务
44+阅读 · 2020年4月10日
KGCN:使用TensorFlow进行知识图谱的机器学习
专知会员服务
81+阅读 · 2020年1月13日
密歇根大学《20年目标检测综述》
专知会员服务
98+阅读 · 2019年10月13日
相关资讯
基于手机系统的实时目标检测
计算机视觉战队
8+阅读 · 2018年12月5日
理解 YOLO 目标检测
AI研习社
21+阅读 · 2018年11月5日
从零开始PyTorch项目:YOLO v3目标检测实现
机器之心
14+阅读 · 2018年4月23日
YOLO升级到v3版,检测速度比R-CNN快1000倍
人工智能头条
10+阅读 · 2018年3月28日
使用SSD进行目标检测:目标检测第二篇
专知
29+阅读 · 2018年1月28日
目标检测技术之Faster R-CNN详解
论智
13+阅读 · 2018年1月25日
深度学习目标检测从入门到精通:第一篇
专知
42+阅读 · 2018年1月24日
论文 | YOLO(You Only Look Once)目标检测
七月在线实验室
14+阅读 · 2017年12月12日
【推荐】YOLO实时目标检测(6fps)
机器学习研究会
20+阅读 · 2017年11月5日
相关论文
Interpretable CNNs for Object Classification
Arxiv
20+阅读 · 2020年3月12日
Mesh R-CNN
Arxiv
4+阅读 · 2019年6月6日
Learning Recommender Systems from Multi-Behavior Data
Arxiv
11+阅读 · 2018年4月8日
Arxiv
7+阅读 · 2018年1月24日
Arxiv
4+阅读 · 2016年12月29日
Top
微信扫码咨询专知VIP会员