不需要面包的AI

关于我们如何逐步构建AI的文章。阅读时间超过10分钟。







引言。一家以低成本开发为核心概念的计算机视觉初创公司。该团队非常符合以下精神:3至5不同级别和方向开发人员的学生,具体取决于工作日和工作时间(从0.25到1.25)。我玩标签的经验在这里非常有用。



简要介绍产品(PC +软件)-一种智能视频监控系统,该系统连接到局域网并自行产生视频处理。两个先决条件:具有不同权限的用户界面的存在和算法的最大自治权。



在技​​术方面,对硬件没有任何限制,主要是它运行良好。但与财务人。对于一切的一切〜$ 500。当然,只有新的和现代的组件。他们的选择不是很好,但是有!



我们决定先使用硬件,然后再选择软件。出于某种原因,选择基于使用docker的微服务架构。



功能的开发从简单且必要(使用流和视频文件)到复杂的定期检查。我们组装了MVP,几个优化冲刺明显地使我们更接近了我们的目标-同时完成所有4个点,而不是分别完成:



  1. 16个以上IP摄像机(FHD / 25fps)实时,事件或时间回放和录制
  2. 所有可用CV算法的并行操作
  3. 用户无需中断即可密集使用界面-观看视频流
  4. CPU负载小于90%,一切正常(!)


关于堆栈的一些选择落在了C / C +,Python + TensorFlow,PHP,NodeJS,TypeScript,VueJS,PostgreSQL + Socket.io和其他一些小东西上。



故意隐藏了已实现的功能,以便更详细地介绍CV领域中最有趣,最令人愉悦的功能,在某种程度上还包括ML。



“唯一用户”



一个使用示例是收集每个特定访客的访问历史,并且即使我们不知道员工是雇员(例如,购物中心),也应单独考虑员工。

看来这个问题已经解决了100,500多次,电话和其他任何东西都可以识别面部并记住它们,将它们发送到某个地方,然后保存它们。但是95%的解决方案都在ACS中使用,试图使用户自己被识别出来,他站在5MP相机前面,距离30-50厘米,持续了几秒钟,直到他的脸与数据库中的一张或几张脸进行检查。



对我们而言,这样的条件是一种奢侈。用户不固定地移动,看着智能手机离天花板上的摄像头足够远。此外,相机本身也带来了困难,最常见的是预算相机(具有1.3-2MP)和某种难以理解的色彩渲染,总是不同的。



通过为安装摄像机的条件制定技术规范,可以部分解决此问题,但总的来说,系统应该能够在这种条件下识别(当然,更糟)。



解决方法:将任务分解为2个任务+数据库结构。



短期记忆



一项单独的服务(主要是实时过程)在输入处是来自相机的帧(实际上是另一项服务),在输出处是-具有规范化512维X矢量(face-id)和一些元数据的http请求,例如时间戳。

在其内部,在逻辑和优化领域有许多有趣的解决方案,仅此而已;现在一切...



长期记忆



一项单独的服务,对实时性的要求不是很严格,但在某些情况下很重要(例如,停靠站中的人员)。通常,我们将自己的处理时间限制为3秒。

在服务的入口处-带有512维矢量的短期记忆中的http;在出口处-访客ID。



最初的想法很明显,解决问题的方法很简单:http→进入数据库,取→→与http填充相比,如果有,则为;如果没有,那么新的。

这种解决方案的优点是无数的,但只有一个缺点-它是行不通的。



尽管我们遵循了武士的道路,尝试了各种方法,并定期查看Internet,但问题仍得以解决。总的来说,这个决定是中度的。这个概念非常简单,并且基于聚类:



  1. 每个向量(一个向量)将属于某个用户;每个群集(不超过M个向量,开箱即用M = 30)都属于某个用户。一个向量是否属于聚类A并不是事实。群集中的向量定义群集的交互,而User中的向量仅定义用户的历史记录。
  2. 每个簇将具有一个质心(实际上是一个A向量)及其与其他矢量或簇的相互作用的半径(以下称为范围)。
  3. 重心和范围将是一个簇函数,而不是静态的。
  4. 向量的接近度由平方的欧几里得距离确定(在特殊情况下,否则)。尽管这里还有其他一些不错的方法,但我们只是在这里停了下来。


注意:由于 我们使用归一化向量,它们之间的距离保证为0到2。接下来,介绍实现该概念的算法。



#1犯罪嫌疑人圈子。重心作为哈希函数



从短期内存获得的X向量与数据库中可用于邻近,远距离的簇质心(A向量)进行比较,其中范围[X,A]> 1-被丢弃。如果没有人,则创建一个新集群。



接下来,在X向量和所有其余的a向量之间寻找最小值(min_range [X,a])



#2集群的唯一属性。自我调节实体



计算聚类自身的range_A,其向量最接近X向量。在这里,我们使用这个簇中已经存在的向量数量(N)的反线性函数(const *(1-N / 2M));开箱即用const = 0.67)。



#3验证和误解。如果不是某人-那么谁!



如果range_A> min_range [X,a],则将X向量标记为属于A群集。如果不是,那么……呵呵……这有点类似于对数学模型的描述的误解。

我们决定在这种情况下,我们将创建一个新的群集,从而故意犯第一种“丢失目标”的错误。



#4附加培训。数字如何形成符号



主观经验是数据成为工具的时候。我们较早识别,但可能有错误。我应该信任X向量在下一场比赛中使用它吗?检查!X向量必须:



  • 距质心A足够近(range_A>范围[X,A])
  • 它是有用且多样化的,因为一方面,我们使错误的风险降到最低,另一方面,我们也不需要副本(Config_Max [0.35]>范围[X,a]> Config_Max [0.125])。因此,配置确定“学习​​”的速度和正确性。


满足这些条件后,X向量将落入群集A中(之前它仅属于用户)。如果聚类中有更多向量,则我们删除最中心的向量(min_range [A,a])-它引入的变异最少,只是其他向量的函数;此外,质心已经参与匹配。



#5处理错误。我们把劣势变成优势



在每个困难的选择中,我们都朝着“缺少目标”错误迈出了一步-我们创建了一个新的集群和用户。是时候重新审视他们了……全部。在#4之后,我们有一个经过修改的簇A。接下来,我们重新计算其质心(A矢量),并在512维空间中寻找到所有可用质心的最小距离。在这种情况下,距离被认为更困难,但现在并不那么重要。当min_range [A,B]的距离小于某个值(即开箱即用range_unity = 0.25)时,我们将合并两个集合,计算一个新的质心,如果其中有太多的“有用”向量,则将它们去除。

换句话说:如果实际上有2个以上的集群属于同一个用户,那么在进行一系列检测之后,它们将变得紧密并与它们的故事合并为一个。



#6组合功能。当汽车...想到!?



值得在本文中定义一个新术语。幻像向量是不是由于短期记忆活动而获得的向量,而是由于群集的N个向量(a1,a2,a3,a4 ...)上的函数而获得的向量。当然,以这种方式获得的向量是分别存储和说明的,在匹配结果被确定为最接近的向量之前,它们不表示任何值(请参见#3)。幻象向量的主要好处是可以加快群集的早期学习



该系统已经投入生产。结果是在5000个用户的测试环境之外的真实数据上获得的;在那里也注意到了一堆“弱点”,这些弱点在本文中得到了加强和考虑。



有趣的是,这种方法没有用户设置,并且所有工作都不受任何方式控制,一切都是完全自主的此外,时间序列分析允许您以类似方式将“用户”分类为不同的类别,从而建立关联。这是解决问题的方式-谁是雇员,谁是访客。



系统用户的角色很简单-您需要定期检查邮件或系统界面以获取新的活动报告。



结果



对于中度训练的群集(包含6-15个a矢量),基于长期记忆的识别接近值约为0.12-0.25。此外,由于``向量复制''的可能性增加,学习速度变慢,但是从长远来看,当聚类已经包含20+个a-向量时,接近度趋向于〜0.04-0.12的值。请注意,在短期记忆中,从一帧到另一帧,同一参数的值约为0.5-1.2,这听起来像是:“一个人2年前戴着眼镜比100ms之前看起来更像他自己。” 通过在长期记忆中使用聚类来打开此类机会



谜语



其中一项测试得出了一个有趣的发现。



初始条件:



  • 具有完全相同设置的完全相同的视频监视系统部署在两台完全相同的PC上。根据TOR,它们已连接到正确定位的单个IP摄像机。


法案:



  • 系统在同一时间启动,并在所有算法正常工作的情况下搁置一周。流量与正常流量匹配,没有变化。


结果:



  • 创建的用户,聚类和a向量的数量相同,但是质心不同,不是很大-而是不同。问题是为什么?谁知道-在评论中写下或在此处


很遗憾,我无法在此处写很多东西,但是也许我可以在另一篇文章中以相同的细节描述某些东西。也许所有这些内容都已经在一些出色的手册中进行了描述,但是令我遗憾的是,我从未找到任何手册。



总而言之,我要说的是,从内部观察一个自治的AI系统如何对周围的空间进行分类,并实现其中固有的各种功能,这是非常有趣的。由于积累的感知经验,人们没有注意到很多事情(第4步)。




我真的希望本文对他的项目中的任何人都有用。



All Articles