1
我们这个名为 Human-firewall 项目的项目的目的是引入一种智能对讲机,能够在消息应用程序上通过按门铃的人的照片通知您,并实时提供对个人的评估。
通过这种方式,您会立即知道您是否可以信任相关人员,如果此人不值得信任,您将避免让自己、您的积蓄和您的家面临危险。
注意:我们的目标不是创建一个完全成熟的对讲机,而是创建一个可以连接到现有对讲机的原型。
从现有的对讲机中,我将捕获门铃输入,这将触发相机拍摄对象的照片,使用这张照片和一些幕后魔术(剧透:这是机器学习)我将把对象评估发送到房主。
使用 LAN 上的常识评估对象
此时,您可能会问:“您如何评价按对讲机的人?”。
我们选择了同行评审的方法,每个房主都能够对在他家敲门的人进行分类,这样就建立了一种常识。
这些知识将在同一网络上存在的所有对讲机之间共享,例如,即使您的邻居来到您家门口,也能正确检测到已被您的邻居标记的骗子。
公寓作为我们的目标环境
我们的项目真正在公寓中大放异彩,那里有多个建筑物,每个建筑物都有自己的对讲机,并且有共享网络(无线或有线无关紧要)。
这也可以用于较小的环境,但这会导致更差的检测率和减少智能对讲机的常识。
我们想象这也可以被店主用来保护他们的生意。
硬件与服务
对于我们的智能对讲机演示,我们采用了 Raspberry Pi 3(使用 Raspbian 作为其操作系统)作为我们的参考板,但只要可以建立与本地网络的连接,较新的版本也不错。
连同电路板,我们使用了 Pi Camera 模块 V2,它提供了按铃对象的高清图像。
您还需要一切才能为电路板提供能量(谁会猜到?)和一个模拟用户在门铃上输入的按钮。
云服务?不,谢谢,人类防火墙项目不需要它们,一切都将通过专门使用 LAN 来工作,这样我们就可以为将要使用(但永远不会存储)的敏感数据提供最高级别的隐私。
我们的项目由三部分组成:
鉴于这三个子系统,我们有两种类型的板,主板和从板,但是,用户看不出主板和从板之间有任何区别。
所有的板子都应该在同一个 NATed WiFi/有线局域网中,不需要开放的互联网端口,除了机器人子系统使用的 Telegram 服务器的端口。
主控系统_
主板托管一个主子系统的实例,该子系统由一个 Web 服务器、一个 MQTT 代理组成,包含公寓的 Telegram 机器人,并使用从属子系统作为门铃。
Web 服务器用于与从站通信,并提供几个端点:
这些端点由从系统使用,因此需要在任何从系统之前初始化主系统。
奴隶制度
从板仅包含从子系统的一个实例。
从属子系统由一个 SQLite 数据库组成,用于维护用户的反馈和一个内存中的特征向量数据库,以及一个磁盘副本以支持重启,这是我们表示人脸的方式。
反馈数据库使用复合键,由以下组成:
使用此模式,即使在多个门铃和多个响铃事件中,一个用户也只能对响铃的人进行一次反馈,因此我们更新了用户对特定人给出的旧的且可能不正确的反馈,而不是添加到数据库更新的反馈。这样做是为了保持我们的分类有意义和可更新。
启动后,它将通过扫描网络定位标识端点来定位主控,然后,在找到主控后,它将启动恢复程序,检查其数据是否已更新并在必要时下载更新。
在找到主节点并更新数据库后,它将订阅 MQTT 代理以接收来自整个系统的新更新,并将等待本地环事件。
这个恢复过程在第一次初始化和灾难恢复的情况下都非常方便(例如,一个从属已经断电,可能以一个与主或其他从属相关的不同步的数据库结束)。
当本地响铃事件被拦截时(即当有人按从属门铃时),将捕获一张照片,并通过使用Dlib和face_recognition库定位人脸并将其编码为特征向量。然后,slave 询问它本地的反馈数据库,看看是否有针对那个人的任何反馈;然后照片、电路板 ID 和反馈通过环端点发送到主板。
如果在任何时候收到来自 MQTT 代理的消息,其内容将被添加到反馈和编码数据库中,从而增加董事会知识。
机器人子系统
机器人子系统仅托管在主板上,用于与用户交互、通知他们响铃事件以及收集和分发他们的反馈。
通知通过使用 Telegram API 发送到用户的 Telegram 帐户。
我们选择使用 Telegram 是因为这样做,我们可以轻松访问每个平台(iOS、Android、Windows、Mac、Linux),而无需实施我们自己的移动应用程序和服务器基础架构,同时用户不会他心爱的设备上又装了一个应用程序。
Telegram 机器人使用聊天 ID 来识别用户,并使用通过散列面板序列号获得的面板 ID 来识别门铃。
机器人由用户在指定它将接收通知的门铃 ID 时进行配置,为了更加用户友好的应用程序,我们让用户为配置的每个门铃指定一个名称,这比 ID 更容易记住.
这些配置设置保存在用户数据库中,我们在其中存储用户聊天 ID 和配置的门铃。
当响铃事件被通知到主板时,它会通知机器人子系统,机器人子系统将向每个配置了门铃的用户发送通知,其中包含照片和人的分类,根据可用反馈计算出多数票与相应的事件板 ID。
然后用户可以在他们的手机上看到事件,如果系统找到了人的脸,那么用户还可以看到人的分类,如果以前的反馈可用,并给出他们自己的分类。
当给出分类时,bot 子系统会将消息发布到 MQTT 队列中,所有从属都订阅了该队列,其中包含聊天 ID、我们用来识别人员的特征向量和用户给出的分类。
人脸识别库
dlib最先进的人脸识别库的接口,提供多种人脸定位算法和预训练的矢量化模型。
我们使用 HOG 模型 (O(#pixels)) 来定位人脸,而不是 dlib 的默认 CNN 模型,这是一种不太准确的模型,但CPU 密集度也较低。
为了计算编码,预训练模型基于 ResNet,一种深度 CNN
我们在欧几里得产品中使用 0.6 的阈值来检测两个编码是否指的是同一个人,规模有点高,但对于公寓来说是可以的。
蚊子和帕霍
我们选择Eclipse Mosquitto作为我们的代理,它是 MQTT 代理的开源实现。
Mosquitto 重量轻,适合在 CPU 时钟较低的设备上使用。
我们选择不持久存储消息,以免浪费磁盘空间。
我们选择的 MQTT 客户端是Eclipse Paho项目,它为多种编程语言(包括 Python)提供 MQTT 和 MQTT-SN 消息传递协议的开源客户端实现。
在 Raspberry Pi 3 上,dlib 的多进程执行会导致死锁,因此我们不得不使用以下变通方法强制在单线程上执行 dlib 库,该变通方法已包含在我们的设置脚本中:
export OPENBLAS_NUM_THREADS=1
export OPENBLAS_MAIN_FREE=1
烧瓶
Flask是基于 Werkzeug 和 Jinja 2 的 Python 微框架。
我们使用它来托管主板 Web 服务器,因为它是一个可扩展的框架,可以轻松地针对多种用途进行定制。
对于项目的基本需求,我们只选择了 Flask 核心模块和一些使我们的 Web 服务器轻量级和快速的基本扩展。
python电报机器人
为了在 bot 子系统中与 Telegram 的 API(通过 HTTP)交互,我们选择了一个名为python-telegram-bot的社区制作的包装器。
包装器实现了从发送消息到对话处理的广泛功能,同时防止出现同步问题。
它内存占用小,CPU 使用率低,因为它使用 webhook 来防止轮询 Telegram 的服务器。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !