计算机视觉代替办公室通行证



今天,我将告诉您我们如何基于Vision面部识别服务在办公室中创建门禁系统。 首先,有一点背景。 与任何电子邮件服务一样,我们创建了一个反垃圾邮件系统。 这样的系统现在是在机器学习的基础上构建的,我们有一个强大的团队负责它。 哪里有机器学习,哪里就有计算机视觉。 因此,Vision服务自然而然地出现了。

与此同时,几年前,我们推出了Cloud,这是一种可靠的文件存储,具有地理分布于数据中心的功能,个人和公司均可使用。 随着时间的流逝,我们得到了一个“ Cloud for Business”,它不仅存储文件,而且还允许您订购虚拟机。 逐渐地,它变成了MCS-Mail.ru云解决方案,在其中Vision成为其中的一项服务。


我们的神经网络不仅能够识别人脸,而且还能识别各种物体,物体和场景 ,包括视觉 。 现在他们可以识别大约一万种类别,并且机器视觉有时比人类更有效。



这是我在2012年,2015年和2018年的女儿。 如果我不认识她,那么我可能不会立即理解她是同一个人。 而且神经网络能够匹配和理解。



在这里,女孩转身斜视着,男孩通常戴着帽子,脸上有阴影。 但与此同时,即使遇到如此困难的情况,神经网络仍能准确识别它们。 自然,公司内部开发的技术不得不在内部服务中寻求支持。

我们的内部网


我们的内部网称为sys。 这是一种社交网络(我们很少)。 在其中,员工可以上传各种活动的照片。



在活动中布置数百张照片时,很难在那找到自己。 因此,我们将机器视觉连接到这些相册,这些相册就在企业内部网上的一个位置中显示了描绘了我的照片。 在这里,系统在一个夏季公司聚会上看到了我。



神经网络即使在黄昏时也能认出我,照片中还有更多人。

会议架


后来我们制作了会议架。 我为iPad编写了软件,该软件安装在机架内,但总的来说,我是iOS开发人员,与计算机视觉无关,我只是以友好的方式提供帮助。



这个架子的本质是什么? 在整个活动(会议,会议,公司聚会或至少是生日)中,摄影师都会为您拍照。 它会不时地将累积的图像拖放到云中。 您可以随时前往柜台拍照,然后单击“查找我”按钮。 如果系统尚未成功索引索引,机架将立即显示捕获您的所有照片,或者说到目前为止尚未找到任何照片,并提示您输入电子邮件。 活动结束后,您将在邮件中收到指向云端文件夹的链接,其中包含您所处的所有照片。 这是视觉服务的应用程序之一。

门禁系统


自然,我不仅想使用这样的面部识别功能来搜索公司图像中的相貌,而且还要寻找更实用的东西。 例如,对于自动吞吐量系统。 在地板的每个入口处应用通行证不是很方便:您常常会忘记通行证,对于夏天穿轻便衣服的女孩来说,没有地方固定通行证。

因此,我们决定进行实验。 我们具备所有条件:我们不需要征求任何人的许可,这是一个反应迅速的行政部门,他叹了口气说:“好的。 连接相机。 只是不在门口。 门与消防安全有关。” 我们是:“那么。 我们将站在侧面。” 我们也有耐心的同事,他们遭受了我们的折磨。

建筑学


乍一看,访问系统的体系结构似乎非常简单:相机拍摄照片并将其发送给Vision,然后Vision打开门。 但是,当我们开始与同事一起绘画如何实际执行此操作时,我们得到了这样一个方案:



右边的块称为“相机”-这是悬挂在门上的模块。 它包括三个部分。 Raspberry Pi从USB摄像机接收视频,用FFmpeg编码,然后发送。 我们测试了几款价格合理的IP摄像机,每个人都有明显的延迟,大约为0.5 s。 而且由于我们在其他阶段会有延迟,因此当一个人出现时,注视着镜头,几秒钟没有任何反应,他已经想通过。 因此,我们尽可能地减少了延迟,事实证明带有USB摄像头的Raspberry Pi比许多商用IP摄像头要快。 连接到Raspberry的还有一个带有多色LED和一个squeaker的小型Arduino。 默认LED为红色。 当一个人出现并被识别时,绿色点亮。

