TowardsDataScience 博客中文翻译 2020(七百七十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

搜索和排序加密数据

原文:https://towardsdatascience.com/searching-and-sorting-encrypted-data-59fc95d961b7?source=collection_archive---------36-----------------------

走向安全的云数据库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mauro Sbicego 在 Unsplash 上拍摄的照片

假设有一天,你的老板走进办公室,给你一份工作:

老板:我要你对一组数据进行排序

你:好吧!给我意见,我会处理的

老板:我不信任你,我的数据对我来说是合理的

你:如果你不想给我数据,我该怎么分类?

老板:不知道!想办法!这就是我付钱给你的原因😤

如果你没有数据,你怎么能对一组数据进行排序呢?

和大多数隐私问题一样,答案在于 密码术 的秘密。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯蒂芬·斯坦鲍尔在 Unsplash 上拍摄的照片

关于通用加密的一个词

我想我们所有人,作为程序员,都至少在自己写的软件中使用过一次密码学。有些人可能只是在服务器上启用 TLS,有些人可能编写了特殊的加密软件。在所有这些情况下,您都有一些想要加密的数据。

最常见的加密方案,如 AES、RSA 等。有一个至关重要的特性:它们在语义上是安全的。这是什么意思?嗯,是关于两个人的游戏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由JESHOOTS.COMUnsplash 上拍摄

在这个游戏(称为 IND-CPA 游戏)中,一个玩家是攻击者,另一个是挑战者。游戏如下:

  1. 攻击者选择一些消息,挑战者提供这些消息的密文
  2. 攻击者选择两条相同长度的消息发送给挑战者
  3. 挑战者从两条消息中随机选择一条,加密并发送给攻击者
  4. 如果攻击者猜对了哪条消息被加密,该方案就被破解了

下图说明了这个游戏:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ryan Henry I 538 /B 609:密码学简介

回到老板的问题

所以你的老板有一些数据,他想排序,但他不想给你看😵

你可能想告诉你的老板在把数据交给你之前先加密。假设数组只包含两个元素: m1m2 。计划如下:

  1. 老板使用某种加密方案对这两个元素进行加密,得到两个密文: c1c2
  2. 你比较一下 c1 和 *c2。*如果 c1 < c2 你告诉你老板,排序后的数组是[ m1m2 ]。否则你告诉你老板,排序后的数组是[ m2m1 ]。

为此,你需要一个保序的加密方案。

也就是说,该方案保留了明文的顺序。举个例子,如果 c1m1 的加密, c2m2m1 < m2 的加密,那么 c1 < c2

如果你正在考虑一个共同的加密方案,如 AES 或 RSA,它不会工作。为什么?记住所有这些方案都是语义安全的。

如果你能比较两个密文,并推断出明文的顺序,你就能打破 IND-CPA 游戏。

方法如下:

游戏第一步,你会选择两条消息 m1m2(m1<m2)。挑战者将返回两条消息的密文: c1c2 。然后,在步骤 2 中,您将向挑战者发送在第一步中选择的相同消息( m1m2 )。挑战者将返回一个密文 c ,该密文将是 m1 的加密或 m2 的加密。如果 c 是对 m1 的加密,那么 c < c2 如果 c 是对 m2 的加密,那么 c > c1

因此,您不能使用 AES、RSA 或任何其他众所周知的加密方案。那你应该用什么呢?

Boldyreva 的加密方案是您的正确答案

如果你想了解更多可以阅读原文 这里

现在,让我们开始工作,实现加密数据的排序和搜索。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Corinne KutzUnsplash 上拍摄

在 python 中排序和搜索加密数据

Boldyreva 的方案已经在 pyope 库中实现。因此,让我们导入库:

要使用该方案,我们必须首先生成密钥并实例化密码:

让我们用一个简单的数组来排序它:

为了加密这个数组,我们需要在 simple_array 的每个元素上调用密码对象的加密方法T3:

只需对列表进行排序:

现在您已经对数组进行了排序,让我们解密它,并验证原始元素是否按升序排列。为此,您需要在*simple _ array _ encrypted:*的每个元素上调用 cipher 对象的 decrypt 方法

你应该看到[1,2,3,4,7]。

如果你的老板给你一个加密的元素,并询问它是否存在于他给的加密数组中,你只需从 numpy 库中调用search sorted函数即可:

您应该看到 2。

结论

恭喜你!你刚刚意识到了不可能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

威尔·斯图尔特在 Unsplash 上拍摄的照片

您能够在不知道元素本身的情况下对元素列表进行排序和搜索。保序加密和揭示序加密是密码学中非常活跃的研究领域。这些加密方法有许多应用,尤其是在数据库领域。随着数据量的增加,通过个人资源维护数据库变得越来越困难。你需要把你的数据放到云中。然而,没有必要以清晰的形式给出你的数据。你可以使用像保序加密这样的东西,首先加密你的数据,然后把它发送到云端。加密方案允许您继续使用数据库,即使数据一直被加密。这就是密码学的美妙之处,❤️.

感谢您的阅读😊

另外,我为你准备了一个 colab 笔记本,上面有所有代码。你可以从这里进入。

在 SQL Server 中搜索数据库对象和表数据

原文:https://towardsdatascience.com/searching-for-database-objects-and-table-data-in-sql-server-f42f7e3e76a1?source=collection_archive---------46-----------------------

让我们来看看 SQL Server 中数据库数据和对象搜索的复杂性,并看看如何使用标准脚本和特定工具来执行它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Piqsels (CC0)

您好,欢迎来到我的系列文章的第四部分,它将帮助您了解如何设计和使用数据库。这一次我们将深入研究 SQL Server 中复杂的数据和对象搜索问题,这将首先在标准脚本的帮助下进一步进行,然后使用 dbForge 搜索工具

我们经常会遇到这样的情况,我们需要找到:

  1. 数据库对象(表、视图、存储过程、函数等)。).
  2. 数据(值和包含它的表)。
  3. 数据库对象定义中的代码片段。

使用标准脚本在 SQL Server 中搜索数据和对象

让我们首先展示如何在标准脚本的帮助下做到这一点。
您可以使用以下脚本在数据库中搜索雇员表:

select [object_id], [schema_id],
                  schema_name([schema_id]) as [schema_name],
                  [name],
                  [type],
                  [type_desc],
                  [create_date],
                  [modify_date]
from sys.all_objects
where [name]='Employee'

脚本的结果将如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.1 .雇员表的搜索结果

它显示:

  1. 对象的标识符和对象所在的架构。
  2. 架构的名称和对象的名称。
  3. 对象类型和描述。
  4. 创建和修改对象的日期和时间。

要查找“项目”字符串的所有条目,可以使用以下脚本:

select [object_id], [schema_id],
           schema_name([schema_id]) as [schema_name], 
           [name], 
           [type], 
           [type_desc], 
           [create_date], 
           [modify_date] 
from sys.all_objects 
where [name] like '%Project%'

结果将是下表的输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.2 .跨所有数据库对象的“项目”子字符串的搜索结果

如结果所示,“Project”字符串不仅包含在 Project 和 ProjectSkill 表中,还包含在一些主键和外键中。

要了解哪个表包含这些键,让我们通过执行以下操作将 parent_object_id 字段、其名称及其所在的模式添加到输出中:

select ao.[object_id], ao.[schema_id],
          schema_name(ao.[schema_id]) as [schema_name],
          ao.parent_object_id,
          p.[schema_id] as [parent_schema_id],
          schema_name(p.[schema_id]) as [parent_schema_name],
          p.[name] as [parent_name],
          ao.[name],
          ao.[type],
          ao.[type_desc],
          ao.[create_date],
          ao.[modify_date] 
from sys.all_objects as ao 
left outer join sys.all_objects as p on ao.[parent_object_id]=p. [object_id] 
where ao.[name] like '%Project%'

结果将是带有父对象详细信息的表输出,这意味着,在指定主键和外键的地方:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.3 .包含父对象详细信息的所有数据库对象中“项目”子字符串的搜索结果。

查询中使用了以下系统对象:

  1. sys.all_objects 表。
  2. schema_name 标量值函数。

您可以通过这个解决方案找到所有数据库表中的字符串值。让我们简化这个解决方案,并展示如何用下面的脚本找到值“Ramiro”:

输出可能如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.4 .数据库搜索结果

这里,输出显示了表的名称,哪些列存储了包含子串“Ramiro”的值,以及找到的匹配表列的该子串的输出数。

要查找其定义包含给定代码片段的对象,可以使用以下系统视图:

  1. sys.sql_modules
  2. 系统所有 sql 模块
  3. sys.syscomments

例如,使用最后一个视图,您可以在以下脚本的帮助下找到其定义包含给定代码片段的所有对象:

select obj.[object_id], 
            obj.[name], 
            obj.[type_desc], 
            sc.[text] 
from sys.syscomments as sc 
inner join sys.objects obj on sc.[id]=obj.[object_id] 
where sc.[text] like '%code snippet%'

这里,输出显示了对象的标识符、名称、描述和完整定义。

使用 dbForge Search 搜索数据库数据和对象

借助现成的便捷工具,搜索数据和对象要方便得多。其中一个工具就是 dbForge Search

要调用此工具,请在 SSMS 窗口中按 dbForge 搜索。将出现搜索窗口:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img。5 dbForge 搜索的搜索窗口

请注意顶部面板(从左到右),因为您可以更改:

  • 搜索模式(搜索 DDL(对象)或数据)。
  • 我们实际搜索的内容(哪个子串)。
  • 区分大小写,搜索单词的精确匹配,或搜索字符串条目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.6 .搜索模式

您还可以:

  • 使用顶部中间的按钮(由花括号连接的两个正方形)按对象类型对结果进行分组。
  • 为搜索选择必要的对象类型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.7 .为搜索选择对象类型

  • 为搜索设置几个数据库,并选择一个 MS SQL Server 实例

这是对象搜索模式,即包括 DDL 时:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.8 .按 DDL 对象搜索

在数据搜索模式中,唯一不同的是对象类型选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.9 .按数据搜索

也就是说,只有存储数据的表可供选择:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.10 .选择用于数据搜索的表格

现在,和以前一样,让我们在对象名中找到所有“项目”子串条目:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.11 .数据库对象名称中所有“项目”字符串条目的搜索结果

显然,搜索模式是由 DDL 对象设置的,我们正在寻找“项目”字符串,所以它是填充的,其他一切都是默认的。

当选择检索到的对象时,您可以在下面看到给定对象及其父对象的定义代码。

此外,您可以通过按下下面显示的按钮将导航切换到检索到的对象:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.12 .将导航转移到检索到的对象

您也可以按类型对找到的对象进行分组:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.13 .按类型分组的对象进行搜索的结果

请注意,甚至包含名称中包含“Project”子字符串的字段的表也会显示出来。但是,让我提醒您,搜索模式是可以改变的:搜索整个匹配或部分匹配,区分大小写与否。

现在,让我们找出所有表中的“Ramiro”值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.14 .跨所有数据库数据的“Ramiro”子字符串的搜索结果

请注意,将显示所选 Employee 表上包含“Ramiro”子字符串的所有字符串。

此外,您可以像之前一样,通过按下下面显示的按钮将导航切换到找到的对象:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.15 .将导航转移到找到的对象

因此,我们可以在数据库中搜索所需的对象和数据。

结论

简而言之,从创意到实现招聘服务数据库,我们走过了漫长的道路。让我们总结一下到目前为止我们所取得的成就:

就这样,数据库已经准备好可以使用了,在测试运行之后,它可以被集成,并且它将存在。那么下一步是什么?稍后,我们将需要维护数据库,并在需要时引入更改。

另请阅读:

  1. SQL 数据库设计基础及示例
  2. 用测试数据填充员工数据库
  3. 导出和导入 JSON 数据

原载于 2020 年 8 月 11 日https://blog.devart.com

在 SQL Server 数据库中搜索无效对象

原文:https://towardsdatascience.com/searching-for-invalid-objects-in-the-sql-server-database-a90fab49a66a?source=collection_archive---------43-----------------------

本文旨在解决在 SQL Server 数据库中查找和修复无效对象的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Piqsels (CC0)

本文讨论数据库开发人员和管理员工作中的一个瓶颈,即无效对象的出现以及在 SQL Server 数据库中找到它们的方法。

在之前的文章中,我们涵盖了从创意到实现招聘服务数据库的所有过程:

如何使用 SQL Complete 查找无效对象

让我们在 SQL Complete 工具的帮助下查看无效对象的搜索。假设我们用雇员的地址定义了一个新表,并将其命名为 Address:

员工可能有不同的地址。同时,几个雇员可以有相同的地址。因此,这些实体之间的关系是多对多的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.1 .雇员和地址之间的关系

我们不考虑每个雇员只有一个指定地址的居住登记情况。我们对所有地址都感兴趣,包括那些指定员工倾向于在哪里度过时间(他居住和睡觉的地方)的地址。这样的地方可能有几个。

现在,让我们创建一个 vEmployeeAddress 视图,以如下方式显示雇员的数据和地址:

问题是我们忘记了更改 vAddressEmployee 视图,它现在引用了不存在的表。

不久之后,一个用户或者如果我们幸运的话,一个测试人员发现了一个问题,每当调用 vAddressEmployee 视图时,系统的一部分功能就会崩溃。

为了避免这种情况,每次将更改引入数据库时,我们都需要检查是否存在无效对象。

为此,选择您需要的数据库,在 SSMS 的菜单栏中,选择 SQL Complete\Find Invalid Objects 命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.2 .在 SQL Complete 中选择“查找无效对象”命令

在出现的窗口中,单击窗口左上角或中间的“分析”按钮:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.3 .运行无效对象的搜索

请注意,您可以在“数据库”面板上一次选择多个数据库:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.4 .选择多个数据库

对无效对象的搜索完成后,我们可以看到显示 vAddressEmployee 视图的结果,该视图引用了不存在的表 AddressEmployee 和 Address:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.5 .搜索无效对象的结果

考虑到地址在雇员表中,重写 vAddressEmpoyee 视图就足够了,如下所示:

ALTER VIEW [dbo].[vAddressEmpoyee] AS
SELECT emp.[EmployeeID]
      ,emp.[FirstName]
      ,emp.[LastName]
	  ,emp.[EmployeeID] AS [AddressID]
	  ,emp.[Address]
  FROM [JobEmpl].[dbo].[Employee]		 AS emp
GO

完成后,当您第二次搜索无效对象时,将找不到它们:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Img.6 .未找到任何无效对象

请注意,AddressID 列根本不应该显示在 vAddressEmployee 视图中。但是,如果系统使用它,我们需要以两种方式确定变化的过程:

  1. 如果该字段仅用于提供信息,而不用于搜索相同的地址,是否可以用 EmployeeID 中的值替换 AddressID。
  2. 是否可以完全不显示 AddressID。

如果执行第一点失败,我们将不得不在应用程序的逻辑中引入变化,同时执行第二点。

然而,如果第一点是可行的,这将是一个快速解决问题的方法,您可以稍后通过一个修补程序或下一个更新来执行第二点。

简而言之,我们已经考虑了找到无效对象并修复它们的重要性。

结论

总之,我们研究了为招聘服务创建数据库的整个过程,从想法开始,到在生产中实现,并对模式进行进一步的修改。

给定的数据库允许我们执行快速搜索,并根据以下指标汇总数据:

  1. 用人公司。
  2. 位置。
  3. 项目。
  4. 技能。

值得一提的是,这个模式为 IWU 团队的创业提供了基础。

原载于 2020 年 8 月 11 日【https://blog.devart.com】

基于 Python 中的属性对对象列表进行搜索或排序

原文:https://towardsdatascience.com/searching-or-sorting-a-list-of-objects-based-on-an-attribute-in-python-6cffb26a57c3?source=collection_archive---------8-----------------------

当你想找出哪个(狗)学生和其他(狗)学生的数量最多时

通常,当您有一组对象时,您可能不希望根据它们在内存中的位置,而是根据感兴趣的属性对它们进行排序。今天,我们将看看 Python 的内置工具:operator.attrgetter,以及这个工具包中的相关工具和实现类似目标的替代方法(使用 lambdas 和迭代器/理解)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

对于我们今天的数据集,我们将使用一个由 100 只狗组成的虚拟数据集。狗学生类有属性:nameyrstrengthsareas_for_growthworks_well_withnot_works_well_withhas_sat_byhas_not_sat_bynotes。它有添加、获取、移除和这些属性的方法,加上返回各自列表中朋友/敌人数量的get_n_not_works_wellget_n_works_well

如何使用 attrgetter

Attrgetter 是一个属性 getter。您可以通过几种方式使用它:

  1. 您可以创建一个 attrgetter“可调用对象,该对象从其操作数中获取 attr ”(从文档)属性。
from operator import attrgetterfriend_getter = attrgetter('works_well_with')
print(friend_getter(dog_pack[1]))

这里,friend_getter 返回 dog_pack[1]的works_well_with列表:

[Student('Qeb', 12), Student('Putty', 6), Student('Douglas', 3), Student('Denali', 5), Student('Asher', 12), Student('Portia', 3), Student('Suki', 2), Student('Olive', 14), Student('Peri', 8), Student('Mari', 5), Student('Snowflake', 2), Student('Guayaba', 12)]

我仍在寻找你会在dog_pack[1].works_well_with上这样做的背景。我们将在下面看到我遇到的一个例子,但我不确定我是否被说服了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马特·尼尔森在 Unsplash 上拍摄的照片

2.可以将 attrgetter 用于需要函数参数的函数。比如作为 sorted()、max()、min()的键;或者用 map()、itertools.groupby()等。

要得到最老的狗:

# to get the object with the characteristic (max yr)
oldest = max(dog_pack, key=attrgetter("yr"))
print(f"Oldest Dog\nname: {oldest.name}\nage: {oldest.yr}", 
      f"Strengths: {oldest.strengths}")

打印:

Oldest Dog
name: Abbey
age: 15
Strengths: ['snuggly', 'snuggly', 'plays well', 'fetch']

这里我们实际上有多个最老的狗,所以我们想使用过滤/条件列表理解来获得最老的狗的列表:

[d for d in dog_pack if d.yr == max(d.yr for d in dog_pack)]

返回

[Student(Abbey, 15),
 Student(Radar, 15),
 Student(Pinot, 15),
 Student(Lucci, 15),
 Student(Leona Mae Alcott Helmsley Cole, 15),
 Student(Stella, 15),
 Student(Whiskers, 15)]

不要忘记,如果我们想要值本身,而不是带有值的对象,就没有必要使用attrgetter

max(d.yr for d in dog_pack)

它返回15

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Bharathi KannanUnsplash 上拍摄的照片

方法的 Attrgetter:方法调用方

Methodcaller 的工作方式与 attrgetter 非常相似,但是当您希望使用类的“方法”而不是“类”属性的返回时。

例如,如果我想让狗学生与最少的其他学生一起工作:

min_works_well = min(dog_pack, key=methodcaller('get_n_works_well'))print(f"""Works Well With The Fewest Dogs
          name: {min_works_well.name}
          works well with: {min_works_well.get_n_works_well()} dogs
          strengths: {min_works_well.strengths}
          areas for growth: {min_works_well.areas_for_growth}""")

返回:

Works Well With The Fewest Dogs
name: Pringles
works well with: 4 dogs
strengths: ['leave it', 'snuggly', 'comes when called']
areas for growth: ['playing with others']

attrgettermethodcaller的另一个区别是,对于attrgetter,附加参数是要获取的附加属性,而对于methodcaller,它们是作为参数传递给方法的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 gotdaflowUnsplash 上拍摄

其他数据结构的 attr getter:item getter

attrgetter作用于类,而itemgetter作用于其他数据结构(列表、元组、字典等)。

如果我们的 dog_pack 被构造成一个字典列表:

oldest = max(dogs_dict_list, key=itemgetter('yr'))print(f"Oldest dog\nname: {oldest['name']}",
      f"strengths: {oldest['strengths']}")

itemgetter使用“yr”作为关键字并返回:

Oldest dog
name: Dollie
strengths: ['plays well', 'ignores food on the sidewalk']

如果它被构造成这样的元组列表:

dogs_tups = [('Bella', 5, 'labrador', 'yellow'), 
             ('Dollie', 12, 'austrailian sheppard', 'cream, brown')]youngest = min(dogs_tups, key=itemgetter(1))print(f"Youngest Dog:\nname: {youngest[0]}\nbreed: {youngest[2]}")

itemgetter将使用参数 1 作为索引并返回

Youngest Dog:
name: Bella
breed: labrador

attrgetter一样,itemgetter在提供多个参数时返回一组查找值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡米洛·菲耶罗在 Unsplash 的照片

获取子属性

如果你想对我们的狗进行分类,不是根据这些一级属性中的一个,而是根据属性的一个组成部分,我看到了四个选项:

  1. 如果属性是一个类,你可以通过将第二个属性名和第一个属性名一起传递给attrgetter来访问你的属性的一个属性。例如,如果我们改变 name 属性来创建类名的一个实例,我们可以像在 docs 示例中一样,用sorted(dog_pack, key=attrgetter("name.first")按名字排序。
  2. 如果你可以访问这个类,或者这个类有一个方法返回你感兴趣的子属性,你可以使用methodcaller来访问/排序这个子属性。
from operator import methodcallersorted(dog_pack, key=methodcaller("get_area_for_growth", 0))

这里的growth_sorted是一个列表,按照它们的第一个成长领域排序(按字母顺序)。

再次注意,methodcaller 向该方法传递附加参数。这与 attrgetter 不同,在 attr getter 中,额外的参数被作为额外的属性来读取,支持多属性键。对于带有 methodcaller 的多属性键,您需要一个 lambda 函数。

3.使用 lambda 或定义的函数。

sorted(dog_pack, key=lambda x: (x.get_area_for_growth(0),
                                x.name.first)

或者相当于:

def first_growth_first_name(x):
    "Returns the first area for growth and first name of Dog x" first_growth = x.get_area_for_growth(0)
    first_name = x.name.first
    return (first_growth, first_name) sorted(dog_pack, key=first_growth_first_name)

4.组合 lambda 和 attrgetter/methodcaller。

sorted(dog_pack[0:5], key = lambda x: attrgetter("strengths")(x)[0])

这个例子对我来说很复杂,它依赖于群体中的每只狗在那个位置的力量。但在某些情况下这可能是正确的做法。与lambda和直接属性访问相比,我不确定attrgetterlambda组合的相对计算时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Anoir ChafikUnsplash 上拍摄的照片

attr getter/item getter/method caller 与 lambda

内置函数似乎运行得更快,这对您的场景来说可能重要,也可能不重要。互联网上的人们似乎不同意哪个更优雅/更漂亮/更漂亮。字符串的使用阻碍了许多代码编辑器的自动完成功能,这需要键入/拼写/知道他们想要什么属性。不理想。对我来说不是交易破坏者。

这些都可以很容易地用 lambda 函数(或定义的函数)来代替:

attrgetter

按年份和名称对我们的狗群进行分类:

sorted(dog_pack, key=attrgetter(“yr”, "name.first"))成为

sorted(dog_pack, key=lambda x: (x.yr, x.name.first))

itemgetter

dogs_tups = [('Bella', 5, 'labrador', 'yellow'), 
             ('Dollie', 12, 'austrailian sheppard', 'cream, brown')]

将这些狗元组按品种分类:

sorted(dogs_tups, key=itemgetter(2)成为

sorted(dog_pack, key=lambda x: x[2])

方法调用程序

根据狗狗们玩耍的数量对狗群进行分类:

sorted(dog_pack, key=methodcaller(“get_n_works_well”))变成了

sorted(dog_pack, key=lambda x: x.get_n_works_well())

何时使用 lambda、自定义函数或理解

如果您需要在排序/获取最大值/最小值/无论什么之前处理属性数据,那么您可能需要使用attrgetter的替代方法。

例如,最初,我的狗的名字有不规范的大写。如果您没有访问该类的权限,可以使用以下方法进行更正:

sorted(dog_pack, key=lambda x: x.name.first.lower())

或者如果你正在寻找名字以 A 开头的狗:

[d for d in dog_pack if d.name.first.lower() < 'b']

点击查看 GitHub 库。编码快乐!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 allison christineUnsplash 上拍摄

在云中搜索无服务器 GPU

原文:https://towardsdatascience.com/searching-the-clouds-for-serverless-gpu-597b34c59d55?source=collection_archive---------31-----------------------

一个未完成的任务?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

泰勒·范·里佩尔在 Unsplash 上的照片

无服务器是云计算的一大趋势。关注代码,而不是基础设施,对于许多开发人员(或者像我这样的数据科学家)来说是一件非常简单的好事。此外,如果您不喜欢为闲置的服务器付费,那么现收现付的定价模式是非常好的。同时,人工智能(主要是深度学习)的快速发展极大地增加了对 GPU 作为计算密集型任务加速器的需求。鉴于 GPU 价格昂贵,将其放在无服务器架构中不是很好吗?是的,那太好了!

我的使用案例

对于一个爱好项目,我一直在开发一个简单的应用程序,它提供了一个神经类型转移的用户界面。不熟悉这种技术?简而言之,神经风格转移(NST)是一种深度学习技术,可用于风格化图像。该算法将内容图像样式图像作为输入,并使用它们来生成显示内容图像的内容和样式图像的样式的新图像。明白了吗?如果你想更深入地了解 NST,请查看这篇文章,这篇文章很好地解释了它!

现在回到我的爱好项目。我开发的应用程序允许用户在一个简单的图形用户界面中选择内容图像和样式图像,并通过单击按钮生成风格化的图像——简单明了。

该应用程序在我的本地环境中运行良好。现在,我很想在网上发布这个应用程序,这样每个人都可以访问并使用它来创建自己的人工艺术。由于它仍然是一个爱好项目,我想以一种经济高效的方式来做这件事。为了实现这一点,我想在一个无服务器平台上运行 NST 算法;这样,我只会在用户积极使用应用程序时付费。哦,是的,我想在 GPU 上运行该算法,这样一幅图像就可以在一瞬间生成,用户不必像 CPU 支持的计算那样等待几秒钟。

关于我的用例,我想我们已经明白了为什么无服务器 GPU 有时会派上用场。现在让我们看看市场上有什么!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GPU 显卡——Rafael Pol 在 Unsplash 上拍摄的照片

云提供了什么

在我寻找无服务器 GPU 的过程中,我了解了很多目前可用的不同无服务器选项。让我与你分享这些发现。

功能即服务

无服务器框架已经存在了很长一段时间,所有主要的云提供商都提供了一个成熟的功能即服务(FaaS)平台:AWS 有 Lambda ,Azure 有功能应用,Google 有云功能 ( 这里有一篇比较三者的文章!).到目前为止一切顺利。但是,如果我们想在 GPU 上运行我们的无服务器计算,而不是在传统的 CPU 上呢?太糟糕了!不可能。这里提到的三个 FaaS 平台都不支持 GPU 支持的服务器。在撰写本文时,我们只能依靠 CPU 来利用 Lambda、函数应用程序或云函数。

人工智能平台

谷歌云将他们的人工智能平台描述为一种轻松“将你的机器学习项目投入生产”的方式。它目前提供三种补充服务:

  • AI 平台笔记本
  • AI 平台培训
  • AI 平台预测

因为在我的例子中,我已经有了一个经过训练的 AI 模型(具体来说是 TensorFlow SavedModel),所以我在这里的重点将是预测服务。我的目标是为我的人工智能模型服务,根据用户输入推断新的值。人工智能平台预测在这方面应该是完美的,因为它的建立正是为了做到这一点:为现有模型获得新的预测。这是一个无服务器的平台,所以我们不必担心基础设施或为闲置的服务器付费。好消息是,它在一些可用的机器类型上支持 GPU(甚至 TPU )!

嗯,任务完成了,你可以这么想!我唯一要做的事情就是将我的模型部署到平台上,然后继续我的在线预测。然而,因为我们生活在现实世界中,当然有一些如果和但是。在这种情况下,一些技术细节被证明是不可逾越的。不涉及太多细节,它与输入大小的限制和对库的有限版本支持有关。我现在的结论是,由于这些问题,目前不可能在我的场景中使用人工智能平台预测。

无服务器容器

我探索的第三种选择是无服务器容器服务。我研究得相当透彻的一个是谷歌云运行。云运行“抽象出所有基础设施管理”,因此您可以轻松地将您的容器部署到生产中。因为它是按使用付费的,你只在你的代码运行时付费。太棒了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

许多集装箱——由 Guillaume BolducUnsplash 上拍摄

当你意识到云运行也只有对 CPU 的支持时,失望来了。如果您选择完全管理选项,至少情况是这样。还可以选择在 Kubernetes 集群上运行容器,这为您的基础设施提供了充分的灵活性,并支持使用 GPU。这种方法的缺点是您需要维护(并支付)您的集群,从而消除了无服务器的两个主要好处!因此,Kubernetes 上的云运行对我来说不是一个有吸引力的选择。

除了 Google Cloud Run,还有用于在无服务器框架上运行容器的 AWS FargateAzure 容器实例。我还没有仔细研究这些替代方案,尽管从表面上看,它们本质上与 Google Cloud Run 非常相似,因此对我的用例同样不满意。

超越三巨头

你有时会忘记,除了云计算的“三巨头”:AWS、Azure 和 Google Cloud,还有更多值得探索的东西。在谷歌上简单搜索“无服务器 gpu”,你会很快找到像 nuclio 这样的公司。他们自称是“第一个支持 GPU 优化利用和共享的无服务器平台”。我不知道你怎么想,但我觉得这听起来不错!然而,nuclio 似乎不像三大巨头那样提供自助服务环境。他们的目标似乎是更大的企业,而不是像我这样的私人客户。所以有一个障碍使得他们的服务不适合我。

包装它

所以我在这里,暂时结束了我对无服务器 GPU 的搜寻。我的结论是,目前,在撰写本文时,没有简单的方法在 GPU 加速的无服务器平台上部署 AI 模型。由于云计算的发展速度非常快,我毫不怀疑这一市场空白将在短时间内被填补。我决定耐心等待,同时让自己忙于其他项目和冒险!

如果我错误地提出了错误的主张,或者遗漏了重要的东西,请告诉我。当然,我也很高兴听到你是否知道在哪里可以找到无服务器的 GPU!

分割东京的 Airbnb 社区:调查周围环境

原文:https://towardsdatascience.com/sectioning-airbnb-neighborhoods-in-tokyo-survey-the-surroundings-31edd55b37d9?source=collection_archive---------20-----------------------

您下次去东京时打算住在 Airbnb 吗?瞥一眼周围是什么样子,看看其他类似的区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

前言

Despite rising tension with the government authority in recent years, Tokyo has been a growing market for property owners renting out their space for the public; 民泊 or minpaku as they would call in Japanese. Airbnb, just as in other major cities, is among the popular platforms to find one, especially for foreigners who possess little or no local language understanding.

当到达 Airbnb 时,人们往往会想知道附近有哪些好景点。隐藏的被低估的寿司店,正宗的当地拉面摊,或者那些“可语法化的日式咖啡馆”正等着被发现。快速的谷歌搜索就可以了,但是如果我们能在预订之前就探索在哪个地区有什么样的地方呢?还是找出特色相似但花费较少的地区?我们也许可以节省更多的时间来决定去哪里,甚至更好地计划我们的旅行。这个照明项目旨在回答这个问题。它不仅针对旅行者,也可能对那些有兴趣在附近经营住宿或相关业务的人有用,甚至对那些考虑住在世界上人口最多的大都市并想知道社区是什么样子的人有用。

准备数据

Inside Airbnb 拥有世界上任何 Airbnb 城市中更新最多的数据库之一,而且是免费的;感谢他们的抓取工具成功地从 Airbnb 网页相对复杂的 HTML 结构中提取文本。仅获取必要的分析数据后,由 13367 个列表(截至 2019 年 11 月)组成的数据将如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 1:东京 Airbnb 房源

然后我汇总数据,找出每个街区的房源数量、平均价格和经纬度坐标。为了增加一些趣味,我在东京维基百科的特殊选区页面上做了一个快速的漂亮的图片抓取,这个页面包含了该市 23 个行政区的人口和面积数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 2:每个邻域的聚合属性

随后,基于坐标,我使用 Foursquare API 检索了步行距离半径(小于 1 公里)内每个区域的最多 100 个推荐地点。有些区域可能不如其他区域集中,因此周围的斑点较少。我发现看到获得的结果很有趣,因为我不知道周围一些相当不错的地方,尽管我在这个地区生活了多年。下面显示的是收集的 2216 条记录的前几行。我们会在场地类别上查找更多信息,以浏览周围环境并回答项目问题。让我们开始进一步的分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 3:每个邻近区域的推荐景点列表

视察社区

简要检查

下面的图表总结了所有的信息,让我们一瞥病房之间的比较。我正在使用 Plotly 进行可视化,所以你可以随意在周围徘徊。

注:圆圈的大小表示人口数量。x 轴是对数刻度。

总体而言,东京房源平均每晚花费12000 ~ 15000 日元(110~140 美元)。这与世界其他主要城市的平均水平相当或低于平均水平,但由于今年夏天奥运会前需求的上升,实际上从去年开始变得越来越贵。

面积和人口似乎有很好的相关性,因为练马、足立江户川太田的大小和颜色大致相同。有趣的是,Bunkyo 是最贵的病房,尽管它在列表数量上排名倒数第三。此外,尽管在人口和面积上与两个最便宜的地区不相上下,江户川的价格还是出现了飙升,这可能是因为它很容易到达东京迪士尼度假区和市中心。5 离群值很容易识别,因为有 1000~个列表;这似乎有一个明显的原因,我们将在接下来的几行中看到。

你可能想知道东京的 Airbnb 房源大多集中在哪里。这是一张地图,显示了公寓的位置(半径越小意味着花费越少)和标记图标所指的 23 个特殊病房。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大致有 3 大组和几个较小的上市集群。位于中野标志 4 点钟位置的是新宿区,这里是日本最繁忙的地区,也是东京约 17%的房源所在地。拥有城市的中央车站和许多景点可能是出租公寓聚集在那里的主要原因。稍微往北一点,我们可以看到第二个拥挤的区域——丰岛——著名的池袋区的所在地。它是连接东京和邻近郊区的主要枢纽之一,也是生活便利的地区之一。最后一个团位于台东隅田基地的东侧。必须参观的浅草真宗寺和东京晴空塔每天都会吸引大量游客。我对周围的环境不太熟悉,但我听说由于合理的租金和不断改善的基础设施,越来越多的人来到这里居住。

将病房分组

在数据集 3 中,有 242 个独特的类别,其中“便利店”、“拉面餐厅”、“日本餐厅”(你不要说)、“咖啡馆”和“清酒吧”名列榜首。诸如“井”、“白俄罗斯餐馆”和“十字路口”之类的随机类别也出现在列表中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了弄清楚社区是什么样子,我列出了每个区最常见的场所类别,然后使用相对频率值进行细分。聚集表是一个稀疏的 23×243 矩阵。

这一次,我将只使用 k-means 聚类算法来查找相似的邻域组,因为它对于无监督的任务来说是常见且强大的。我在考察了肘法和剪影评分后选择 4 作为 k 的最佳数。数据集 2 中的其他要素不包括在拟合模型中,以避免人口统计和空间噪声。但是它们在比较聚类之间的差异时非常有用,如下表所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个和第二个集群看起来像这样,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是剩下的第三和第四个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于那些不熟悉东京的人来说,仅仅从上面的表格中很难看出地理模式,所以下面的精确可视化可能会有所帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们仅从基础地理空间数据、Airbnb 列表和 Foursquare 的相对较小的数据集观察到有趣的发现。在简单检查部分,你可以有一个大的图片,哪一个社区适合你的需要。例如,如果你想住在公共区域的一个地方,并愿意收取高于平均水平的费用,将你的过滤搜索设置为列表数量最多的 5 个病房之一。或者那些为了更便宜的租金而牺牲更多的交通和通勤时间的人可能会在 Nerima 和 Adachi 附近找到适合他们的地方。

聚类结果也出乎意料的好。在没有将地理坐标数据放入 k-means 拟合中的情况下,结果似乎找到了形成将邻域与其空间上接近的对应物分组的线段的方法。如果我可以包括我自己的领域知识,集群 1 由郊区组成,集群 2 代表对旅行者友好的区域,集群 3 似乎是全才(商业、购物、旅游),集群 4 基本上是随机。进一步来看,每个集群的特征如下:

  • 集群 1:房源少,价格低,人口多,面积大,便利店占主导
  • 集群 2:很多上市,平均价格,游客的热门停留区域,拉面餐厅和酒吧是最常见的
  • 集群 3:房源多,价格高,人口少,面积小,场地多样
  • 集群 4:房源少,价格平均,混合了普通住宅、学生和游客的住宿区

附言

当预订 Airbnb 或其他租赁住宿时,了解其特点和周围环境可能会很有用。通过考虑位置、平均价格和/或人口密度,你可以知道哪些社区适合或不适合你的偏好。像新宿、涩谷、池袋、上野和浅草这样的热门地区是出租公寓集中的地方。然而,不太出名的街区也值得一试,而且花费相对较少;也许你会发现隐藏的宝石和沿途的当地经历。数据显示,日本首都可以分为 4 个区域。郊区?旅行者之群?全能区?还是一般的地区?你喜欢哪一个?

本文是 IBM 数据科学专业证书 应用顶石项目的一部分。

加密数据上的安全协作 XGBoost

原文:https://towardsdatascience.com/secure-collaborative-xgboost-on-encrypted-data-ac7bc0ec7741?source=collection_archive---------61-----------------------

一个使用安全飞地进行多方训练和 XGBoost 模型推理的库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克在 Unsplash 上拍摄的照片(已修改)。

TL;DR: 在加州大学伯克利分校的 RISE 实验室,我们一直在构建 Secure XGBoost ,这是一个支持协作XGBoost对加密数据进行训练和推理的库。为了便于使用,我们提供了一个与 XGBoost 几乎相同的 Python API,只是增加了一些集成安全性。Secure XGBoost 是 umbrella MC 项目的一部分,在这个项目下,我们正在开发各种保护隐私的机器学习工具。

特别是,Secure XGBoost 有助于安全的协作学习*——相互不信任的数据所有者可以在他们的数据上联合训练一个模型,但不会向彼此透露他们的数据。安全协作学习是一种强大的范式,可能是开启更具弹性和稳健模型的关键。我们一直在与行业中的一些团队合作,包括丰业银行和蚂蚁金服,以部署 Secure XGBoost 来努力实现反洗钱和欺诈检测。*

动机

训练机器学习模型需要大量高质量的数据。实现这一点的一种方法是组合来自许多不同数据组织或数据所有者的数据。但是,出于隐私方面的考虑,数据所有者通常不愿意彼此共享他们的数据,这可能源于商业竞争,也可能是法规遵从性的问题。

问题是:我们如何减轻这样的隐私问题?

安全的协作学习使许多数据所有者能够在他们的集体数据上建立稳健的模型,但不会相互泄露他们的数据。银行可以合作开展反洗钱工作,同时保持客户数据的私密性。医疗保健机构可以将他们的患者数据集中在一起,并在医学研究方面进行合作。可能性是巨大的,充满希望的。

安全 XGBoost 简介

作为朝着这个方向迈出的一步,我们很高兴推出 Secure XGBoost ,这是一个支持协作 XGBoost 对加密数据进行训练和推理的库。简而言之,多个客户端(或数据所有者)可以使用这个库,在云环境中基于他们的集体数据联合训练一个 XGBoost 模型,同时保护他们个人数据的隐私。虽然我们在本文的其余部分关注协作学习,但是 Secure XGBoost 也支持那些只是想将计算外包给云,但不想以纯文本形式将数据暴露给云的人。

在其核心部分,Secure XGBoost 使用安全飞地(如英特尔 SGX)来保护数据,即使是在充满敌意的云环境中。也就是说,即使培训在云中运行,每个客户端的数据仍然对云提供商和其他客户端隐藏。客户端远程编排训练管道,但是协作,并且安全 XGBoost 保证每个客户端保留对其自身数据的控制。**

安全的飞地

安全区域是计算机处理器技术的最新进展,它允许在不可信的机器上创建安全的内存区域(称为区域)。放置在 enclave 中的任何数据或软件都与系统的其余部分隔离开来。同一处理器上的任何其他进程都不能访问该内存,即使是操作系统或虚拟机管理程序等特权软件也不能。secure enclave 技术的示例包括英特尔 SGX、AWS Nitro Enclaves、ARM TrustZone 和 AMD 内存加密。

此外,enclaves 通常支持一个名为远程证明的特性。该特性使客户端能够以加密方式验证云中的 enclave 正在运行可信的、未经修改的代码。

Secure XGBoost 构建于 Open Enclave SDK 之上,这是一个开源 SDK,提供了跨不同 Enclave 技术的单一统一抽象。Open Enclave 的使用使我们的库能够兼容许多不同的 Enclave 后端,如英特尔 SGX 和 OP-TEE。

减轻旁道攻击

在飞地之上,Secure XGBoost 增加了第二层安全,额外保护数据和计算免受飞地上的大类攻击。

研究人员已经表明,攻击者可能能够通过利用辅助泄漏源(或“旁道”)了解 SGX 飞地内数据的敏感信息,即使他们无法直接观察数据。存储器访问模式就是这种旁路的一个例子。

在 Secure XGBoost 中,我们设计并实现了用于模型训练和推理的数据无关算法。在高层次上,我们的算法产生相同的存储器访问序列,而不管输入数据如何。因此,内存访问模式不会向攻击者透露任何有关底层数据的信息。

然而,额外的安全性是以牺牲性能为代价的。如果这种攻击超出了用户的威胁模型,他们可以禁用这种额外的保护。

系统结构

安全 XGBoost 的部署由以下实体组成:(I)多个数据所有者(或客户),他们希望在他们各自的数据上协作训练模型;以及(ii)在飞地机器集群中托管安全 XGBoost 平台的不可信云服务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安全 XGBoost:架构

  • ***嫖客。*客户是指与其他客户一起参与协作学习过程的数据所有者。客户端通过远程调用其 API 在安全的 XGBoost 平台上共同执行计算管道。
  • ***有飞地的云服务。*云服务由一个虚拟机集群组成,每个虚拟机在一个安全的飞地中托管安全的 XGBoost。在训练和推理过程中,Secure XGBoost 将计算分布在飞地集群中。飞地通过 TLS 通道相互通信,TLS 通道在飞地内部开始和结束。云还托管一个不受信任的 orchestrator 服务。orchestrator 协调客户机和部署在 enclaves 中的安全 XGBoost 平台之间的通信。

工作流程

每个客户端将它们的加密数据上传到云服务,然后共同调用安全的 XGBoost API 来处理它们的数据。端到端示例工作流如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安全 XGBoost:工作流

  1. 客户端认证云上的 enclave(通过 enclave 的远程认证程序)以验证预期的安全 XGBoost 代码已经安全地加载到每个 enclave 中。作为证明的一部分,他们从飞地接收一个公钥 pk。每个客户端生成一个对称密钥 k_i ,使用 pk 对其进行加密,并将其发送到 Secure XGBoost。
  2. 客户端上传加密数据到云存储。每个客户端用他们的对称密钥 k_i 加密数据,并上传到云存储。
  3. 客户端共同协调数据处理。客户端同意预先确定的命令*(一个命令是一个 XGBoost API 调用)序列,这些命令将在它们的数据上联合执行。客户端提交一个签名的命令给 orchestrator,orchestrator 将其转发给 Secure XGBoost。命令的结果(例如,加密的训练模型或加密的预测结果)被返回给客户端。*

该过程继续,直到所有命令都被执行。

用户 API

从用户的角度来看,上面工作流的所有复杂性都被抽象到了库中,使用这个库非常简单。在很大程度上,Secure XGBoost 保留了常规 XGBoost 公开的 API,只需要很少的添加就可以在 enclaves 的多方设置中工作。

假设每个客户端都已经将它们的加密数据上传到了云服务器,这里有一个客户端如何使用 Secure XGBoost 的例子。

  1. 每个客户端首先初始化它们的密钥,并连接到云中的安全 XGBoost 部署。
*import securexgboost as xgbxgb.init_client(user1,
                symmetric_key,
                public_key,
                certificate,
                server_addr)*

2.接下来,每个客户端验证 enclaves,以验证它们正在运行真实的、未经修改的安全 XGBoost 代码。

*xgb.attest()*

然后,客户端调用安全的 XGBoost APIs。这些与普通的 XGBoost 非常相似,在支持多个数据所有者方面略有不同。

3.将来自不同数据所有者的数据加载到服务器的单个“数据矩阵”中。

*dtrain = xgb.DMatrix({user1: “/path/to/data/on/server”,
                      user2: “/user2/data/on/server”})*

4.根据加载的数据训练模型。

*params = {"tree_method": "hist",
          "objective": "binary:logistic",
          "min_child_weight": "1",
          "gamma": "0.1",
          "max_depth": "3"}num_rounds = 5booster = xgb.train(params, dtrain, num_rounds)*

5.使用模型运行预测。Secure XGBoost 发送加密的结果,这些结果在客户机上本地解密。

*dtest = xgb.DMatrix({username: “path/to/data/on/server”})predictions, num_preds = booster.predict(dtest)*

应用程序

在过去的几个月里,我们一直在与行业中的几个团队合作,包括加拿大丰业银行、爱立信和蚂蚁金服,以开发和部署安全的 XGBoost。特别是,我们正在努力使用 Secure XGBoost 进行反洗钱、欺诈检测和信用风险建模。

资源

我们对这个项目的方向及其潜在的应用感到非常兴奋。代码库是开源的。要开始,请查看我们在 Github 上的项目页面。如果您想进一步了解该项目或有任何疑问,请提出问题或通过以下方式联系我们:

Secure XGBoost 是 umbrella MC 项目的一部分,在这个项目下,我们正在开发各种保护隐私的机器学习工具。请查看我们的项目页面获取更新。

作者

里沙布·波德达尔、切斯特·梁、郑文婷、拉卢卡·阿达·波帕和扬·斯托伊察(里塞拉布,加州大学伯克利分校)

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

使用密码保护您的数据工具

原文:https://towardsdatascience.com/secure-your-data-tool-part-1-2-1585029d59e9?source=collection_archive---------27-----------------------

作为一名数据科学家,如何使用 NGINX 保护数据工具

TL;博士: NGINX 是一种安全访问数据科学工具(如 Airflow 或任何 web 应用程序)的快速简单的方法,不需要完整的 web 开发技能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

框住的熊Unsplash 上拍照

想象一下…你是一名数据科学家,有一个棘手的问题要解决,你发现了一个很棒的开源工具,可以解决这个问题。也许你希望开始用 MLflow 跟踪不同的模型版本……或者你想用 Apache Airflow 建立数据管道……或者你想开始在 JupyterHub 中合作。这些工具都有一个超级简单的安装指南。您运行几个 bash 命令,然后将 web 浏览器指向localhost:port,您就可以启动并运行了。

让我们假设你正在使用气流。在本地使用它之后,您希望开始定期使用 Airflow 和/或与团队中的其他人分享。为此,您可以使用由云提供商(如 AWS EC2 或 GCP 计算引擎)管理的虚拟机,并遵循与在本地机器上类似的步骤。一旦 airflow 启动并运行,您需要能够通过一个网址访问,而不需要提供整个互联网访问。作为一名 web 安全经验有限的数据科学家,这第一次可能是一项艰巨的任务。本教程将向您展示如何以安全的方式在虚拟机上快速托管气流,而无需成为安全或 web 工程师!您也可以轻松地将这些方法应用于其他数据科学工具。

免责声明:本指南旨在为数据科学家提供一种设置密码保护的简单方法。在对敏感用户或公司数据或系统使用这些方法之前,请务必咨询您的内部(或外部)安全专家。#保护数据

先决条件:

本教程假设您已经在 EC2 机器上运行了一个 Apache Airflow 应用程序。这里是阿帕奇气流的一个很好的例子。许多其他数据科学工具都有关于如何设置的类似教程!您还应该非常熟悉 bash 脚本。在本教程中,我们在 EC2 实例上使用 Ubuntu。

此时,您应该能够通过http://<webserver_location>:port在互联网上访问您的 web 应用程序(这种访问可以通过安全组来设置——下面有更多信息!).此时,Airflow 前面没有密码保护,您的浏览器指示您的连接不安全。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

必要的工具

NGINX

NGINX (发音为“engine x”)是一个漂亮、强大、全功能的 web 服务器,它为 web 开发人员提供了许多优秀的功能。这意味着数据科学家需要的少量功能实际上很难设置。您可以将它用于一些关键的功能:

  • 向我们的 web 应用程序添加身份验证(这篇文章)
  • 用域名给我们的网络应用添加加密,这样我们就可以访问 HTTPS 上空的气流

NGINX 是免费和开源的。要在 Ubuntu 服务器上安装 NGINX,请运行:

sudo apt-get install nginx

htpasswd

htpasswd 是一个超级简单的系统,用于管理用户列表和认证密码。我们将使用 htpasswd 来管理访问 Airflow 的用户的用户名和密码。要安装 htpasswd,请运行

sudo apt-get install apache2-utils

AWS 安全组

如果您使用 Airflow running,您可能已经在这里完成了,但是您需要访问 AWS 中的输入/输出端口安全设置来完成本教程。如果你在 AWS 上有一个管理员级别的帐户,你应该没有问题访问它。如果您的访问权限较低,请要求您的管理员授予您 EC2 安全组访问权限。

下面,您将看到对端口8080(它将在没有密码的情况下指向气流)、端口22(它将自动为 SSH 启用)和端口8081(它将在有密码保护的情况下指向气流)的开放访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要添加对这些端口的访问,只需编辑入站列表并点击“添加规则”。接下来从下拉列表中选择“自定义 TCP 规则”,添加您的端口号,并指定谁应该能够访问。您可以在开放访问、当前 IP 和自定义 IP 地址之间进行选择。小心开放访问——互联网上的任何人都可以访问!在这里,我们正在为8081港设置开放访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

设置步骤

测试出 NGINX

NGINX 是通过一系列配置来管理的。在默认安装 Ubuntu 的情况下,这些配置会在/etc/nginx(找不到这个文件?更多详情此处)。您将在这个配置文件中看到各种目录和文件。你在乎的那个叫sites-enabled ( 为什么?)。在这个目录中,您会发现default,这是默认的配置文件。继续打开那个文件。为了保持整洁,让我们继续删除这个文件中的所有内容(提示:如果您正在使用 vim,请键入dG)。

为了确保 NGINX 正常工作,我们将设置一个超级简单的“代理传递”,将一个运行在8080上的 web 服务器“传递”给8081。为此,将以下内容粘贴到新清除的default文件中:

server {
        listen 8081;

        location / {
        proxy_pass http://127.0.0.1:8080;
        }
}

保存并退出该文件后,您需要使用sudo service nginx restart重启 NGINX(这对您不起作用吗?更多选项此处)。假设没有弹出错误,您新创建的代理通行证现在应该可以工作了!如果没有,检查您的安全组设置(前面已经讨论过)以确保端口8081是可访问的。这意味着您现在也应该能够从端口8081获得气流:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意:气流现在仍然在端口 8080 上可用,但现在也在端口 8081 上可用。

添加身份验证

接下来,我们要添加一个用户名和密码认证到我们新的代理端口 8081。我们将使用 htpasswd 来管理用户名和密码,NGINX 将引用它们。

首先,让我们设置我们的第一个新用户。为此,请运行以下命令:

sudo htpasswd -c /etc/.htpasswd testuser

-c应该只是添加了的第一个时间,而不是当你添加新用户之后,/etc/.htpasswd可以是任何文件位置,请小心你放置这个的地方!testuser是用户名。

这将提示您输入密码并确认密码!该命令用您的username:password组合设置一个纯文本文件字符串。尽管密码是以加密格式存储的,但是仍然要确保谁可以访问这个文件。

要添加额外的用户名和密码,只需重新运行上面不带-c的命令:

sudo htpasswd /etc/.htpasswd testuser2

现在我们有了用户设置,我们应该回到default NGINX 配置文件。我们需要增加两条新线路。第一个设置登录提示文本,第二个引用最近创建的密码文件:

server {
        listen 8081;

        location / {
        proxy_pass http://127.0.0.1:8080;
 **auth_basic "Please Login";
        auth_basic_user_file /etc/.htpasswd;**
        }
}

随着 NGINX 配置文件的每次更新,我们需要使用 sudo service NGINX restart 来重启服务。现在前往8081端口,你会看到新的安全网页:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在您已经在端口 8081 上设置了密码,您可以通过安全组设置删除对端口 8080 的访问。现在,用户将只能通过密码安全链接访问气流!

关于这一节的更多细节,这里还有另一个很棒的教程

***注意:*此时,任何窥探您连接的人都可能在传输过程中窃取您的密码。这就是为什么有一个关于“你与这个网站的连接不是私人的”的说明为了避免这种情况,您应该只在安全、可信的 wifi 网络上使用它,或者使用 VPN。您也可以用自己的域名设置 HTTPs,这样就不用担心这个问题了。NGINX 有很棒的教程这里

问题,想法,错误?请在评论中让我知道。感谢阅读!

保护网络上的 ML 服务

原文:https://towardsdatascience.com/securing-ml-services-on-the-web-69408e8554d0?source=collection_archive---------36-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://pix abay . com/photos/vault-business-bank-vault-bank-1144249/

HTTPS 和访问控制

如果您希望在 web 上托管机器学习服务,那么通常有必要锁定端点,以便对服务的调用是安全的,并且只有授权用户才能访问服务。为了确保敏感信息不会暴露在 web 上,我们可以使用安全的 HTTP (HTTPS)来加密客户端和服务之间的通信,并使用访问控制来限制谁可以访问端点。如果你在 2020 年建立一个机器学习服务,你应该计划为你的端点实现安全 HTTP 和访问控制。

本文将展示如何构建一个用 Flask 实现的安全端点来托管 scikit-learn 模型。我们将探索以下方法:

  • 使 HTTPS 直接在烧瓶中
  • 使用 WSGI 服务器(Gunicorn)
  • 使用安全的负载平衡器(GCP)

我们将在 GCP 生态系统中使用 Docker 和 Kubernetes 托管服务。为了限制授权用户的访问,我们将探索以下服务访问控制方法:

  • 基于令牌的身份验证(Flask)
  • OAuth 认证(破折号)
  • 白名单

根据您的组织部署服务的方式,这些选项中的一些可能不可用,但获得锁定服务的各种不同方法的经验是很好的,通常使用多种方法锁定端点是个好主意。这篇文章是从托管用 Python 编写的 web 服务的角度来写的,并建立在我以前关于模型作为 web 端点的文章的基础上。

[## 作为 Web 端点的模型

《生产中的数据科学》摘录

towardsdatascience.com](/models-as-web-endpoints-162cb928a9e6)

烧瓶用 HTTPS

如果您计划在 web 上托管一个机器学习模型,那么您应该在项目早期考虑数据和结果的安全传输需求。Chrome 在 2018 年年中开始将 HTTP 网站标记为不安全,现在有很多工具可以使用 HTTPS 来保护模型端点。安全 HTTP 利用安全套接字层(SSL)来确保客户端和服务器之间的通信是加密的,并使用公钥基础设施(PKI)来确保客户端与其预定目标进行通信。本文主要关注第一个方面,客户端和服务器之间发送的流量是加密的。若要完全设置 HTTPS,您需要设置一个对应于您的端点 IP 地址的 DNS 条目,以便您可以创建一个签名证书,将您的端点标识为受信任的主机。一旦你设置了 DNS 入口,这一步对于谷歌云平台(GCP)来说是很简单的,但是管理一个网络域和 DNS 查询不在这篇文章的讨论范围之内。

一般来说,最好使用 Flask 以外的系统来保护端点,因为 Flask 不应该直接用作 web 应用程序。相反,最好使用 Gunicorn 或 Nginx 等工具在非安全的 Flask 应用程序上提供一个安全层。然而,有时候 Flask 应用程序,比如在 Flask 上用 Dash 构建的交互式 web 应用程序,需要提供端到端的安全连接。这就是像 Flask Dance 这样的库有用的地方。

首先,我们需要安装 Python 和相关库。对于本教程,我们将安装以下库来设置 Flask 端点、Dash 应用程序和客户端应用程序:

pip3 install --user pandas 
pip3 install --user scikit-learn
pip3 install --user flask
pip3 install --user Flask-HTTPAuth
pip3 install --user requests
pip3 install --user cryptography
pip3 install --user gunicorn
pip3 install --user dash
pip3 install --user flask_dance
pip3 install --user dash-google-auth

我们首先在 Flask 中构建一个预测建模端点,返回用户购买新游戏的倾向。模型的输入是一个特征向量,它描述了用户以前是否购买过小目录中的游戏。代码在我以前关于模型的帖子中有更详细的描述,名为 web 端点。下面的代码片段显示了如何设置 Flask 端点,该端点首先训练一个 scikit-learn 模型,在“/”处设置一个端点来服务该模型,然后直接启动应用程序。

基本 HTTP Flask 应用程序。

在使用python flask_html.py运行应用程序之后,我们现在有了一个运行在端口 80 上的模型服务器应用程序。

* Serving Flask app "app" (lazy loading)
* Environment: production
* Debug mode: off
* Running on [http://0.0.0.0:80/](https://0.0.0.0:443/) (Press CTRL+C to quit)

我们还可以使用 Python 测试端点,如下面的代码片段所示:

用于通过 HTTP 调用模型端点的 Python 客户端。

运行客户端代码的结果是使用requests库通过不安全的 HTTP 调用模型端点,然后打印结果。我们希望达到同样的结果,但要让通话在 HTTPS 进行。要设置此协议,我们可以锁定 Flask 端点,使用 web 服务在 Flask 上提供一个安全层,或者使用负载平衡器来提供 HTTPS 功能,同时仍然在虚拟私有云(VPC)中使用 HTTP。

直接使用 Flask 使用 Flask 应用程序启用安全 HTTP 的第一种方法是在 Flask 中建立安全连接。这不是推荐的方法,因为在生产环境中直接使用 Flask 不是最佳实践,而是应该使用诸如 Gunicorn 之类的 WSGI 服务器来包装 Flask 应用程序。但是如果您想在开发期间锁定服务,那么这种方法可能是合适的。在 Flask 端,从 HTTP 到 HTTPS 的更改只需要更改一行,这是前面 Flask 代码片段中的最后一行。

app.run(host='0.0.0.0', port=443, ssl_context='adhoc')

我们修改了应用程序,使其运行在端口 443 上,这是 HTTPS 的默认端口,而不是 HTTP 的默认端口 80。此外,我们还设置了一个 SSL 上下文,它告诉 Flask 使用 SSL 来提供安全连接。adhoc参数告诉 Flask 动态生成未签名的凭证,而不是将已签名或未签名的凭证传递给服务器。当您运行更新后的示例时,您会看到服务的端口和协议都发生了变化,如下所示。

* Serving Flask app "app" (lazy loading)
* Environment: production
* Debug mode: off
* Running on [https://0.0.0.0:443/](https://0.0.0.0:443/) (Press CTRL+C to quit)

该服务现在使用 SSL 来提供客户端和服务器之间的安全连接,但是使用adhoc设置意味着证书的来源没有经过可信机构的验证。为了创建正确签名的证书,我们需要将模型托管在一个命名的 URL 上,比如[https://cat-classifier.ml.com](https://cat-classifier.ml.com),而不仅仅是一个 IP 地址,比如[https://10.0.0.1](https://10.0.0.1)。如果您能够设置一个 DNS 条目来将您的 IP 地址映射到一个命名的 URL,那么您可以使用一个认证机构来创建正确的凭证。与此同时,我们将继续使用adhoc方法,这意味着当您试图使用 Google Chrome 查看模型端点时,会得到以下警告。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用临时凭据会导致未签名的证书。

此外,如果您修改前面的客户端示例,使用 HTTPS 代替 HTTP,您将得到下面的警告。

requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1076)')))

我们现在有了作为安全端点运行的模型,但不是可信端点。为了创建受信任的端点,我们需要一个签名证书来验证发送到端点的流量实际上对应于模型端点,并且不能被冒充我们的服务的第三方截获。我们不会在本文中涉及这方面的内容,但是我们将在下一节中展示如何设置自签名证书。

使用 WSGI 服务器 与其直接运行 Flask 应用,不如在将模型服务应用部署到生产时,使用可扩展的 web 服务器框架,如 Gunicorn 或 Nginx。要修改我们的应用程序以使用 Gunicorn,我们首先需要创建一个自签名证书,该证书可用于建立安全连接。下面显示的命令显示了如何使用 Gunicorn 在 HTTPS 上提供 Flask 应用程序。

openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem 
            -keyout key.pem -days 365 gunicorn --certfile cert.pem --keyfile key.pem 
         -b 0.0.0.0:443 flask_http:app

结果与上一节类似,现在我们有了一个受不可信模型保护的端点。这两个例子的主要区别在于 Gunicorn 方法可以处理更大的流量。

使用负载均衡器 还有第三种方法可以用来建立安全的 flask 应用程序,即构建一个 Flask 应用程序,它使用 HTTP 来服务请求,但是将这个服务包装在一个私有集群中。这种方法是安全的,但是不使用端到端加密。一旦流量被路由到私有集群,云内的机器之间就会使用不安全的连接,这些机器通常没有公共 IP 地址。实现这种设置的一种方法是使用 Google Kubernetes 引擎(GKE)来托管您的容器化 Flask 应用程序,并使用节点端口和入口来设置 HTTPS 安全负载平衡器。结果是,从客户端到服务器的流量将被加密到入口端点,并且从该端点到容器将在内部使用 HTTP。同样,这种方法导致了一种安全但不可信的方法。然而,如果您的端点有一个 DNS 条目,那么使用 Google 管理的 SSL 证书创建一个合适的证书是很简单的。

这一部分专门针对 GCP,但是这种方法应该适用于其他 Kubernetes 环境。下面是一般的方法:

  1. 使用 Docker 将您的应用程序容器化
  2. 在没有公共 IP 的 Kubernetes 集群中托管容器
  3. 使用节点端口服务类型在 VPC 中公开服务
  4. 使用启用了 HTTPS 的服务入口启用外部连接

要设置 GCP 帐户、创建凭证并启用这种方法所需的容器注册和 GKE 服务,需要遵循许多步骤。在我之前关于在 GCP 建立模型服务的文章中提供了更多的细节。我将在这篇文章中介绍的主要区别是使用节点端口加入口设置(第 7 层)与使用负载平衡器作为 TCP 端点来直接公开服务(第 4 层)。

[## 与 GCP 合作开发数据科学

为模型服务部署生产级容器

towardsdatascience.com](/devops-for-data-science-with-gcp-3e6b5c3dd4f6)

第一步是将端点设置为 Docker 应用程序。为了实现这一结果,我们需要创建一个 docker 文件来设置 Python 生态系统,安装所需的库,并定义要运行的应用程序。我们将使用 Gunicorn 来包装 Flask 应用程序,并通过 HTTP 托管这个端点,如下面的 Dockerfile 所示:

FROM ubuntu:latest
MAINTAINER Ben WeberRUN apt-get update \
  && apt-get install -y python3-pip python3-dev \
  && cd /usr/local/bin \
  && ln -s /usr/bin/python3 pythonRUN pip3 install flask
RUN pip3 install pandas
RUN pip3 install gunicorn
RUN pip3 install scikit-learnCOPY app.py app.pyENTRYPOINT ["gunicorn", "--bind", "0.0.0.0:80", "app:app"]

接下来,我们将构建容器,然后在将容器推送到注册中心之前在本地测试容器。

sudo docker image build -t "model_service" .
sudo docker images
sudo docker run -it -p 80:80 model_service

要将容器推送到 Google Container Registry,我们首先需要在推容器之前执行docker login。关于设置这些证书的细节,请参见我之前在 GKE 的模特服务上的帖子。执行完这些步骤后,我们将在 GCP 上有一个可用的容器,我们可以用它在 GKE 部署服务。

将图像推送到 Google 容器注册表。

将容器推送到 GCP 后,我们将启动一个 GKE 集群,并将容器部署为一个工作负载。一旦您设置了一组 pod 并运行服务,您就可以通过首先设置节点端口服务类型来安全地公开服务,如下图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 VPC 中公开模型服务。

下一步是为服务创建一个入口,将端点暴露给开放的 web,而不仅仅是在您的 VPC 中。要设置入口,请浏览至服务和入口选项卡,选择您刚刚创建的节点端口,然后选择“创建入口”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从节点端口创建入口。

从这一步开始,我们可以设置一个具有 HTTP 和 HTTPS 端点的负载平衡器。如果要禁用模型服务的非安全流量,可设置仅 HTTPS 端点。如果选择 HTTPS 选项,则需要指定要使用的证书。您可以暂时假装这一步,选择使用 Google 管理的证书并选择任何域。结果将是一个无效的证书,但是您将能够测试设置一个支持 HTTPS 的负载平衡器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 GCP 负载平衡设置 HTTPS 端点。

结果将是一个 HTTPS 端点,您现在可以在“服务和入口”选项卡中查看。模型服务现在在[https://34.107.189.4](https://34.107.189.4)运行,但是端点不是受信任的 URL。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由此产生的 HTTPS 端点。

我们现在已经探索了将 Flask 应用程序设置为安全端点的三个选项。虽然使用的方法会根据您的云平台和组织偏好而有所不同,但是使用安全 web 服务包装 Flask 应用程序的第二种方法可能是最合适的方法。

烧瓶的访问控制

我们已经讨论了锁定模型服务的第一个方面,即确保客户端和服务器之间发送的流量是加密的。下一步是使用访问控制工具来限制谁可以访问该工具。加密可确保第三方无法监听主机之间的流量,而访问控制可确保未授权方无法访问该服务。如果您在公司网络中工作,那么一种可能已经存在的访问控制形式是仅限于 VPN 的访问。我们不会在这篇文章中讨论这种方法,因为 VPN 的设置可能非常复杂,并且在不同的组织中差异很大。相反,我们将通过令牌、OAuth 和白名单来探索访问控制。

本文没有涉及的另一种访问控制方法是使用 web 服务层,例如 Nginx,在将流量转发到 Flask 应用程序之前进行用户授权。这种方法非常适合数据科学团队,因为它实现了关注点的分离,数据科学团队建立模型服务容器,DevOps 团队管理对端点的访问。对于成熟的组织来说,这是一个很好的方法,但对于负责端到端模型部署的数据科学团队来说,这可能不可行。

基于令牌的认证 启动并运行锁定端点的最简单方法是拥有一个公共秘密,客户端可以使用该秘密向模型服务进行认证。在最简单的情况下,这意味着拥有单一的共享密码,客户端可以使用该密码来建立对资源的访问。这种方法以及大多数访问控制方法只有在使用安全连接与模型服务进行通信时才有效。一般来说,如果没有安全的通信协议,您就不能拥有有效的访问控制。下一步是为不同的用户提供不同的访问令牌或密码,并为不同的角色提供不同的访问级别。

我们将使用令牌方法开始,因为密码管理是一个庞大的主题,我无法在一篇简短的帖子中对其进行公正的讨论。事实上,我建议不要使用任何直接的密码管理,而应该使用 OAuth 之类的协议,这将在下一节中讨论。我们将浏览的示例使用单个令牌进行访问,但是可以扩展到使用一组令牌。理想情况下,您应该有一个工具来生成令牌,存储关于用户和角色的元数据,并能够拒绝令牌或使令牌过期。对于这个简单的例子,我们将使用 Flask-HTTPAuth ,它提供令牌和摘要认证。

向 Flask 应用程序添加令牌认证只需要几个步骤。我们需要使用@auth.login_required 注释来识别哪些路由是安全的,并实现一个verify_token函数来认证客户端。在这种情况下,我们检查来自用户 (1234567890abcdefg )的已知令牌。对于生产系统,通常将令牌存储在数据库中,并将令牌映射到不同的访问策略。

用固定令牌保护 Flask 应用程序。

现在我们已经锁定了端点,当客户端试图在没有令牌的情况下访问端点时,将被拒绝访问,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尝试在没有令牌的情况下访问模型服务。

要访问模型服务,我们需要更新客户机请求示例,以便在请求头中提供令牌。下面的代码片段显示了如何更新请求,将令牌添加到请求中的headers参数。现在,结果应该与第一个示例相同,但是我们现在已经使用令牌将模型服务锁定到客户端。

使用用于访问的令牌调用模型端点。

在与第三方合作时,令牌方法非常有用,因为您可以允许大量用户进行访问。但是,这种方法不如使用 OAuth 之类的协议安全,OAuth 可以用来限制对一组指定用户的访问。

OAuth 认证 令牌对于模型端点很有用,因为您可能需要提供预测,而不需要客户端通过 web UI 登录。但是如果你的目标应用是一个交互式应用,而不是模型预测,那么 Dash 这样的工具会非常有用。我喜欢用 Dash 来构建 web 应用程序,因为我可以用 Python 编写 web 应用程序,并使用 OAuth 等安全特性来验证用户。使用 OAuth,您可以将身份验证委托给已知的提供者,比如 Google 来建立用户的身份。您仍然定义可以访问您的应用程序的用户列表,但是您依赖可信的提供者来完成确保身份的复杂工作。

下面的例子展示了如何使用 Google Oauth 2.0 来锁定 Dash 应用程序。Dash 是建立在 Flask 之上的框架,本例中使用的 Flask Dance 库可以应用于所有 Flask 应用程序。为了让这个例子工作,您需要在 GCP 中配置一个 OAuth 规则。

用 OAuth 2.0 保护的 Dash 应用程序示例。

这种方法的结果是,当您试图访问模型服务端点时,您将得到一个登录页面。如果您提供了凭据并且在允许的用户列表中,您将获得以下内容:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该应用程序服务于授权用户。

使用 OAuth 的主要好处是第三方负责建立用户的身份,这是一个标准协议。如果您正在设置一个基于 GUI 的 web 服务,这是一个很好的方法。

第三种实施访问控制的方式是限制哪些机器可以访问服务。这种方法被称为白名单,因为只有授权 IP 地址列表上的机器才被授权使用该服务。这种方法不验证发出调用的客户端的身份,但是锁定了对少量机器的访问。这种方法对于 VPN 设置很有用,在 VPN 设置中,到 VPN 的连接是安全的,流量通过带有静态地址的 VPN 传输。这对于需要与已知 IP 地址的第三方服务交互的模型端点也很有用。

如果您使用 GKE 服务入口方法来设置负载平衡的 HTTPS 端点,那么您可以使用 GCP 云盔甲来设置白名单规则。所有不允许访问服务的传入流量都将返回 403 响应代码(禁止)。要为负载平衡器设置白名单,请在 GCP 控制台中浏览到 Cloud Armor,然后单击“创建策略”。您可以配置一组阻止的 IP 和允许的 IP。在下面的示例中,默认情况下所有流量都被阻止,优先级更高的第二个规则允许来自 IP 1.2.3.4的访问。设置好 IP 规则后,我们可以使用目标部分将这个新策略应用到模型服务负载平衡器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将单个 IP(1.2.3.4)加入 GCP 云防护的白名单

这种方法的结果是,来自指定 IP 地址的流量将被允许,所有其他流量将得到禁止响应。这种方法不直接对用户进行身份验证,而是依赖于来自已知静态 IP 地址的流量。这类似于在 AWS 上配置 EC2 安全组时设置入站流量规则。

结论

如果您计划建立将在 web 上提供的机器学习模型,那么您应该从项目一开始就计划安全性和访问控制。虽然通常使用包装数据科学团队建立的服务功能的工具来提供安全措施,但是任何发布服务的团队都应该确保 web 服务是安全的,并且仅限于授权用户。

本·韦伯是 Zynga 杰出的数据科学家。我们正在招聘

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

安全认证与授权:您需要了解的内容

原文:https://towardsdatascience.com/security-authentication-vs-authorization-what-you-need-to-know-b8ed7e0eae74?source=collection_archive---------31-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

史蒂夫·哈拉马在 Unsplash 上拍摄的照片

软件术语可能会令人困惑。许多单词可能听起来相似,但却是计算机安全和网络的不同方面,有时,很难将它们区分开来。

关于安全系统,术语“认证”和“授权”的混淆是一个典型的例子。

它们经常被错误地互换使用。

虽然它们听起来相似,但它们是两个完全不同的安全概念。

开发人员集成了强大的身份验证和授权过程,以保护他们的应用程序免受恶意行为者的攻击。

有数以百万计的 web 应用和服务需要认证才能正常工作,因为它们的大部分服务/意图依赖于用户的行为:博客、论坛、购物车、协作工具和基于订阅的内容/服务。

但是,这并不等同于授权。

安全认证与授权:有什么区别?

安全认证和授权到底有什么不同?

在这一节中,我们将进一步了解安全认证和授权。

什么是认证?

认证是断言和证明一个人的身份。我的身份是“joe _ user”(userID),我可以证明我是 Joe,因为我知道 Joe 的密码(其他人都不知道)。

身份认证是验证用户身份以授予他们访问系统或网络的权限的过程。它决定了用户访问诸如服务、数据服务器、网络、数据库、文件等资源的权利。

web 应用程序如何向用户提供身份验证?

大多数应用程序都有一个登录页面,用户必须输入凭据来证明自己的身份。这些凭证可能包括他们的用户 ID、用户名、电子邮件或电话号码以及与之关联的密码。

如果用户提供的凭证与存储在应用程序数据库中的数据相匹配,那么用户就通过了身份验证,并被授权访问应用程序。

常见的身份验证方法有哪些?

有几种方法可以执行身份验证,包括一次性密码、生物识别、身份验证应用程序、硬件令牌、软件令牌等。

最常见的身份验证方式之一是密码,如果用户输入正确的密码,系统会检查凭据并授予用户访问权限。

然而,密码经常成为黑客的目标,并且容易受到网络攻击,如暴力攻击、数据泄露、中间人攻击和密码破解。

因此,企业通常使用其他安全方法,如双因素或多因素身份验证(2FA/MFA)来加强密码之外的安全性。

在多因素身份认证中,系统可能要求在向用户授予访问权限之前成功验证多个因素。

什么是授权?

一旦用户通过身份验证,应用程序就知道你是谁。授权决定了用户可以在应用程序中做什么(垂直授权,例如,用户是否拥有管理员权限,或者他们是普通用户?)以及他们可以访问哪些数据?(横向授权,Joe 用户应该不能访问 Mary Smith 的数据)。

授权是授予用户访问特定资源(如文件、数据库、位置、资金、文件、信息以及应用程序中的几乎任何内容)的必要权限的过程。简而言之,授权评估用户访问系统的能力和程度。

根据 2019 年全球数据风险报告,近 53%的公司发现超过 1000 个敏感文件对每个员工开放。

为了维护强大的安全性,授权必须在身份验证之后进行,即系统在根据用户的权限授予访问权限之前验证用户的身份。

例如,您可能希望允许管理员查看敏感信息,但限制第三方供应商访问这些敏感数据。授权通常与用户访问控制和用户特权互换使用。

授权有哪些不同的方法?

说到授权,您可以采取不同的方法。什么最适合你取决于你的需求。

不同的授权方法包括:

  • **基于令牌:**用户被授予一个令牌,该令牌规定了用户被授予什么特权以及他们可以访问什么数据,其中令牌被加密签名。
  • 基于角色的访问控制(RBAC): 用户被识别为处于规定他们拥有什么特权的角色中。此外,他们的用户 ID 会限制他们可以访问的数据。
  • **访问控制列表(ACL)😗*ACL 指定哪些用户可以访问特定的资源。例如,如果用户想要访问特定的文件或文件夹,他们的用户名或详细信息应该在 ACL 中提及,以便能够访问某些数据。

企业通常批量为用户分配权限和 ACL,他们可能会实现“组”和“角色”,这两个功能可以对用户进行分类,并根据他们的组织地位和工作职能为他们分配访问控制和权限。

通常,一旦经过身份验证的用户可以访问他们的帐户,他们就可以执行他们有权执行的所有操作。

例如,一旦您登录到您的电子邮件帐户,您就可以查看您的所有电子邮件,回复它们,删除它们,对它们进行分类,修改您的个人信息,以及执行其他与电子邮件相关的任务。

但是,如果用户希望执行特别敏感的操作,他们可能需要采取额外的步骤来授权请求。

例如,如果用户试图进行支付,他们可能需要重新输入密码,或者重复身份验证过程,以再次验证他们的身份。

在安全环境中,如果某些应用程序观察到异常的用户行为,如 IP 地址、异常的登录时间或进行高价值交易的尝试,它们可能会使用这种预防性授权方法。

这是为了确保只有授权用户才能访问他们的帐户,并证明他们的帐户没有被恶意行为者劫持或破坏。

身份验证与授权:一个示例

还不清楚身份验证和授权的区别吗?

一个真实世界的例子可以帮助您更好地理解认证和授权之间的区别。

比方说,你想在线访问你的银行账户。

如果您需要登录您的银行应用程序,您必须拥有您的帐户凭证。如果您输入正确的用户名和密码,您就可以访问您的帐户。该应用程序只向拥有正确凭据的用户授予访问权限。

这是认证。

如果您忘记了密码,他们可能会问您一些只有您知道的安全问题,或者他们可能会通过电子邮件向您发送密码重置令牌。

这也是认证。

一旦您成功登录您的用户帐户,您就可以访问您的个人资料、下载您的银行对账单、进行交易以及进行许多其他与银行相关的活动。所有这些活动都是经过授权的。你被授予执行它们的特权。

现在,让我们假设你想在你的账户上访问一个高级服务。虽然您可以访问您的帐户(身份验证)并获得服务,但您可能不被允许(授权)访问高级服务。

在这种情况下,应用程序将在后端数据库中检查您的用户权限,并且只有当您有权访问这些高级服务时,才允许您使用它们。

外卖食品

认证和授权是网络安全的两大支柱,可以保护数据免受潜在的网络攻击。

身份验证是通过检查用户的凭据来验证用户是否是他们所声称的人的过程。授权是检查用户权限并仅授予对特定资源的访问权限的方法。

简而言之,身份验证和授权都是至关重要的,但一个不能替代另一个。

将身份验证和授权视为互补的系统,两者都需要。

理想情况下,您应该在安全系统中实现身份验证和授权。这是确保您的系统和网络安全的最佳方式。

如果您想进行网络安全审计或代码审查,请联系我们。

关于作者:

Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

透过树看到森林

原文:https://towardsdatascience.com/seeing-the-forest-through-the-trees-45deafe1a6f0?source=collection_archive---------42-----------------------

一窥决策树和随机森林算法的内部工作原理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplashveeterzy 拍摄的照片

决策树如何工作

形象地说,决策树就像一个流程图,其中父节点代表一个属性的测试,叶节点代表分配给该叶节点的数据点的最终类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1-学生样本分布

在上图中,从学生成绩数据集中随机抽取了 13 名学生。散点图显示了基于两个属性的样本分布:

  1. 举手次数:学生在课堂上举手提问或回答问题的次数。
  2. visitedResources:学生访问课程内容的次数。

我们的目的是手动构建一个决策树,该决策树能够最好地将样本数据点分成不同的类别——L,M,H,其中:

L =较低性能类别

M =中等(平均)性能类别

H =高性能类别

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选项 A

一种选择是在点标记 70 处沿着属性 visitedResources 分割数据。

这“完美地”将 H 类与其他类区分开来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选项 B

另一种选择是在点标记 41 处沿同一属性 visitedResources 进行分割。

任何类别都无法实现“完美”的分离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选项 C

另一个选项是在点标记 38 处沿属性“举手”进行分割。

这“完美地”将 L 类与其他类区分开来。

选项 A 和 C 在分离至少一个类方面做得更好。假设我们选择选项 A,结果决策三将是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

左边的分支只有 H 班的学生,因此不能再分开了。在右边的分支上,结果节点在 M 和 L 班各有四名学生。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请记住,这是我们分离练习的当前状态。

如何最好地将剩余的学生(数据点)划分到相应的班级?是的,你猜对了——多画几条线!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一种选择是在点标记 38 处沿着属性“举手”进行分割。

同样,可以绘制任意数量的分割线,然而,这个选项似乎产生了一个好的结果,所以,我们将使用它。

分割后得到的决策树如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然,数据点被完美地分成了适当的类,因此不需要进一步的逻辑分离。

迄今吸取的经验教训:

  1. 用 ML 的说法,这个建立一个对给定数据集进行最佳分类的决策树的过程被解释或称为学习
  2. 这个学习过程是迭代的。
  3. 根据所做的拆分属性选择和允许的树深度,可以从同一个数据集中导出不同预测准确度级别的几个决策树。

在手动构建决策树的过程中,我们了解到分隔线可以沿着数据集中可用的任何属性在任何点绘制。问题是,在任何给定的决策节点,哪种可能的属性和分离点会更好地将数据集分离为所需或接近所需的类或类别?确定这个问题答案的工具是基尼系数。

基尼杂质

假设我们有一个新生,我们根据班级的概率分布将这个新生随机分为三个班级。基尼系数是对新的随机学生(变量)进行错误分类的可能性的度量。这是一个概率度量,因此它的范围在 0 和 1 之间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的样本数据集中总共有 13 名学生,H、M 和 L 类的概率分布分别为 5/13、4/13 和 4/13。

以下公式用于计算基尼系数杂质:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述公式在我们的示例中应用时变成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,在任何分割之前,决策树的根节点处的 gini 杂质将被计算为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回想一下前面讨论的根节点处的拆分选项 A 和 C,让我们比较一下这两个选项的基尼系数,看看为什么选择 A 作为更好的拆分选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选项 A

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选项 C

因此,用分割选项 A 去除的杂质数量—基尼系数为:0.66–0.3 =0.36。而拆分选项 C 的值为:0.66–0.37 =0.29

很明显,基尼系数 0.36>0.29,因此,选项 A 是一个更好的分割选择,告知早先选择 A 而不是 c 的决定。

在一个节点上,所有的学生都是一个班的,比如说 H,基尼系数总是等于零,这意味着没有杂质。这意味着一个完美的分类,因此,没有进一步的分裂是必要的。

随机森林

我们已经看到,可以从同一个数据集生成许多决策树,并且这些树在正确预测未知示例方面的性能可能会有所不同。此外,使用单一的树模型(决策树)很容易导致过度拟合。

问题变成了:我们如何确保构建尽可能好的性能树?对此的答案是智能地构造尽可能多的树,并使用平均来提高预测精度和控制过拟合。这种方法称为随机森林。它是随机的,因为每个树不是使用所有的训练数据集而是数据集和属性的随机样本来构造的。

我们将使用 Scikit-learn python 包中的随机森林算法实现来演示如何训练、测试随机森林模型,以及可视化构成森林的一棵树。

在本练习中,我们将训练一个随机森林模型,根据学生在课堂/学习过程中的参与程度来预测(分类)学生所属的学术表现类别(班级)。

在本练习的数据集中,学生的参与被定义为四个变量的衡量标准,它们是:

  1. **举手:**学生在课堂上举手提问或回答问题的次数(数字:0-100)
  2. **访问过的资源:**学生访问课程内容的次数(数字:0–100)
  3. **查看公告:**学生查看新闻公告的次数(数字:0–100)
  4. **讨论组:**学生参加讨论组的次数(数字:0-100)

在下面的示例摘录中,前四(4)个数字列对应于前面定义的学生参与度,最后一列——类别,代表学生的表现。一名学生可以参加三(3)个班中的任何一个——低、中、高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:数据集摘录:学生参与度和表现类

基本数据准备步骤:

  1. 加载数据集
  2. 清理或预处理数据。该数据集中的所有要素都已采用正确的格式,并且不存在缺失值。根据我的经验,在 ML 项目中很少出现这种情况,因为通常需要某种程度的清理或预处理。
  3. 编码标签。这是必要的,因为该数据集中的标签(类)是分类的。
  4. 将数据集分成训练集和测试集。

上述所有步骤的实现如下面的代码片段所示:

接下来,我们将创建一个 RandomForest 实例,并使模型适合(构建树)训练集。

其中:

  1. n_estimators =组成森林的树木数量
  2. 标准 =为决策树挑选最佳属性分割选项时使用的方法。在这里,我们看到基尼系数被使用。
  3. 这是树木深度的上限。如果在这个深度,没有得到明确的分类,模型将认为该层的所有节点是叶节点。此外,对于每个叶节点,数据点被分类为该节点中的多数类。

注意,最佳 n 估计量和 max_depth 组合只能通过试验几种组合来确定。实现这一点的一种方法是使用网格搜索方法。

模型评估

虽然存在几种评估模型的度量标准,但我们将使用其中一种(如果不是最基本的话)——准确性。

训练集上的准确率:72.59% ,**测试集上的准确率:68.55%——**可以更好,但不是一个坏的基准。

想象森林中最好的树

随机森林模型中的最优树可以很容易地可视化,使工程师、科学家和商业专家对模型的决策流程有所了解。

下面的代码片段从上面训练的模型中提取并可视化了最佳树:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从随机森林中提取的决策树。

结论:

在本文中,我们成功地了解了决策树的工作原理,了解了如何使用 gini 杂质进行属性分割选择,如何将几个决策树组合起来形成随机森林,最后,通过训练随机森林模型来演示随机森林算法的用法,以根据学生在课堂/学习过程中的参与程度将他们分类到学术表现类别中。

感谢阅读。

机器学习时代用模型看世界

原文:https://towardsdatascience.com/seeing-the-world-in-models-in-the-age-of-machine-learning-24b5ecec91ef?source=collection_archive---------65-----------------------

电气工程师如何看世界:模型、系统、代码;和机器人

最好的机器人团队并不都是计算机科学家——他们有电气和机械工程师、计算机科学家、机器人等等来填补空缺。这篇文章探索了不同的思维方式是如何在机器人领域做出贡献的——并延伸到许多软件工程项目。

你如何总结你本科专业的总体概念主题?

这最初发布在我关于机器人学的免费时事通讯上&自动化、 民主化自动化

看模特

我主要不是通过电路设计或纳米制造来描述 EE。我花了很长时间才弄清楚我的电子工程(ee)学位和类似的计算机科学学位有什么不同。我的很多同学都获得了软件工程师(SWE)的工作,我们真的不同吗?我知道课程是不同的,但有可能这些课程在不同的课程和时间表中教授相同的概念。

有人会问,EEs 有什么不同?他们学会用模型看世界。我们从事的所有不同任务都有一套不同的假设和工具。我们需要小心并理解我们使用的模型在哪里是正确的,以及我们可能在哪里损害性能(以不确定性的形式)。电路设计有一个 Cadence 库形式的模型,用于特定的制造运行,微机电系统有通常基于物理的模型(但许多其他因素会影响最终的器件),信号处理使用模型来确定它们看到和发送什么信息,等等。

专业的数学,比如傅立叶变换,小波,电磁学等等,都是不同的模型集合。与深度学习相比,这些分析需要大量的数学基础(线性代数、多变量微积分和概率)。学习这些包含系统的严格性使得 EEs 看待机器学习模型的范围有其局限性。

随着每家公司都试图用机器学习 模型 解决新问题,这种用模型看世界的方式变得更加有价值。我的实验室小组几乎完全是电子工程类型的人,科学的、受约束的思维方式将比传统的电子工程设计空间更有助于系统。

也许把这个发给一个你不知道是什么意思的朋友?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

f(x) = x*sin(x)。图片作者。

系统思维

除了用模型看世界,今天制造的大多数东西都是一系列极其复杂的相互联系中的一个齿轮。事实上,大多数工程师都在做一件具有许多下游效应的作品(例如,考虑一下推荐系统如何影响远不止用户)。这是未建模 动力学 的复杂形式(或者是扰动,有些场会这么说)。

我今天认识的机械工程师对系统中他们无法控制的部分有直觉。制造一件硬件?他们会思考它会触动什么,以及如何影响设计。这是一种思维方式,在这种思维方式中,你制造的任何东西都不会存在于泡沫中。

我没有完全掌握这里,因为我不是机械工程师,所以我很好奇什么人可以帮我填写。我有一种预感,热力学、控制理论、静力学等在 EE 中有重叠的主题,但我的印象是如何训练 mech-e 思考和处理事情有点不同。这种方法上的差异就是增加 mech-e 和 EE 的价值所在。

这就好像用不同的参照系覆盖相同类型的主题有助于冗余。我还会将化学工程循环到本节讨论的许多主题中。最终,它指向了计算机科学与工程的讨论,在未来十年我们将会有更多的讨论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不含像素

一切都是可能的

我发现,与全职计算机科学家一起工作时,最大的收获是他们的乐观。软件正在改变世界(或者,称之为魔法),有人相信他们可以构建任何东西。乐观和黑客文化确实有其优点。

我认为计算机科学也建立了很强的主题 抽象 。无论是软件抽象(常见的方式)还是系统层次结构,在计算机科学领域都有一些真正优雅的解决方案。与计算机科学和广义人工智能的发展趋势相比,我不看好集合论、基本算法、编译器等事物的发展速度。这种从理论基础领域和思想结构公式到实现和制造事物(在教育的正式阶段——这具有巨大的价值)的指导的分歧,将定义计算机科学的未来。我想关注一下,与像伯克利和斯坦福这样的学校相比,规模较小的文科学校是如何教授计算机科学的。

那些建立了自己的计算机科学系的学校将会为他们的进步感到高兴。由于工具在社会中的流行,注册人数将持续上升。那是第一层点。其次,通过分离学校,人们会更好地意识到这些群体中有不同的思维方式。计算机科学家理应能够快速移动并打破事物,但是被打破的事物不可能是我们社会的结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

免于像素

无形的(不可捉摸的)东西

大规模建造任何东西需要的不仅仅是受过工程训练的人。也许某个自学成才的人会填补“实际可行”的一些漏洞,或者(工程师优势-复杂触发警告)当设计产品时,没有受过工程师培训的人仍然有有效的输入。

许多无形资产的好处会在几年后显现出来。我喜欢的一个例子是,如果有人设计了一个推荐系统,试图让用户自我感觉良好。这不是短期的收入游戏(与风险投资模式相冲突),但我认为一家 5 年前开始这样做的公司现在会成为所有科技新闻业的黄金盘上的帮手,并且在财务上是不可战胜的(股票市场游戏)。

把它放在一起

机器人技术是一个奇怪的领域。人们实际行为的差异如此之大。这是一个更明显的例子,说明我们需要一种多样化的思维方式,但同样的趋势最终会适用。

作为一名研究人员,我花了第一个“富有成效”的月份追逐一架无人机,所以当它撞到天花板、检测到碰撞并关闭时,我可以抓住它,这样它就不会撞到地面,让我重新组装并从零开始。

  • 或者,我有一个朋友试图将电动机安装到自行车的杆上,制造自动自行车(被微型移动人群吞没)。
  • 或者,亚马逊的研究人员用许多“简单”的机器人管理他们的仓库,我是在开玩笑,提高了受伤率。
  • 或者,你在一个专注于深度强化学习的实验室工作,成功的衡量标准是在计算任务上超越基线。

这些都是正确的答案,但我正试图澄清作为一名机器人专家意味着什么。我试图让人们明白,我们需要各种各样的人来解决这些问题。

信念的飞跃是看到我们需要的不仅仅是计算机科学家来制造产品(即使它们没有在物理上体现出来)。如果一个纯软件项目成功了,那么这个项目将会发展壮大,而随着这种发展,如果在项目的制作过程中没有多样化的想法,那么这个团队可能会准备不足。我不打算指出最近的 ML 系统的道德和实施失败,但它们是普遍存在的。思想的交叉授粉有助于消灭这种恶意的角度。

[## 自动化大众化

一个关于机器人和人工智能的博客,让它们对每个人都有益,以及即将到来的自动化浪潮…

robotic.substack.com](https://robotic.substack.com/)

这最初发布在我关于机器人学的免费时事通讯上&自动化、 民主化自动化

分割和对象检测—第 1 部分

原文:https://towardsdatascience.com/segmentation-and-object-detection-part-1-b8ef6f101547?source=collection_archive---------16-----------------------

FAU 讲座笔记关于深度学习

细分基础

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级/下一讲

欢迎回到深度学习!所以今天,我们想讨论几个更面向应用的话题。我们希望研究图像处理,特别是分割和对象检测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

道路场景中的语义分割。使用 gifify 创建的图像。来源: YouTube

让我们看看我为你准备了什么。下面是接下来五个视频的大纲:我们首先介绍话题,当然。然后,我们再来讲细分。因此,我们将激发它并讨论细分的问题所在。接下来,我们将介绍几种可以实现良好图像分割的技术。你会发现实际上有一些非常有趣的方法,它们非常强大,可以应用于各种各样的任务。在此之后,我们想继续谈论对象检测。所以,这是一种相关的话题。对于对象检测,我们希望研究如何在场景中找到对象以及如何实际识别哪个对象属于哪个类的不同方法。所以,我们先从介绍开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分割、对象检测和实例分割。 CC 下的图片来自深度学习讲座的 4.0 。

到目前为止,我们研究了图像分类。从本质上讲,你可以看到问题在于你只是简单地进行了分类,但是你不能从物体之间的空间关系中得到任何信息。一个改进是图像分割。所以在语义分割中,你试图找到图像中每个像素的类别。在这里,你可以看到我们用红色标记了所有属于“猫”类的像素。现在,如果我们想讨论对象检测,我们必须研究一个稍微不同的方向。因此,这里的想法是基本上识别感兴趣对象所在的区域。你可以在这里看到,如果我们使用,例如,我们在可视化中学到的方法,我们可能不会很高兴,因为我们只会识别与该类相关的像素。所以,这必须以不同的方式完成,因为我们实际上对寻找不同的实例感兴趣。所以我们希望能够在一张图片中找出不同的猫,然后找到包围盒。因此,这实质上是对象检测和实例识别的任务。最后,当我们掌握了这两个概念后,我们还想谈谈实例分割的问题。在这里,不仅仅是你找到所有显示猫的像素,而是你实际上想要区分不同的猫,并将分割分配给不同的实例。这就是实例分割,它将出现在关于这些主题的最后一个视频中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个例子中,图像分割试图找到与图像中的计划相关联的所有像素。 CC 下的图片来自深度学习讲座的 4.0 。

所以,让我们继续谈一谈关于图像分割的想法。现在在图像分割中,我们想要准确地找到哪些像素属于那个特定的类。我们想从本质上描绘有意义的物体的边界。因此,在边界内的所有这些区域应该具有相同的标签,并且它们属于相同的类别。因此,每个像素都有一个语义类,我们希望生成像素级的密集标签。这些概念,当然,在这里显示在图像上,但从技术上讲,你也可以在声音上做类似的事情,例如,当你看光谱图时。图像的概念是,我们想把左边的图像变成右边的图像。你可以看到,我们找到了由飞机标识的区域,我们找到了边界。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

语义边缘分割直接找到语义类的边界。使用 gifify 创建的图像。来源: YouTube

当然,这是一个更简单的任务。在这里,你也可以考虑更复杂的场景,比如这个自动驾驶的例子。在这里,我们感兴趣的是街道在哪里,人在哪里,行人在哪里,车辆在哪里,等等。我们想在这个复杂的场景中标记它们。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分段的应用。 CC 下的图片来自深度学习讲座的 4.0 。

类似的任务也可以用于医学成像。例如,如果你对不同器官的识别感兴趣,比如肝脏在哪里,血管在哪里,或者细胞在哪里。所以,当然,还有很多很多的应用我们不会在这里讨论。如果你处理卫星图像,当然还有航拍图像,自动机器人,还有图像编辑,你可以展示这些技术非常有用的特性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像分割的评价指标。 CC 下的图片来自深度学习讲座的 4.0 。

当然,如果我们想这样做,我们需要谈一谈评估指标。我们必须以某种方式来衡量分割算法的有用性。这取决于几个因素,如执行时间、内存占用和质量。一个方法的质量,我们需要用不同的度量来评估。这里的主要问题是,这些类通常不是平均分布的。因此,我们必须以某种方式解释这一点。我们可以通过增加背景类的数量来做到这一点。然后,我们可以确定,例如,类别 I 的像素被推断为属于类别 j 的概率。例如,p 下标 I,I 将表示真阳性的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个流行的评估指标。来自深度学习讲座CC BY 4.0 下的图片。

这就引出了几个度量标准,例如,像素精度,即正确分类的像素数量与像素总数之间的比率,以及平均像素精度,即每类基础上正确分类的像素的平均比率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两个更受欢迎的指标。 CC 下的图片来自深度学习讲座的 4.0 。

实际上,评估分割更常见的是平均交集/并集,即两个集合的交集和并集之间的比率,以及一个并集的频率加权交集,这是一个平衡版本,其中还将类频率纳入该度量。因此,有了这些衡量标准,我们就可以知道什么是好的细分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以重用分类网络进行图像分割吗?来自深度学习讲座的 4.0CC 下的图片。

然后,我们继续,当然,我们遵循使用完全卷积网络进行分段的思想。到目前为止,如果我们一直使用全卷积网络,我们基本上有一个高维输入——图像——然后我们使用这个 CNN 进行特征提取。然后,输出实际上是不同类别的分布。因此,我们基本上有了一个编码类别概率的向量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

传统的全卷积网络只允许很差的空间分辨率。 CC 下的图片来自深度学习讲座的 4.0 。

所以,你也可以把它转换成一个完全卷积的神经网络,然后从本质上解析整个图像,并把它转换成热图。所以,当我们谈到不同的激活时,我们已经在可视化中看到了类似的想法。我们基本上也可以遵循这条解释线,然后我们会得到一个非常低维非常粗糙的“虎斑猫”类的热图。当然,这是一种可行的方法,但是您无法非常详细地识别属于该特定类的所有像素。因此,你必须做的是,以某种方式将分割或类别信息恢复到原始图像分辨率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编码器-解码器网络似乎有希望用于图像分割。编码器分支本质上是对类进行编码。来自深度学习讲座CC BY 4.0 下的图片。

在这里,关键的想法是不只是使用 CNN 作为编码器,但你也可以使用解码器。因此,我们最终得到一个类似 CNN 的结构,你甚至可以说是沙漏,其中有一个编码器和一个解码器,再次进行上采样。顺便说一下,这不是一个自动编码器,因为输入是图像,但输出是分段掩码。网络的编码器部分本质上是一个 CNN,这与我们已经谈论了很多的技术非常相似。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解码器分支将分类结果提升回原始图像分辨率。 CC 下的图片来自深度学习讲座的 4.0 。

所以,另一方面,我们需要一个解码器。该解码器然后被用于再次对信息进行上采样。实际上有几种方法可以做到这一点。早期的一个是 Long 等人的全卷积网络[13]。还有 SegNet [1],我认为最流行的是 U-net [21]。这也是我暗示过的有很多参考文献的论文。所以,U-net 真的很受欢迎,你可以看到你可以每天查看引用计数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了再次提高分辨率,我们需要上采样技术。 CC 下的图片来自深度学习讲座的 4.0 。

好吧,让我们讨论一下我们该怎么做。主要问题是上采样部分。所以在这里,我们希望有一个解码器,以某种方式创建一个像素预测。可能有不同的选项,例如,取消轮询。你也可以转置卷积,这实际上不是使用池的概念,而是使用卷积的概念,而是转置,从而提高分辨率,而不是进行二次采样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最近邻和甲床上采样。来自深度学习讲座CC BY 4.0 下的图片。

那么,让我们更详细地看看这些上采样技术。当然,您可以做一些类似最近邻插值的事情。在那里,你只需简单地获取低分辨率信息,然后通过获取最近的邻居来解除轮询。有一个钉床,它只接受一个值,你只需要把它放在其中一个位置。所以,剩下的图像看起来像一床钉子。这里的想法是,当然,你只是把信息放在你知道它属于的位置。然后,剩余的缺失条目应该由一个可学习的部分来填充,然后在网络的后续步骤中引入该可学习的部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

记住池索引是使用上下文信息的一种方式。 CC 下的图片来自深度学习讲座的 4.0 。

另一种方法是使用最大汇集指数。因此,这里的想法是,在编码器路径中,执行最大池化,并保存池化实际发生位置的索引。然后,您可以在上采样步骤中再次获取该信息,并在最大值出现的位置准确写入该信息。这非常类似于最大池的反向传播步骤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

转置卷积允许可训练的上采样。 CC 下的图片来自深度学习讲座的 4.0 。

当然,也有像转置卷积这样可以学习的技术。在这里,您将学习上采样,有时也称为去卷积。实际上,对于输入中的每一个像素,滤波器会在输出中移动两个像素。您可以使用步幅控制更高的上采样。让我们看看这个例子。我们有一个单独的像素,然后被取消。在这里,你产生这个 3 x 3 转置卷积。我们用两个步幅展示它。然后,我们移动到下一个像素,你可以看到一个重叠区域出现在这种情况下。在那里,你必须对这个重叠区域做些什么。例如,您可以简单地将它们相加,并希望在随后的处理中,您的网络学会如何处理上采样步骤中的这种不一致性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最好避免重叠配置。来自深度学习讲座CC BY 4.0 下的图片。

在本例中,我们可以继续对其他两个像素执行此操作。然后,你看到我们有这个十字形区域。因此,当内核大小不能被步幅整除时,转置卷积会导致不均匀的重叠。这些轴上不均匀的重叠成倍增加,他们创造了这个典型的棋盘格人工制品。原则上,如前所述,您应该能够学习如何在后续层中再次移除那些工件。在实践中,它会导致冲突,我们建议完全避免它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

避免棋盘状伪影的策略。 CC 下的图片来自深度学习讲座的 4.0 。

那么,如何避免这种情况呢?嗯,你选择一个合适的内核大小。您选择内核大小的方式是它可以被步幅整除。然后,您还可以从卷积中进行单独的上采样来计算特征。例如,您可以使用神经网络或线性插值来调整图像的大小。然后,添加一个卷积层。所以,这是一种典型的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

好吧。到目前为止,我们已经了解了执行图像分割所需的所有基本步骤。实际上,在下一个视频中,我们将讨论如何集成编码器和解码器,以获得良好的分段蒙版。我可能已经告诉你了,有一个你必须要做的特殊技巧。如果不使用这一招,很可能得不到很好的分割结果。所以,请继续关注下一个视频,因为在那里你会看到你如何做好细分。您将了解这些高级分段技术的所有细节。非常感谢大家的收听,下期视频再见。拜拜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

胸部 x 光的分割结果。使用 gifify 创建的图像。来源: YouTube

如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTubeTwitter脸书LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客

参考

[1] Vijay Badrinarayanan, Alex Kendall, and Roberto Cipolla. “Segnet: A deep convolutional encoder-decoder architecture for image segmentation”. In: arXiv preprint arXiv:1511.00561 (2015). arXiv: 1311.2524.
[2] Xiao Bian, Ser Nam Lim, and Ning Zhou. “Multiscale fully convolutional network with application to industrial inspection”. In: Applications of Computer Vision (WACV), 2016 IEEE Winter Conference on. IEEE. 2016, pp. 1–8.
[3] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”. In: CoRR abs/1412.7062 (2014). arXiv: 1412.7062.
[4] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs”. In: arXiv preprint arXiv:1606.00915 (2016).
[5] S. Ren, K. He, R. Girshick, et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”. In: vol. 39. 6. June 2017, pp. 1137–1149.
[6] R. Girshick. “Fast R-CNN”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1440–1448.
[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, et al. “Focal loss for dense object detection”. In: arXiv preprint arXiv:1708.02002 (2017).
[8] Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, et al. “A Review on Deep Learning Techniques Applied to Semantic Segmentation”. In: arXiv preprint arXiv:1704.06857 (2017).
[9] Bharath Hariharan, Pablo Arbeláez, Ross Girshick, et al. “Simultaneous detection and segmentation”. In: European Conference on Computer Vision. Springer. 2014, pp. 297–312.
[10] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[11] N. Dalal and B. Triggs. “Histograms of oriented gradients for human detection”. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition Vol. 1. June 2005, 886–893 vol. 1.
[12] Jonathan Huang, Vivek Rathod, Chen Sun, et al. “Speed/accuracy trade-offs for modern convolutional object detectors”. In: CoRR abs/1611.10012 (2016). arXiv: 1611.10012.
[13] Jonathan Long, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation”. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015, pp. 3431–3440.
[14] Pauline Luc, Camille Couprie, Soumith Chintala, et al. “Semantic segmentation using adversarial networks”. In: arXiv preprint arXiv:1611.08408 (2016).
[15] Christian Szegedy, Scott E. Reed, Dumitru Erhan, et al. “Scalable, High-Quality Object Detection”. In: CoRR abs/1412.1441 (2014). arXiv: 1412.1441.
[16] Hyeonwoo Noh, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation”. In: Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1520–1528.
[17] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, et al. “Enet: A deep neural network architecture for real-time semantic segmentation”. In: arXiv preprint arXiv:1606.02147 (2016).
[18] Pedro O Pinheiro, Ronan Collobert, and Piotr Dollár. “Learning to segment object candidates”. In: Advances in Neural Information Processing Systems. 2015, pp. 1990–1998.
[19] Pedro O Pinheiro, Tsung-Yi Lin, Ronan Collobert, et al. “Learning to refine object segments”. In: European Conference on Computer Vision. Springer. 2016, pp. 75–91.
[20] Ross B. Girshick, Jeff Donahue, Trevor Darrell, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation”. In: CoRR abs/1311.2524 (2013). arXiv: 1311.2524.
[21] Olaf Ronneberger, Philipp Fischer, and Thomas Brox. “U-net: Convolutional networks for biomedical image segmentation”. In: MICCAI. Springer. 2015, pp. 234–241.
[22] Kaiming He, Xiangyu Zhang, Shaoqing Ren, et al. “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”. In: Computer Vision — ECCV 2014. Cham: Springer International Publishing, 2014, pp. 346–361.
[23] J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, et al. “Selective Search for Object Recognition”. In: International Journal of Computer Vision 104.2 (Sept. 2013), pp. 154–171.
[24] Wei Liu, Dragomir Anguelov, Dumitru Erhan, et al. “SSD: Single Shot MultiBox Detector”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 21–37.
[25] P. Viola and M. Jones. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision Vol. 1. 2001, pp. 511–518.
[26] J. Redmon, S. Divvala, R. Girshick, et al. “You Only Look Once: Unified, Real-Time Object Detection”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). June 2016, pp. 779–788.
[27] Joseph Redmon and Ali Farhadi. “YOLO9000: Better, Faster, Stronger”. In: CoRR abs/1612.08242 (2016). arXiv: 1612.08242.
[28] Fisher Yu and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions”. In: arXiv preprint arXiv:1511.07122 (2015).
[29] Shuai Zheng, Sadeep Jayasumana, Bernardino Romera-Paredes, et al. “Conditional Random Fields as Recurrent Neural Networks”. In: CoRR abs/1502.03240 (2015). arXiv: 1502.03240.
[30] Alejandro Newell, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation”. In: European conference on computer vision. Springer. 2016, pp. 483–499.

分割和对象检测—第 2 部分

原文:https://towardsdatascience.com/segmentation-and-object-detection-part-2-a334b91255f1?source=collection_archive---------45-----------------------

FAU 讲座笔记关于深度学习

跳过连接和更多

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级 / 下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用于细胞分割的 U-net。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习!所以今天,我们想谈谈更高级的图像分割方法。让我们看看我们的幻灯片。你可以在这里看到这是图像分割和物体检测系列讲座视频的第二部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如何整合语境知识? CC 下的图片来自深度学习讲座的 4.0 。

现在,我们需要知道的关键思想是如何整合上下文知识。仅仅使用我们在上一个视频中谈到的这种编码器-解码器结构不足以获得良好的分割。关键的概念是,你必须以某种方式告诉你的方法在哪里发生了什么,以便得到一个好的分段掩码。你需要平衡本地和全球信息。当然,这是非常重要的,因为局部信息对于给出好的像素精度是至关重要的,并且全局上下文对于正确地找出类是重要的。CNN 通常在这种平衡中挣扎。因此,我们现在需要一些关于如何整合这些上下文信息的好主意。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Long 等人在[13]中展示了整合上下文的第一个想法。来自深度学习讲座CC BY 4.0 下的图片。

现在,Long 等人展示了这样做的第一种方法。他们本质上使用由可学习的转置卷积组成的上采样。关键的想法是,您想要添加链接,将最终预测与更精细的步骤中的先前较低层相结合。此外,他在池层之后进行了 1x1 卷积,然后将预测相加,以使用全局结构进行局部预测。因此,网络拓扑是一个有向无环图,从较低层到较高层有跳跃连接。因此,您可以细化一个粗略的分段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Long 等人对早期阶段知识进行了补充和整合。 CC 下的图片来自深度学习讲座的 4.0 。

所以,让我们更详细地看看这个想法。你现在可以看到,如果你在右下角有地面实况,这有很高的分辨率。如果你简单地使用 CNN 和上采样,你会得到一个非常粗糙的分辨率,如左边所示。那么,龙等人的提议是什么呢?他们建议使用来自先前下采样步骤的信息,该步骤仍具有较高的分辨率,并在解码器分支内使用该信息,通过求和产生分辨率更高的图像。当然,您可以在解码器分支中再次这样做。你可以看到,这样我们可以对分段进行上采样,并重用来自编码器分支的信息,以产生更好的高分辨率结果。现在,您可以引入这些跳过连接,它们可以产生比仅使用解码器和上采样信息好得多的分段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SegNet [1]重用了最大池索引。 CC 下的图片来自深度学习讲座的 4.0 。

你看,整合背景知识是关键。在 SegNet 中,这里采用了不同的方法。还有这种卷积编码器-解码器结构。这里,关键思想是在上采样步骤中,在下采样步骤中重用来自最大池的信息,以便获得分辨率更高的解码。这已经是一个整合上下文知识的好主意了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ronneberger 在[21]中引入了跳过连接。来自深度学习讲座CC BY 4.0 下的图片。

然后,一个更好的想法在 U-net 中展示出来。这里,网络由编码器分支组成,该分支是捕获上下文的收缩路径。解码器分支为定位进行对称扩展。因此,编码器遵循 CNN 的典型结构。解码器现在包括上采样步骤和相应编码器步骤的各个层的先前特征图的连接。因此,训练策略也依赖于数据扩充。有非刚性的变形、旋转和平移被用来给 U-net 带来额外的性能提升。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

U-net 设计。 CC 下的图片来自深度学习讲座的 4.0 。

你可以说 U-net 本质上是最先进的图像分割方法。这也是它有这个名字的原因。源于其形。你可以看到你得到了这个 U 型结构,因为你在精细层次上有很高的分辨率。然后降采样到较低的分辨率。解码器分支再次对所有内容进行上采样。这里的关键信息是连接解码器和编码器的两个相应级别的跳跃连接。这样你可以得到非常非常好的图像分割。训练非常简单,这篇论文已经被引用了数千次(2020 年 8 月 11 日:16471 次引用)。每天你都可以查看引用次数,它已经增加了。Olaf Ronneberger 能够在这里发表一篇非常重要的论文,它主宰了整个图像分割领域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

U-net 的变体。来自深度学习讲座的 4.0CC 下的图片。

您可以看到还有许多其他方法。它们可以通过 U-net 实现。所以他们可以使用扩张卷积等等。已经提出了许多这些非常小的变化,它们可能对特定的任务有用,但是对于一般的图像分割,U-net 已经被证明仍然优于这样的方法。尽管如此,仍然有一些东西可以使用,如扩张卷积,有网络堆栈可以非常有益,还有多尺度网络,然后甚至进一步深入到在不同尺度上使用图像的想法。您还可以做一些事情,比如将上下文建模推迟到另一个网络。然后,你也可以加入循环神经网络。同样非常好的想法是使用一个条件随机场来改进产生的分割图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

扩张卷积也可以应用于 U-net。 CC 下的图片来自深度学习讲座的 4.0 。

我们这里有一些额外的方法,这样你就能明白我们在说什么。这里的扩大卷积,是你想要使用我们已经讨论过的那些萎缩卷积的想法。因此,我们的想法是,在不损失分辨率的情况下,使用扩张卷积来支持感受野的指数级扩张。然后,引入控制上采样因子的膨胀率 L。然后你把它叠加在上面,这样你就能使感受野呈指数增长,而滤波器的参数数量呈线性增长。因此,在需要进行大范围放大的特定应用中,这非常有用。所以,这真的取决于你的应用。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在各种分割方法中已经采用了扩展卷积。来自深度学习讲座CC BY 4.0 下的图片。

这方面的例子有 DeepLab、ENet 和[28]中的多尺度上下文聚合模块。当然,主要问题是没有有效的实现。因此,这种好处还不清楚。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堆叠沙漏模块。 CC 下的图片来自深度学习讲座的 4.0 。

我想向大家展示的另一种方法是所谓的堆叠沙漏网络。所以,这里的想法是,你使用一个非常类似于 U-net 的东西,但是你要在 skip 连接中加入一个额外的可训练部分。所以,这基本上是主要的想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堆叠模块导致堆叠沙漏网络。来自深度学习讲座的 4.0CC 下的图片。

然后,您可以使用这个沙漏模块,并将其堆叠在彼此后面。因此,基本上有多个细化步骤,并且总是返回到原始分辨率。你可以插入第二个网络,本质上是一种伪像校正网络。现在,这种沙漏网络方法的真正好处是,你可以回到原来的分辨率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卷积姿态机器还将几个模块堆叠在彼此之上,以实现姿态跟踪。这也可以与分段相结合。使用 gifify 创建的图像。来源: YouTube

假设你同时在预测几门课。然后,你会得到几个不同类别的分段掩码。这个想法可以在一个叫做卷积姿态机的东西中被提取出来。在回旋摆姿机中,你使用沙漏连接的区域,这里你有一个 U 形网基本上叠在另一个 U 形网的上面。在这一层,您还可以使用每个类的结果分割图,以便相互通知。因此,您可以使用在图像中检测到的其他事物的上下文信息来控制这种细化。在卷积姿态机器中,你为身体模型关节的姿态检测做那件事。当然,如果你有左膝关节和右膝关节以及身体的其他关节,关于其他关节的信息有助于解码正确的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

X 射线变换不变标志检测Bastian Bier。来自深度学习讲座的 4.0CC 下的图片。

这个想法也被我的同事 Bastian Bier 用于在 x 射线投影分析中检测解剖标志。我在这里放一个小视频。您已经在简介中看到了这一点,现在您终于有了理解该方法所需的所有上下文。因此,这里有一种非常类似于卷积姿态机器的方法,然后开始通知地标彼此的方向和位置,以获得更好的检测结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

条件随机场也可以作为层引入。 CC 下的图片来自深度学习讲座的 4.0 。

那还有什么?我已经暗示了条件随机场。这里的想法是使用条件随机场来优化输出。因此,像素被建模为随机场中的一个节点。这些基于像素对的术语非常有趣,因为它们可以捕捉长程相关性和精细的局部信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果使用通用报告格式。来自深度学习讲座CC BY 4.0 下的图片。

如果你看到这里的输出,这是来自 DeepLab 的。在这里,您可以看到条件随机场的迭代优化如何帮助改进分割。因此,你也可以像在[4]中那样将它与阿图斯卷积结合起来。你甚至可以用递归神经网络来模拟条件随机场,如参考文献[29]所示。这也允许整个条件随机场的端到端训练。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对抗性损失也适用于图像分割。 CC 下的图片来自深度学习讲座的 4.0 。

还有几个高级主题我仍然想暗示一下。当然,你也可以带着损失工作。到目前为止,我们只看到了分割损失本身,但是当然,您也可以混合和匹配我们在本课程中已经看到的以前的想法。例如,你可以使用 GAN 来增加你的损失。这里的想法是,你可以创建一个分割器。然后,您可以使用分割器的输出作为 GAN 类型鉴别器的输入。鉴别器现在的任务是判断这是自动分段还是手动分段。那么,这可以被用作一种由生成性对抗网络的思想所启发的额外的对抗损失。你会发现,在文学作品中,这通常被称为对抗性的失败。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对抗性损失通常与分割损失相结合。 CC 下的图片来自深度学习讲座的 4.0 。

那么,这是如何实现的呢?这个想法是,如果你有一个数据集给定的 N 个训练图像和相应的标签图,那么你可以建立以下损失函数:这本质上是多类交叉熵损失,然后你把对你的分割掩模起作用的对抗性损失放在上面。所以在这里,你可以用事实标签和欺骗鉴别器来训练你的分段。这本质上就是一种带有对抗性任务的多任务学习方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。来自深度学习讲座CC BY 4.0 下的图片。

好吧。所以,今天的短片到此结束。你可以看到,我们已经了解了如何构建良好的细分网络的关键理念。尤其是,U-net 是您应该了解的关键概念之一。既然我们已经讨论了分割网络,我们可以在下节课讨论对象检测以及如何快速实现它。所以,这是图像解读的另一面。我们还将能够找出图像中不同实例的实际位置。所以我希望,你喜欢这个小视频,我期待着在下一个视频中见到你。非常感谢,再见。

如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTubeTwitter脸书LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客

参考

[1] Vijay Badrinarayanan, Alex Kendall, and Roberto Cipolla. “Segnet: A deep convolutional encoder-decoder architecture for image segmentation”. In: arXiv preprint arXiv:1511.00561 (2015). arXiv: 1311.2524.
[2] Xiao Bian, Ser Nam Lim, and Ning Zhou. “Multiscale fully convolutional network with application to industrial inspection”. In: Applications of Computer Vision (WACV), 2016 IEEE Winter Conference on. IEEE. 2016, pp. 1–8.
[3] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”. In: CoRR abs/1412.7062 (2014). arXiv: 1412.7062.
[4] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs”. In: arXiv preprint arXiv:1606.00915 (2016).
[5] S. Ren, K. He, R. Girshick, et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”. In: vol. 39. 6. June 2017, pp. 1137–1149.
[6] R. Girshick. “Fast R-CNN”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1440–1448.
[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, et al. “Focal loss for dense object detection”. In: arXiv preprint arXiv:1708.02002 (2017).
[8] Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, et al. “A Review on Deep Learning Techniques Applied to Semantic Segmentation”. In: arXiv preprint arXiv:1704.06857 (2017).
[9] Bharath Hariharan, Pablo Arbeláez, Ross Girshick, et al. “Simultaneous detection and segmentation”. In: European Conference on Computer Vision. Springer. 2014, pp. 297–312.
[10] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[11] N. Dalal and B. Triggs. “Histograms of oriented gradients for human detection”. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition Vol. 1. June 2005, 886–893 vol. 1.
[12] Jonathan Huang, Vivek Rathod, Chen Sun, et al. “Speed/accuracy trade-offs for modern convolutional object detectors”. In: CoRR abs/1611.10012 (2016). arXiv: 1611.10012.
[13] Jonathan Long, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation”. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015, pp. 3431–3440.
[14] Pauline Luc, Camille Couprie, Soumith Chintala, et al. “Semantic segmentation using adversarial networks”. In: arXiv preprint arXiv:1611.08408 (2016).
[15] Christian Szegedy, Scott E. Reed, Dumitru Erhan, et al. “Scalable, High-Quality Object Detection”. In: CoRR abs/1412.1441 (2014). arXiv: 1412.1441.
[16] Hyeonwoo Noh, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation”. In: Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1520–1528.
[17] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, et al. “Enet: A deep neural network architecture for real-time semantic segmentation”. In: arXiv preprint arXiv:1606.02147 (2016).
[18] Pedro O Pinheiro, Ronan Collobert, and Piotr Dollár. “Learning to segment object candidates”. In: Advances in Neural Information Processing Systems. 2015, pp. 1990–1998.
[19] Pedro O Pinheiro, Tsung-Yi Lin, Ronan Collobert, et al. “Learning to refine object segments”. In: European Conference on Computer Vision. Springer. 2016, pp. 75–91.
[20] Ross B. Girshick, Jeff Donahue, Trevor Darrell, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation”. In: CoRR abs/1311.2524 (2013). arXiv: 1311.2524.
[21] Olaf Ronneberger, Philipp Fischer, and Thomas Brox. “U-net: Convolutional networks for biomedical image segmentation”. In: MICCAI. Springer. 2015, pp. 234–241.
[22] Kaiming He, Xiangyu Zhang, Shaoqing Ren, et al. “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”. In: Computer Vision — ECCV 2014. Cham: Springer International Publishing, 2014, pp. 346–361.
[23] J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, et al. “Selective Search for Object Recognition”. In: International Journal of Computer Vision 104.2 (Sept. 2013), pp. 154–171.
[24] Wei Liu, Dragomir Anguelov, Dumitru Erhan, et al. “SSD: Single Shot MultiBox Detector”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 21–37.
[25] P. Viola and M. Jones. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision Vol. 1. 2001, pp. 511–518.
[26] J. Redmon, S. Divvala, R. Girshick, et al. “You Only Look Once: Unified, Real-Time Object Detection”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). June 2016, pp. 779–788.
[27] Joseph Redmon and Ali Farhadi. “YOLO9000: Better, Faster, Stronger”. In: CoRR abs/1612.08242 (2016). arXiv: 1612.08242.
[28] Fisher Yu and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions”. In: arXiv preprint arXiv:1511.07122 (2015).
[29] Shuai Zheng, Sadeep Jayasumana, Bernardino Romera-Paredes, et al. “Conditional Random Fields as Recurrent Neural Networks”. In: CoRR abs/1502.03240 (2015). arXiv: 1502.03240.
[30] Alejandro Newell, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation”. In: European conference on computer vision. Springer. 2016, pp. 483–499.

分割和对象检测—第 3 部分

原文:https://towardsdatascience.com/segmentation-and-object-detection-part-3-abb4ec936fa?source=collection_archive---------43-----------------------

FAU 讲座笔记关于深度学习

一家地区性有线电视新闻网

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是与幻灯片匹配的讲座视频&的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级/下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

野外物体检测。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习!所以今天,我们想多谈谈物体检测的概念。我们将从对象检测的一个小动机和如何实际执行的一些关键想法开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也可以使用对象检测方法来检测猫。 CC 下的图片来自深度学习讲座的 4.0 。

那么,让我们来看看我们的幻灯片。你看,这已经是我们关于分割和物体检测的短片系列的第三部分了。现在,主题是物体检测。好吧,让我们稍微激励一下。这个想法——你还记得——是我们想要定位物体并对它们进行分类。所以,我们想知道猫在图像中的位置,我们想知道它们是否真的是猫。这通常通过生成关于边界框的假设来解决,然后对这些框进行重新采样,并应用分类器。因此,这些方法的主要区别在于如何组合和替换这些步骤,以实现更高的速度或精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

包围盒是物体检测的关键。来自深度学习讲座CC BY 4.0 下的图片。

我们也可以看看这个平面例子。当然,我们正在寻找边界框,边界框通常被定义为完全包含所讨论的对象的最小的框。然后,这通常被定义为具有宽度 w 和高度 h 以及边界框的一些分类器置信度的左上角。你可以看到,我们也可以用它来检测整个飞机,或者我们也可以用它来检测飞机的一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于特殊的应用,存在传统的方法。来自深度学习讲座的 4.0CC 下的图片。

这实际上是我们已经有了不同成功故事的悠久历史的事情。一个非常早期的继任者是 Viola 和 Jones 算法,这是最早的真正有效的人脸检测器之一。这里你可以看到例子。这是使用哈尔特征,然后这些哈尔特征被用于一种提升级联,以便非常快速地检测人脸。所以,它使用了大量可以高效计算的特征。然后,在提升级联中,他们将只选择最有可能在给定位置检测到人脸的特征。然后用所谓的梯度方向直方图和经典方法对此进行了改进。你总是有一个好的特征提取加上一些有效的分类。当时,支持向量机非常普遍。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

常见深度学习对象检测方法综述。 CC 下的图片来自深度学习讲座的 4.0 。

当然,也有基于神经网络的方法。你可以用一个预先训练好的 CNN 很容易地做到这一点。因此,您可以简单地使用滑动窗口方法,然后通过 CNN 检测每个可能的窗口。有像 RCNN 这样的区域提议 CNN,先找到感兴趣的图像区域,然后用我们的 CNN 进行分类。我们将在下一个视频中讨论单次检测器,它可以进行联合检测和分类。我认为最著名的例子之一是 YOLO——你只需看一次——我们在介绍中已经有了这个例子。这是一种非常好的方法,可以实时完成所有这些检测方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么。不就是用推拉窗吗?来自深度学习讲座CC BY 4.0 下的图片。

嗯,在滑动窗口方法中,你可以简单地拿起你预先训练好的 CNN,在图像上移动它。当你发现一个高度自信的领域时,你可以说:“好的。有一张脸,我想检测这张脸!”现在,这里最大的缺点是,你不仅要检测人脸,而且人脸可能有不同的分辨率。所以,你要在多个分辨率上重复这个过程。然后,您已经看到逐片检测会产生大量的补丁。你要做大量的分类。所以,这可能不是我们想要走的路。当然,一个好处是我们不需要重新训练。在这种情况下,我们可以简单地使用我们训练过的分类网络。但它的计算效率非常低,我们希望寻找一些如何更有效地做到这一点的想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

更好的方法是完全卷积处理。 CC 下的图片来自深度学习讲座的 4.0 。

一个想法是,当然,你用它与完全卷积神经网络,并理解以下方法。所以,我们可以考虑如何将一个完全连接的层应用到一个任意形状的张量。一个想法是你将激活扁平化,然后运行你的全连接层,你可以得到一个分类结果。相反,您可以重塑权重,然后使用卷积。这将产生完全相同的结果。我们在讨论逐个卷积时已经讨论过了。现在,这里好的性质是,如果我们遵循这个想法,我们也可以处理任意形状的空间输入大小。通过使用卷积,我们还将产生更大的输出大小。所以,我们有点摆脱了移动窗口的方法,但我们仍然有一个问题,我们必须查看不同的比例,以便找到所有有趣的对象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

区域 CNN (RCNN)综述。来自深度学习讲座CC BY 4.0 下的图片。

这就是为什么人们一直在关注基于区域的检测器。因此,我们知道 CNN 是强大的分类器,全卷积神经网络有助于提高效率。但他们还是有些蛮力。那么,我们能做些什么呢?我们可以通过像我们的眼睛一样只考虑感兴趣的区域来提高效率。所以,这就引出了 RCNN,区域性的 CNN。这里,您有一个多步骤方法,可以生成区域建议和选择性搜索。然后,将区域建议的内容分类到一个优化的边界框中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,我们必须找到区域。 CC 下的图片来自深度学习讲座的 4.0 。

让我们更详细地看一下这个问题。在这里,我们的区域建议,你通过一组具有相似纹理和颜色的像素来生成这些候选对象。然后你产生几千个目标提案,比如每个图像两千个。您会注意到,这比可能的窗口数量小得多。你基本上是基于一种粗略的分割形式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RCNN 使用经典的超像素方法。来自深度学习讲座CC BY 4.0 下的图片。

在最初的 RCNN 论文中,他们实际上使用了一种叫做超像素的方法。超像素允许你生成更小和更大的区域。所以,你可以看到我们如何从左到右增加区域大小。然后,我们可以使用这些区域,以便用另一个检测器找到感兴趣的区域。然后,这些感兴趣的区域可以进入分类器的下一阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其次是美国有线电视新闻网专题敲诈加 SVM 分类。 CC 下的图片来自深度学习讲座的 4.0 。

因此,在第二阶段,一旦我们有了这些区域,我们基本上就有了一个卷积神经网络。一方面,这产生了细化边界框的框回归。另一方面,这也作为一种表示学习提供给支持向量机进行最终决策。因此,这比我们之前在 2013 年那个时候看到的要好,但仍然很慢,而且不是端到端的。所以,如果我们想加速这个过程,我们会发现 RCNN 仍然存在问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为什么我们必须单独处理每个包围盒? CC 下的图片来自深度学习讲座的 4.0 。

因为我们对每个地区的提案都进行了全面的审核,这意味着这种培训很慢,推理也很慢。我们可以在计算特征图时共享计算,因为我们一直在做相同或相似的计算。然后,为了提高推理速度,关键思想是在特征图上使用区域建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

空间金字塔池允许我们只运行一遍 CNN 特征提取。它将检测到的 ROI 映射到最大汇集空间。来自深度学习讲座CC BY 4.0 下的图片。

所以,你要做的是通过网络传递整个图像来生成特征地图。然后,将区域建议应用到最后一个卷积层。因此,您必须调整它们的大小才能应用到图层。您可以这样做,因为您可以通过计算合并步骤来重新格式化检测到的超像素,从而预测该特定图层的大小。分类 CNN 具有固定的输入大小。因此,您使用所谓的空间金字塔池,通过最大池将其重新采样为固定大小。最初,这是用三种不同的窗口大小和跨度完成的。然后,你基本上共享了这种基于图像的计算,这大大加快了推理的速度。你已经可以将推论加速 24 倍到 104 倍。尽管如此,你有缓慢的训练,这不是端到端的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

重新绑定到固定的输入大小是通过池化实现的。 CC 下的图片来自深度学习讲座的 4.0 。

一个原因是,我们有这个区域提案库,您可以根据区域标识中的这些建议进行汇总。你可以简单地用最大池来实现。如果你只是在一个固定的采样中做,你在这一步会丢失一些信息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

快速 RCNN 的剩余问题。来自深度学习讲座CC BY 4.0 下的图片。

此外,这种空间金字塔池用于一个输出地图。他们有一些想法来更好地选择小批量的样品。你可以随机抽取 128 个均匀的感兴趣区域,如果你这样做,那么特征图通常不会重叠。相反,您也可以进行分层采样,然后从几幅图像中进行采样,但会有许多 ROI,比如 64 个。然后,你产生一个高度重叠。将支持向量机和回归替换为用于分类的 softmax 图层和用于边界框微调的回归图层。这将导致多任务丢失,并且总的来说,训练比 RCNN 快 9 倍。但我们仍然不是实时的。因此,除了投资回报提案,我们几乎是端到端的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

家居用品也可以在货架上检测到。未来的超市会使用这种技术吗?使用 gifify 创建的图像。来源: YouTube

为了进一步加速,你可以做的就是所谓的更快的 RCNN。这里的关键思想是,您添加一个区域建议网络,输入现在是生成的特征地图,输出是我们的区域建议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用区域提议网络,我们可以端到端地训练我们的 RCNN。来自深度学习讲座的 4.0CC 下的图片。

这集成到快速 RCNN 中。这里的想法是用不同的比例和纵横比定义锚定框,通常是三个比例和三个纵横比。这导致了有效的多尺度。因此,图像大小和过滤器大小都不需要改变。您可以获得大约 4000 个盒子参数和 2000 个分数,因为您拥有用于对象/非对象检测的 softmax。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

快速 RCNN 的配置。 CC 下的图片来自深度学习讲座的 4.0 。

这样,你就有了一个完全卷积的端到端系统,但这个系统仍然不是实时的。那么,让我们来比较一下这些方法。在这里,您可以看到基于 RCNN 的不同架构的概述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RCNN、快速 RCNN 和更快 RCNN 的比较。来自深度学习讲座CC BY 4.0 下的图片。

你可以看到 RCNN 本身也在进行选择性搜索。然后,根据产生感兴趣区域的选择性搜索,调整大小。你使用一个 CNN,然后由支持向量机处理,你还做了一个包围盒回归,以完善包围盒。因此,快速 RCNN 在完全卷积方法中使用一个 CNN 进行特征提取。一步就可以制作出完整的特征地图。您仍然可以进行选择性搜索,然后生成感兴趣区域,您可以在空间金字塔池中使用它们,以便为完全连接的图层提供信息。然后,你有包围盒检测头和正在做这种多任务预测的类头。在更快的 RCNN 中,你真正进入了一个端到端的系统。这里,你有 CNN 特征提取。从这些提取的特征中,你做区域提议。随后进行 ROI 合并,然后得到边界框预测头和类头,这在训练、端到端方面快得多,在推理方面也快得多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

尽管如此,我们仍然不能进行实时分类,这就是为什么我们下次要讨论能够做到这一点的单次检测器。我真的希望你喜欢这个视频,我期待着在下一个视频中见到你。拜拜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个皮卡丘探测器不会帮你玩 Pokemon Go。使用 gifify 创建的图像。来源: YouTube

如果你喜欢这篇文章,你可以在这里找到更多的文章,在这里找到更多关于机器学习的教育材料,或者看看我们的深度 学习 讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube、Twitter、脸书、LinkedIn 或 T21。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客

参考

[1] Vijay Badrinarayanan, Alex Kendall, and Roberto Cipolla. “Segnet: A deep convolutional encoder-decoder architecture for image segmentation”. In: arXiv preprint arXiv:1511.00561 (2015). arXiv: 1311.2524.
[2] Xiao Bian, Ser Nam Lim, and Ning Zhou. “Multiscale fully convolutional network with application to industrial inspection”. In: Applications of Computer Vision (WACV), 2016 IEEE Winter Conference on. IEEE. 2016, pp. 1–8.
[3] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”. In: CoRR abs/1412.7062 (2014). arXiv: 1412.7062.
[4] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs”. In: arXiv preprint arXiv:1606.00915 (2016).
[5] S. Ren, K. He, R. Girshick, et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”. In: vol. 39. 6. June 2017, pp. 1137–1149.
[6] R. Girshick. “Fast R-CNN”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1440–1448.
[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, et al. “Focal loss for dense object detection”. In: arXiv preprint arXiv:1708.02002 (2017).
[8] Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, et al. “A Review on Deep Learning Techniques Applied to Semantic Segmentation”. In: arXiv preprint arXiv:1704.06857 (2017).
[9] Bharath Hariharan, Pablo Arbeláez, Ross Girshick, et al. “Simultaneous detection and segmentation”. In: European Conference on Computer Vision. Springer. 2014, pp. 297–312.
[10] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[11] N. Dalal and B. Triggs. “Histograms of oriented gradients for human detection”. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition Vol. 1. June 2005, 886–893 vol. 1.
[12] Jonathan Huang, Vivek Rathod, Chen Sun, et al. “Speed/accuracy trade-offs for modern convolutional object detectors”. In: CoRR abs/1611.10012 (2016). arXiv: 1611.10012.
[13] Jonathan Long, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation”. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015, pp. 3431–3440.
[14] Pauline Luc, Camille Couprie, Soumith Chintala, et al. “Semantic segmentation using adversarial networks”. In: arXiv preprint arXiv:1611.08408 (2016).
[15] Christian Szegedy, Scott E. Reed, Dumitru Erhan, et al. “Scalable, High-Quality Object Detection”. In: CoRR abs/1412.1441 (2014). arXiv: 1412.1441.
[16] Hyeonwoo Noh, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation”. In: Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1520–1528.
[17] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, et al. “Enet: A deep neural network architecture for real-time semantic segmentation”. In: arXiv preprint arXiv:1606.02147 (2016).
[18] Pedro O Pinheiro, Ronan Collobert, and Piotr Dollár. “Learning to segment object candidates”. In: Advances in Neural Information Processing Systems. 2015, pp. 1990–1998.
[19] Pedro O Pinheiro, Tsung-Yi Lin, Ronan Collobert, et al. “Learning to refine object segments”. In: European Conference on Computer Vision. Springer. 2016, pp. 75–91.
[20] Ross B. Girshick, Jeff Donahue, Trevor Darrell, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation”. In: CoRR abs/1311.2524 (2013). arXiv: 1311.2524.
[21] Olaf Ronneberger, Philipp Fischer, and Thomas Brox. “U-net: Convolutional networks for biomedical image segmentation”. In: MICCAI. Springer. 2015, pp. 234–241.
[22] Kaiming He, Xiangyu Zhang, Shaoqing Ren, et al. “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”. In: Computer Vision — ECCV 2014. Cham: Springer International Publishing, 2014, pp. 346–361.
[23] J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, et al. “Selective Search for Object Recognition”. In: International Journal of Computer Vision 104.2 (Sept. 2013), pp. 154–171.
[24] Wei Liu, Dragomir Anguelov, Dumitru Erhan, et al. “SSD: Single Shot MultiBox Detector”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 21–37.
[25] P. Viola and M. Jones. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision Vol. 1. 2001, pp. 511–518.
[26] J. Redmon, S. Divvala, R. Girshick, et al. “You Only Look Once: Unified, Real-Time Object Detection”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). June 2016, pp. 779–788.
[27] Joseph Redmon and Ali Farhadi. “YOLO9000: Better, Faster, Stronger”. In: CoRR abs/1612.08242 (2016). arXiv: 1612.08242.
[28] Fisher Yu and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions”. In: arXiv preprint arXiv:1511.07122 (2015).
[29] Shuai Zheng, Sadeep Jayasumana, Bernardino Romera-Paredes, et al. “Conditional Random Fields as Recurrent Neural Networks”. In: CoRR abs/1502.03240 (2015). arXiv: 1502.03240.
[30] Alejandro Newell, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation”. In: European conference on computer vision. Springer. 2016, pp. 483–499.

分割和目标检测—第 4 部分

原文:https://towardsdatascience.com/segmentation-and-object-detection-part-4-f1d0d213976b?source=collection_archive---------52-----------------------

FAU 讲座笔记关于深度学习

单发探测器

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是讲座视频&配套幻灯片的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级 / 下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天的话题是复杂场景下的实时物体检测。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习!所以今天,我们想讨论一下单次检测器,以及如何实现实时物体检测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单次触发探测器的一般概念。 CC 下的图片来自深度学习讲座的 4.0 。

好了,分割和对象检测的第四部分——单次检测器。所以,难道我们不能在《你只看一次》中使用区域提议网络作为检测器吗?这是 YOLO 的想法,这是一个单触发探测器。您只需查看一次-将边界框预测和分类合并到一个网络中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

YOLO 算法。 CC 下的图片来自深度学习讲座的 4.0 。

这是通过将图像基本上细分成 S×S 个单元来完成的,并且对于每个单元,并行地进行分类概率图计算,并且产生边界框和置信度。这将为每个单元格提供 B 个边界框,这些边界框带有一个置信度得分和类置信度,由 CNN 生成。所以 CNN 预测 S 乘以 S 乘以(5 B + C)的值,其中 C 是类的数量。最后,为了产生最终的对象检测,计算边界框与相应类别概率图的重叠。然后,这允许您计算这个边界框内的平均值,以产生相应对象的最终类。这样你就能解决像这样的复杂场景,而且这是实时的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自深度学习讲座CC BY 4.0 下的 YOLO9000 图片规格。

所以有 YOLO9000,它是 YOLO 的改进版,被宣传为更好、更快、更强。所以更好是因为用了批量归一化。他们还进行高分辨率分类,将平均精度提高了 6%。通过对训练数据进行聚类而找到的锚框将召回率提高了 7%。多尺度训练让 YOLO9000 更容易检测到不同分辨率的物体。它更快,因为它使用了不同的 CNN 架构,加快了向前传递的速度。最后,它更强大,因为它在树上具有这种分层检测,允许组合不同的对象检测数据集。所有这些都使 YOLO9000 能够实时或更快地检测到多达 9000 个类别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

YOLO9000 在行动。使用 gifify 创建的图像。来源: YouTube

还有[24]中的单次多盒检测器。这是一个受欢迎的 YOLO 的替代品。也是像 Yolo 一样只有一次前向通过 CNN 的单发探测器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单次多盒探测器。 CC 下的图片来自深度学习讲座的 4.0 。

它被称为多框,因为这是[15]中边界框回归技术的名称,它显然是一个对象检测器。它在几个方面不同于 YOLO,但有着相同的核心思想。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RetinaNet 是一个多尺度单次检测器。来自深度学习讲座CC BY 4.0 下的图片。

现在,你仍然有一个多重分辨率的问题。特别是,如果你想到像组织学图像这种分辨率非常高的任务。然后,你也可以使用像 RetinaNet 这样的探测器。它实际上使用的是一个 ResNet CNN 编码器/解码器。这与我们在图像分割中已经看到的非常相似。它使用特征金字塔网络,允许您将不同的特征地图与解码器生成的原始输入图像结合起来。所以你可以说它非常类似于 U-net。与 U-net 相比,它使用特征金字塔网络的每个尺度上的子网进行类别和盒子预测。因此,你可以说它是一个单次检测器,同时使用 U-net 进行类和箱预测。此外,它还利用了我们将在几张幻灯片中讨论的焦点损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同物体探测器的比较。 CC 下的图片来自深度学习讲座的 4.0 。

让我们来看看速度和准确性之间的权衡。你可以看到,一般来说,非常精确的网络并没有那么快。这里,您可以在 x 轴上看到 GPU 时间,在 y 轴上看到总体平均精度。您可以看到,您可以将单次检测器(RCNN)等架构或更快的 RCNN 等理念与不同的特征提取器(如 Inception-ResNet、Inception 等)相结合。这使我们能够产生许多不同的组合。你可以看到,如果你在计算上花更多的时间,那么你通常也可以提高精度,这反映在这个图中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们如何处理阶层失衡? CC 下的图片来自深度学习讲座的 4.0 。

类的不平衡是解决速度-精度权衡的关键。所有这些单触发检测器评估许多假设位置。大部分都是很容易否定的。因此,目前的培训没有解决这种不平衡。在经典方法中,我们通常用硬负挖掘来处理这个问题。现在,问题是“我们能不能改变损失函数来减少对简单例子的关注?”。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

焦点损失。来自深度学习讲座CC BY 4.0 下的图片。

这个想法恰恰把我们带到了焦点损失。在这里,我们基本上可以将对象性定义为二进制的,不管它是不是一个对象。然后,你可以把它模拟成伯努利分布。通常的损失只是交叉熵,也就是正确类别的负对数。你现在可以看到,我们可以把它调整到所谓的焦点损失。这里,我们引入一个附加参数α。α是作为类别频率倒数计算的不平衡重量。此外,我们还引入了超参数γ。这允许减少简单例子的影响。所以,你可以看到γ对左手边的图的影响。你增加的γ越多,你各自的体重就越多,这样你就可以真正专注于不太频繁的课程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

物体检测概述。 CC 下的图片来自深度学习讲座的 4.0 。

那么,我们来总结一下物体检测。主要任务是检测包围盒和相关的分类。滑动窗口方法效率极低。区域建议网络减少了候选的数量,但是如果你真的想走向实时,那么你必须使用像 YOLO 这样的单次检测器来避免额外的步骤。当然,对象检测器概念可以与我们前面看到的任意特征提取和分类网络相结合。此外,请记住速度和精度之间的权衡。所以,如果你想变得非常快,那么你当然要减少预测的包围盒的数量,因为这样你会变得更快,但是你可能会错过真正的肯定。请注意,许多实现已经可用[31]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

我们现在讨论了细分。我们现在讨论了对象检测以及如何非常快速地进行对象检测。下一次,我们将探讨两者的融合,也就是实例细分。所以,非常感谢你观看这个视频,我期待着在下一个视频中见到你。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Yolo COCO 物体探测器在工作。使用 gifify 创建的图像。来源: YouTube

如果你喜欢这篇文章,你可以在这里找到更多的文章,或者看看我们的讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTubeTwitter脸书LinkedIn 。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中获得文字记录,试试自动博客

参考

[1] Vijay Badrinarayanan, Alex Kendall, and Roberto Cipolla. “Segnet: A deep convolutional encoder-decoder architecture for image segmentation”. In: arXiv preprint arXiv:1511.00561 (2015). arXiv: 1311.2524.
[2] Xiao Bian, Ser Nam Lim, and Ning Zhou. “Multiscale fully convolutional network with application to industrial inspection”. In: Applications of Computer Vision (WACV), 2016 IEEE Winter Conference on. IEEE. 2016, pp. 1–8.
[3] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”. In: CoRR abs/1412.7062 (2014). arXiv: 1412.7062.
[4] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs”. In: arXiv preprint arXiv:1606.00915 (2016).
[5] S. Ren, K. He, R. Girshick, et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”. In: vol. 39. 6. June 2017, pp. 1137–1149.
[6] R. Girshick. “Fast R-CNN”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1440–1448.
[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, et al. “Focal loss for dense object detection”. In: arXiv preprint arXiv:1708.02002 (2017).
[8] Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, et al. “A Review on Deep Learning Techniques Applied to Semantic Segmentation”. In: arXiv preprint arXiv:1704.06857 (2017).
[9] Bharath Hariharan, Pablo Arbeláez, Ross Girshick, et al. “Simultaneous detection and segmentation”. In: European Conference on Computer Vision. Springer. 2014, pp. 297–312.
[10] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[11] N. Dalal and B. Triggs. “Histograms of oriented gradients for human detection”. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition Vol. 1. June 2005, 886–893 vol. 1.
[12] Jonathan Huang, Vivek Rathod, Chen Sun, et al. “Speed/accuracy trade-offs for modern convolutional object detectors”. In: CoRR abs/1611.10012 (2016). arXiv: 1611.10012.
[13] Jonathan Long, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation”. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015, pp. 3431–3440.
[14] Pauline Luc, Camille Couprie, Soumith Chintala, et al. “Semantic segmentation using adversarial networks”. In: arXiv preprint arXiv:1611.08408 (2016).
[15] Christian Szegedy, Scott E. Reed, Dumitru Erhan, et al. “Scalable, High-Quality Object Detection”. In: CoRR abs/1412.1441 (2014). arXiv: 1412.1441.
[16] Hyeonwoo Noh, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation”. In: Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1520–1528.
[17] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, et al. “Enet: A deep neural network architecture for real-time semantic segmentation”. In: arXiv preprint arXiv:1606.02147 (2016).
[18] Pedro O Pinheiro, Ronan Collobert, and Piotr Dollár. “Learning to segment object candidates”. In: Advances in Neural Information Processing Systems. 2015, pp. 1990–1998.
[19] Pedro O Pinheiro, Tsung-Yi Lin, Ronan Collobert, et al. “Learning to refine object segments”. In: European Conference on Computer Vision. Springer. 2016, pp. 75–91.
[20] Ross B. Girshick, Jeff Donahue, Trevor Darrell, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation”. In: CoRR abs/1311.2524 (2013). arXiv: 1311.2524.
[21] Olaf Ronneberger, Philipp Fischer, and Thomas Brox. “U-net: Convolutional networks for biomedical image segmentation”. In: MICCAI. Springer. 2015, pp. 234–241.
[22] Kaiming He, Xiangyu Zhang, Shaoqing Ren, et al. “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”. In: Computer Vision — ECCV 2014. Cham: Springer International Publishing, 2014, pp. 346–361.
[23] J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, et al. “Selective Search for Object Recognition”. In: International Journal of Computer Vision 104.2 (Sept. 2013), pp. 154–171.
[24] Wei Liu, Dragomir Anguelov, Dumitru Erhan, et al. “SSD: Single Shot MultiBox Detector”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 21–37.
[25] P. Viola and M. Jones. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision Vol. 1. 2001, pp. 511–518.
[26] J. Redmon, S. Divvala, R. Girshick, et al. “You Only Look Once: Unified, Real-Time Object Detection”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). June 2016, pp. 779–788.
[27] Joseph Redmon and Ali Farhadi. “YOLO9000: Better, Faster, Stronger”. In: CoRR abs/1612.08242 (2016). arXiv: 1612.08242.
[28] Fisher Yu and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions”. In: arXiv preprint arXiv:1511.07122 (2015).
[29] Shuai Zheng, Sadeep Jayasumana, Bernardino Romera-Paredes, et al. “Conditional Random Fields as Recurrent Neural Networks”. In: CoRR abs/1502.03240 (2015). arXiv: 1502.03240.
[30] Alejandro Newell, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation”. In: European conference on computer vision. Springer. 2016, pp. 483–499.
[31] Object Detection Algorithms and Libraries, Neptune.ai Blog Post: https://neptune.ai/blog/object-detection-algorithms-and-libraries

分割和目标检测—第 5 部分

原文:https://towardsdatascience.com/segmentation-and-object-detection-part-5-4c6f70d25d31?source=collection_archive---------46-----------------------

FAU 讲座笔记关于深度学习

实例分割

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

FAU 大学的深度学习。下图 CC BY 4.0 来自深度学习讲座

这些是 FAU 的 YouTube 讲座 深度学习 的讲义。这是讲座视频&配套幻灯片的完整抄本。我们希望,你喜欢这个视频一样多。当然,这份抄本是用深度学习技术在很大程度上自动创建的,只进行了少量的手动修改。 自己试试吧!如果您发现错误,请告诉我们!

航行

上一讲 / 观看本视频 / 顶级 / 下一讲

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例分割也可以用于视频编辑。使用 gifify 创建的图像。来源: YouTube

欢迎回到深度学习!今天,我们想谈谈物体检测和分割的最后一部分。我们想了解实例分段的概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

语义分割与实例分割。 CC 下的图片来自深度学习讲座的 4.0 。

那么,让我们来看看我们的幻灯片。你看这已经是最后一部分了。第五部分,现在我们要谈谈实例分割。我们不只是想检测立方体的像素在哪里,而不是杯子的像素在哪里。我们想真正弄清楚哪些像素属于哪个立方体。这本质上是对象检测和语义分割的结合。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例分割方法的例子。 CC 下的图片来自深度学习讲座的 4.0 。

潜在应用的例子是关于遮挡的信息、对属于同一类的元素的数量进行计数、检测物体边界,例如在机器人学中抓取物体。这是非常重要的,文献中有同时检测和分割的例子,DeepMask、SharpMask 和 Mask RCNN[10]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

掩模 RCNN 是最广泛使用的实例分割方法之一。来自深度学习讲座CC BY 4.0 下的图片。

让我们更详细地看看[10]。我们实际上回到了仓库。我们将目标检测和分割结合起来。我们使用 RCNN 进行目标检测。它本质上解决了实例分离。然后,分割细化每个实例的边界框。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

掩模 RCNN 的概念。 CC 下的图片来自深度学习讲座的 4.0 。

工作流程是一个两阶段的过程。你有提出物体边界框的区域提议。然后,使用边界框回归进行分类,同时进行分割。因此,您有一个多任务损失,它本质上结合了分割的像素分类损失、框损失和用于产生正确的类/边界框的类损失。所以,你有这三个术语,然后结合在一个多任务损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

掩模 RCNN 的体系结构。 CC 下的图片来自深度学习讲座的 4.0 。

让我们更详细地了解两阶段程序。两级网络有两种不同的选择。您可以有一个联合分支,该分支在 ROI 上工作,然后在稍后阶段拆分为掩膜分割和类及边界框预测,或者您可以提前拆分。然后,你在两个独立的网络中运行,在两个版本中,你都有这种多任务损失,它结合了逐像素分割损失、盒损失和类损失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实例分割结果。来自深度学习讲座CC BY 4.0 下的图片。

让我们来看一些例子。这些也是来自掩模 RCNN 的结果。你可以看到,老实说,这些是相当令人印象深刻的结果。所以,确实有疑难病例。你辨认出这些人在哪里,你也看到不同的人,当然,是不同的例子。所以,非常令人印象深刻的结果!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Mask RCNN 也适合支持自动驾驶。使用 gifify 创建的图像。来源: YouTube

所以让我们总结一下目前为止我们所看到的。分割通常通过分析图像并随后细化粗略结果的架构来解决。完全卷积网络保留了空间布局,并通过池支持任意输入大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分割和目标检测综述。来自深度学习讲座的 4.0CC 下的图片。

我们可以使用对象检测器,并将它们实现为一系列区域提议和分类。那么这基本上导致了 RCNN 型网络族。或者,您可以使用单次检测器。我们研究了 YOLO,这是一种非常常见且非常快速的技术,如 YOLO9000。我们研究了 RetinaNet,如果你真的有一个规模的依赖,你想检测许多不同的规模,如组织切片处理的例子。因此,对象检测和分割是密切相关的,组合是常见的,正如您在这里看到的实例分割的目的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这个深度学习讲座中,更多令人兴奋的事情即将到来。 CC 下的图片来自深度学习讲座的 4.0 。

让我们看看这节课还需要讲些什么。即将出现的是减轻标签负担的方法。因此,我们将讨论弱注释。我们如何生成标签?这也引出了自我监督的概念,这是现在非常流行的话题。为了建立更好的网络,它被大量使用。这些方法还能够稀疏地或者甚至完全地重新使用未标记的数据。我们将研究一些更先进的方法。我稍后要展示的一个想法是使用已知运算符。我们如何将知识整合到网络中?这有哪些属性?我们也展示了一些想法,关于我们如何潜在地使部分网络可重复使用。所以,激动人心的事情还在后面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一些综合性的问题。来自深度学习讲座CC BY 4.0 下的图片。

我有一些综合性的问题要问你,比如“语义分段和实例分段的区别是什么?”,“与物体检测有什么联系?”“我们如何构建一个接受任意输入大小的网络?”,“什么是投资回报池?”,“我们如何通过投资回报池层执行反向传播?”,“评估细分的典型方法是什么?”例如,我可以请你解释一种实例分割的方法。

我还有几篇关于链接的阅读材料。Yolo 的创始人 Joseph Redmond 有一个很棒的网站。我认为这是一个非常好的库,叫做 darknet 。你也可以研究约瑟夫·雷德蒙的简历,我这里有的链接。我认为,如果你遵循这种布局,这肯定会推动你的职业生涯。请慢慢看,也看看下面的参考资料。我们选择了非常好的最先进的论文,我们绝对可以推荐看一看。非常感谢你们来听这个讲座,我希望你们喜欢我们对分割和物体检测等更应用领域的短暂探索。我希望这对你有用,我也希望我们能在下一个视频中再次看到。所以,非常感谢,再见!

如果你喜欢这篇文章,你可以在这里找到更多的文章,在这里找到更多关于机器学习的教育材料,或者看看我们的深度 学习 讲座。如果你想在未来了解更多的文章、视频和研究,我也会很感激关注 YouTube、Twitter、脸书、LinkedIn 或 T21。本文以 Creative Commons 4.0 归属许可发布,如果引用,可以转载和修改。如果你有兴趣从视频讲座中生成文字记录,试试自动博客

参考

[1] Vijay Badrinarayanan, Alex Kendall, and Roberto Cipolla. “Segnet: A deep convolutional encoder-decoder architecture for image segmentation”. In: arXiv preprint arXiv:1511.00561 (2015). arXiv: 1311.2524.
[2] Xiao Bian, Ser Nam Lim, and Ning Zhou. “Multiscale fully convolutional network with application to industrial inspection”. In: Applications of Computer Vision (WACV), 2016 IEEE Winter Conference on. IEEE. 2016, pp. 1–8.
[3] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs”. In: CoRR abs/1412.7062 (2014). arXiv: 1412.7062.
[4] Liang-Chieh Chen, George Papandreou, Iasonas Kokkinos, et al. “Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs”. In: arXiv preprint arXiv:1606.00915 (2016).
[5] S. Ren, K. He, R. Girshick, et al. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”. In: vol. 39. 6. June 2017, pp. 1137–1149.
[6] R. Girshick. “Fast R-CNN”. In: 2015 IEEE International Conference on Computer Vision (ICCV). Dec. 2015, pp. 1440–1448.
[7] Tsung-Yi Lin, Priya Goyal, Ross Girshick, et al. “Focal loss for dense object detection”. In: arXiv preprint arXiv:1708.02002 (2017).
[8] Alberto Garcia-Garcia, Sergio Orts-Escolano, Sergiu Oprea, et al. “A Review on Deep Learning Techniques Applied to Semantic Segmentation”. In: arXiv preprint arXiv:1704.06857 (2017).
[9] Bharath Hariharan, Pablo Arbeláez, Ross Girshick, et al. “Simultaneous detection and segmentation”. In: European Conference on Computer Vision. Springer. 2014, pp. 297–312.
[10] Kaiming He, Georgia Gkioxari, Piotr Dollár, et al. “Mask R-CNN”. In: CoRR abs/1703.06870 (2017). arXiv: 1703.06870.
[11] N. Dalal and B. Triggs. “Histograms of oriented gradients for human detection”. In: 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition Vol. 1. June 2005, 886–893 vol. 1.
[12] Jonathan Huang, Vivek Rathod, Chen Sun, et al. “Speed/accuracy trade-offs for modern convolutional object detectors”. In: CoRR abs/1611.10012 (2016). arXiv: 1611.10012.
[13] Jonathan Long, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation”. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015, pp. 3431–3440.
[14] Pauline Luc, Camille Couprie, Soumith Chintala, et al. “Semantic segmentation using adversarial networks”. In: arXiv preprint arXiv:1611.08408 (2016).
[15] Christian Szegedy, Scott E. Reed, Dumitru Erhan, et al. “Scalable, High-Quality Object Detection”. In: CoRR abs/1412.1441 (2014). arXiv: 1412.1441.
[16] Hyeonwoo Noh, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation”. In: Proceedings of the IEEE International Conference on Computer Vision. 2015, pp. 1520–1528.
[17] Adam Paszke, Abhishek Chaurasia, Sangpil Kim, et al. “Enet: A deep neural network architecture for real-time semantic segmentation”. In: arXiv preprint arXiv:1606.02147 (2016).
[18] Pedro O Pinheiro, Ronan Collobert, and Piotr Dollár. “Learning to segment object candidates”. In: Advances in Neural Information Processing Systems. 2015, pp. 1990–1998.
[19] Pedro O Pinheiro, Tsung-Yi Lin, Ronan Collobert, et al. “Learning to refine object segments”. In: European Conference on Computer Vision. Springer. 2016, pp. 75–91.
[20] Ross B. Girshick, Jeff Donahue, Trevor Darrell, et al. “Rich feature hierarchies for accurate object detection and semantic segmentation”. In: CoRR abs/1311.2524 (2013). arXiv: 1311.2524.
[21] Olaf Ronneberger, Philipp Fischer, and Thomas Brox. “U-net: Convolutional networks for biomedical image segmentation”. In: MICCAI. Springer. 2015, pp. 234–241.
[22] Kaiming He, Xiangyu Zhang, Shaoqing Ren, et al. “Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition”. In: Computer Vision — ECCV 2014. Cham: Springer International Publishing, 2014, pp. 346–361.
[23] J. R. R. Uijlings, K. E. A. van de Sande, T. Gevers, et al. “Selective Search for Object Recognition”. In: International Journal of Computer Vision 104.2 (Sept. 2013), pp. 154–171.
[24] Wei Liu, Dragomir Anguelov, Dumitru Erhan, et al. “SSD: Single Shot MultiBox Detector”. In: Computer Vision — ECCV 2016. Cham: Springer International Publishing, 2016, pp. 21–37.
[25] P. Viola and M. Jones. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision Vol. 1. 2001, pp. 511–518.
[26] J. Redmon, S. Divvala, R. Girshick, et al. “You Only Look Once: Unified, Real-Time Object Detection”. In: 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR). June 2016, pp. 779–788.
[27] Joseph Redmon and Ali Farhadi. “YOLO9000: Better, Faster, Stronger”. In: CoRR abs/1612.08242 (2016). arXiv: 1612.08242.
[28] Fisher Yu and Vladlen Koltun. “Multi-scale context aggregation by dilated convolutions”. In: arXiv preprint arXiv:1511.07122 (2015).
[29] Shuai Zheng, Sadeep Jayasumana, Bernardino Romera-Paredes, et al. “Conditional Random Fields as Recurrent Neural Networks”. In: CoRR abs/1502.03240 (2015). arXiv: 1502.03240.
[30] Alejandro Newell, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation”. In: European conference on computer vision. Springer. 2016, pp. 483–499.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值