TowardsDataScience 博客中文翻译 2019(一百五十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

检测网上虚假政治新闻

原文:https://towardsdatascience.com/detecting-fake-political-news-online-a571745f73dd?source=collection_archive---------21-----------------------

了解如何使用 NLP 和被动攻击算法来识别网上的假新闻。

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

Photo by Lieu Cap on Unsplash

近年来,在线社交网络的蓬勃发展使得许多在线平台上出于各种商业和政治目的的假新闻数量激增。

我们都曾偶然发现政客死亡的假新闻,一些领导人发表关于寺庙和清真寺之类的声明。

误导性的新闻极大地影响了读者,并且已经给线下社会带来了非常负面的影响。

因此,提高在线社交网络上信息的可信度的一个重要目标是及时和正确地识别假新闻。

在这篇文章中,我将指导你使用被动攻击算法构建一个假新闻检测分类器。

用于分类器的数据集可以在这里下载。

数据集包含三列,即:

  1. 标题:新闻文章的标题
  2. 文本:新闻文章的内容
  3. 标签:两个标签——假的和真的。

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

A subset of the data-set

简而言之,使用 sklearn,可以在数据集上构建 TfidfVectorizer。然后,初始化被动主动分类器并拟合模型。最后,准确度分数和混淆矩阵定量地解释了模型的表现。

专业术语太多?好吧,让我们一步一步地把它们都弄清楚。

让我们了解一下像 TfidfVectorizer 和被动主动分类器这样的术语。

tfidf 矢量器将原始文档的集合转换成 TF-IDF 特征的矩阵。

让我们再深入一点…

TfidfVectorizer 是由什么构成的?

  1. TF(词频):一个词在文档中出现的次数就是它的词频。较高的值意味着某个术语比其他术语出现得更频繁,因此,当该术语是搜索术语的一部分时,该文档是一个很好的匹配。
  2. **IDF(逆文档频率)😗*在一个文档中多次出现,但在很多其他文档中也多次出现的词,可能是不相关的。 IDF 是衡量一个术语在整个语料库中的重要性的指标。

被动主动分类器

被动攻击算法是在线学习算法。这种算法对于正确的分类结果保持被动,而在误算、更新和调整的情况下变得主动。与大多数其他算法不同,它不收敛。其目的是进行修正损失的更新,使得权重向量的范数变化很小。

让我们开始吧。

首先导入所有必需的库。

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

Loading the data-set and analyzing the distribution of predicting label

既然数据集已经加载,接下来我们将把它分成测试集和训练集。

数学模型只理解数字。因此,我们将使用 TFIDF 矢量器将训练集和测试集转换成模型的可解释形式。

现在我们已经万事俱备了。我们现在将构建被动主动分类器,并使用 sklearn 的 accuracy_score 指标对数据集进行评估。

在测试集上实现了 92.58%的准确率。接下来,我们将使用混淆矩阵评估结果,并计算 F1 得分。

这里 F1 的分数是: 0.9283。

这里是各种度量的汇编,帮助我们定量评估分类器的性能。

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

Various metrics used to evaluate the performance of PAssive agressive classifier

Jupyter 笔记本的完整代码可以在我的 GitHub 库中找到。

检测仇恨推特——推特情绪分析

原文:https://towardsdatascience.com/detecting-hate-tweets-twitter-sentiment-analysis-780d8a82d4f6?source=collection_archive---------2-----------------------

一项综合研究,旨在确定预处理和模型选择的哪种组合能够提供最佳的仇恨言论过滤器

供稿人 : Vedant Kshirsagar、Adwait Toro、Sushrut Shendre、Sneha Lakshmikanthaiah、Rishab Ballekere Narayana Gowda、Tanvir Brar、Chavi Singal

我们所有的代码都可以在 GitHub 上找到

【https://github.com/vedant-95/Twitter-Hate-Speech-Detection

摘要

由于不同文化和教育背景的人对互联网的使用呈指数增长,有毒在线内容已成为当今世界的一个主要问题。区分仇恨言论和攻击性语言是自动检测有毒文本内容的关键挑战。在这份报告中,我们提出了一种方法来自动将 Twitter 上的推文分为两类:仇恨言论和非仇恨言论。使用 Twitter 数据集,我们通过利用单词包和术语频率-逆文档频率(TFIDF)值对多个机器学习模型进行实验。考虑到这两种方法,我们对模型进行了比较分析。在调整给出最佳结果的模型之后,我们在应用逻辑回归模型时实现了 89%的准确率和 84%的召回率。我们还使用 flask 创建了一个模块,作为我们模型的实时应用程序。

概述

我们的目标是将推文分为两类,仇恨言论或非仇恨言论。我们的项目分析了来自 Kaggle 的包含 31,935 条推文的数据集 CSV 文件。数据集严重扭曲,93%的推文或 29,695 条推文包含非仇恨标签的推文数据,7%或 2,240 条推文包含仇恨标签的推文数据。构建我们模型的第一步是平衡仇恨和非仇恨推文的数量。我们的数据预处理步骤包括两种方法,单词包词频逆文档频率(TFIDF)。

单词袋方法是自然语言处理和信息检索中使用的简化表示。在这种方法中,一个文本(如一个句子或一个文档)被表示为它的单词的包(多集合),不考虑语法甚至词序,但保持多样性。

TFIDF 是一个数字统计量,旨在反映一个单词对集合中的文档有多重要。在信息检索、文本挖掘和用户建模的搜索中,它被用作加权因子。

在我们将这些数据输入各种算法之前,我们必须清理这些数据,因为推文中包含许多不同的时态、语法错误、未知符号、标签和希腊字符。

我们通过使用词汇化、词干化、删除停用词和省略来解决这个问题。词汇化删除单词的屈折词尾,并将单词返回到其本身的基本形式或词典形式。词干化类似于词干化,因为它将屈折词或派生词简化为词干。停用词是一个常用词,如“the”、“a”、“an”、“in”,我们编程忽略它,因为它不重要。最后一步是省略任何外国字符和希腊符号。

灵感

探索这一主题的灵感来自仇恨言论实例的增加和仇恨言论意识。据《纽约时报》报道,“由偏见或成见引发的人身攻击在 2018 年达到了 16 年来的最高水平,针对拉丁美洲人的暴力事件大幅上升,超过了针对穆斯林和阿拉伯裔美国人的袭击事件的下降。”这种上升也可归因于数字社交媒体平台的兴起,这些平台为仇恨言论的传播提供了便利。大多数(59.6%)仇恨犯罪事件涉及种族和族裔偏见。其次是宗教偏见,占所有事件的 18.7%。当我们观察到仇恨推特中最常见的负面词汇与种族或宗教有关时,我们的研究验证了这些结果。这些尖酸刻薄的例子会下意识地在我们的社会中煽动仇恨,尤其是在我们易受影响的年轻一代的头脑中。根据公共研究,22%的受访者表示,由于网上的仇恨言论,他们在自己的社区感到不太安全,超过 85%的人支持建立一个工作组来监控网络欺凌。这个问题现在已经变得如此普遍,以至于美国第一夫人梅兰妮·特朗普已经把打击网络欺凌和网上仇恨言论作为她的主要目标。统计数据显示,在减少仇恨言论传播方面做得还不够。

数据

(来源:【https://www.kaggle.com/vkrahul/twitter-hate-speech )

数据字典

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

可视化和文字云

创建单词云是为了了解 tweets 中最常用的单词。这是针对仇恨和非仇恨两类推文进行的。接下来,我们创建了一个条形图,来可视化积极情绪和消极情绪中最常见单词之间的使用频率。

正面推文

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

负面推文

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

数据架构

如前所述,我们拥有的数据是不平衡的。我们总共有 31935 行,其中仇恨推文仅占推文总数的 7%。在不平衡的数据集上建模并不理想,因为模型无法学习哪些文本或信息导致该推文被归类为仇恨推文。

如果我们在不平衡的数据上训练一个模型,结果将是误导性的。在这样的数据集中,由于缺乏学习,该模型会简单地将每条推文预测为好推文。在这种情况下,尽管准确率很高,但它实际上并没有做好分类工作,因为它无法准确地对仇恨推文进行分类。

更简单地说,即使模型预测所有的推文都是非仇恨的,它仍然有 93%的准确率。

因此,我们执行策略抽样,并将数据分成临时集和测试集。请注意,由于我们已经执行了战略抽样,对于临时和测试数据集,好推文与讨厌推文的比例是 93:7。

在临时数据上,我们首先尝试使用 SMOTE(合成少数过采样技术)对仇恨推文进行上采样。由于 SMOTE 包不能直接处理文本数据,我们为它编写了自己的代码。流程如下:

我们创建了一个语料库,收录了临时数据集的仇恨推文中出现的所有独特词汇。一旦我们有了包含仇恨推文中所有可能单词的矩阵,我们就创建了一个空白的新数据集,并开始用新的仇恨推文填充它。这些新推文是通过从语料库中随机选择单词合成的。这些新推文的长度是根据组成语料库的推文的长度确定的。

然后,我们多次重复这个过程,直到合成数据中仇恨推文的数量等于临时数据中非仇恨推文的数量。然而,当我们使用单词袋方法生成特征时,特征的数量增加到了 100,000。由于特性数量非常多,我们面临硬件和处理能力的限制,因此不得不放弃 SMOTE 过采样方法。

由于不可能对仇恨推文进行上采样以平衡数据,我们决定对非仇恨推文进行下采样以使其平衡。我们从临时数据集中提取了一部分非仇恨性的推文。从这个子集中,我们选择了 n 条随机推文,其中 n 是临时数据中仇恨推文的数量。然后我们在临时数据中加入了仇恨推特的子集。这个数据集现在是我们用于特征生成和建模目的的训练数据。

测试数据仍然是好的推文和讨厌的推文之比为 93:7,因为我们没有对它进行任何采样。由于真实世界的数据是以这个比率出现的,所以没有进行采样。

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

逼近

我们已经研究了两种主要的特征生成方法:单词袋(BOW)和词频逆文档频率(TFIDF)。

1.一袋单词

2.术语频率逆文档频率

一袋话

词袋模型(bag-of-words model)是一种从文本中提取特征以用于建模的方法,例如使用机器学习算法。

它被称为单词的“,因为任何关于文档中单词的顺序或结构的信息都被丢弃了。该模型只关心已知单词是否出现在文档中,而不关心它在文档中的位置。直觉是,如果文档有相似的内容,它们就是相似的。此外,仅从内容上,我们就可以了解文件的含义。

目标是将自由文本的每个文档转换成一个向量,我们可以使用它作为机器学习模型的输入或输出。因为我们知道词汇表有 10 个单词,所以我们可以使用 10 的固定长度的文档表示,用向量中的一个位置来给每个单词打分。最简单的评分方法是将单词的存在标记为布尔值,0 代表不存在,1 代表存在。

使用词汇表中上面列出的任意单词顺序,我们可以遍历第一个文档(“这是最好的时代”),并将其转换为二进制向量。

文档的评分如下所示:

●“它”= 1

●“曾经”= 1

● “the” = 1

●“最佳”= 1

● “of” = 1

●“时代”= 1

●“最差”= 0

●“年龄”= 0

●“智慧”= 0

●“愚蠢”= 0

作为一个二进制向量,它将如下所示:

[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

其他三个文档如下所示:

1.“这是最坏的时代”= [1,1,1,0,1,1,1,0,0,0]

2.“那是智慧的时代”= [1,1,1,0,1,0,0,1,1,0]

3.“那是愚蠢的时代”= [1,1,1,0,1,0,0,1,0,1,1]

如果您的数据集很小,并且上下文是特定于领域的,BoW 可能比单词嵌入更好。上下文是非常领域特定的,这意味着你不能从预先训练的单词嵌入模型(GloVe,fastText 等)中找到相应的向量。)

TFIDF

TFIDF 是一种信息检索技术,它衡量术语的频率(TF)及其逆文档频率(IDF)。每个单词或术语都有其各自的 TF 和 IDF 得分。一项的 TF 和 IDF 得分的乘积称为该项的 TFIDF 权重。

简单来说,TF*IDF 得分(权重)越高,该术语越稀有,反之亦然。

TFIDF 算法用于对任何内容中的关键字进行加权,并根据该关键字在文档中出现的次数为其分配重要性。更重要的是,它检查关键字在整个网络中的相关性,这被称为语料库*。

对于文档 d 中的项 t,文档 d 中的项 t 的权重 Wt,d 由下式给出:

Wt,d = TFt,d log (N/DFt)

其中:

● TFt,d 是 t 在文档 d 中出现的次数。

● DFt 是包含术语 t 的文档数。

● N 是语料库中的文档总数。

TF*IDF 是如何计算的?一个词的 TF(词频)是一个词在文档中出现的频率(即出现的次数)。当你知道它的时候,你就能看到你使用一个术语是过多还是过少。

例如,当一个 100 个单词的文档中包含 12 次术语“cat”时,单词“cat”的 TF 为

TFcat = 12/100,即 0.12

一个词的 IDF(逆文档频率)是该词在整个语料库中的重要性的度量。

数据清理

我们说的和写的语言是由几个单词组成的,这些单词通常来源于另一个单词,并且可以包含一些不增加意义或上下文的单词。为了清理数据,我们实施了 5 种方法。

  1. 停用词移除:停用词通常是冠词或介词,它们不能帮助我们找到上下文或句子的真正含义。这些单词可以被删除,而不会对您正在训练的最终模型产生任何负面影响。英语中常用的语言包括“is”、“and”、“are”等。
  2. 希腊字符:我们接下来删除特殊字符和数字。数字很少包含有用的意义。特殊字符会扩大我们的词频矩阵。
  3. 俚语词汇:俚语词汇包括通常在演讲中使用的非正式短语。由于缺乏现有的字典,我们将一些俚语映射到它们的原始形式,例如“luv”到“love”,“thx”到“thanks ”,举几个例子。
  4. 词干化:使用词干化,考虑到在一个屈折词中可以找到的常见前缀和后缀的列表,通过切断单词的结尾或开头,单词被缩减为它们的词干。一个单词被查看并通过一系列决定如何删减的条件句。对于我们的数据集,使用波特词干算法。
  5. 词汇化:词汇化是将一个单词的不同屈折形式组合在一起的过程,这样它们就可以作为一个单独的项目进行分析。词汇化类似于词干化,但它给单词带来了上下文。所以,它把意思相近的单词连接成一个单词。比如 runs,running,ran 都是单词 run 的形式,因此 run 就是所有这些单词的引理。

造型

对于单词袋和 TFIDF,我们运行 5 种分类算法,即逻辑回归、朴素贝叶斯、决策树、随机森林和梯度提升。此外,我们还在这两种方法中执行维数减少,并再次运行这 5 种算法。

我)包话

我们在训练数据集上实现了用于特征生成的单词包。在这种方法中,我们试图找出一条推文是否是仇恨推文的概率,给定某些词的存在及其在推文中的频率。

我们的训练数据是总共 4480 条推文,生成了 12566 个独特单词的语料库。在实现单词包特征工程之后,结果是包含 4480 行和 12566 列的数据帧,其中每一列对应于一个唯一的单词。然后,我们将标签连接成一列。

在运行分类算法时,获得了以下结果:

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

为了更好地显示这些结果,我们绘制了下面的聚类柱形图。

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

Preprocessing: Bag of Words

我们现在讨论将准确率和召回率作为我们的衡量标准的理由,以及它们将如何帮助我们选择冠军模型。乍一看,梯度增强似乎是最好的模型,因为它的精度最高。但是正如《数据架构》中所讨论的,我们的测试数据包含了 93:7 的好推文和讨厌推文的比例。因此,具有高精度可能不是最好的度量。因此,我们考虑召回,这是我们能够正确识别的仇恨推文的比例。如果这个指标很高,这将相当于大量的仇恨推文被归类为仇恨推文,从而实现我们的目标。如果我们只看回忆,朴素贝叶斯似乎是最好的模型。然而,另一个需要考虑的因素是,我们捕获的所有仇恨推文将被转发给运营团队,该团队将单独审查这些推文。因此,有大量的误报将意味着分析师将不得不不必要地审查更多的推文,这些推文实际上不是仇恨推文。这将导致时间、资源和人员的利用效率低下。我们的建议是拥有高召回率,同时确保假阳性的数量保持在最低水平。这将是理想的前进模式,给予高评分的准确性和召回率。因此,我们选择逻辑回归和随机森林作为冠军模型。

ii)词频逆文档频率(TFIDF)

有些词被认为是俚语或骂人的话,但它们太常见了,人们在日常生活中经常使用。因此,如果有一条包含这些词的推文,它实际上可能不是一条仇恨推文。为了区分一个俚语/辱骂性的词是否意在表达仇恨,我们尝试了 TFIDF 方法,因为它给这样的词分配了较低的权重。因此,我们不再使用单词包模型来计算这个单词在 tweet 中出现的次数,而是使用 TFIDF 权重。运行算法后,我们获得以下结果。

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

Preprocessing: TF-IDF

同样,逻辑回归和随机森林为我们提供了最好的准确性和召回结果。

iii)1000 个最常用单词的单词包

由于特征的数量等于唯一单词的数量,因此是巨大的(12566),我们假设到目前为止我们讨论的两个模型可能是过度拟合的。因此,我们试图通过选取 1000 个最常用的单词(以及变量)来降低维度。在这个变量选择之后,我们再次实现分类算法。我们对单词包和 TFIDF 都这样做。获得的结果列表和绘图如下:

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

Bag of Words for 1000 most frequent words

iv)1000 个最常用词的 TF-IDF

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

TF-IDF for 1000 most frequent words

运行降维模型后获得的结果与未降维的结果一致。梯度推进再次给出了高准确度,朴素贝叶斯给出了好的回忆,逻辑回归和随机森林给出了这两个度量的最佳结果。

然而,这些模型没有显著的改进。虽然一些算法的指标有所改进,但另一些算法的指标却有所下降,并且改进/降低的幅度可以忽略不计。

最后,我们来看 ROC 曲线。以下是单词袋方法(所有单词)的曲线:

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

ROC Curve for all the classifiers

下表显示了各种算法的曲线下面积(AUC)

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

AUC of all the classifiers

现在,让我们看看 TFIDF 方法的 ROC 曲线和 AUC 表(所有单词)

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

ROC curve and AUC for all the classifiers

如我们所见,逻辑回归给出了最好的 AUC。此外,如果我们看它的 ROC 曲线,我们可以看到它相等地覆盖了假阳性率(FPR)和真阳性率(TPR)区域。将其与朴素贝叶斯进行比较,朴素贝叶斯表现出较差的假阳性性能,这也通过其先前的准确度得分而明显可见。类似地,梯度推进具有较差的真实积极表现,这从其较低的回忆分数可以明显看出。

此外,逻辑回归本质上是直接的,即可以借助简单的指数方程来解释该模型,并且可以可视化和比较其系数。因此,我们推荐逻辑回归作为我们案例的最佳模型。

MVP

在所有的数据清理、特性工程和建模之后,我们决定部署这个模型,以便从这个项目中获得一些有用的东西。这个项目的主要目标是开发一个可以检测仇恨推文的系统,以便 Twitter 可以采取适当的行动,减少社交欺凌的原因。因此,我们使用 Flask 技术部署了我们的机器学习模型。

以下是该网站的快照:-

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

该网站是使用 HTML 和 CSS 建立的,人们可以在网站的文本框中输入推文。

考虑我们提出的模型的两个用例

1-用户输入一条正面推文,然后被正确分类为正面推文。

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

2-用户输入一条仇恨推文,然后正确地被归类为仇恨推文。

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

关键见解和经验

政治、种族和性的推文构成了仇恨推文的主要部分。

当我们摆弄不平衡的数据集时,得到的结果是不准确的。由于训练数据的偏斜性质,该模型预测新数据属于训练集中的主要类。

在评估模型的性能时,分类器的加权精度不是唯一要考虑的度量。商业环境也扮演着重要的角色。

挑战和未来步骤

仇恨言论自动检测系统面临的一个挑战是随着时间和历史背景对话题的态度的改变。例如,在下面的摘录中:

“……残忍的印第安野蛮人,他们的战争规则是不分年龄、性别和条件一律格杀勿论……”

直觉表明这是仇恨言论;它将美洲原住民称为“无情的印第安野蛮人”,并暗示他们低人一等,使他们失去人性。事实上,该文本符合大多数仇恨言论定义中使用的条件。然而,这段文字实际上是引自《独立宣言》的。鉴于该文本的历史背景,发布该文本的用户可能并不打算获得仇恨言论的结果,而是为了其他目的而引用该历史文档。这表明用户意图和上下文在仇恨言论识别中起着重要作用。

作为另一个例子,考虑短语“纳粹组织是伟大的。”这将被视为仇恨言论,因为它显示了对仇恨团体的支持。然而,“纳粹的组织是伟大的”并不是支持他们的理想,而是在评论这个组织有多好。在某些情况下,这可能不被视为仇恨言论,例如,如果作者正在比较一段时间内的组织效率。这两个短语的区别很微妙,但足以区分是否是仇恨言论。

另一个挑战是,仇恨言论自动检测是一个闭环系统;个人意识到它正在发生,并积极试图逃避检测。希望传播仇恨信息的用户很快找到了规避这些措施的方法,例如,将内容发布为包含文本的图像,而不是文本本身。虽然可以采用光学字符识别来解决这一特殊问题,但这进一步表明了仇恨言论检测的难度。在那些试图传播仇恨内容的人和那些试图阻止它的人之间,这将是一场持续的战斗。

结论

随着仇恨言论继续成为一个社会问题,对仇恨言论自动检测系统的需求变得更加明显。在这份报告中,我们提出了一种通过使用单词袋和 TF IDF 值的机器学习来检测 Twitter 上仇恨言论和攻击性语言的解决方案。我们对多组特征值和模型参数进行了逻辑回归、朴素贝叶斯、决策树、随机森林和梯度推进的比较分析。结果显示逻辑回归与 TF IDF 方法相比表现更好。

我们提出了当前的问题,这个任务和我们的系统达到了合理的准确率(89%)和召回率(84%)。鉴于仍然存在的所有挑战,有必要对这一问题进行更多的研究,包括技术和实际问题。

参考文献

[1]ncbi.nlm.nih.gov/pmc/articles/PMC6701757/[在线]

[2] A. Gaydhani,V. Doma,S. Kendre 和 L. Bhagwat,“使用机器学习检测 Twitter 上的仇恨言论和攻击性语言:基于 N-gram 和 TF IDF 的方法”。

[3]https://www . nytimes . com/2019/11/12/us/hate-crimes-FBI-report . html

[4]https://www . daily prince tonian . com/article/2018/10/hate-speech-words-a second-look

使用深度学习在 Keras 中检测心律失常,包括 Dense、CNN 和 LSTM

原文:https://towardsdatascience.com/detecting-heart-arrhythmias-with-deep-learning-in-keras-with-dense-cnn-and-lstm-add337d9e41f?source=collection_archive---------4-----------------------

让我们从单个心电信号中检测异常心跳!

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

介绍

最近,我在回顾吴恩达团队(https://stanfordmlgroup.github.io/projects/ecg/)在卷积神经网络(CNN)心律失常检测器方面的工作。我发现这非常有趣,尤其是随着可穿戴产品(例如 Apple Watch 和便携式 EKG 机器)的出现,这些产品能够在家里监测你的心脏。因此,我很好奇如何建立一个可以检测异常心跳的机器学习算法。这里,我们将使用 ECG 信号(心脏的连续电测量)并训练 3 个神经网络来预测心律失常:密集神经网络、CNN 和 LSTM。

在本文中,我们将探讨 3 个教训:

  1. 分割患者数据集,而不是样本数据集
  2. 学习曲线可以告诉你获得更多的数据
  3. 测试多种深度学习模型

你可以跟随我的 github(【https://github.com/andrewwlong/deep_arrhythmias】)上提供的 Jupyter 笔记本。

资料组

我们将使用来自 https://physionet.org/content/mitdb/1.0.0/的 MIH-BIH 心律失常数据集,该数据集在 ODC 授权许可下可用。这是一个数据集,包含 20 世纪 70 年代以 360 Hz 测量的 48 个半小时双通道 ECG 记录。这些记录有心脏病专家对每次心跳的注释。注释符号可在https://archive.physionet.org/physiobank/annotations.shtml找到

项目定义

根据 ECG 信号预测心跳是否在以心跳峰值为中心的每 6 秒窗口内出现心律失常。

为了简化问题,我们假设 QRS 检测器能够自动识别每次心跳的峰值。由于数据减少,我们将忽略记录的前 3 秒或最后 3 秒中的任何非心跳注释和任何心跳。我们将使用一个 6 秒的窗口,这样我们就可以将当前节拍与之前和之后的节拍进行比较。这个决定是在与一位医生交谈后做出的,这位医生说,如果你有与之比较的东西,就更容易识别。

数据准备

让我们从列出 data_path 中的所有患者开始。

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

这里我们将使用 pypi 包 wfdb 来加载 ecg 和注释。

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

让我们加载所有注释,并查看心跳类型在所有文件中的分布。

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

我们现在可以列出非心跳和异常心跳:

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

我们可以按类别分组,并查看数据集中的分布情况:

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

看起来这个数据集中大约有 30%是不正常的。如果这是一个真正的项目,最好查阅文献。鉴于这是一个关于心律失常的数据集,我想这比正常情况要高!

让我们编写一个函数来加载单个患者的信号和注释。注意注释值是信号数组的索引。

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

让我们来看看患者的心电图中有哪些异常心跳:

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

我们可以用以下公式绘制异常心跳周围的信号:

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

制作数据集

让我们制作一个数据集,它以前后相差± 3 秒的节拍为中心

def make_dataset(pts, num_sec, fs, abnormal):
    # function for making dataset ignoring non-beats
    # input:
    # pts - list of patients
    # num_sec = number of seconds to include before and after the beat
    # fs = frequency
    # output: 
    #   X_all = signal (nbeats , num_sec * fs columns)
    #   Y_all = binary is abnormal (nbeats, 1)
    #   sym_all = beat annotation symbol (nbeats,1)

    # initialize numpy arrays
    num_cols = 2*num_sec * fs
    X_all = np.zeros((1,num_cols))
    Y_all = np.zeros((1,1))
    sym_all = []

    # list to keep track of number of beats across patients
    max_rows = []

    for pt in pts:
        file = data_path + pt

        p_signal, atr_sym, atr_sample = load_ecg(file)

        # grab the first signal
        p_signal = p_signal[:,0]

        # make df to exclude the nonbeats
        df_ann = pd.DataFrame({'atr_sym':atr_sym,
                              'atr_sample':atr_sample})
        df_ann = df_ann.loc[df_ann.atr_sym.isin(abnormal + ['N'])]

        X,Y,sym = build_XY(p_signal,df_ann, num_cols, abnormal)
        sym_all = sym_all+sym
        max_rows.append(X.shape[0])
        X_all = np.append(X_all,X,axis = 0)
        Y_all = np.append(Y_all,Y,axis = 0)
    # drop the first zero row
    X_all = X_all[1:,:]
    Y_all = Y_all[1:,:]

    # check sizes make sense
    assert np.sum(max_rows) == X_all.shape[0], 'number of X, max_rows rows messed up'
    assert Y_all.shape[0] == X_all.shape[0], 'number of X, Y rows messed up'
    assert Y_all.shape[0] == len(sym_all), 'number of Y, sym rows messed up' return X_all, Y_all, sym_alldef build_XY(p_signal, df_ann, num_cols, abnormal):
    # this function builds the X,Y matrices for each beat
    # it also returns the original symbols for Y

    num_rows = len(df_ann) X = np.zeros((num_rows, num_cols))
    Y = np.zeros((num_rows,1))
    sym = []

    # keep track of rows
    max_row = 0 for atr_sample, atr_sym in zip(df_ann.atr_sample.values,df_ann.atr_sym.values): left = max([0,(atr_sample - num_sec*fs) ])
        right = min([len(p_signal),(atr_sample + num_sec*fs) ])
        x = p_signal[left: right]
        if len(x) == num_cols:
            X[max_row,:] = x
            Y[max_row,:] = int(atr_sym in abnormal)
            sym.append(atr_sym)
            max_row += 1
    X = X[:max_row,:]
    Y = Y[:max_row,:]
    return X,Y,sym

第 1 课:对患者而非样本进行分割

让我们从处理所有病人开始。

num_sec = 3
fs = 360
X_all, Y_all, sym_all = make_dataset(pts, num_sec, fs, abnormal)

想象一下,我们天真地决定按照样本将我们的数据随机分成一个训练集和一个验证集。

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

现在,我们准备建立我们的第一个密集神经网络。为了简单起见,我们将在 Keras 中这样做。如果你想看密集神经网络和另一个样本项目的方程,请参见我的另一篇文章这里,这是我在这里写的关于糖尿病再入院项目的深度学习后续。

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

我们可以为度量报告构建一些函数。有关数据科学分类指标的更多讨论,请参见我之前的帖子这里

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

我们可以用predict_proba从 Keras 模型中得到预测

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

为简单起见,让我们将阈值设置为异常心跳的发生率,并计算我们的报告:

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

太神奇了!没那么难!但是等等,这对新病人有用吗?如果每个病人都有独一无二的心脏信号,也许就不会了。从技术上讲,同一个患者可以同时出现在训练集和验证集中。这意味着我们可能无意中泄露了数据集的信息。我们可以通过对病人而不是样本进行分割来测试这个想法。

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

并训练一个新的密集模型:

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

正如您可以看到的,验证 AUC 下降了很多,证实了我们之前有数据泄漏。经验教训:在病人身上而不是在样本上分开!

第二课:学习曲线可以告诉我们,我们应该得到更多的数据!

鉴于训练和验证之间的过度拟合。让我们做一个简单的学习曲线,看看我们是否应该去收集更多的数据。

aucs_train = []
aucs_valid = []n_pts = [1,18,36]
for n_pt in n_pts:

    print(n_pt)
    pts_sub = pts_train[:n_pt]
    X_sub, y_sub, sym_sub = make_dataset(pts_sub, num_sec, fs,abnormal)# build the same model
    # lets test out relu (a different activation function) and add drop out (for regularization)
    model = Sequential()
    model.add(Dense(32, activation = 'relu', input_dim = X_train.shape[1]))
    model.add(Dropout(rate = 0.25))
    model.add(Dense(1, activation = 'sigmoid'))# compile the model - use categorical crossentropy, and the adam optimizer
    model.compile(
                    loss = 'binary_crossentropy',
                    optimizer = 'adam',
                    metrics = ['accuracy']) model.fit(X_sub, y_sub, batch_size = 32, epochs= 5, verbose = 0)
    y_sub_preds_dense = model.predict_proba(X_sub,verbose = 0)
    y_valid_preds_dense = model.predict_proba(X_valid,verbose = 0)

    auc_train = roc_auc_score(y_sub, y_sub_preds_dense)
    auc_valid = roc_auc_score(y_valid, y_valid_preds_dense)
    print('-',auc_train, auc_valid)
    aucs_train.append(auc_train)
    aucs_valid.append(auc_valid)

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

经验教训:更多的数据似乎有助于这个项目!

我怀疑吴恩达的团队也得出了同样的结论,因为他们花时间注释了来自 29163 名患者的 64121 份心电图记录,这比任何其他公共数据集都多两个数量级(见https://stanfordmlgroup.github.io/projects/ecg/)。

第三课:测试多种深度学习模型

美国有线新闻网;卷积神经网络

先做个 CNN 吧。这里我们将使用一维 CNN(相对于 2D CNN 的图像)。

CNN 是一种特殊类型的深度学习算法,它使用一组过滤器和卷积算子来减少参数的数量。这种算法引发了图像分类的最新技术。从本质上讲,1D CNN 的工作方式是从第一个时间戳开始获取一个大小为kernel_size的过滤器(内核)。卷积运算符采用过滤器,并将每个元素乘以第一个kernel_size时间步长。然后对神经网络下一层中的第一个细胞的这些乘积求和。然后过滤器移动stride时间步长并重复。Keras 中默认的stride是 1,我们将使用它。在图像分类中,大多数人使用padding,它允许你通过添加“额外”的单元格来提取图像边缘的一些特征,我们将使用默认填充 0。卷积的输出然后乘以一组权重 W 并加到偏差 b 上,然后像在密集神经网络中一样通过非线性激活函数。然后,如果需要,您可以使用其他 CNN 图层重复此操作。这里我们将使用 Dropout,这是一种通过随机删除一些节点来减少过拟合的技术。

对于 Keras 的 CNN 模型,我们需要对我们的数据进行一点改造

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

在这里,我们将是一个一层 CNN 与辍学

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

CNN 的性能似乎比密集神经网络更高。

RNN: LSTM

由于该数据信号是时间序列,因此测试递归神经网络(RNN)是很自然的。这里我们将测试一种双向长短期记忆(LSTM)。与密集的神经网络和有线电视新闻网不同,RNN 在网络中有环路来保存过去发生的事情的记忆。这允许网络将信息从早期时间步骤传递到后期时间步骤,这在其他类型的网络中通常会丢失。本质上,在通过非线性激活函数之前,在计算中对于该存储器状态有一个额外的项。这里我们使用双向信息,这样信息可以双向传递(从左到右和从右到左)。这将有助于我们获得关于中心心跳左右两侧正常心跳的信息。

如下图所示,这花了很长时间来训练。为了使这个项目成为一个周末项目,我将训练集减少到 10,000 个样本。对于一个真正的项目,我会增加历元的数量,并使用所有的样本。

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

似乎该模型需要从额外的时期进行正则化(即删除)。

最终 ROC 曲线

这是这三个模型的最终 ROC 曲线

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

给更多的时间,这将是很好的尝试优化超参数,看看我们是否可以得到密集或 CNN 甚至更高。

限制

因为这只是一个周末项目,所以有一些限制:

  • 没有优化超参数或层数
  • 没有按照学习曲线的建议收集额外的数据
  • 没有研究心律失常患病率的文献,以了解该数据集是否代表一般人群(可能不是)

感谢阅读!

使用深度学习检测疟疾。

原文:https://towardsdatascience.com/detecting-malaria-using-deep-learning-fd4fdcee1f5a?source=collection_archive---------6-----------------------

构建卷积神经网络以快速预测薄血涂片中疟疾寄生细胞的存在。

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

Nightmare: Malaria (Source)

答虽然疟疾病毒没有以变异蚊子的形式出现,但肯定觉得这是一个变异问题。这种致命的疾病在世界不同地区已经达到流行病*、*甚至地方病的比例——每年杀死大约 40 万人[1]。在世界上的其他地方,它几乎不存在。一些地区特别容易爆发疾病——某些因素使得一个地区更容易感染疟疾[2]。

  • 高度贫困
  • 缺乏适当的医疗保健
  • 政治不稳定
  • 疾病传播媒介的存在(例如蚊子)〔6〕

由于这些问题的混合,我们在构建模型时必须记住一些事情:

  • 可能缺少一个可靠的电源
  • 电池供电的设备具有较少的计算能力
  • 可能缺少互联网连接(所以在云上训练/存储可能很难!)

虽然我们希望获得尽可能高的精确度,但我们也必须考虑让模型尽可能小,计算效率尽可能高,并且能够部署到边缘和物联网设备。

目前对该病的诊断方法繁琐费时。

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

Thin film of red blood cells. Stained parasites are deep purple. (Source)

最广泛使用的方法(到目前为止)是在显微镜下检查薄血涂片,并目测寻找受感染的细胞。患者的血液涂在载玻片上,用造影剂染色,以便更好地识别红细胞中受感染的寄生虫。

然后,临床医生手动计数寄生红细胞的数量有时高达 5000 个细胞(根据世卫组织协议)【3】。

为什么是卷积神经网络?

卷积神经网络具有自动提取特征和学习过滤器的能力。在以前的机器学习解决方案中,特征必须手动编程——例如,大小、颜色、细胞的形态。利用卷积神经网络(CNN)将大大加快预测时间,同时反映(甚至超过)临床医生的准确性。

我们将使用 Keras、Tensorflow 后端,如果你还没有安装的话,请继续安装。一定要同时安装 NumpyScikit-learnMatplotlib、imutils(Adrian rose Brock 创建的一个图像处理和深度学习便利功能包)。

资料组

幸运的是,我们有一个巨大的标签和预处理图像数据集来训练和评估我们的模型。NIH 拥有 27,558 个细胞图像的疟疾数据集,其中寄生和未感染细胞的数量相等。应用基于水平集的算法来检测和分割红细胞。这些图像是由医学专业人员收集和注释的;更多信息可在这里找到。此外,从页面下载数据:文件被命名为 cell_images.zip

源代码

我用 Keras 复制了 Adrian Rosebrock 的博文深度学习和医学图像分析,这里可以找到。按照他的代码,我在 GitHub 上发布了我的版本。你可以在这里下载项目的源代码来跟进或者创建你自己的项目。

我们开始吧!

设置

首先,创建一个文件夹/目录来存储项目。然后,在名为 malaria 的目录中创建一个目录,将数据集下载到该目录中并打开它。

$ cd whatever-you-named-your-directory
$ mkdir malaria
$ cd malaria
$ wget [https://ceb.nlm.nih.gov/proj/malaria/cell_images.zip](https://ceb.nlm.nih.gov/proj/malaria/cell_images.zip)
$ unzip cell_images.zip

我们将切换回我们的父目录,并创建另一个名为 cnn 的目录,在那里我们存储我们的配置文件和网络架构。

$ cd ..
$ mkdir cnn
$ cd cnn

配置文件

cnn 里面创建一个模块,命名为 config.py. 这是我们的配置文件**,它会存储我们所有的常量变量。**

我们的配置文件初始化所有的路径到我们的

  • 原始数据集(第 4 行)
  • 包含培训和测试之间划分的目录(第 8 行)
  • 以及我们新分离的训练、验证和测试数据集(第 11–13 行)。

80% 的数据被留出用于原始数据集中的训练(第 16 行)。然后,在训练数据之外,另一个 10% 百分比将被用作验证数据(第 20 行)。

构建数据集

创建一个名为 build_dataset.py 的模块,它应该位于您的原始目录中。 build_dataset.py 将用于在文件系统中创建路径。打开它并插入下面的代码。

导入所有必要的包(第 3–5 行)后,我们将打乱原始数据集中的所有图像(第 8–10 行)。

首先,让我们使用从我们的配置文件**(第 2–4 行)中设置的值定义的索引来分割训练数据和测试数据;然后,我们使用索引来执行数组切片。**

通过用另一个值覆盖索引,并重复相同的过程,留出一些训练数据用于验证(第 7–9 行)。

之后,我们将定义新分离的训练、验证和测试数据集。列表数据集包含 3 元组,其中包含:

  1. 拆分的名称
  2. 分割的图像路径
  3. 拆分的输出目录的路径

现在,我们可以在数据集上循环。

第 4 行将打印它正在创建哪个数据分割,第 7–9 行将创建一个输出目录,如果它不存在的话。

在第 12 行,我们开始遍历输入图像路径。第 14 行将提取输入图像的文件名,第 15 行将提取相应的类标签(寄生,未寄生)。

然后,构建子目录的路径(第 18 行),如果它们不存在就创建它们(第 21–23 行)。每个子目录(测试、验证和培训)被分成寄生和未寄生的映像。

最后,我们将构建实际图像的路径,并将其复制到子目录中(第 27–28 行)。

我们现在可以建立我们的目录了!打开终端,执行以下命令:

$ python build_dataset.py

输出应该如下所示:

[INFO] building 'training' split
[INFO] 'creating malaria/training' directory
[INFO] 'creating malaria/training/Uninfected' directory
[INFO] 'creating malaria/training/Parasitized' directory
[INFO] building 'validation' split
[INFO] 'creating malaria/validation' directory
[INFO] 'creating malaria/validation/Uninfected' directory
[INFO] 'creating malaria/validation/Parasitized' directory
[INFO] building 'testing' split
[INFO] 'creating malaria/testing' directory
[INFO] 'creating malaria/testing/Uninfected' directory
[INFO] 'creating malaria/testing/Parasitized' directory

现在我们已经处理了数据,让我们开始训练我们的模型。在我们开始之前,让我们快速看一下我们将使用的网络架构:Adrian Rosebrock 在他的书 中使用 Python 复制的一个 ResNet 模型。他的模型是基于何等人 2015 年学术出版物 用于图像识别的深度残差学习。艾尔。【6】,但更小更紧凑(我们正试图为我们的型号减小存储空间)。**

模型架构(ResNet)

首先,我们为什么选择 ResNet ?在 Rajaraman 等人完成的一项研究中,他们使用预训练的卷积神经网络对我们正在使用的同一数据集中的图像进行分类。他们比较了六个模型:AlexNet、VGG-16、ResNet-50、Xception、DenseNet-121,以及他们建造的一个定制模型。他们的结果显示ResNet-50 模型在这个特定的数据库上始终显示出最准确的结果* —它在 MCC 和 F-1 评分(这些在医疗保健应用中很重要)等指标上也具有最高的性能[4]。***

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

Source: [4]

然而,当他们在最佳层(使用特征提取*)而不是最终层上运行时,DenseNet-121 在灵敏度(这可以说是医疗保健设置中最重要的指标之一)方面胜过它。***

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

Source: [4]

***你可以从这里下载代码,但是如果你已经有了源代码,它就在 cnn 下的文件夹里。*关于如何从头开始实现的详细解释(以及为什么它如此有效的基本解释),你可以在这里查看我的文章

训练模型

在您的原始目录中创建一个名为 train_model.py 的文件。

看看我们要导入的包:

  • keras 训练我们的模型(第 1-3 行)
  • 我们的自定义 ResNet 模型类(第 4 行),和配置文件(第 5 行)
  • sklearn 打印分类报告(第 6 行)
  • 在第 7 行从我们的数据集中抓取路径(使用 imutils )
  • Matplotlib 用于绘制我们的图表(第 8 行)
  • numpy 进行数值加工(第 9 行)
  • argparse 用于命令行参数解析(第 10 行)

请注意,我们使用“Agg”后端来处理 matplotlib ,因为我们正在将我们的绘图保存到磁盘。

我们唯一需要解析的命令行参数是" — plot " 。它将默认放置在当前工作目录中(在这种情况下,它将是您的父目录),并命名为“plot.png”。执行程序时,可以在命令行重命名该文件。

训练参数和学习率衰减函数

首先,让我们将我们想要训练的段数 设置为 50 (第 2 行)我们的学习率将被初始化为 0.1 (第 3 行),它将根据我们的衰减函数(第 9–20 行上的 poly_decay )进行衰减。批处理大小将被设置为 32 (第 4 行),如果你在 CPU 上运行它,这是一个好数字,但是如果你使用 GPU,你可以将它增加到 64。****

我们的多项式衰减函数将使我们的学习率在每个时期后衰减(第 9 行)。我们将幂初始化为 1.0(第 14 行),这将我们的多项式衰减变成了线性衰减。这是为了在我们的模型上减少过度配合****

接下来,让我们获取测试/验证/测试集(第 2-4 行)中的图像路径总数,以确定验证&训练的每个时期的总步骤数。**

数据增强

数据扩充应用到我们的图像有助于规则化*(这有助于减轻过度拟合)。我们的网络将更好地概括验证数据(这可能意味着在训练集上表现更差)。***

**首先,让我们通过初始化 ImageDataGenerator 对我们的训练数据进行数据扩充。我们将把像素值重新调整到范围[0,1](第 4 行),并对每个训练示例执行随机变换(第 5–11 行)。

对于我们的验证和训练数据,我们只是将像素值重新调整到范围[0,1]。

培训/测试/验证生成器

现在让我们初始化我们的训练生成器,它将从我们的输入目录加载图像。

Kerasflow _ from _ directory函数有两个先决条件:一个用于数据拆分的基本输入目录,以及基本输入目录内的 N 个子目录,其中每个子目录对应一个类标签(在我们的例子中,N = 2;寄生和未寄生)。**

看一下输入到每台发电机的参数:

  • class_mode 被设置为“分类,以对类别标签执行一键编码(第 4/13/22 行)
  • target_size :图像被调整到 64 x 64 像素(第 5/14/23 行)
  • 颜色模式设置为“ rgb 通道排序(第 6/15/24 行)
  • 混洗图像路径仅设置为训练发生器的(第 7 行)**
  • batch_size 被设置为 BS = 32(我们已经在前面的学习率部分进行了初始化)(第 8/17/26 行)

正在初始化 ResNet 模型

在第 2–3 行,我们用以下参数初始化 ResNet。

  • 图像为 64 x 64 x 3(长度、宽度和深度—三通道 RGB 图像)
  • 2 类(寄生和未寄生)
  • 阶段= (3,4,6)
  • 过滤器= (64,128,256,512)

这意味着第一 CONV 层(在减少空间维度之前)将具有 64 个总滤波器。

首先,我们将堆叠 3 组残差模块,每个残差模块中的 3 个 CONV 层将分别学习 32、32 和 128 滤波器。应用维数缩减。

然后,应用 4 组剩余模块。三个 CONV 层将学习 64、64 和 256 过滤器——再次应用维度缩减。

***最后, 6 组剩余模块再次堆叠,其中每个 CONV 层学习 128、128 和 *512 滤波器。空间维度最终被缩减(查看我的文章这里关于阶段和过滤器的解释)。

我们将使用的优化器是随机梯度下降*(第 4 行)。我们的学习率设置为 0.1动量项为 0.9。***

最后,我们在第 5–9 行编译我们的模型。我们的损失函数被设置为二进制交叉熵,因为我们正在执行二进制、二类分类。**

现在,让我们定义我们的一组回调——在每个时期结束时执行。为了在每个时期后衰减我们的学习率,我们应用了poly _ decaylearning rate scheduler*(第 2 行)。***

第 3–9 行的 model.fit_generator 调用告诉我们的脚本开始我们的训练过程。 trainGen 生成器自动从磁盘加载我们的图像,并解析图像路径中的类标签。 valGen 对验证数据做同样的事情。

既然我们已经完成了训练部分,我们可以在我们的测试集上评估它。我们将对测试数据(第 4–5 行)进行预测,并为数据集中的每幅图像找到概率最大的标签(第 10 行)。

然后,我们将在终端中打印一份分类报告(第 13–14 行)。

最后,我们将绘制我们的测试验证损失*,以及我们的验证测试准确性的图表,以查看我们做得如何。***

结果

通过参考 GitHub 上的我的知识库,确保你的项目结构正确。现在,打开一个终端并执行以下命令:

*$ python train_model.py*

在你的模型完成训练后,看看分类报告。

你应该获得

  • 训练数据的准确率为 96.50%
  • 96.78%准确率上验证数据
  • 测试数据上有 97%的准确度

总的来说,序列化的模型文件只有17.7 MB。量化模型本身的权重将允许我们获得 10MB 的模型 <。

现在您拥有了一个完整的端到端疟疾分类系统!

现在,您可以将该模型保存到磁盘上,并加载新的图像进行预测。您也可以在您的网站或应用程序上部署它。

如果您有任何问题,请在评论中或通过以下方式联系我们:

特别感谢 PyImageSearch 的 Adrian Rosebrock 博士就此发表的博客文章和附带的代码[6]。

参考文献

[1]:世界卫生组织,概况介绍:2016 年世界疟疾报告https://www . who . int/Malaria/media/World-Malaria-Report-2016/en/(2016 年 12 月 13 日)。

[2]世界卫生组织,疟疾https://www.who.int/news-room/fact-sheets/detail/malaria(2018 年 11 月 19 日)。

[3]: 卡洛斯·阿蒂科·阿里扎疟疾英雄:一个用于更快诊断疟疾的 web 应用https://blog . insightdatascience . com/https-blog-insightdatascience-com-Malaria-Hero-A 47 D3 D5 fc 4 bb(2018 年 11 月 6 日)

[4]: Rajaraman 等人,预训练卷积神经网络作为特征提取器,用于改进薄血涂片图像中疟原虫的检测(2018) 。PeerJ 6:e 4568;DOI 10.7717/peerj.4568

[5]何国光,张,任,孙,【2015】****

[6] A. Rosebrock,深度学习和医学图像分析 (2017),https://www . pyimagesearch . com/2018/12/03/Deep-Learning-and-Medical-Image-Analysis-with-keras/

[7] A. Rosebrock, 用 Python 进行计算机视觉的深度学习 (2017)

用深度学习检测疟疾

原文:https://towardsdatascience.com/detecting-malaria-with-deep-learning-9e45c1e34b60?source=collection_archive---------4-----------------------

人工智能造福社会系列—第一部分

人工智能促进社会公益——医疗保健案例研究

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

Photo by Hal Gatewood on Unsplash

本文内容改编自我之前在 opensource.com发表的 自己的文章

介绍

欢迎来到 AI for Social Good 系列,在这里我们将关注人工智能(AI)与流行的开源工具、技术和框架如何被用于发展和改善我们的社会的不同方面。*“健康就是财富”*也许是一句老掉牙的名言,但却是千真万确的!在这篇特别的文章中,我们将看看如何利用人工智能来检测疟疾这一致命疾病,以及建立一个低成本、有效而准确的开源解决方案的前景。这篇文章的目的是双重的——理解致命疾病疟疾的动机和重要性,以及深度学习在检测疟疾方面的有效性。我们将在本文中讨论以下主要话题。

  • 该项目的动机
  • 疟疾检测方法
  • 用于疟疾检测的深度学习
  • 从零开始训练的卷积神经网络
  • 用预训练模型转移学习

在我们开始之前,我想指出,我既不是医生,也不是医疗保健研究员,我远不如他们有资格。不过,我确实对将人工智能应用于医疗保健研究感兴趣。本文的目的不是深入宣传人工智能将取代工作岗位并接管世界,而是展示人工智能如何有助于疟疾检测、诊断并通过低成本有效且准确的开源解决方案减少人工劳动。

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

Python and TensorFlow — A great combo to build open-source deep learning solutions

由于 Python 和深度学习框架(如 TensorFlow)的强大功能,我们可以构建健壮、可扩展和有效的深度学习解决方案。这些工具的额外好处是开源和免费的,使我们能够构建真正具有成本效益的解决方案,并且每个人都可以轻松采用和使用。我们开始吧!

动机

疟疾是一种致命的传染性蚊媒疾病,由疟原虫寄生虫引起。这些寄生虫通过受感染的雌性按蚊的叮咬传播。虽然我们不会深入了解这种疾病的细节,但疟疾有五种主要类型。现在让我们看看这种疾病在下面的情节中有多致命的意义。

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

Malaria Estimated Risk Heath Map (Source: treated.com)

很明显,疟疾在全球流行,尤其是在热带地区。然而,该项目的动机是基于这种疾病的性质和致命性。最初,如果被感染的蚊子叮咬,蚊子携带的寄生虫会进入你的血液,并开始破坏携氧的红细胞。通常情况下,疟疾的最初症状类似于流感或病毒,通常在蚊子叮咬后几天或几周内开始感到恶心。然而,这些致命的寄生虫可以在你的身体里存活一年以上,没有任何问题!因此,延误正确的治疗会导致并发症甚至死亡。因此,疟疾的早期有效检测可以拯救生命。

世界卫生组织(世卫组织)发布了一些关于疟疾的重要事实,你可以在这里查看。简而言之,近一半的世界人口面临疟疾的威胁,每年有超过 2 亿的疟疾病例和大约 40 万人死于疟疾。这给了我们更大的动力,让疟疾的检测和诊断变得快速、简单和有效。

疟疾检测方法

有几种方法和测试可用于疟疾的检测和诊断。我们的数据和分析所基于的原始论文是 S Rajaraman 等人的 【预训练卷积神经网络作为特征提取器用于改进薄血涂片图像中疟原虫的检测】 。艾尔。向我们简要介绍了其中的一些方法。这些包括但不限于厚薄血涂片检查、聚合酶链反应(PCR)和快速诊断测试(RDT)。虽然我们不会在此详细介绍所有方法,但需要记住的重要一点是,后两种测试是替代方法,通常在无法提供高质量显微镜服务的情况下使用。

我们将简要讨论基于典型血液涂片工作流程的标准疟疾诊断,这要感谢 Carlos Ariza 关于洞察数据科学的精彩文章,这是我从 Adrian Rosebrock 关于疟疾检测的精彩文章pyimagesearch中了解到的,所以我衷心感谢他们两位提供了如此优秀的资源,让我在这个领域有了更多的视角。

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

A blood smear workflow for Malaria detection (Source)

根据《世卫组织议定书》的指导原则,这一程序包括以 100 倍的放大倍数对血液涂片进行强化检查,在此过程中,人们从 5000 个细胞中人工计数含有寄生虫的红细胞。事实上拉贾拉曼等人的论文。艾尔。我们之前提到的,谈到了完全相同的事情,为了使事情更清楚,我引用了这篇论文中的一个例子。

厚血涂片有助于检测寄生虫的存在,而薄血涂片有助于识别引起感染的寄生虫的种类(疾病控制和预防中心,2012 年)。诊断的准确性很大程度上依赖于人的专业知识,并可能受到观察者之间的变异性和疾病流行/资源受限地区大规模诊断所带来的责任的不利影响(Mitiku,Mengistu & Gelaw,2003)。使用聚合酶链式反应(PCR)和快速诊断测试(RDT)等替代技术;然而,PCR 分析的性能有限(Hommelsheim 等人,2014 年),而快速诊断技术在疾病流行地区的成本效益较低(Hawkes,Katsuva & Masumbuko,2009 年)。

因此,疟疾检测肯定是一个密集的手动过程,也许可以使用深度学习实现自动化,这是本文的基础。

用于疟疾检测的深度学习

对于常规的手工诊断血涂片,这是一个密集的手工过程,需要适当的专业知识来分类和计数被寄生和未被感染的细胞。通常情况下,这可能无法很好地扩展,如果我们在全球特定地区没有合适的专业知识,可能会带来问题。在利用最先进的(SOTA)图像处理和分析技术来提取手工设计的特征和建立基于机器学习的分类模型方面,已经取得了一些进展。然而,这些模型是不可扩展的,因为有更多的数据可用于训练,并且考虑到手工设计的特征需要大量时间的事实。

深度学习模型,或者更具体地说,卷积神经网络(CNN)已经被证明在各种各样的计算机视觉任务中非常有效。虽然我们假设你对 CNN 有所了解,但如果你不了解,请点击这里的查看这篇文章。简而言之,CNN 模型中的关键层包括卷积层和池层,如下图所示。

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

A typical CNN architeture (Source: deeplearning.net)

卷积层从数据中学习空间层次模式,这也是平移不变的。因此,他们能够学习图像的不同方面。例如,第一卷积层将学习小的和局部的图案,例如边缘和拐角,第二卷积层将基于来自第一层的特征学习更大的图案,等等。这允许 CNN 自动化特征工程并学习在新数据点上概括良好的有效特征。合并图层有助于缩减采样和降维。

因此,CNN 帮助我们进行自动化和可扩展的特征工程。此外,在我们的模型末尾插入密集层使我们能够执行像图像分类这样的任务。使用深度学习模型(如 CNN)的自动化疟疾检测可能非常有效、廉价和可扩展,特别是随着迁移学习和预训练模型的出现,这些模型即使在数据较少等限制下也能很好地工作。

Rajaraman 等人的论文,’ 预训练卷积神经网络作为特征提取器,用于改进薄血涂片图像中的寄生虫检测 利用他们论文中提到的数据的总共六个预训练模型,在检测疟疾与未感染样本方面获得了令人印象深刻的 95.9%的准确性。我们的重点是从头开始尝试一些简单的 CNN 模型和几个使用迁移学习的预训练模型,看看我们在同一数据集上得到的结果!我们将使用包括 Python 和 TensorFlow 在内的开源工具和框架来构建我们的模型。

数据集详细信息

让我们讨论一下我们将在分析中使用的数据集。我们很幸运,李斯特山国家生物医学通讯中心(LHNCBC)的研究人员(国家医学图书馆(NLM)的一部分)仔细收集并注释了健康和感染血液涂片图像的数据集。你可以从 官网 下载这些图片。

事实上,他们开发了一个移动应用程序,可以在连接到传统光学显微镜的标准 Android 智能手机上运行(Poostchi 等人,2018 年)。在孟加拉国吉大港医学院医院收集 150 名恶性疟原虫感染患者和 50 名健康患者的吉姆萨染色薄血涂片并拍照。智能手机的内置摄像头可以获取每个微观视野的幻灯片图像。这些图像由泰国曼谷的玛希多-牛津热带医学研究中心的专家幻灯片阅读者手工注释。让我们简单地检查一下我们的数据集结构。我们首先根据正在使用的操作系统安装一些基本的依赖项。

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

我在云上使用基于 Debian 的系统,它有一个 GPU,所以我可以更快地运行我的模型!安装树依赖项,以防您没有它,这样我们可以查看我们的目录结构(**sudo apt install tree**)。

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

看起来我们有两个文件夹,里面有被感染和健康细胞的图像。使用下面的代码,我们可以获得图像总数的更多细节。

看起来我们有了一个平衡的数据集,包括 13779 疟疾非疟疾*(未感染)细胞图像。让我们以此为基础构建一个数据框架,它将在我们开始构建数据集时对我们有用。*

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

构建和浏览影像数据集

为了建立深度学习模型,我们需要训练数据,但我们也需要在看不见的数据上测试模型的性能。我们将分别对训练、验证和测试数据集使用 60:10:30 的分割。我们将在训练期间利用训练和验证数据集,并在测试数据集上检查模型的性能。

显然,由于血液涂片和细胞图像会因人、测试方法和照片拍摄方向的不同而有所不同,因此图像的尺寸会有所不同。让我们获取一些训练数据集的汇总统计数据,以确定最佳图像尺寸(请记住,我们根本不接触测试数据集!).

我们应用并行处理来加速图像读取操作,并且基于汇总统计数据,我们决定将每个图像的大小调整为**125x125**像素。让我们加载所有的图像,并调整它们的大小到这些固定的尺寸。

我们再次利用并行处理来加速与图像加载和大小调整相关的计算。最后,我们得到了前面输出中描述的所需维数的图像张量。我们现在可以查看一些样本细胞图像,以了解我们的数据是什么样子的。

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

根据上面的样本图像,我们可以注意到疟疾和健康细胞图像之间的一些细微差异。我们基本上会让我们的深度学习模型在模型训练的时候尝试学习这些模式。在开始训练我们的模型之前,我们设置一些基本的配置设置。

我们固定我们的图像尺寸、批量大小、时期并编码我们的分类标签。TensorFlow 2.0 的 alpha 版本于 2019 年 3 月发布,就在本文撰写的几周前,它给了我们一个完美的借口来尝试它!

深度学习模型训练阶段

在模型训练阶段,我们将建立几个深度学习模型,并在我们的训练数据上训练它们,并在验证数据上比较它们的性能。然后,我们将保存这些模型,并在稍后的模型评估阶段再次使用它们。

模型 1: CNN 从零开始

我们的第一个疟疾检测模型将从头开始构建和训练一个基本的卷积神经网络(CNN)。首先让我们定义我们的模型架构。

基于前面代码中的架构,我们的 CNN 模型有三个卷积和池层,后面是两个密集层和正则化丢弃层。现在就来训练我们的模型吧!

我们得到了一个95.6%的验证精度,这已经很不错了,尽管我们的模型看起来有点过拟合,看看我们的 训练精度99.9%。我们可以通过绘制训练和验证准确性和损失曲线来清楚地了解这一点。**

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

Learning Curves for Basic CNN

因此,我们可以看到,在第五纪元后,事情似乎并没有整体改善很多。这个模型还是留着以后评估吧。

****model.save('basic_cnn.h5')****

深度迁移学习

正如人类具有跨任务转移知识的固有能力一样,转移学习使我们能够利用以前学习的任务中的知识,并将它们应用到更新的相关任务中,即使是在机器学习或深度学习的背景下。对迁移学习的全面介绍可以在我的文章和我的书中找到,供有兴趣深入研究的读者参考。

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

Ideas for deep transfer learning

就本文的目的而言,我们的想法是,我们能否利用预先训练的深度学习模型(在大型数据集上训练——如 ImageNet )通过在我们的问题背景下应用和转移其知识来解决疟疾检测的问题?

我们将应用两种最流行的深度迁移学习策略。

  • 作为特征提取器的预训练模型
  • 经过微调的预训练模型

我们将使用牛津大学视觉几何小组(VGG)开发的预训练 VGG-19 深度学习模型进行实验。像 VGG-19 这样的预训练模型是在具有许多不同图像类别的巨大数据集(ImageNet)上已经预训练的模型。考虑到这一事实,该模型应该已经学习了特征的健壮层次,这些特征相对于由 CNN 模型学习的特征是空间、旋转和平移不变的。因此,该模型已经学习了超过一百万幅图像的特征的良好表示,可以作为新图像的良好特征提取器,适用于计算机视觉问题,就像疟疾检测一样!在针对我们的问题释放迁移学习的力量之前,让我们简要讨论一下 VGG-19 模型架构。

了解 VGG-19 模型

VGG-19 模型是建立在 ImageNet 数据库上的 19 层(卷积和全连接)深度学习网络,其建立的目的是图像识别和分类。这个模型是由卡伦·西蒙扬和安德鲁·齐泽曼建立的,并在他们题为‘用于大规模图像识别的超深度卷积网络’的论文中提到。我推荐所有感兴趣的读者去阅读这篇文章中的优秀文献。下图描述了 VGG-19 模型的架构。

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

VGG-19 Model Architecture

您可以清楚地看到,我们共有使用**3 x 3**卷积滤镜的**16**卷积层,以及用于缩减采样的 max pooling 层,并且共有两个完全连接的隐藏层,每个层中有**4096**个单元,后面是一个密集的**1000**个单元层,其中每个单元代表 ImageNet 数据库中的一个图像类别。我们不需要最后三层,因为我们将使用我们自己的完全连接的密集层来预测疟疾。我们更关心前五个模块,这样我们可以利用 VGG 模型作为有效的特征提取器。

对于其中一个模型,我们将通过冻结所有五个卷积块来将其用作简单的特征提取器,以确保它们的权重不会在每个时期后更新。对于最后一个模型,我们将对 VGG 模型进行微调,其中我们将解冻最后两个块(块 4 和块 5),以便在我们训练自己的模型时,它们的权重在每次迭代(每批数据)中得到更新。

模型 2:作为特征提取器的预训练模型

为了构建这个模型,我们将利用 TensorFlow 加载 VGG-19 模型,并冻结卷积块,以便我们可以将其用作图像特征提取器。我们将在最后插入我们自己的密集层来执行分类任务。

因此,从前面的输出中很明显,我们的模型中有许多层,我们将只使用 VGG-19 模型的冻结层作为特征提取器。您可以使用以下代码来验证我们的模型中有多少层确实是可训练的,以及我们的网络中总共有多少层。

现在,我们将使用与之前模型相似的配置和回调来训练我们的模型。参考 我的 GitHub 库 获取训练模型的完整代码。我们观察到下面的曲线显示了模型的准确性和损失。

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

Learning Curves for frozen pre-trained CNN

这表明我们的模型并没有像我们的基本 CNN 模型那样过度拟合,但是性能并没有真的更好,事实上比我们的基本 CNN 模型略差。现在让我们保存这个模型,以便将来评估。

****model.save('vgg_frozen.h5')****

模型 3:带有图像增强的微调预训练模型

在我们的最终模型中,我们将微调预训练 VGG-19 模型的最后两个块中存在的层的权重。除此之外,我们还将介绍图像增强的概念。图像增强背后的想法就像它的名字一样。我们从训练数据集中加载现有图像,并对其应用一些图像变换操作,如旋转、剪切、平移、缩放等,以产生现有图像的新的、改变的版本。由于这些随机变换,我们每次得到的图像并不相同。我们将利用**tf.keras**中一个名为**ImageDataGenerator**的优秀工具,它可以帮助我们构建图像增强器。

除了缩放图像(这是强制性的)之外,我们不对验证数据集应用任何变换,因为我们将使用它来评估每个时期的模型性能。对于迁移学习环境中图像增强的详细解释,如果需要,请随意查看我的文章。让我们来看看一些来自一批图像增强变换的样本结果。

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

Sample Augmented Images

在前面的输出中,您可以清楚地看到图像的细微变化。我们现在将建立我们的深度学习模型,确保 VGG-19 模型的最后两个模块是可训练的。

我们降低了模型中的学习率,因为我们不想在微调时对预训练层进行大的权重更新。该模型的训练过程将略有不同,因为我们使用数据生成器,因此我们将利用**fit_generator(…)** 函数。

这看起来是我们迄今为止最好的模型,给了我们几乎 96.5%的验证准确度 ,并且基于训练准确度,看起来我们的模型没有我们的第一个模型那样过度拟合。这可以用下面的学习曲线来验证。****

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

Learning Curves for fine-tuned pre-trained CNN

让我们现在保存这个模型,以便我们可以很快在我们的测试数据集上使用它进行模型评估。

******model.save('vgg_finetuned.h5')******

这就完成了我们的模型训练阶段,我们现在准备在实际的测试数据集上测试我们的模型的性能!

深度学习模型性能评估阶段

我们现在将评估我们刚刚在训练阶段构建的三个不同的模型,方法是使用它们对来自我们测试数据集的数据进行预测,因为仅仅验证是不够的!我们还构建了一个名为**model_evaluation_utils**的漂亮实用模块,我们将使用它来评估我们的深度学习模型和相关分类指标的性能。这里的第一步显然是扩展我们的测试数据。

下一步涉及加载我们保存的深度学习模型,并对测试数据进行预测。

最后一步是利用我们的**model_evaluation_utils**模块,用相关的分类指标检查每个模型的性能。

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

看起来我们的第三个模型在测试数据集上的表现是我们所有三个模型中最好的,给出了模型 准确性 以及f1-分数***96%,这非常好,与我们之前提到的研究论文和文章中提到的更复杂的模型相当!***

结论

在本文中,我们看到了一个有趣的疟疾检测的真实世界医学成像案例研究。疟疾检测本身并不是一个简单的过程,全球各地是否有合适的人员也是一个严重的问题。我们研究了利用人工智能的易于构建的开源技术,这些技术可以为我们提供检测疟疾的最先进的准确性,从而使人工智能造福社会。我鼓励每个人查阅本文中提到的文章和研究论文,没有它们,我就不可能构思和写这篇文章。让我们期待医疗保健行业更多地采用开源人工智能功能,让世界各地的每个人都可以更便宜地使用它!

本文改编自我之前在 opensource.com发表的 自己的文章

如果您有兴趣运行或采用本文中使用的所有代码,可以在my GitHub repository上找到。

记得从 官网 下载数据。

用 Jetson Xavier 在无人机上探测行人和骑车人

原文:https://towardsdatascience.com/detecting-pedestrians-and-bikers-on-a-drone-with-jetson-xavier-93ce92e2c597?source=collection_archive---------18-----------------------

rones 是每个制造商和发烧友都想拥有的最酷的技术之一。与此同时,随着无人机变得越来越普遍,人工智能正在快速发展,我们现在正处于一个可以在无人机上进行物体检测和语义分割的状态。在这篇博文中,我将分享如何对无人机拍摄的图像进行物体检测。

手头问题的一些基础知识

  • 首先,重要的是要认识到,我们无法在通用嵌入式硬件(如 raspberry pi)上实际运行对象检测,因此需要为人工智能推理构建专用硬件。
  • 第二,如果你运行常用的对象检测模型,如在 COCO 和 Pascal VOC 数据集上训练的 YOLO 或 SSD,它们根本不会做得很好。这是因为从高处看一个物体和在地面上看是完全不同的。因此,推理数据的分布将与模型在训练期间遇到的分布非常不同,这将导致它失败。

一些解决方案

  • 正如这篇文章的标题中提到的,我将使用目前自主机器人可用的最高端嵌入式处理器,来自 Nvidia 的 Jetson AGX Xavier。如果你想使用 Jetson TX2 或 nano,我会在文章末尾提供一些改进它们性能的建议。
  • 为了解决不同数据分布的问题,斯坦福大学的研究人员发布了一个名为斯坦福无人机数据集的数据集,其中包含几个从无人机上拍摄的视频,以及每个视频每一帧的标签。被检测的有六个等级:BikerCarBusCartSkaterPedestrian

任何经过斯坦福数据集训练的像样的对象检测模型都应该能够很好地检测这六个对象。在这篇文章中,我们将使用 RetinaNet ,这是一个由脸书(FAIR)发布的非常好的对象检测模型,它以这样一种方式塑造损失函数,即模型在训练期间学习专注于困难的例子,从而学习得更好。更多关于 RetinaNet 的细节可以在这里找到。

获取模型并转换为 fp16

答虽然 FAIR 的 Detectron 2 model zoo 有几个模型可以下载和使用,但它们都是在 COCO 和 Pascal 数据集上训练的,正如我们所讨论的,这对我们的任务没有用。在斯坦福数据集上从头训练一个模型将是一项艰巨的任务。幸运的是,我发现 Nvidia 提供了一个在这个数据集上训练的模型,作为他们在 DeepStream SDK 上的一个网络研讨会的一部分。我并不想在这篇博文中支持 Nvidia,但是如果你想在没有训练自己的模型的情况下开始,最快的方法是注册网上研讨会并下载模型作为网上研讨会资源的一部分。你要找的文件是大约 150 MB 的stanford_resnext50.onnx

一旦你有了这个文件,你就可以使用 GitHub 的retinanet-examples库的 C++ API 将onnx文件转换成一个引擎plan文件,这个文件是专门为你正在使用的 Jetson 设备编译的。以下是这些步骤的演练:

git clone [https://github.com/NVIDIA/retinanet-examples.git](https://github.com/NVIDIA/retinanet-examples.git)
cd retinanet-examples/extras/cppapi
mkdir build && cd build
cmake -DCMAKE_CUDA_FLAGS="--expt-extended-lambda -std=c++11" ..
make
cp /path/to/onnx/file . #copy onnx file to this directory./export stanford_resnext50.onnx engine.plan

成功创建engine.plan后,您可以使用infer实用程序在图像上测试模型的性能:

./infer engine.plan image.jpg

这将编写一个名为detections.png的文件,该文件将包含图像中检测到的对象的边界框。我给了斯坦福数据集中的一个视频图像作为模型的输入,下面是它输出的结果:

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

我们可以看到,该模型已经检测到几个行人在人行道上行走。这对于 Pascal 或 COCO 训练的模型是不可能的。这个图像的纵横比看起来很奇怪,因为 infer 实用程序将图像的大小调整为 1280x1280,这是模型的输入大小。

对视频的推断

既然我们可以在单个图像中检测行人,那么通过编辑cppapi目录中的infer.cpp文件,就可以直接将其扩展到视频中。我想到了这个:

要使用这个脚本,将其保存为cppapi目录中的infervideo.cpp,并编辑CMakeLists.txt以添加添加infervideo可执行文件的行,并将其链接到retinanet和其他库。

完成后,您可以切换到build目录,并像以前一样调用cmakemake:

cmake -DCMAKE_CUDA_FLAGS="--expt-extended-lambda -std=c++11" ..
make

一旦构建了目标,您将在构建目录中看到一个名为infervideo的新可执行文件,它可以用作:

./infervideo engine.plan input.mov output.mp4

这将创建一个名为output.mp4的新视频,显示每个对象的边界框。如果您想要对来自无人机的实时视频流执行对象检测,您可以简单地提供摄像机的 gstreamer 管道作为脚本的第二个参数,它也会处理摄像机。

我用上面的脚本对我的母校新德里 IIT 德里校区拍摄的一段视频进行了推理。我使用了 0.2 的低阈值来绘制边界框,这就是为什么下面的视频中有一些误报。

提高性能

如果您在 Xavier 上运行上面提供的脚本,您会发现视频的每一帧都需要 150 ms 来进行推断。这在 Xavier 上非常慢,在 TX2 或 nano 这样的小型 Jetsons 上就更慢了。以下是我们可以提高性能的一些方法:

  • 我们在这篇文章中创建的引擎是用于 fp16 precision 的。您可以在整数精度上运行该模型,这将显著提高其性能。为此,您可以使用斯坦福数据集的一小部分数据和 tensorRT 的trtexec实用程序来创建 INT8 校准文件,并将该文件提供给我们构建目录中的export实用程序。
  • 实际上,任何实时对象检测管道都不会对每一帧执行完整的推断,而是通常将其与计算成本低廉的跟踪器(如卡尔曼滤波器或光流)混合在一起。可以使用 opencv 的 KalmanFilter 类跨帧跟踪对象,每 4 或 5 帧只进行一次推断。如果无人机在推理过程中没有突然的抖动,这在实践中会很好。
  • 我们正在使用的模型非常大,因为它需要 1280x1280 的图像。您可以在较低分辨率的图像甚至自定义数据集上训练模型,以显著改善模型的延迟和吞吐量。训练模型的说明在retinanet-examples存储库中,但是最好在一个配备支持 CUDA 的 GPU 的 x86 工作站上完成。

结论

这篇博客旨在为那些在 Jetson Xavier 上部署 retinanet 模型有困难的人提供帮助,并记录我为在无人机上运行良好的对象检测管道所做的努力。虽然我们得到了比 Coco/Pascal 模型更好的结果,但要使模型在 Jetson 设备上实时运行,还需要做许多改进。请将此作为您自己项目的起点,如果您有任何其他改进性能的建议,请在下面发表评论。

使用 RaspberryPi、热感相机和机器学习来检测人

原文:https://towardsdatascience.com/detecting-people-with-a-raspberrypi-a-thermal-camera-and-machine-learning-376d3bbcd45c?source=collection_archive---------3-----------------------

这个故事的更新版本可以在 Platypush 博客 上免费获得。

一段时间以来,基于人的存在触发事件一直是许多极客和 DIY 机器人的梦想。例如,让你的房子在你进出客厅时开灯或关灯是一个有趣的应用。大多数解决这类问题的解决方案,甚至更高端的解决方案,如飞利浦色调传感器,检测运动,而不是实际的人的存在——这意味着一旦你像树懒一样躺在沙发上,灯就会关闭。当你离开房间去你的卧室时,能够关掉音乐和/或电视,而不用麻烦地关掉所有的按钮,这也是一个有趣的推论。当你不在家时,检测你房间里的人是另一个有趣的应用。

热感相机与深度神经网络相结合是一种更强大的策略,可以实际检测人的存在。与运动传感器不同,即使人不动,它们也能探测到人的存在。此外,与光学相机不同,它们通过测量人体以红外辐射形式释放的热量来检测人体,因此更加耐用——它们的灵敏度不取决于照明条件、目标的位置或颜色。在探索热感相机解决方案之前,我尝试了一段时间来建立一个模型,而不是依赖于传统网络摄像头的光学图像。差异是惊人的:我用一周内在不同照明条件下拍摄的 1 万多张 640x480 图像训练光学模型,而我用一天内拍摄的 900 张 24x32 图像训练热感相机模型。即使使用更复杂的网络架构,光学模型在检测人的存在方面也不会达到 91%以上的准确度,而热模型在更简单的神经网络的单个训练阶段内将达到大约 99%的准确度。尽管潜力很大,但市场上并没有太多东西——已经有一些关于这个主题的研究工作(如果你在谷歌上搜索“人物检测热感相机”,你会发现大多数研究论文)和一些用于专业监控的高端和昂贵的产品。由于我的房子缺乏现成的解决方案,我决定承担起自己的责任,构建自己的解决方案——确保任何人都可以轻松复制它。

五金器具

  • 一个 RaspberryPi(价格:35 美元左右)。理论上,任何模型都应该工作,但使用单核 RaspberryPi Zero 来执行机器学习任务可能不是一个好主意——任务本身并不昂贵(我们将只使用 Raspberry 来对经过训练的模型进行预测,而不是训练模型),但它可能仍然会在 Zero 上遭受一些延迟。任何更多的表演模式应该做得很好。
  • 热感相机。对于这个项目,我使用了mlx 90640Pimoroni breakout 相机(价格:55 美元),因为它相对便宜,易于安装,并且提供了良好的效果。这款相机有标准(55)和广角(110)两种版本。我使用广角模式,因为相机监控一个大客厅,但考虑到两者具有相同的分辨率(32x24 像素),因此更宽的角度以较低的空间分辨率为代价。如果你想使用不同的热感相机,你不需要做太多改变,只要它带有 RaspberryPi 的软件接口,并且与 platypush 兼容。
  • 如果你用的是突破相机,我个人建议把它安装在类似于突破花园的东西上(价格:10-14 美元),因为它很容易安装在你的 RaspberryPi 上,不需要焊接。

在您的 RaspberryPi 上设置 MLX90640 如果您有一个突破性的花园,这很容易。将突破花园放在你的覆盆子上。将摄像机分接头安装到 I2C 插槽中。启动 RaspberryPi。完成了。

软件

我在 Raspbian 上测试了我的代码,但是经过一些小的修改,它应该很容易适应安装在 RaspberryPi 上的任何发行版。

热感相机的软件支持需要做一些工作。MLX90640(还)没有 Python 现成的接口,但是为它提供了一个 C++开源驱动。安装说明:

# Install the dependencies
[sudo] apt-get install libi2c-dev# Enable the I2C interface
echo dtparam=i2c_arm=on | sudo tee -a /boot/config.txt# It's advised to configure the SPI bus baud rate to
# 400kHz to support the higher throughput of the sensor
echo dtparam=i2c1_baudrate=400000 | sudo tee -a /boot/config.txt# A reboot is required here if you didn't have the
# options above enabled in your /boot/config.txt# Clone the driver's codebase
git clone [https://github.com/pimoroni/mlx90640-library](https://github.com/pimoroni/mlx90640-library)
cd mlx90640-library# Compile the rawrgb example
make clean
make I2C_MODE=LINUX examples/rawrgb

如果一切顺利,您应该会在examples目录下看到一个名为rawrgb的可执行文件。如果你运行它,你应该会看到一堆二进制数据——这是相机捕捉的帧的原始二进制表示。记住它的位置或将它移动到自定义 bin 文件夹,因为它是 platypush 将用来与相机模块交互的可执行文件。

本文假设您已经在系统上安装并配置了 platypush。如果没有,请到我在开始使用 platypushreadthedocs 页面GitHub 页面wiki 上的帖子。

您还需要 RaspberryPi 上的以下 Python 依赖项:

# For machine learning image predictions
pip install opencv opencv-contrib-python# For image manipulation in the MLX90640 plugin
pip install Pillow

在这个例子中,我们将在捕获和预测阶段使用 RaspberryPi,在训练阶段使用一个更强大的机器。在用于训练模型的计算机上,您需要以下依赖项:

# For image manipulation
pip install opencv# Install Jupyter notebook to run the training code
pip install jupyterlab
# Then follow the instructions at [https://jupyter.org/install](https://jupyter.org/install)# Tensorflow framework for machine learning and utilities
pip install tensorflow numpy matplotlib# Clone my repository with the image and training utilities
# and the Jupyter notebooks that we'll use for training
git clone [https://github.com/BlackLight/imgdetect-utils](https://github.com/BlackLight/imgdetect-utils)

捕获阶段

现在你已经有了所有的硬件和软件,是时候开始用你的相机捕捉帧,并用它们来训练你的模型了。首先,在 platypush 配置文件中配置 MLX90640 插件:

camera.ir.mlx90640:
    fps: 16      # Frames per second
    rotate: 270  # Can be 0, 90, 180, 270
    rawrgb_path: /path/to/your/rawrgb

重启 platypush。如果您启用了 HTTP 后端,您可以测试是否能够拍照:

curl -XPOST -H 'Content-Type: application/json' \
     -d '{"type":"request", "action":"camera.ir.mlx90640.capture", "args": {"output_file":"~/snap.png", "scale_factor":20}}' \
      [http://localhost:8008/execute](http://localhost:8008/execute)?token=...

热图像应该存储在~/snap.png下。在我的例子中,当我在传感器前面时,它看起来像这样:

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

注意右下角的辉光——这实际上是我的 RaspberryPi 4 CPU 发出的热量。它在我拍摄的所有图像中都存在,如果你将相机安装在树莓上,你可能会看到类似的结果,但这对于你的模型训练来说应该不是问题。

如果您打开 webpanel ( [http://your-host:8008](http://your-host:8008)),您还会注意到一个由太阳图标表示的新标签,您可以使用它从 web 界面监控您的相机。

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

您也可以将浏览器指向http://your-host:8008/camera/ir/mlx90640/stream?rotate=270&scale_factor=20.,直接在网络面板外监控摄像机

现在向 platypush 配置添加一个 cronjob,以便每分钟拍摄一次快照:

cron.ThermalCameraSnapshotCron:
    cron_expression: '* * * * *'
    actions:
        -
            action: camera.ir.mlx90640.capture
            args:
                output_file: "${__import__(’datetime’).datetime.now().strftime(’/img/folder/%Y-%m-%d_%H-%M-%S.jpg’)}"
                grayscale: true

图像将以格式YYYY-mm-dd_HH-MM-SS.jpg存储在/img/folder下。没有应用比例因子——即使图像很小,我们也只需要它们来训练我们的模型。此外,我们将把图像转换成灰度——神经网络将更轻,实际上更准确,因为它将只需要依赖每个像素一个变量,而不会被 RGB 组合欺骗。

重启 platypush,验证每分钟在你的图片目录下创建一张新图片。让它运行几个小时或几天,直到你对样本数量满意为止。试着平衡房间里没有人和有人的照片数量,试着覆盖尽可能多的情况,例如,坐在、站在房间的不同位置等等。正如我前面提到的,在我的例子中,我只需要不到 1000 张足够多样的图片就可以达到 99%以上的准确率。

标记阶段

一旦你对你采集的样本数量感到满意,就把图像复制到你用来训练你的模型的机器上(它们应该都是小的 JPEG 文件,每个小于 500 字节)。将它们复制到您克隆了我的imgdetect-utils库的文件夹中:

BASEDIR=~/git_tree/imgdetect-utils# This directory will contain your raw images
IMGDIR=$BASEDIR/datasets/ir/images# This directory will contain the raw numpy training
# data parsed from the images
DATADIR=$BASEDIR/datasets/ir/datamkdir -p $IMGDIR
mkdir -p $DATADIR# Copy the images
scp pi@raspberry:/img/folder/*.jpg  $IMGDIR# Create the labels for the images. Each label is a
# directory under $IMGDIR
mkdir $IMGDIR/negative
mkdir $IMGDIR/positive

一旦复制了图像并创建了标签目录,运行存储库中提供的label.py脚本来交互式地标记图像:

cd $BASEDIR
python utils/label.py -d $IMGDIR --scale-factor 10

每个图像将在一个新窗口中打开,您可以通过键入 1(负)或 2(正)来标记它:

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

在程序结束时,图像目录下的negativepositive目录应该已经被填充。

培训阶段

一旦我们得到了所有标记的图像,就该训练我们的模型了。在notebooks/ir下提供了一个[train.ipynb](https://github.com/BlackLight/imgdetect-utils/blob/master/notebooks/ir/train.ipynb) Jupyter 笔记本,它应该是相对不言自明的:

如果您成功地正确执行了整个笔记本,您将在models/ir/tensorflow下拥有一个名为ir.pb的文件。那是你的 Tensorflow 模型文件,你现在可以把它复制到 RaspberryPi,并用它来做预测:

scp $BASEDIR/models/ir/tensorflow/ir.pb pi@raspberry:/home/pi/models

探测房间里的人

使用 platypush [MlCv](https://platypush.readthedocs.io/en/latest/platypush/plugins/ml.cv.html) 插件,将我们之前创建的ThermalCameraSnapshotCron的内容替换为按预定时间间隔拍照的逻辑,并使用我们刚刚训练的模型来预测房间中是否有人。

你可以在procedure.people_detectedprocedure.no_people_detected中实现任何你喜欢的逻辑。这些程序仅在先前观察的状态发生变化时才会被调用。例如,当有人进入/离开房间时,打开或关闭灯的简单逻辑:

procedure.sync.people_detected:
    - action: light.hue.onprocedure.sync.no_people_detected:
    - action: light.hue.off

下一步是什么?

这是你的电话!随意试验更复杂的规则,例如,当有人进入房间时,使用 platypush 媒体插件改变房间中播放的音乐/视频的状态。或者早上第一次进房间的时候说一句自定义的早安短信。或者建立你自己的监视系统,当你不在家的时候跟踪别人的存在。或者增强模型以检测房间中的人数,而不仅仅是存在。或者你可以将它与光学流量传感器、距离传感器、激光测距传感器或光学相机(platypush 为其中一些提供了插件)结合起来,构建一个更加强大的系统,该系统还可以检测和跟踪传感器的移动或接近,等等。

使用深度学习检测 API 通信中的个人数据

原文:https://towardsdatascience.com/detecting-personal-data-within-api-communication-using-deep-learning-9e52a1ff09c6?source=collection_archive---------6-----------------------

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

概观

有没有想过有多少个人数据分散在各个组织中?大量的个人数据——你的、我的、每个人的——从模糊的个人信息到极其具体的信息,都在四处漂浮。大多数情况下,它是未被发现的。几乎总是,它被你给它的组织使用,有很好的理由。有时,出于可疑的原因。经常(非常,非常经常)它被第三方出售和使用,或者被误用。).太多时候,个人数据被劫持并用于邪恶的目的。鉴于在线个人数据的使用和滥用机会呈指数增长,难怪欧盟最近通过了《通用数据保护条例》(GDPR),该条例于 2018 年 5 月 25 日生效。一个月后,加州紧随其后,颁布了《加州消费者隐私法》(CCPA)。如果你想知道有多少组织掌握着你的个人数据,你并不孤单。但是那些组织本身呢?监控这些数据既困难又耗时。这种个人数据噩梦最可怕的部分可能是,组织本身往往不知道你的个人数据存储在哪里,它可能流经哪些应用程序,或者它可能最终会在哪里。监管个人数据的流动和使用的趋势正在上升,但你如何监管你无法检测到的东西?

GDPR 法规的支柱之一是,任何处理个人数据的应用程序都应该“嵌入”隐私,通常称为隐私设计(PbD)。这远不是一个新的定义:

“隐私设计方法的特点是采取主动措施,而不是被动措施。它可以在隐私侵犯事件发生之前预测并阻止它们。PbD 不会等待隐私风险的出现,也不会在隐私侵害发生后提供补救措施来解决隐私侵害——它旨在防止隐私侵害的发生。简而言之,隐私是事先设计好的,而不是事后的”

A.卡沃金。设计隐私——7 项基本原则,2011 年 1 月。

这遵循了类似于安全设计的原则(不幸的是,我认为我们离安全设计还很远)。隐私和安全的设计听起来都很棒。但是,如何处理已经发布并投入生产、传输和接收个人数据的数十亿行代码呢?我们是否要等待数据泄露发生,然后应用修复程序?对我来说,这听起来太少,太晚了。

为了寻找灵感,我开始研究一个相关领域:网络安全。我了解得越多,就越发现个人数据共享和网络安全问题之间的相似之处。在必须应对应用程序和基础架构中的新旧未知威胁方面,挑战是相似的。一种常见的缓解机制是持续监控网络流量,检测可能转化为实质性威胁的潜在恶意模式。

我认为,涉及个人数据处理的威胁与网络安全威胁一样重要。在这两种情况下,它都归结为暴露,这总是以这样或那样的方式转化为财务损失,影响负责处理个人数据记录的组织。这反过来影响他们如何处理这些个人记录;这对我们所有人都有影响,有时影响非常大。

但是说够了,是时候动手了。

训练数据集生成

为了通过深度学习获得相当不错的结果,训练需要大量的正面和负面例子。这些例子越真实,预测就越准确。

我面临的第一个挑战是如何获得如此庞大的样本集,因为根据定义,个人数据是保密的,因此不会公开。

有许多方法可以获得这种数据来检测应用程序安全异常,例如利用动态应用程序安全测试(DAST)工具,该工具包括生成和捕获恶意流量,然后基于此训练分析模型。然而,在我们的案例中,包含个人数据流的流量并不意味着安全威胁,因此 DAST 工具或它们通常生成的流量数据不提供覆盖范围。

第二个挑战?除了包含虚构的个人数据之外,我还需要对个人数据在 API 通信(例如 REST)中通常是如何传递的进行编码,因为这是我们将要运行预测的对象。例如,个人数据属性通常只代表整个 REST API 有效负载的一个子集。

最后,我还需要网络来了解个人数据和有效载荷的规律。简而言之,它不仅要学习不同形式的个人记录,更重要的是,还要学习通过网络交换的个人数据是什么样的。

我应对这些挑战的方法是使用模式作为主要来源,精心制作我自己的机器生成数据集,也称为合成数据集。

好消息是大多数流行的 REST APIs 都附带了一个 OpenAPI(以前称为 Swagger)描述符。

OpenAPI 规范,最初被称为 Swagger 规范,是用于描述、产生、消费和可视化 RESTful web 服务的机器可读接口文件的规范。

因此,给定一个 OpenAPI 描述符,我只需基于这个蓝图实例化一个 RESTful 请求,在给定数据类型的情况下,用虚构但格式良好的值填充空白。最新的 OpenAPI 描述符目录可在 https://github.com/APIs-guru/openapi-directory 获得。数据集生成器扫描该目录,并基于该目录实例化合成请求有效载荷的集合,该集合随后用于训练网络。

下面是综合请求生成器的核心部分:

REST APIs 的局限性之一是尽可能避免传递个人信息。取而代之的是,使用一个或多个不太敏感的标识符,以便服务可以解析到相应的 PII,而无需公开完整的记录。这是在有两个少数正面例子(即包含 PII)导致高度不平衡的数据集的情况下得出的。我采取的缓解此问题的方法(见第 21-30 行)是通过使用最近的正面示例(PII 请求有效负载)作为模板进行过采样,以生成包含一些其他随机选择的 PII 属性(如 SSN、电话号码等)的其他正面示例。).

该项目捆绑了一个预生成的训练数据集,位于 data/training.csv 下。

以下是我们的“假”有效载荷的摘录:

现在,让我们获取我们生成的数据集的一些指标:

0 19278
1 22607
数据集中包含 PII 的请求:53.97%

我们已经能够生成足够大且平衡的训练数据集。

不错吧?让我们使用它。

选择 DNN 发动机

正如您可能已经知道的,有几个很棒的 DNN 堆栈,支持多种网络拓扑结构。我们将选择 TensorFlow,它最近受到了很多关注,因为到目前为止,该领域的大多数研究都是在这里进行的。

为了保持人工智能相关的复杂性,以及能够快速迭代,我们将抽象特定的堆栈(TensorFlow)并使用 Keras,Keras 将负责设置网络层所需的繁重工作。

因为我们的 DNN 堆栈是用 Python 实现的,所以我们的解决方案需要使用相同的语言来实现,以实现无缝的互操作性。

了解“个人”的含义

我们应该使用哪种可用的神经网络拓扑结构?

很明显,我们在按照一套既定的规则处理信息。例如,一个有效的 JSON 文档遵循特定的约定——在其语法中指定——这是我们需要考虑的。这方面的一个例子是数据由逗号分隔,花括号包含对象,等等。

此外,值可以遵循各种各样的格式,其中许多是位置相关的。例如,社会安全号码不同于电话号码。让网络学会在这一水平上进一步辨别将提高预测的准确性。继续前面的例子,如果属性名是“ssn ”,但是对应的值与学习到的 SSN 格式不匹配,那么它的得分将低于遇到格式良好的 SSN 值时的得分。

总之,我们必须学习序列,包括 JSON 文档的术语和其中定义的值的字符模式。到目前为止,这种情景的最佳匹配是 LSTM(长短期记忆)。这种类型的 RNN(递归神经网络)带来的主要特征是状态性。简而言之,在处理输入时,它会考虑之前看到的内容。它有记忆。例如,如果它看到下面的 JSON 键/值对:

{ " SSN “:” 744–22–5837 " }

在学习值部分的序列(即“744–22–5837”)时,它将考虑之前看到的密钥(即“ssn”),从而在提取其处理的令牌背后的正确含义方面增加了更多信心。

这里是实现位。LSTM 隐藏层输入单词 embedding——很像一个从有效载荷中提取文本的字典——并有单独的丢弃层以减少过度拟合;和最后的输出层,以产生 PII 分类。我们将使用 100 个历元,因为这是模型与我们的合成数据集聚合的地方。我强烈建议使用体面的 GPU,以便通过这一点明显更快。

现在是训练神经网络的时候了。默认情况下,它将使用项目附带的数据集(training.csv)。

$ python privapi/train.py

超过 99% 的准确率!到目前为止,一切似乎都很有希望。接下来呢。现实检查。

检测个人数据

我们训练好的网络模型现在可以预测一个给定的 JSON 有效载荷中是否有 PII。

我们的分类器将遍历包含示例请求有效负载的文件夹,并将使用先前生成的神经网络模型获得的预测输出到 CSV 文件中:

在“预测”文件夹中,我们有两个要对其运行预测的示例。

注册 webhook 的示例非敏感 Slack API 有效负载:

和一个敏感的请求有效载荷——因此包含 PII——用于 Magento 电子商务解决方案:

让我们运行预测器:

$ python privapi/predict.py

该命令将遍历包含示例请求有效负载的文件夹,并将预测输出到名为 predictions.csv 的 CSV 文件中,如下所示:

这表明,至少在这两个例子中,我们的预测器做得非常好。

首先,它检测到 Magento 有效载荷确实很敏感,得分几乎是 100%。其次,它将松弛有效载荷归类为不敏感,准确率约为 40%。

有趣的是,这个有效载荷包含了可能被错误地认为是 PII 的内容(例如,名字和姓氏),但是它并没有强烈地影响分类,以至于选择了错误的类。

我建议您尝试使用您喜欢的请求有效负载,看看您会得到什么结果。

带回家的体验

老实说,我对当前最先进的人工智能如何在隐私领域做出贡献印象深刻,主要是通过让处理和传输我们个人数据的组织产生意识。我相信机器有很多机会来学习如何帮助保护我们的个人数据安全。我将这个项目命名为 PrivAPI,并在 Github 上公开。请随意查看、体验,并做出贡献。

我们将何去何从

PrivAPI 还有很大的改进空间。主要领域包括:

  • **流式传输:**从事件流式传输平台获取 REST API 有效负载,并将神经网络模型应用于新事件,以推断结果(即有效负载是否保密)。最后,将预测推给任意的消费者,让他们据此采取行动。
  • **在线学习:**不要将训练和推理分开,而是允许从接收到的 REST API 有效负载中进行训练,这样解决方案的整体有效性就会得到提高,因为它正在学习特定组织内的 API 流量模式。
  • **神经网络监控和警报:**监控神经网络模型的准确性、分数、SLA 和其他指标,并实时提供自动警报。最后,反馈度量以改进或替换神经网络模型。
  • **额外的有效载荷格式:**处理使用另一种符号表示的 API 流量应该非常简单,因为神经网络与此无关。例如,支持 XML API 有效负载将允许我们监控 SOAP 流量,这在企业环境中仍然非常普遍。

你想在 PrivAPI 中看到什么?欢迎在下面发表评论,贡献一个 Github pull 请求。

查看 GitHub 上的代码:

[## Veridax/privapi

使用深度神经网络检测敏感的 REST API 通信- Veridax/privapi

github.com](https://github.com/veridax/privapi)

从 OCT-视网膜图像中检测视网膜损伤

原文:https://towardsdatascience.com/detecting-retina-damage-from-oct-retinal-images-315b4af62938?source=collection_archive---------14-----------------------

光学相干层析成像(OCT) 是一种利用相干光捕捉生物组织高分辨率图像的成像技术。眼科医生大量使用 OCT 来获得眼睛视网膜的高分辨率图像。眼睛的视网膜功能更像照相机中的胶片。OCT 图像可用于诊断许多视网膜相关的眼病。

OCT 是一种新兴的生物医学成像技术,可以对高度散射的组织进行非侵入式实时高分辨率成像。它被眼科医生广泛用于对眼前部和视网膜的结构进行诊断成像。

在这篇文章中,我们将看到如何分类光学相干断层扫描来分类视网膜疾病。我们将讨论基于卷积神经网络(CNN)对视网膜 OCT 图像进行自动分类的分类方法,所述卷积神经网络基于使用迁移学习的 2 个预训练模型和 1 个定制 CNN 模型。

关于数据集

获取自:视网膜 OCT 图像

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

1。脉络膜新生血管(CNV): 脉络膜新生血管是在脉络膜层产生新的血管。脉络膜新生血管是新生血管变性性黄斑病变(即“湿性”黄斑变性)【1】的常见原因,通常会因极度近视、恶性近视变性或年龄相关发展而加剧。

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

Choroidal neovascularization (CNV)

2。糖尿病黄斑水肿(DME):

DME 是糖尿病的一种并发症,由黄斑中的液体积聚引起,可影响视网膜中央凹。黄斑是视网膜的中心部分,位于眼睛的后部,是视觉最敏锐的地方。DME 导致的视力丧失会持续数月,使人无法清晰聚焦。

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

Diabetic Macular Edema (DME)

3。德鲁森:

玻璃疣是视网膜下的黄色沉积物。玻璃疣是由脂质,一种脂肪蛋白质组成的。玻璃疣可能不会导致老年性黄斑变性。但是患有玻璃疣会增加一个人患 AMD 的风险。玻璃疣由蛋白质和钙盐组成,一般出现在双眼中。

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

Drusen

4。正常

当光线直接聚焦在视网膜上,而不是在它的前面或后面时,就会出现正常的视觉。视力正常的人能清楚地看到远近的物体。

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

Normal

迁移学习

微调我们的模型

微调实施包括截断预训练网络的最后一层(softmax 层)并用与我们的问题相关的新 soft max 层替换它。

1)MobileNet

MobileNet 是一种架构,更适合缺乏计算能力的基于移动和嵌入式的视觉应用。这个架构是 Google 提出来的。

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

使用预训练的 imagenet 权重加载 MobileNet,并排除顶层(即最后三层)用新的可训练层替换完全连接的层,并使用 include_top=False 显示模型中的其他层

冻结一层或一组层意味着防止它们的权重在训练期间被更新。如果不这样做,那么卷积基先前学习的表示将在训练期间被修改。

所有的卷积级别都是预先训练的,所以我们在完整的训练过程中冻结这些层,这样当新的完全连接的层试图学习模型时,它们的权重不会改变。因此,我们将可训练层设置为假。

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

GlobalAveragePooling2D 用于将输入转换为正确的形状,以便密集图层进行处理。它将前一层的 3D 输出展平为 1D 层,通过平均适合我们的全连接层。

num_classes=4,activation="softmax "通过推理将单个类别赋予样本—这是通过计算每个可能类别的概率来完成的。然后,我们可以选择概率最高的类别进行最终分类。

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

添加 mobilenet 层和全连接层,用于使用卷积基进行训练。

模型摘要

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

13 Conv Layers(Mobile Net)

可训练参数(权重)是在反向传播的反向过程中得到更新的所有参数。这些权重包含网络从训练数据中学习到的信息。

图像增强

图像增强背后的思想是,我们遵循一个设定的过程,从我们的训练数据集中获取现有图像,并对它们应用一些图像变换操作,如旋转、剪切、平移、缩放等,以产生现有图像的新的、改变的版本。

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

该增强生成 4 类 34464 幅训练图像和 3223 幅验证图像

培训模式

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

在模型的每次训练迭代期间,即在每个时期结束时,将调用回调机制。

检查点是一个定期保存应用程序状态快照的过程,因此如果出现故障,应用程序可以从上次保存的状态重新启动。这在深度学习模型的训练过程中很有用,这通常是一项耗时的任务。

提前停止减少神经网络中的过拟合就是利用提前停止。如果没有真正学到任何东西,提前停止可以通过终止训练过程来防止模型过度训练。

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

val_loss 没有从 0.70965 提高到最近 3 个时期的较低值,这是早期停止回调中的耐心。

测试准确率为 71.2%

混淆矩阵

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

正常图像很容易识别。

我们可以通过研究其他模型来提高更多。

Github 代码: Retinal-MobileNet.ipynb

2)VGG16

来自牛津视觉几何小组,或简称为 VGG 的研究人员开发了 VGG 网络,该网络的特点是简单,只使用 3×3 的卷积层堆叠在彼此的顶部,深度不断增加。减少卷大小是由最大池处理的。最后,两个完全连接的层,每个层有 4,096 个节点,然后是 softmax 层。

池化是由 max pooling 层执行的,它位于某些卷积层之后。并非所有卷积层都遵循最大池。最大池是在一个 2×2 像素的窗口上执行的,步长为 2。ReLU 激活用于每个隐藏层。在大多数 VGG 变型中,过滤器的数量随着深度而增加。16 层架构 VGG-16 如下图所示。

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

与 mobilenet 类似,步骤几乎没有变化

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

展平层处理尺寸。因为我们有一个三维像素输入图像,所以我们使用 Flatten 将其转换为一个长的一维数字字符串。

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

13 Conv Layers(Vgg16)

与 MobileNet 相比,可训练参数更多。它标志着更多的功能都学到了模型。

混淆矩阵

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

与其他视网膜疾病相比,正常的玻璃疣被正确识别

Github 代码: RetinalVGG16.ipynb

3)五隐层 CNN 模型

我们应用 5 CNN(卷积层)和 3*3 内核以及“relu”激活。

模型

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

可训练参数

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

与预训练模型相比,可训练性似乎更低。但是与预训练的模型相比,它仍然表现得更好。

测量精度

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

混淆矩阵

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

混淆矩阵在预测正常,玻璃疣和 DME 方面表现更好。

Github 代码: Retinal5CNN.ipynb

4)定制 VGG 模型

可训练参数

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

更多的可训练参数相比,这两个模型。与对比模型相比,不可训练参数也明显较少。

混淆矩阵

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

该模型已经正确地预测了大多数 OCT 视网膜疾病。上述推论可以在下面的预测中看到。

预言

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

Normal Prediction

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

Drusen Prediction

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

CNV Prediction

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

DME Prediction

从上面我们可以看到,所有的视网膜疾病都被正确地分类了。

Github 代码: OCT-Retinal-VGG.ipynb

结论

具有 16 个隐藏层的 CNN 模型,即类似于 VGG 模型,给出了 96%测试准确度的最佳结果。

参考资料:

  1. https://www.appliedaicourse.com

2.https://www.kaggle.com/paultimothymooney/kermany2018

3.http://www . cell . com/cell/full text/s 0092-8674(18)30154-5

使用人工智能检测骗局,真的

原文:https://towardsdatascience.com/detecting-scams-using-ai-for-real-6c96e712cf09?source=collection_archive---------30-----------------------

历时一年的旅程,开发市场上最好的欺诈防范系统之一

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

Photo by Po-Ying Chen on Unsplash

根据 2019 年 3 月发表的一项研究——我特意寻找只是为了给这篇帖子找一个很酷的介绍——欧洲 40%的自定义人工智能初创公司实际上并不使用人工智能。我看到他们在那里做什么,利用普通人(和投资者)对这个领域鲜有的熟悉,在市场上将自己定位为酷黑魔法专家。我不为人工智能初创公司工作(我的意思是,我们不直接出售任何人工智能驱动的服务),但几天前我们终于在发表了一篇内容广泛的帖子,向公众介绍了我们的第一款人工智能驱动的产品。我认为分享我们实际部署它所经历的所有步骤以及我们为什么决定以这种方式进行部署会非常有趣。

没有重复,只是作为一个介绍性的术语:佩内洛普是我们检测骗局的内部工具。在我们的平台( HousingAnywhere ,一个在全球 400 多个城市都有房源的住宿市场)上发布的每个新房源都被归类为诈骗或非诈骗,在某些情况下,我们的客户解决方案 (CS)部门会对其进行人工检查。它已经使用过去三年中收集的数据进行了训练,并作为一个集成来实现,其中每个模型独立地关注不同的特征或数据集的不同时间子集。

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

佩内洛普之前的欺诈预防

HousingAnywhere 不是 Penelope 生来就有的,提供信任和安全的市场一直是该公司的首要目标。多年来,欺诈预防系统在没有任何人工智能的情况下表现良好(难以置信,不是吗?)并且它几乎完全依赖于由一些静态 SQL 规则组成的触发器系统。一些被查询的数据结构和查询本身一点也不简单,但是一个简单的系统,如果设计和维护得好,往往可以胜过非常复杂的解决方案。问题是情况并不完全如此。当一家公司开始快速扩张,并且必须快速解决问题时,它可能会忽略一些好的实践。

最初的系统由大约 50 条规则组成,缺乏适当的文档,并且范围重叠。我们没有收集任何关于他们表现的统计数据,我们也不知道最初的设计者为什么要创造这些规则。我们有一种感觉,一些触发因素几个月来都没有导致任何检测,导致大量时间浪费在无用的检查上,但我们没有任何指标来证明这一假设,我们最终没有删除任何东西,在现有规则的基础上添加新规则,因为系统正在工作-在 3 年内没有一个骗子成功过!——我们很害怕碰任何东西。设计新规则本身也很棘手。有时,描述一个可疑的行为并不容易,对于一个人来说,可能很容易得到的东西可能需要数百行 SQL 语句,将可能存储在不同位置的表连接在一起。就在那时,我们开始考虑使用机器学习来取代规则系统:停止明确定义所有规则,让算法直接从我们的数据中学习它们。这是一个相当雄心勃勃的目标,我们花了 6 个多月的时间才实现,但那时我们已经有了一个非常具体的使用案例和一个定义良好的流程。我们不是简单地开始将随机数据扔给学习算法,看看会发生什么。此外,目标是替换已经被人们成功使用的现有产品(有点儿),这允许我们有一个真实世界的框架来可靠地测试我们的替代产品(我已经在这里写了这个)。但是,如果我们不能衡量我们现有产品的性能,如何定义成功呢?

我们不是简单地开始将随机数据扔给学习算法,看看会发生什么。

我们在佩内洛普项目上花费了大量的精力,从一开始,就在永远扼杀它之前,对以前的规则系统进行合理化和改进。我们设计并实施了一个监控基础设施,能够跟踪每个触发器的性能(主要是精度),我们还开始为客户解决方案部门收集一些指标,以检查我们的瓶颈在哪里,以及我们是否需要在技术基础设施的基础上改进我们的内部流程。我们最终两者都做了:如果人们遵循的过程一开始就没有效率,那么改进人们使用的技术基础设施就没有意义。人工智能是一种改善事物的工具,但它只是拼图中的一块。它的用处不在于单独使用它,而在于用它来改进整个过程。实现机器学习不是最容易的事情,最重要的是,这是一项结果非常不可预测的工作。先从简单的事情做起。

如果人们遵循的过程一开始就没有效率,那么改进人们使用的技术基础设施是没有意义的。

实际上是佩内洛普

一旦我们有了一个可靠的防欺诈基础设施(大约一个月的工作),我们就开始构建一个替代方案来消除它。从一开始,我们从未考虑过完全取代人类主持人,我们也从未追求过类似学术论文的表现。我们总是不把精确度看做一个数字,而是看 CS 为检查标记的列表而浪费的无用工作的数量,并回忆为留在野外的诈骗列表的数量。规则系统也有助于为我们提供一组初始的工作特性。除此之外,我们还调查了其他一些人,这主要归功于每天与骗子打交道的人提供的信息。不过,我们没有浪费时间去研究那些在创建列表的前 5 分钟内无法获得的功能,同样,在早期阶段就有产品愿景在这方面非常有帮助。

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

我们在训练模型时面临的真正挑战是生成数据的平台的进化性质。我们最终组装了 5 个 LightGBMs (性能相当,但训练时间比 XGBoost 短),每个都用不同的数据集进行了垂直(样本数量)或水平(特征数量)大小的训练。每个模型都被加权以在新数据上具有最高性能(90-10 次验证,按时间顺序排列样本;探索权重空间的贝叶斯优化)。最终的模型已经被部署为一个 web API (Flask ),为一个异步调度预测任务的 Celery 实例提供数据。每个作业的结果在不同的通道上发送,并且部署不知道正在使用它的客户端。平台上发布的每一个新列表(唯一的例外是由可信的广告商创建的列表)都会发送给 Penelope 进行检查。或者被接受,被标记为诈骗,或者被发送进行人工审核。每个预测作业持续 3-4 秒,但需要其中的一小部分时间来通过第三方来源收集一些数据。

在第一次成功部署后(大约 2019 年 1 月),我们必须决定如何处理系统的再培训过程以及我们数据的进化性质。我们运行了一些离线模拟,并比较了不同的再培训场景,发现对于我们的特定领域,每两周再培训 Penelope 会导致性能的显著提高(基本上,更多的骗子)。不足为奇的是,用集合中的所有最近特征训练的模型的重要性每次都与新列表的分类更相关。在未来,我们期望摆脱一些模式,并可能增加新的模式。在这个阶段,我们非常有信心做到这一点,我们有一个坚实的管道来发现新的换档功能,以训练我们的模型。

绩效和后续步骤

在 Penelope 之前,CS 部门每周花费 80 小时对可疑列表进行人工审核,目前大约是 15 小时(80%的改进)。大多数规则本身不会立即生效,需要 1 到 6 个小时来识别欺诈行为。这一限制将访问者置于风险之中,因为列表可以被联系几个小时。Penelope 能够在列表发布后立即对其进行分类,这使得这个窗口几乎为 0,并且实际上为 CS 提供了一个非常方便的指标来评估它们的性能。我们的防欺诈系统(作为一家公司)的质量现在与客户解决方案部门在检查 Penelope 标记的列表时的响应能力密切相关。 Mes2Det 是我们衡量这一点的内部指标,计算方法是在我们的系统上通知骗子后,报告骗子所需的时间。很容易注意到,自从 Penelope 上线以来,Mes2Det 改进了很多(从 10 小时减少到 2 小时),现在已经稳定了几个月。

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

目前,我们正在对 Penelope 进行不断的迭代,尽我们所能对其进行改进。我们已经学到的一些教训是,要追求的研究方向是缩小模型的范围,可能是用更小的数据集组装更简单的组件,而不是试图建立一个具有数百个复杂功能的更大的架构。在 6 月份,我们已经部署了第二个版本的 Penelope,即使它使用的数据集几乎是原始版本的一半,精度也提高了约 10%。

使用迁移学习检测集卡

原文:https://towardsdatascience.com/detecting-set-cards-using-transfer-learning-b297dcf3a564?source=collection_archive---------22-----------------------

如何从深度卷积网络中生成强大的特征

在美丽的法国度假期间,我和我的家人玩了很多,一种简单而优雅的卡牌游戏。目标是在别人发现之前找到特定的卡片组合。玩游戏的时候,我们经常盯着牌,想知道是否还有一组我们没有看到的牌。这开始了一个有趣的个人兼职项目,我应用机器学习来寻找集合组合。

在这篇文章中,我将分享我的方法,代码的结果和亮点。要获得完整的源代码,请查看 Github 上的笔记本。

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

“我不能创造的,我不理解”

理查德·p·费曼

首先,让我们把事情搞清楚。对于当今最先进的机器学习模型来说,检测设置卡是一项简单的任务。像 YOLO 这样的物体检测算法可以从视频中实时检测许多物体,因此从图像中找到带有简单彩色符号的卡片应该不会太难。

比起使用 YOLO,我会发现从头开始更有趣也更有挑战性。

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

Example of realtime object detection with YOLO

总体方案如下:

1。从图像中提取卡片使用计算机视觉提取单张卡片。

2。使用深度卷积网络对每个单独图像进行分类 以生成用于(线性)分类器的特征。

3。寻找有效集合组合 使用组合学来寻找有效集合。有趣的是,有一种优雅的方法只用几行代码就可以做到。

关于游戏

在我们深入细节之前,让我解释一下这个游戏。

SET 游戏是一种流行的纸牌游戏,挑战你的模式识别技能。游戏的目标是找到一个“套”,这是三张牌的特殊组合。

共有 81 种独特的卡片,具有四种属性:颜色、形状、填充和数量。每个属性可以有三个不同的值。如果就四个属性中的每一个而言,三张牌或者是相同的或者是都不同的**,则这三张牌被称为一组**

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

Example for a valid and invalid SET combination

总共有 12-21 张牌放在桌子上,玩家实时收集尽可能多的牌。

游戏有不同的版本。我在这个项目中使用的版本是 2001 年的 Ravensburger 版本,具有以下特点:

  • 颜色:红色,绿色,紫色
  • 形状:方形,波浪形,圆形
  • 填充:实心、虚线、空心
  • 数量:一、二、三

1974 年玛莎·让·法尔科发明了成套游戏。作为一名遗传学研究者,她研究了德国牧羊犬的癫痫症是否是遗传的。为了代表狗的基因信息,她开始在卡片上画符号。不同的属性(即颜色)代表了狗的不同特征。她意识到这可能是一个具有挑战性的难题,在朋友和家人的鼓励下,她开发并推广了这款纸牌游戏。SET 在数学界内外都变得非常流行。【1】

1.从图像中提取卡片

有一个很棒的帖子详细解释了如何使用 OpenCV 从图像中提取规则扑克牌。附带的代码对于提取器械包卡片也非常有用。因此,我不再重复这个解释,我将参考发布的获取详细信息,并且我将坚持这里的主要步骤。

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

Steps to extract the cards: find contours of cards in the preprocessed image (identify), warp them to a landscape orientation (register) and crop them to separate images.

  • 识别卡片——为了在图像中找到卡片,我们利用了白色卡片与背景截然不同的事实。为了放大这种效果,首先对图像进行预处理。然后通过分组相似的像素来找到轮廓。最后,与典型卡片(如卡片上的符号)不匹配的轮廓被过滤掉。
  • 图像配准—将找到的轮廓转换到一个单一的坐标系中,这叫做图像配准。这样,所有卡片都以横向结束,并且可以从图像中裁剪。

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

Example of finding the contours in an image

如果卡片和背景之间有足够的对比度,这种算法就能很好地工作。如果卡片重叠,它将无法找到所有的卡片,所以我不建议在实际应用中使用该代码,但对于这篇博客来说,它会做得很好。

2.对每个单独的图像进行分类

既然我们可以找到单张卡片,我们就可以开发一个将卡片分类的模型。

创建数据集

第一步是为此任务创建数据集。我在略有不同的光线条件下,从不同的角度为每张卡片拍了四张照片。我分离出一系列图片,并将其用作验证集来测试模型的表现。

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

Example of the generated augmented card images

每堂课只有三个例子不足以成功训练一个模型。通过使用 Keras 中的[ImageDataGenerator](https://keras.io/preprocessing/image/#imagedatagenerator-class) API,您可以从基本数据集创建人工样本。这样你就可以创建一个任意大小的数据集,其中卡片可以旋转、缩放、翻转等。真实样本比人工样本好,但如果你不想自己拍成千上万张照片,这是一个很好的替代选择。

测试基线模型

作为基线,我训练了一个逻辑回归模型,并使用增强的图像作为输入。在下面的结果中,您可以看到该模型对于不同数据集大小的性能。对于 8100 幅增强图像的训练集,验证准确率刚刚超过 43%。

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

相比较而言,随机选择类的模型只会得到 1.23%的分数,所以线性 logistic 回归模型至少学到了一些有用的东西。

对于我们的目的来说,准确度高非常重要。如果我们想找到一幅图像中的所有集合组合,我们需要正确分类 12+张卡片。91%或更低的准确度意味着平均而言,在每张图片中有一张卡片被错误分类,这将破坏集合检测。

让我们看看如何通过使用深度学习来提高这种性能。

选择迁移学习策略

对于我们的任务,我可以尝试从头开始训练一个深度卷积神经网络(DCNN ),但由于我的(基础)数据集很小,该模型可能会过拟合。

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

一种流行的方法是使用转移学习,你拿一个为某项任务训练过的模型,你在另一项任务中重用

有许多方法可以应用迁移学习,为某项任务和数据集找到最佳策略可能会令人望而生畏。我发现有一篇有趣的文章提供了一些指导:选择迁移学习策略的两个最重要的因素是新数据集 的大小和与原始数据集的相似度。**

  • 如果你的新数据集很大: 对于一个大的数据集,过度拟合的机会很小,所以你可以微调整个网络* k 或者如果你的数据非常不同,从头开始训练一个 DCNN。实际上,即使数据集是不同的,用预训练模型的权重初始化网络可能仍然是有帮助的。*
  • 如果您的新数据集很小: 不要训练或微调 DCNN,因为它会过拟合。相反,根据数据集与原始数据集的相似程度,使用来自早期或后期层的 CNN 特征训练一个线性分类器** 。
    如果您的数据集不同,请从网络中较早的某处选择更为通用的要素。如果是相似的,来自更多特定于数据集的最终图层的特征是最有用的。*

*线性模型使用特征的线性组合,正因为如此,它们比可以学习各种非线性模式的神经网络更受限制。这种限制有助于减少过度拟合。通过使用线性模型和非线性特征表示,我们可以说是两全其美。

对于集合检测任务,我们有一个非常小的数据集,该数据集也与 ImageNet 的图像非常不同*,因此该项目的转移学习策略将是从网络中的某个更早的处的训练一个线性分类器。下一步就是找出哪一层*会带来最好的性能。**

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

Setup for the classification: use mid-level image embeddings from a pre-trained Deep Convolutional Network as input for a linear model

寻找最佳图层

根据上面的指导方针,我们知道我们需要从网络中的“更早的某个地方”选择一个层,但是我们如何知道哪一个层具有最好的结果呢?为了找到我们的集合分类任务的最佳层,我决定测试每一层并在验证集合上比较性能。实验设置如下。

对于深度卷积网络中的每个层* i 😗

  • 将纸牌的输入图像通过预先训练好的网络(进行预测),得到第一层的输出
  • 使用图层输出作为输入特征来训练逻辑回归模型。
  • 根据验证集评估模型。

验证精度最高的图层将用于最终模型。

我对不同数量的训练样本重复了这个实验,以观察训练数据量的影响。

resnet 50 的结果

ResNet50 模型【2】的 50 个卷积层中每一层的验证精度如下图所示。

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

我发现什么有趣:

  • 在网络的第一个卷积层(层 1 )之后,验证准确度与基线分数相当。例如,对于 8100 幅图像,验证准确率为 48.1%。这比基线(43.2%)有了小小的提高。
  • 当深入到网络中时,验证准确性会变得更好,但分数根本不会单调增加。存在高峰和深谷,在这些地方,不知何故,特征表示对于检测集卡不是最佳的。
  • 许多层使其达到 100%的验证准确性。最佳层位于网络的中层和高层。尽管满分看起来令人印象深刻,但我们需要考虑到验证集非常小(每个类只有一个样本)。即便如此,我认为良好的验证准确性可以为哪一层的性能最好提供一些指导。
  • 正如所料,用于训练的数据量对性能非常重要。增加样本数量可以提高性能,但某些层有例外。

比较不同深度卷积模型

我还比较了一些不同架构的性能:resnet 50【2】,MobileNet【3】MobileNet V2【4】

残差神经网络(ResNets) 微软的一个团队在 2015 年引入了深度残差学习,作为处理消失梯度的新方法,这是一个阻止非常深度的网络有效工作的问题。通过使用跳过连接*,来自先前层的激活可以被重用并提供基本性能,直到附加层得到改进。这使得在不影响性能的情况下增加层数成为可能[2]。
本实验使用的模型是 ResNet50,有 50 个卷积层。*

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

The ResNet50 uses skip connections (denoted by arrows) to jump over some layers. By reusing activations from earlier layers, it helps to fight the notorious vanishing gradients problem. This made it possible to create really deep networks.

MobileNet 架构 由谷歌开发的 MobileNet 架构经过优化,可以非常高效地在手机上运行。主要思想是使用不同类型的卷积,称为深度方向可分离卷积。它与常规卷积运算的结果大致相同,但速度要快得多[3]。
随着 MobileNetV2 的推出,最初的 MobileNet 架构通过应用残差学习(的一种变体)和许多其他创新得到了进一步改进【4】。

不同网络的验证结果 在下图中,针对 8100 个图像的数据集绘制了每个模型的结果。

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

Performance on the validation set for three different architectures. Note that the number of convolutional layers is different for each architecture.

我发现什么有趣:

  • 对于 ResNet50 架构,第 23 层的精度下降是一个有趣的异常现象。我真的不能解释是什么导致了它,但有趣的是它发生在第四阶段的开始。在每个阶段,过滤器的数量加倍。
  • 这两个 MobileNet 模型看起来更稳定,因为它们对后续层显示出更少的变化。MobileNet 模型稳步增长,在第 10 层表现出最高性能(92.6%)。当到达更高层时,性能逐渐下降。
  • MobileNet V2 性能最好的层是第 32 层,它具有 100%的验证分数。网络中较高层的性能较低。

在数据量相同的情况下,ResNet50 拥有最多具有完美验证分数的层,对于最终模型,我将使用该架构。如果你想为 SET 检测创建一个移动应用程序,我想 MobileNetV2 也是一个有趣的选择。

分类结果
经过一点调整以改进模型后,我发现最大的增益是通过调整增强设置brightness_rangefill_mode获得的。经过几次迭代后,该模型现在可以正确地对所有测试图像进行分类。

我知道在你看到测试集的结果后调整一个模型,它变得更像一个验证集,并且有过度拟合的风险,但是为了博客的目的,我想我可以接受。

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

Example of found contours, registered images and predictions from the best model for each card

3.查找集合组合

现在我们可以对卡片进行分类了,接下来是最后一步,找到所有可能的集合组合。

请记住,为了有一个集合,三张卡的每个属性需要有相同的值或者不同的值。一个简单的解决方案是考虑所有可能的三元组,并检查集合规则是否适用于三元组。对于 12 张卡,有 12 除以 3 = 220 个可能的三元组,检查所有的三元组不会花费太多的计算。**

首先,让我们将特征转换成数值。

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

“设定的诡计”

我发现有一个有趣的方法来确定一个三连音是否是一个集合。考虑以下两个三胞胎:

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

当您查看这些有效和无效集合的示例时,您会发现:

  • 对于有效集合,每个属性的值之和是三的倍数。
  • 对于无效集合,一些属性的值之和不是三的倍数。

这个规则适用于所有可能的组合,它使得我们的集合寻找算法相当优雅。

Finding SETs, by checking if the sum of the attributes mod 3 is zero

有限域

有趣的是,这个技巧不适用于任意的数字表示,但是只要我们选择模 3 不同的数字值,它就会起作用。

更深层次的原因是,模函数是一个有限域。字段是具有特定属性的数字集合,其行为有点像有理数或实数。基本的运算如加、减、乘、除都有定义,每个数都有乘法逆运算,这意味着如果你把它和那个逆运算相乘,你会得到 1。这也意味着设定的自然数不是一个字段。

因为模函数是一个有限域,所以它有一些特殊的性质,这些性质对于集合游戏是很重要的。

你可以把一张集合卡想象成一个四维空间中的一个点,其中每个特征都是一个不同的维度(颜色、形状、填充和数量)。例如,具有特征值绿色、正方形、虚线、两个的卡片可以表示为 4D 点 [1,0,2,1]。因为每个特征只能取三个值中的一个,我们可以定义集卡的空间是一个大小为 3 的有限域。【1】

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

Example for two features (2D space). All points that are co-linear are valid SET combinations

现在,可以表明对于有效集合,有限域内的点是共线的,这意味着这些点在一条线上。此外,如果点不是共线的,它不是一个有效的集合组合。

所以基本上,寻找集合的,其实就是在 4 维有限空间中寻找共线点![1]

将这一切结合在一起

当所有的事情都凑在一起,你真的看到你的模型做了你希望的事情时,会有这种令人满意的*(有时是叛逆的)*感觉。

通过结合纸牌的提取 、纸牌类型的分类集合检测算法,最终我们可以从一幅图像中找到集合组合!

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

Final result of finding SET combinations from an image

参考

用视网膜网探测足球运动员和球。

原文:https://towardsdatascience.com/detecting-soccer-palyers-and-ball-retinantet-2ab5f997ab2?source=collection_archive---------18-----------------------

用于体育运动的计算机视觉

直截了当的指南,建立一个计算机视觉模型,以检测球员和球在架空摄像机图像。

我们将使用 RetinaNet 模型,如宗-林逸普里亚戈亚尔罗斯·吉希克明凯·何彼得·多拉的论文中所述。

我们还将使用 Fizyr 对 keras-retinanet 的出色实现,将其应用于 Haizaha 的足球运动员和球检测免费数据集。

要求:

首先,确保安装了 TensorFlow 和 Keras。

如果您需要 GPU 支持,请遵循tensorflow.org上的说明。

接下来,您将需要克隆、构建和安装 keras-retinanet 项目。

数据

安装完所有依赖项后,下一步是下载标记为的图片。

预训练重量

我已经公开了我的训练重量。如果您想立即运行模型,以下是下载它们的方法。

进口

我们需要导入 TensorFlow、Keras、keras_retinanet,以及其他一些模块。

实用程序

  • 查看注释:

我们将使用下面的 view_annotations 函数来显示带有相关边界框注释的图像。

如果您运行以下命令:

您应该会得到如下图像:

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

Output of view_annotations()

  • 加载模型:

  • 用模型对图像进行检测

推论

既然我们已经创建了助手函数,我们需要做的就是调用它们来加载模型并在图像上运行它。

加载模型:

使用模型检测球员和球:

Run_detection 采用我们使用权重“pre-trained/resnet 50 _ CSV _ last _ inference . H5”创建的模型,并在“soccer/images/frame_0100.jpg”上运行该模型

您应该得到这样的结果:

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

Output of run_detection()

训练

要训练您的模型,您需要做的就是执行 train.py 脚本:

模型训练应该开始,您应该会看到类似这样的内容:

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

Screenshot: training progress in the terminal

监测培训进展

TensorBoard 提供了一个简洁的网络界面来监控你的模型学习。要运行它,您只需在终端中运行以下代码:

tensorboard --logdir logs/fit

您希望确保 logs/fit 指向

现在,您可以在浏览器上访问以下 URL:

http://you_ir_address:6006

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

Screenshot: TensorBoard

转换培训模式

训练完模型后,您需要将训练模型转换为推理模型,然后才能使用它来检测对象。

下面是如何将训练模型转换为推理模型:

运行新训练的模型

现在,您可以加载新训练的模型并再次运行检测:

您应该会从上面的代码中得到以下输出:

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

Output of run_detection() after re-training the model

优化:检测小物体具有挑战性

在过去的几年里,我们在物体探测任务上取得了令人印象深刻的进展。尽管如此,与检测大对象相比,今天的模型仍然难以检测图像中的小对象。

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

Small Objects Detection, on PapersWithCode.com

RetineNet 在第一阶段使用特征金字塔网络(FPN)来识别不同尺度上的对象。你可以使用不同的比例比例值来帮助网络更好地识别小物体。

您需要做的是为您的模型创建一个 config.ini :

[anchor_parameters] 
sizes   = 32 64 128 256 512 
strides = 8 16 32 64 128 
ratios  = 0.5 1 2 3 
scales  = .5 1.2 1.6

训练模型时,请确保包含配置文件:

python keras-retinanet/keras_retinanet/bin/train.py --config config.ini csv soccer/train.csv soccer/labels.csv --val-annotations soccer/valid.csv

项目存储库

这个项目的所有代码都可以在 GitHub 上免费获得:

[https://github.com/ramarlina/retinanet-player-ball-detection](https://github.com/ramarlina/retinanet-player-ball-detection)

检测时间序列数据中的平稳性

原文:https://towardsdatascience.com/detecting-stationarity-in-time-series-data-d29e0a21e638?source=collection_archive---------1-----------------------

平稳性是时间序列分析中的一个重要概念。关于这个话题的简明(但全面)介绍,以及让这个话题变得重要的原因,请看一下我之前关于这个话题的博客文章。无需重复太多,只需指出:

  1. 平稳性意味着一个时间序列的统计特性(或者说产生它的过程)不会随着时间而改变。
  2. 平稳性很重要,因为许多有用的分析工具、统计测试和模型都依赖于它。

因此,确定时间序列是否平稳的能力非常重要。这通常意味着能够以很高的概率确定一个序列是由一个平稳过程生成的,而不是在两个严格的选项之间做出决定。

在这篇简短的文章中,我将介绍几种方法来做到这一点。

形象化

平稳性检测的最基本方法依赖于绘制数据或其函数,并直观地确定它们是否呈现平稳(或非平稳)数据的某些已知属性。

在看数据

试图通过观察一个时间序列的图表来确定它是否是由一个平稳过程产生的是一个可疑的冒险。然而,我们可以寻找非平稳数据的一些基本属性。让我们以[hynd man&Athanasopoulos,2018 ]中的以下美好情节为例:

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

Figure 1: Nine examples of time series data; (a) Google stock price for 200 consecutive days; (b) Daily change in the Google stock price for 200 consecutive days; © Annual number of strikes in the US; (d) Monthly sales of new one-family houses sold in the US; (e) Annual price of a dozen eggs in the US (constant dollars); (f) Monthly total of pigs slaughtered in Victoria, Australia; (g) Annual total of lynx trapped in the McKenzie River district of north-west Canada; (h) Monthly Australian beer production; (i) Monthly Australian electricity production. [Hyndman & Athanasopoulos, 2018]

[Hyndman & Athanasopoulos,2018]给出了几种用于排除上述图中平稳性的试探法,对应于平稳过程的基本特征(,我们之前已经讨论过):

  • 在系列(d)、(h)和(I)中可以观察到显著的季节性。
  • 在系列(a)、©、(e)、(f)和(I)中可以看到明显的趋势和变化水平。
  • 系列(I)显示方差增加。

作者还补充说,尽管系列(g)中的强周期可能看起来使其不稳定,但这些周期的时间使其不可预测(由于潜在的动态主导猞猁种群,部分由可用饲料驱动)。这使得系列(b)和(g)成为唯一的固定系列。

如果你和我一样,在看上面的图时,没有发现这些观察中至少有一些是微不足道的,你不是唯一一个。事实上,这不是一个非常可靠的检测平稳性的方法,它通常用于获得数据的初步印象,而不是做出明确的断言。

查看自相关函数(ACF)图

自相关是信号与自身延迟副本或滞后的相关性,作为延迟的函数。当绘制增加滞后的 ACF 值时(称为相关图的图),对于平稳时间序列,这些值往往会迅速降为零(见图 1,右),而对于非平稳数据,降级会发生得更慢(见图 1,左)。

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

Figure 2: The ACF of the Google stock price (left; non-stationary), and of the daily changes in Google stock price (right; stationary).

或者,【 Nielsen,2006 】建议,绘制基于自相关和比例自协方差的相关图,并对其进行比较,提供了区分平稳和非平稳数据的更好方法。

参数测试

另一种更严格的方法,检测时间序列数据中的平稳性,是使用统计测试来检测特定类型的平稳性,即由生成随机过程的简单参数模型产生的平稳性详见我之前的帖子

我将在这里介绍最突出的测试。我还将为每个测试命名 Python 实现,假设我已经找到了。有关 R 实现,请参见 CRAN 任务视图:时间序列分析(此处也是)。

单位根检验

Dickey-Fuller 检验
Dickey-Fuller检验是第一个为检验零假设而开发的统计检验,假设给定时间序列的自回归模型中存在单位根,因此该过程不是平稳的。最初的测试处理简单的 lag-1 AR 模型的情况。该测试有三个版本,它们测试的单位根过程的模型不同;

  1. 单位根检验:∆yᵢ = δyᵢ₋₁ + uᵢ
  2. 有漂移的单位根检验:∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ
  3. 具有漂移和确定性时间趋势的单位根检验:
    ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

选择使用哪个版本—这可以显著影响测试的规模和功效—可以使用一系列有序测试的先验知识或结构化策略,从而发现最合适的版本。

开发了测试的扩展,以适应更复杂的模型和数据;这些包括增强的迪基-富勒(ADF) (使用任意阶的 ARp并支持时间趋势的建模)菲利普-佩伦检验(PP) (对未指定的自相关和异方差增加稳健性)和 ADF-GLS 检验(处理恒定和线性趋势的局部去趋势数据)。

Python 实现可以在 statsmodelsARCH 包中找到。

KPSS 测试
另一个针对单位根存在的著名测试是 KPSS 测试。[科维亚特科夫斯基等人,1992 年]与迪基-富勒检验家族相反,零假设假设围绕一个均值或线性趋势平稳,而另一个是单位根的存在。

测试基于线性回归,将序列分成三部分:确定性趋势( βt )、随机游走( rt )和平稳误差( εt ),回归方程为:

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

并且其中 u ~(0,σ)和都是 iid 。因此,零假设被表述为 H₀: σ =0 ,而备选项为 Hₐ: σ > 0 。通过分别设置 β=0 (在这种情况下 x 在均值 r₀附近是稳定的)或 β≠0 来确定零假设中的平稳性是围绕均值还是趋势。

KPSS 检验通常用于补充迪基-富勒型检验。我将在以后的文章中谈到如何解释这样的综合结果。

Python 实现可以在 statsmodelsARCH 包中找到。

Zivot 和 Andrews 测试 上述测试没有考虑到结构突变的可能性——涉及过程的平均值或其他参数变化的突然变化。假设断裂的时间是一个外生现象,Perron 表明,当静态选择为真且结构断裂被忽略时,拒绝单位根的能力下降。

[Zivot 和 Andrews,1992]提出了一个单位根检验,其中他们假设断点的确切时间是未知的。根据 Perron 对结构突变形式的描述,Zivot 和 Andrews 继续用三个模型来检验单位根:

  • 模式 A:允许一次性改变系列级别。
  • 模型 B:允许趋势函数斜率的一次性变化。
  • 模型 C:结合了系列趋势函数的水平和斜率的一次性变化。

因此,为了针对一次性结构突变的替代方案测试单位根,Zivot 和 Andrews 使用了以下与上述三个模型相对应的回归方程:[Waheed 等人,2006]

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

Python 实现可以在 ARCH 包和这里中找到。

半参数单位根检验

方差比检验
【Breit ung,2002】提出了一种基于方差比统计的单位根存在性的非参数检验。零假设是过程 I(1)(一阶积分),而备选项是 I(0)。我将这个测试列为半参数测试,因为它测试的是一个特定的、基于模型的平稳性概念。

非参数检验

由于参数检验的局限性,以及人们认识到它们只涵盖真实数据中可能遇到的情况的一个狭窄的子类,一类针对平稳性的非参数检验在时间序列分析文献中出现了。

自然,这些测试为调查时间序列数据开辟了一条有希望的途径:你不再需要假设非常简单的参数模型碰巧适用于你的数据,以确定它是否是平稳的,或者冒着发现这些模型没有捕捉到的现象的复杂形式的风险。

然而,它的现实要复杂得多;目前,还没有任何广泛适用的非参数测试来涵盖生成时间序列数据的所有真实场景。相反,这些测试仅限于特定类型的数据或流程。此外,我无法找到以下任何测试的实现。

我将在这里提到我遇到的几个例子:

连续时间马尔可夫过程平稳性的非参数检验

[ Kanaya,2011 ]建议对单变量 时齐马尔可夫过程进行这种非参数平稳性检验,构造基于核的检验统计量并进行蒙特卡罗模拟,以研究该检验的有限样本容量和功效特性。

函数时间序列平稳性的非参数检验

[Delft et al,2017]提出了一种非参数平稳性检验,仅限于函数时间序列——通过将一个连续的*(在自然界中)时间记录分成自然的连续间隔(例如天数)获得的数据。请注意,[Delft 和 Eichler,2018]已经提出了对函数时间序列的局部平稳性的测试(参见我以前的帖子中关于局部平稳性的一些参考)。此外,[Vogt & Dette,2015]提出了一种非参数方法来估计局部平稳框架中的平滑变化点。*

基于局部傅立叶分析的平稳性非参数检验

[ Basu 等人,2009 ]提出了最适用于平稳性的非参数检验,因为它适用于任何零均值离散时间随机过程(我在这里假设离散过程的任何有限样本都可以很容易地转换为零均值)。

最后的话

就是这样。我希望上面的评论能让你对如何检测数据中的平稳性有所了解。我也希望它能让你了解这项任务的复杂性;由于缺乏对少数非参数检验的实现,你将被迫对你的数据做出强有力的假设,并以必要的怀疑来解释你得到的结果。

至于一旦在数据中检测到某种类型的平稳性,该怎么办的问题,我希望在以后的文章中涉及到这个问题。像往常一样,我喜欢听我错过或做错的事情。干杯!

参考

学术文献

  • Basu,p .,Rudoy,d .,和 Wolfe,P. J. (2009 年 4 月)。基于局部傅立叶分析的平稳性非参数检验。在 2009 年 IEEE 国际声学、语音和信号处理会议(第 3005–3008 页)。IEEE。
  • j . Breit ung(2002 年)。单位根和协整的非参数检验计量经济学杂志,108(2),343–363。
  • Cardinali 和 g . p . Nason(2018 年)。二阶平稳性的实用有效小波包测试。应用和计算谐波分析44 (3),558–583。
  • Hyndman,R. J .,& Athanasopoulos,G. (2018 年)。预测:原理与实践。OTexts。
  • Kanaya,S. (2011 年)。连续&时间马尔可夫过程平稳性的非参数检验。牛津大学就业市场论文。
  • 科维亚特科夫斯基,菲利普,施米特,和申(1992)。用单位根检验平稳性的零假设:我们有多确定经济时间序列有单位根?计量经济学杂志54(1–3),159–178。
  • 尼尔森,B. (2006 年)。非平稳自回归的相关图。英国皇家统计学会杂志:B 辑(统计方法论)68 (4),707–720。
  • m .瓦希德、t .阿拉姆和 S. P .加利(2006 年)。结构突变和单位根:来自巴基斯坦宏观经济时间序列的证据。可从 SSRN 963958 处获得。
  • 范·代尔夫特(2017 年)。函数时间序列平稳性的非参数检验。 arXiv 预印本 arXiv:1708.05248
  • 范·代尔夫特和艾希勒(2018)。"局部平稳函数时间序列."电子统计杂志,12:107–170。
  • Vogt,m .,& Dette,H. (2015 年)。检测局部平稳过程中的渐变。统计年鉴43 (2),713–740。
  • Zivot,e .和 D. Andrews,(1992),大崩盘的进一步证据,石油价格冲击和单位根假说,商业和经济统计杂志, 10,251–270。

在线参考

用拓扑数据分析检测股市崩盘

原文:https://towardsdatascience.com/detecting-stock-market-crashes-with-topological-data-analysis-7d5dd98abe42?source=collection_archive---------7-----------------------

由 Wallyson Lemes De Oliveira、 Lewis Tunstall 、Umberto Lupo 和 Anibal Medina-Mardones 撰写

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

只要有金融市场,就会有金融崩溃。当市场下跌时,大多数人都会遭受损失……那些能够预见到下跌的人可以保护他们的资产,或者持有高风险的空头头寸来获利(这种情况尽管令人紧张,正如的大空头中所描述的那样)。

市场上的资产与一个动态系统相关联,其价格随可用信息的变化而变化。金融市场上的资产价格是由广泛的信息决定的,在有效市场假说中,信息的一个简单变化将立即被定价。

金融系统的动态可以与物理系统的动态相媲美

就像固体、液体和气体之间发生相变一样,我们可以区分市场上的正常状态和混乱状态。

观察显示,金融崩溃之前会有一段资产价格波动加剧的时期【1】。这种现象转化为时间序列几何结构的异常变化。

在这篇文章中,我们使用拓扑数据分析(TDA)来捕捉时间序列中的这些几何变化,以便为股市崩盘提供一个可靠的检测器。代码实现了吉迪亚和卡茨给出的想法,这要归功于乔托-TDA 一个用于拓扑数据分析的开源库。

对于金融崩溃的确切定义,人们几乎没有共识

直觉上,股市崩盘是资产价格的快速下跌。价格下跌是由大规模出售资产引起的,这是在价格进一步下跌之前试图平仓。

意识到一个巨大的投机泡沫(就像次贷危机),或者一个灾难性的事件,将会导致市场崩溃。在过去二十年里,我们目睹了两次大崩盘:2000 年的互联网崩盘和 2008 年的全球金融危机。

我们的结果一言以蔽之

我们分析了从 1980 年至今标准普尔 500 指数的每日价格。S&P 是一个常用来衡量金融市场状况的指数,它衡量 500 家大型美国公司的股票表现。

与简单的基线相比,我们发现拓扑信号往往对噪声具有鲁棒性,因此不容易产生假阳性。

这突出了 TDA 背后的一个关键动机,即拓扑和几何可以提供一个强大的方法来抽象复杂数据中的微妙结构。

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

Detection of stock market crashes from baseline (left) and topological (right) models, discussed in detail below.

让我们更详细地描述这两种方法。

一个简单的基线

鉴于市场崩盘代表股价的突然下跌,检测这些变化的一个简单方法是跟踪滚动窗口内平均价格值的一阶导数。事实上,在下图中,我们可以看到这种天真的方法已经捕捉到了黑色星期一崩盘(1987 年)、网络泡沫破裂(2000-2004 年)和金融危机(2007-2008 年)。

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

Magnitude of the first derivative of mean close prices between successive windows.

通过归一化这个时间序列,取[0,1]区间内的值,我们可以应用一个阈值来标记原始时间序列上发生崩溃的点。

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

Crash probability for baseline model (left), with points above threshold shown on original time series (right).

显然,这种简单的方法相当嘈杂。

随着许多点被贴上崩溃的标签,遵循这个建议将导致过度恐慌和过早出售你的资产。让我们看看 TDA 是否能帮助我们降低信号中的噪声,并获得一个更强大的检测器!

TDA 管道

TDA 背后的数学很深奥,不在本文讨论范围内——我们建议这个概述。出于我们的目的,将 TDA 视为提取可用于下游建模的信息特征的手段就足够了。

我们开发的流水线包括:2)将时间序列嵌入到点云中,并构建点云的滑动窗口,3)在每个窗口上构建过滤,以具有编码每个窗口的几何形状的进化结构,4)使用持久性同源性提取那些窗口的相关特征,5)通过测量这些特征从一个窗口到下一个窗口的差异来比较每个窗口,6)基于该差异构建碰撞指示器。

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

TDA pipeline

时间序列作为点云— Takens 嵌入

TDA 流水线的典型起点是从点云生成单纯复形。因此,时间序列应用中的关键问题是如何生成这样的点云?离散时间序列,就像我们正在考虑的,通常被可视化为二维散点图。这种表示使得通过从左到右扫描图来跟踪时间序列的 局部 行为变得容易。但是在传达可能在更大的时间尺度上发生的重要影响时,它常常是无效的。

一组众所周知的捕捉周期行为的技术来自傅立叶分析。例如,时间序列上的时间窗口的离散傅立叶变换给出了关于该窗口中的信号是否作为几个简单周期信号的总和出现的信息。

为了我们的目的,我们考虑一种不同的编码时间演化过程的方式。它基于动力学的一些关键性质可以在更高维度中被有效地揭示的想法。我们首先说明一种将单变量时间序列表示为 点云 的方式,即任意维度的欧几里德空间中的一组向量。

过程如下:我们选择两个整数 dτ 。对于每一次 tᵢ ∈ (t₀,t₁…),我们收集变量 yd 不同时间的值,以 τ 均匀间隔,从 tᵢ 开始,将它们表示为具有 d 条目的向量,即:

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

结果就是一组 d 维空间的向量! τ 称为延时参数, d 为嵌入尺寸。

这种延时嵌入技术也称为塔肯斯嵌入,以芙罗莉丝·塔肯斯命名,他用一个著名的定理非线性 动力系统的背景下证明了它的重要性。

最后,在整个时间序列上对滑动窗口分别应用该程序,得到一个具有可能有趣拓扑的点云时间序列(每个滑动窗口一个)。下面的 GIF 显示了这样的点云是如何在二维空间中生成的。

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

Illustration of the Taken’s embedding with embedding dimension d=2 and time delay *τ=*1

从点云到暂留图

现在我们知道了如何生成时间序列的点云,我们可以用这些信息做什么呢?输入持久同调,它在单纯复形中寻找在某个参数值范围内持续存在的拓扑特征。通常,某个特征(如孔)最初不会被观察到,然后会出现,在某个参数值范围后会再次消失。

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

Point clouds from two successive windows and their associated persistence diagram

持久图之间的距离

给定两个窗口及其对应的持久性图,我们可以计算各种距离度量。在这里,我们比较了两个距离,一个基于持久性景观的概念,另一个基于贝蒂曲线。

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

Magnitude of the landscape (left) and Betti curve (right) distances between successive windows.

从这些图中,我们可以推断,基于景观距离的度量比 Betti 曲线的噪声小。

一个拓扑指示器

使用窗口之间的景观距离作为我们的拓扑特征,就像我们对基线模型所做的那样,对其进行归一化是一件简单的事情。下面我们展示了网络泡沫和全球金融危机导致的股市崩溃的检测结果。与我们的简单基线相比,我们可以看到,使用拓扑特征似乎可以降低目标信号中的噪声。

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

Crash probabilities and detections using topological features. The time ranges correspond to the dot-com bubble in 2000 (upper) and the global financial crisis in 2008 (lower).

结论

我们的结果表明,崩盘前的高波动期会产生几何特征,使用拓扑数据分析可以更有力地检测到这些特征。然而,这些结果只涉及一个特定的市场和一段很短的时间,所以人们应该进一步调查该程序对不同市场和不同阈值的稳健性。然而,结果是令人鼓舞的,并为未来的发展打开了一些有趣的思路。

更多带代码的文章:

图形嵌入

时间序列

可视化

持久性

乔托

使用异常检测技术检测机器故障的开始

原文:https://towardsdatascience.com/detecting-the-onset-of-machine-failure-using-anomaly-detection-techniques-d2f7a11eb809?source=collection_archive---------10-----------------------

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

Source: mc.ai

介绍

影响产品质量的因素很多,但并非所有这些因素都在制造商的控制之下。质量问题最常见的来源之一是没有得到适当维护的故障设备。因此,监控机器和部件(如冷却风扇、轴承、涡轮机、齿轮、皮带)的状态并保持理想的工作状态变得非常重要。

当机器或部件出现故障时,执行纠正性维护,以确定故障原因,并确定维护和重新启动机器至正常工作状态所需的维修程序。然而,因为机器已经在没有任何预先警告的情况下发生故障,所以需要时间来采购和修理故障部件。因此,需要考虑一种维护策略来最大限度地减少服务停机时间。但是机器和它们的部件会随着时间而退化,并且故障的时间是无法提前知道的。因此,基于时间的维护策略主要用于维护机器和设备的状态。

在这篇文章中,我将讨论各种可以用来检测机器中发生的故障的技术。

异常检测

在一个教室里,总有一些学生要么比其他学生表现得更好,要么在确保科目分数方面甚至以最低分数不及格。大多数时候,学生的分数除了刚才提到的,一般都是正态分布的。这些标记可以分别称为极端高点和极端低点。在统计学和机器学习等其他相关领域,这些值被称为异常值或异常值。

异常检测(或异常值检测)是对罕见项目、事件或观察结果的识别,这些项目、事件或观察结果因与大多数数据显著不同而引起怀疑。通常,异常数据可能与某种问题或罕见事件有关,例如银行欺诈、医疗问题、结构缺陷、设备故障等。这种联系使得挑选出哪些数据点可以被视为异常变得非常有趣,因为从业务角度来看,识别这些事件通常非常有趣。

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

Anomaly Detection

这引发了一个问题:我们如何识别数据是正常的还是异常的?有各种技术可以帮助我们识别这一点。

异常检测技术

存在许多异常检测方法。其中一些方法的粗略分组包括统计算法、基于聚类的方法、基于最近邻的方法、基于分类的方法、基于频谱的方法、基于空间二次采样的方法和深度学习方法。

基于统计的方法

基于统计的方法假设数据遵循特定的分布,因此模型是根据指定的概率分布创建的。检测数据异常的最简单方法是标记偏离分布共同统计特性的数据点。例如,可以根据偏离平均值的某个标准偏差来定义异常。这些模型的优点是它们输出一个概率作为离群值的度量。

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

Statistical based methods

基于聚类的方法

在基于聚类的异常检测中,假设相似的数据点属于相似的组。这由到群集质心的距离决定。然后通过为聚类的大小或到聚类质心的距离设置阈值来计算异常分数;如果聚类具有小于阈值的数据点,则它们被标记为异常,或者如果数据点到聚类中心的距离超过设置的阈值,则它被标记为异常。k 均值聚类就是这种方法的一个例子。

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

Clustering-based method (K Means Clustering)

基于最近邻的方法

基于最近邻的异常检测通常假设正常数据样本出现在看似密集的邻域中,而异常数据样本远离它们最近的邻居。最近邻方法通常可以分为基于距离的方法和基于密度的方法。这两种方法都需要相似性或距离度量来决定数据实例的异常程度。一些例子包括 k-NN、马氏距离和局部异常因子(LOF)。

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

Nearest Neighbor method (KNN)

基于分类的方法

根据标签的可用性,基于分类的异常检测可以分为单类(仅正常标签)和多类(多类)分类。基于分类器的异常检测包括两个步骤:

  1. 在训练阶段,使用可用的标记训练数据来学习分类器。
  2. 然后,使用在初始步骤中训练的分类器将测试实例分类为正常或异常。

单类支持向量机(OCSVM)和神经网络方法是这种检测方法的例子。

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

Classification based method (One class SVM)

基于频谱或子空间的方法

基于谱或子空间的方法试图提取最能描述训练数据可变性的特征。这些方法假设正常数据可以表示在一个低维子空间中,在这个子空间中正常数据与异常数据是有区别的。主成分分析(PCA)被认为是一种基于子空间的异常检测方法。

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

Subspace based method (PCA)

基于子采样的方法

许多离群点检测方法遭受维数灾难;随着给定数据集维度的增加,基于距离的方法会失败,因为任何一对点之间的相对距离都会变得相对相同。为了克服这个问题,基于子采样的方法将高维空间划分成更小的子空间,并且监视不同子空间中的异常值排序。离群点是在较小的子空间中始终排名较高的点。隔离森林是一种算法,它将高维空间划分为更小的维度,并尝试在低维空间中发现异常。

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

Subsampling based methods (Isolation forest)

高斯分布方法

高斯分布也称为正态分布。我们将使用高斯分布来开发异常检测算法,也就是说,我们将假设我们的数据是正态分布的。这是一个假设,不能适用于所有的数据集,但当它适用时,它证明了一个发现异常值的有效方法。

椭圆包络是一种方法,通过假设我们的整个数据是基础多元高斯分布的表达式,试图找出我们数据的总体分布的关键参数。

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

Gaussian based methods (Elliptic Envelope)

履行

我已经从 Numenta 异常基准(NAB)下载了数据集。NAB 是评估流实时应用中异常检测算法的新基准。具体来说,我将使用环境温度数据集,该数据集包含来自办公室环境的实时观测数据。

该数据集包含从 2013 年 12 月 2 日到 2014 年 2 月 19 日间隔 5 秒的 22695 次观测。数据集不包含空值。建筑物的温度是华氏温度,后来被转换成摄氏温度。

以下是一段时间内温度读数的图形表示。

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

Temperature Distribution

特征工程

我对数据集进行了特征工程,这将有助于建立一个更好的模型。

  1. 一天分为白天和晚上,这对于确定故障是发生在白天还是晚上非常有用。

白天—早上 7 点到晚上 10 点

夜间——晚上 10.01 到早上 6.59

2.一周分为工作日或周末,如果故障发生在大多数员工在办公室(工作日)或其他时间,这将是有用的信息。

3.四个不同的类别将观察结果分为“工作日夜晚”、“工作日光亮”、“周末光亮”、“周末夜晚”

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

正如我们所见,工作日白天的温度更加稳定。

模型

k 表示聚类

k-均值聚类旨在将 n 个观测值划分为 k 个簇,其中每个观测值属于具有最近均值的簇,作为该簇的原型。这里 k 是一个超参数,使用弯头方法选择。

用肘法,k 被发现是 15。然后,数据被分成 15 个不同的组,如图所示。

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

K means clustering with k=15

下一步是得到每个点和它最近的质心之间的距离。最大的距离被认为是异常的。下面是聚类视图中异常的可视化表示。

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

Anomalies (Red color) and normal readings (Blue color)

我们可以清楚地看到,K 表示聚类能够成功地将异常(红色)与正常(蓝色)区分开来。异常也可以随着时间的推移而可视化。

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

Anomalies visualized throughout time (K Means)

异常也可以通过温度再分配来可视化。

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

Anomaly detection using temperature repartitioning (K Means)

使用 K 均值聚类的一个缺点是,它会将记录末尾附近的低温检测为异常,但不会检测高温附近的异常。

隔离森林

使用隔离林方法检测到以下异常。

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

Anomalies visualized throughout time (Isolation Forest)

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

Anomaly detection using temperature repartitioning (Isolation Forest)

一等 SVM

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

Anomalies visualized throughout time (One Class SVM)

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

Anomaly detection using temperature repartitioning (One Class SVM)

椭圆形信封

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

Anomalies visualized throughout time (Elliptic Envelope)

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

Anomaly detection using temperature repartitioning (Elliptic Envelope)

结果

一类 SVM 在所有算法中表现最好,能够发现高温和低温范围内的异常。

博客的代码可以在这里找到。

参考

[## 如何使用机器学习进行异常检测和状态监控

在这篇文章中,我将介绍机器学习和统计的一些不同的技术和应用…

towardsdatascience.com](/how-to-use-machine-learning-for-anomaly-detection-and-condition-monitoring-6742f82900d7) [## sklearn .协方差. elliptic envelope-sci kit-learn 0 . 21 . 2 文档

如果为真,则计算稳健位置和协方差估计的支持,并且重新计算协方差估计…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.covariance.EllipticEnvelope.html) [## Python 中的异常检测技术

DBSCAN、隔离森林、局部异常因子、椭圆包络和一类 SVM

medium.com](https://medium.com/learningdatascience/anomaly-detection-techniques-in-python-50f650c75aaf) [## Scikit-Learn 中的异常检测

所有 AD 的核心是你想为正常点拟合一个生成分布或决策边界,然后…

sdsawtelle.github.io](http://sdsawtelle.github.io/blog/output/week9-anomaly-andrew-ng-machine-learning-with-python.html?source=post_page---------------------------)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值