因此,Raspberry Pi传输视频流,该视频流通过有线以太网进入服务器。 我们在每层都有一个服务器机房,其中有交换机,将电缆连接到员工办公桌的地方以及一个全职访问控制系统-访问控制和管理系统。

我们在服务器机房中放置了另一台Raspberry Pi,它可以实时接收视频流并通过OpenCV运行它。 为什么我们需要OpenCV? 我们需要确定图片中是否有面孔。 在照片中定义人的神经网络的工作时间更长,而且要持续不断地向其提供视频流太昂贵了。 因此,通过OpenCV,我们确定面部的存在,如果出现,则将其发送给Vision。 该服务回答它找不到该雇员,或者在HR数据库中发送该雇员标识符。 使用该员工标识符,我们转到与ACS关联的Intranet,它返回给我们通行证标识符。 此外,我们将此传递标识符扔到Arduino中,然后将其传递给ACS。 对于访问控制系统,这相当于申请通行证的人。 也就是说,我们不以任何方式更改ACS;它仍然记录员工的出入情况。

我们如何将我们的系统与ACS集成在一起? 在我们的办公室中,使用了Bolid C2000-2设备。



这是一个家庭访问控制系统。 您很可能可以通过485th接口连接到这些设备,但是我们是通过Wiegand协议连接的。



我们将充当代理的Arduino连接到门附近安装的密码读取器。



图为电源读取器的电源连接和两条数据线。 该垫用于更方便的连接。

Arduino通过USB从阅读器或Raspberry Pi接收通行证编号,并将其提供给ACS。 ACS甚至不知道通行证号码来自哪里。

维根


这是门禁系统的标准协议,大多数读者都支持。 该协议非常简单:两条数据线,一条零线和一条单位线。 将零线连接到地面后,读者便会了解到零的传输与单位相同。 也就是说,该协议没有标准化的时序,并且跳过编号很容易通过Arduino上的中断读取,很容易将其表示为数据序列。 由于记录需要某种时间安排,因此我将重点放在这些值上:



已经有一个现成的Arduino库。 她可以阅读不同的Wiegand格式,但是她的能力仅限于此。 而且我仍然必须传播。 因此,我编写了仅适用于Wiegand-26格式的库。 位数为26:跳过数的3个字节和2个奇偶校验位。 而且,在所有文档和文章中都写道,现代控制器很可能会忽略奇偶校验位,因此我很懒,不对它们进行计数,但始终发送零。 ACS通常会感知到这一点。

我们还有另一个问题:如果有人首先出现在镜头前,然后在不等待操作的情况下应用了通行证,则出现了比赛情况:通行证号码同时来自读者和识别。 ACS无法解决此问题,也没有让人们加入。 因此,我必须在库中添加一个包含4个代码的环形缓冲区。 无论代码来自哪里,都将它们放在缓冲区中,然后以0.5 s的超时时间将其传输到ACS。 从那以后,同事们不再抱怨他们不被允许。

试验台




第一个原型是由任何可怕的东西组装而成的。 树莓派(Raspberry Pi)挂在一个荒谬的架子上的盒子里,相机粘贴在双面胶带的上面。 Arduino挂在侧面熨平板上。 总的来说,我们爱的一切都是DIY。

当然,以这种形式不可能离开,必须布置精美。 我们与几位承包商进行了交谈,他们答应我们在中国订购样品,但是所有约定的最后期限都过去了,没人给我们任何东西。

