1 智能对讲机开源设计-德赢Vwin官网 网
×

智能对讲机开源设计

消耗积分:5 | 格式:zip | 大小:0.00 MB | 2023-06-19

分享资料个

描述

 

我们这个名为 Human-firewall 项目的项目的目的是引入一种智能对讲机,能够在消息应用程序上通过按门铃的人的照片通知您,并实时提供对个人的评估。

通过这种方式,您会立即知道您是否可以信任相关人员,如果此人不值得信任,您将避免让自己、您的积蓄和您的家面临危险。

注意:我们的目标不是创建一个完全成熟的对讲机,而是创建一个可以连接到现有对讲机的原型。

从现有的对讲机中,我将捕获门铃输入,这将触发相机拍摄对象的照片,使用这张照片和一些幕后魔术(剧透:这是机器学习)我将把对象评估发送到房主。

使用 LAN 上的常识评估对象

此时,您可能会问:“您如何评价按对讲机的人?”。

我们选择了同行评审的方法,每个房主都能够对在他家敲门的人进行分类,这样就建立了一种常识。

这些知识将在同一网络上存在的所有对讲机之间共享,例如,即使您的邻居来到您家门口,也能正确检测到已被您的邻居标记的骗子。

公寓作为我们的目标环境

我们的项目真正在公寓中大放异彩,那里有多个建筑物,每个建筑物都有自己的对讲机,并且有共享网络(无线或有线无关紧要)。

 
poYBAGOSl22AKSHGAACxWAQrxyo162.jpg
 

这也可以用于较小的环境,但这会导致更差的检测率和减少智能对讲机的常识。

我们想象这也可以被店主用来保护他们的生意。

硬件与服务

对于我们的智能对讲机演示,我们采用了 Raspberry Pi 3(使用 Raspbian 作为其操作系统)作为我们的参考板,但只要可以建立与本地网络的连接,较新的版本也不错。

连同电路板,我们使用了 Pi Camera 模块 V2,它提供了按铃对象的高清图像。

您还需要一切才能为电路板提供能量(谁会猜到?)和一个模拟用户在门铃上输入的按钮。

云服务?不,谢谢,人类防火墙项目不需要它们,一切都将通过专门使用 LAN 来工作,这样我们就可以为将要使用(但永远不会存储)的敏感数据提供最高级别的隐私。

建筑学

 
pYYBAGOSl3CAdl6aAADNP8mwR7g364.png
架构的表示
 

我们的项目由三部分组成:

  • 从属子系统,用于捕获门铃输入拍照并与它们一起识别人。
  • 机器人子系统,托管公寓的电报机器人。
  • 主子系统,这是我们共享知识架构的焦点。

鉴于这三个子系统,我们有两种类型的板,主板和从板,但是,用户看不出主板和从板之间有任何区别。

所有的板子都应该在同一个 NATed WiFi/有线局域网中,不需要开放的互联网端口,除了机器人子系统使用的 Telegram 服务器的端口。

主控系统_

主板托管一个主子系统的实例,该子系统由一个 Web 服务器、一个 MQTT 代理组成,包含公寓的 Telegram 机器人,并使用从属子系统作为门铃。

Web 服务器用于与从站通信,并提供几个端点:

  • Identification endpoint: 使网络中新的slaves可以发现它正在扫描局域网。
  • Ring 端点:用于管理事件,当有人按响连接到网络的门铃时,master 会将照片和评估数据发送给 Telegram bot,允许它向用户通知事件并识别谁按铃。
  • 时间戳端点:当被询问时,它会给出数据库中的最后一个时间戳,让从属了解它们是否是最新的。
  • Recovery endpoints:允许slaves下载从给定时间戳到最后一个时间戳的反馈和识别数据。

这些端点由从系统使用,因此需要在任何从系统之前初始化主系统。

奴隶制度

从板仅包含从子系统的一个实例。

从属子系统由一个 SQLite 数据库组成,用于维护用户的反馈和一个内存中的特征向量数据库,以及一个磁盘副本以支持重启,这是我们表示人脸的方式。

反馈数据库使用复合键,由以下组成:

  • 特征向量,标识响铃的人,需要分类
  • 聊天 ID,用于识别提供反馈的人

使用此模式,即使在多个门铃和多个响铃事件中,一个用户也只能对响铃的人进行一次反馈,因此我们更新了用户对特定人给出的旧的且可能不正确的反馈,而不是添加到数据库更新的反馈。这样做是为了保持我们的分类有意义和可更新。

启动后,它将通过扫描网络定位标识端点来定位主控,然后,在找到主控后,它将启动恢复程序,检查其数据是否已更新并在必要时下载更新。

在找到主节点并更新数据库后,它将订阅 MQTT 代理以接收来自整个系统的新更新,并将等待本地环事件。

这个恢复过程在第一次初始化和灾难恢复的情况下都非常方便(例如,一个从属已经断电,可能以一个与主或其他从属相关的不同步的数据库结束)。

当本地响铃事件被拦截时(即当有人按从属门铃时),将捕获一张照片,并通过使用Dlibface_recognition库定位人脸并将其编码为特征向量。然后,slave 询问它本地的反馈数据库,看看是否有针对那个人的任何反馈;然后照片、电路板 ID 和反馈通过环端点发送到主板。

 
pYYBAGOSl3-AMVkRAAD5XIGmfMQ435.png
可视化门铃被触发时发生的情况
 

如果在任何时候收到来自 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 的服务器。

如何部署和测试

  • 部署应用程序:获取master_scripts
    中的代码并执行 install.py 以设置主板。它既可以在装有 Ubuntu 的笔记本电脑上运行,也可以在装有 Raspbian 操作系统的 Raspberry 上运行。该脚本会要求您提供电报 API 密钥。如果要添加一个或多个slave,可以使用slave_scripts中的代码来实现。在 Raspbian 上,服务也被添加到 systemd 并在启动时启动。

  • 在电报上设置电路板:
    启动机器人并提供 /configure 命令,以命名和添加电路板
  • 使用门铃:
    按下门铃上的按钮以接收通知并留下反馈,一旦给出反馈,系统将使用它进行未来预测。(为了让我们的代码生效,门铃必须连接到树莓派上的 3 号引脚。)
 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//www.hzfubeitong.com/m/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="https://m.elecfans.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'智能对讲机开源设计',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.hzfubeitong.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);