定制产品有一个问题-所有解决方案都是高度专业化的,它们将专门为我们量身定制。 首先,我们变得依赖于供应商。 其次,结果是独特的电路设计具有很小的流通量,这意味着一件电路的成本会很高。 第三,生产时间足够长,如果复印失败,我们将无法在商店中快速购买替代品,我们将不得不等待下一次印刷运行,如果立即进行操作,剩余的副本将被撒在仓库中。

在所有潜在的合作伙伴让我们失望之后,我去了Vision的一位同事说:“ Volodya,让我在您的3D打印机上打印一个盒子,使它看起来更漂亮。” 他叹了口气说:“来吧。 该怎么办?”

相机V 1




在融合中,我画了这样的科学怪人怪物。 拐角处应该是带以太网电缆输入的Raspberry Pi。 侧面有电源。 “二楼”是一台照相机。 结果是一个很大的结构,我什至打印了一层薄的纸,以免浪费很多塑料。 它看起来很糟糕,而且挂起来更加尴尬。



另外,他们说,一位同事给我提供了这样的参考,我们希望这样做。 我回答说我做不到,但是决定设计另一座建筑物。



新盒的直径为11厘米,比CD小。 填充物的位置也是两层。 在打印了第一个版本后,我意识到将USB相机完全放在其原始包装中没有任何意义。 我仔细地拆解了它,结果发现它在前面板上有4个着陆孔。 我将这个面板和一个摄像头组合成一个带有高音扬声器和LED的通用组件。



首先,我们尝试通过gpio在Raspberry Pi上产生吱吱声。 结果非常糟糕。 因此,我们决定通过连接一个小的arduino(实际上是Iskra mini)(与squeaker和LED焊接在一起),并通过TTL直接将其连接到模块,从而使该功能与Raspberry Pi分开。

这是战斗中的样子:


我们将设备挂在地板上。 以这种形式,它的寿命足够长。 但是,并不是每次都发出尖叫声,发出漂亮的光芒,打开门。 但是,同事抱怨该LED太亮。 我不得不削弱它四次。

相机V 2


然后他们做出了这个选择:



它的灵感来自小米集线器的设计,周围有一个发光环。 看起来很漂亮。 视觉徽标由印有不同颜色塑料的单个零件制成。 这是模型:





这次我将squeker放在后墙上,将LED安装在周围的透明环上,并由透明的PLA印刷。 装饰几乎立即坍塌了,因为它最初只是在摩擦时才插入的,所以我不得不将其粘贴在胶水上。

相机问题


我们有想法在整个建筑中重复这一决定。 但是有一个问题:几乎所有楼层都有两个门,每个楼层都应该有两个摄像头,仅其中96个摄像头用于我们其中一个塔楼,现在正在积极开发第二个。 可以打印很多情况,但是看起来已经很复杂。 此外,设备中有很多组件,这意味着很多故障点。 如果我们将解决方案扩展到整个建筑物,我们将不断维护这些摄像机。 再次,快速更换的复杂性,因为每个摄像机都是一个设备。 并且您需要以一定的余量打印其中的许多内容,或者,如果发生某些情况,请立即运行,打印并收集新的内容。 我们意识到DIY解决方案很酷,但是您需要一些更方便的复制方法。 于是,想法便转移到了iPad上。

iPad


iPad具有多个优点。 首先是屏幕。 同事抱怨缺乏反馈,他们很适合并且不了解认可是否已经开始,要等待还是不等待。

其次,iOS具有内置的面部识别功能。 OpenCV执行的功能已传递给iPad。 屏幕上会显示一个框,人应该走得很远,以使脸部适合该框。 之后,系统开始自动识别它,您无需按任何键。

第三,iPad是大众产品。 如果失败,我们设置另一个。 尽管平板电脑本身的价格约为2万卢布,但仍比合作伙伴提供的定制相机便宜。 另外,更快,更可靠。

新架构




iPad接管了大多数功能。 在服务器机房中的Raspberry Pi上,实际上只有一个HTTP主机接受带有通行ID的GET请求。 他立即在Arduino中代理代码,而在ACS中代理她。

在第一个版本中,Raspberry Pi的负载非常大,因为OpenCV一直在对其进行开发。 不再可能将第二个摄像机连接到它;将没有足够的计算能力。 我们已经考虑过在这里放置一台诚实的计算机,该计算机可以从两个门解析4个线程。 但这并没有实现。 现在,在每个iPad上独立执行图像中的人脸搜索。 在十字架上,有两个Arduino,每个门一个。 这两块板均可使用出入通行证。 为什么使用出入境证很重要? 首先,当识别到人脸并且门打开时,读卡器上的绿灯亮起,同事知道您可以出去。 其次,ACS记录输入和输出。 分别模拟输入和输出,我们不会破坏ACS操作方案。

自然,设计师将自己吸引到一起,为我们绘制了漂亮的界面。 这就是我们办公室其中一层的外观:



与愿景合作


尽管MCS是一种商业产品,但业余爱好者也可以使用它。 该服务每月为每个人提供5000次免费交易,即每天166次。 因此,如果您符合限制,则可以申请您的家庭需求。 怎么办呢?

python examples/python/smarty.py \ -u "https://smarty.mail.ru/api/v1/persons/recognize ?oauth_provider=mcs&oauth_token=e50b000614a371ce 99c01a80a4558d8ed93b313737363830" \ -p friends1.jpg \ --meta '{"space":"1", "create_new":true}' \ -v 

拍摄照片,并将其与我们的访问令牌一起发送给Vision。 我们表明我们正在使用第一个空格并设置create_new然后系统将为每个陌生人创建一个新标识符。 这是我们的回应:

 { "status":200, "body":{ "objects": [ { "status":0, "name":"file_0", "persons":[ {"tag":"person1","coord":[102,30,184,134],"confidence":0.99999,"awesomeness":0.5025}, {"tag":"person2","coord":[393,74,461,166],"confidence":0.99987,"awesomeness":0.548}, {"tag":"person3","coord":[458,48,535,149],"confidence":0.99976,"awesomeness":0.4766}, {"tag":"person4","coord":[273,45,352,147],"confidence":0.99963,"awesomeness":0.504}, {"tag":"person5","coord":[525,81,600,184],"confidence":0.99954,"awesomeness":0.4849}, {"tag":"person6","coord":[194,76,258,167],"confidence":0.9984,"awesomeness":0.5725} ] } ], "aliases_changed":false }, "htmlencoded":false, "last_modified":0 } 

我对JSON进行了一些格式化。 响应包含人的标识符,照片中人脸的坐标和两个参数:人脸的识别程度以及该人与标准的匹配程度。 您可以使用编程语言发送带有图片的POST请求,获取JSON并解析响应。

如果十字架很大,只需确定十几个人,就可以手动设置。 然后,系统将为熟悉的人提供标识符,为陌生的人提供标识符。 例如,如果员工辞职,也可以有选择地将人员撤离。

主意


您可以在哪些项目中使用人脸识别? 如果要实施带宽系统,则必须担心防欺骗。 例如,添加红外相机以确定它是照片还是活人。 或放置两个摄像机来确定物体的深度,可以使用OpenCV完成。

您可以组织对入口处的人的识别。 如果这些是您的邻居,那么一切都井然有序,如果某人是局外人,则可以向自己发送警报。 我们的房子有这样的问题,陌生人会定期走来走去,并在自己着陆后留下很多垃圾。

如果您制作“智能镜子”,则可以为其配备家人的认可,以便每个人都可以展示出对他有趣的东西。 说,镜子会告诉我今天的会议时间表,她和我的女儿会愉快地向我打招呼,并愿意像往常一样迅速刷牙,但要花两分钟。

另一个想法是,该国的自动门可以识别车牌。 为了不出门或不按遥控器上的按钮,您可以放置​​一台将删除您的电话号码的摄像头,然后门会自动打开。

Source: https://habr.com/ru/post/zh-CN473828/


All Articles