一扇用名字打招呼的门,只对部门员工开放


我们在大型项目之间进行了几天的工作,因此决定模拟单元负责人的门。 只是为了好玩。 因为无人机已经在我们的脸上认出了我们-这使门变得更糟了吗?

在IT项目开始时,我们已经在3D打印机上打印了配线架。 在两天的时间里,我们用铁,现成的图书馆和一些母亲制作了一种设备的原型,其中考虑了员工,或者允许您验证一个人是否通过了旋转栅门。

没有钱 我们仅使用开源。

您可以使用我们的脚本在15-20分钟内重复一次。

想法和实施方法


一切都从一个夏季住宅开始,我们在完成一个大型项目后就在那里休息了。 有一瞬间,很难用钥匙敲门。 从某种意义上说,我们立即认为在冬天把钱从口袋里掏出来是不好的,好吧,我们提出了许多其他应用程序,直到检查员工通行证和身份。

实际上,我们想像电影《生化危机》中那样用激光束建造走廊,但是我们没有时间。 总的来说,我想要与系统交互的效果,以便它也能发出声音。

由于我们需要原型,因此这里是功能和快速结果的最大方向,这不利于外观,尺寸和美观的体系结构。 事实证明这很可怕,但是很快就可以了。

首先,我们将门控制器分成模块,每个模块都开始编写自己的模块。 第一天的识别模块是合作伙伴Web服务的外部模块,仍然有另一个项目提供的旧的内部神经网络引擎,还有开源解决方案。 结果,他赢得了开源:我们自己的引擎需要重构和更新(这花了很长时间),合作伙伴的Web资源想要钱并且没有让它投入,但是开源是一个开源。

电子和房屋


最初,他们考虑了简单地购买电子控制锁并将其替换为标准内部门锁的选择。 但是由于门中装有玻璃和百叶窗,内部锁格外狭窄,市场上根本没有电子替代品。 因此,我们的工程师印制了一个可拆卸的挂锁,在其中提供了用于控制单元和锁打开单元的容器。

因此,建筑物的项目:


我们从项目之前自己完成的模型中打印出来(建模和拟合比编写代码花费更多的时间):


机壳的设计在Compass-3D中进行。 结果,迪马制造了3种版本的表壳,只要他能够选择元件和紧固件的最佳布置即可。

锁壳内部有一个力为10 kg的MG-995电机(实际曲柄力为5–7 kg),一对红外线传感器以控制进出期间的自动化,带有Wi-Fi模块的Esp8266微控制器和一个Web服务器,为简单起见,它通过http接收了用于打开和关闭门的控制命令。 相同的控制器转动钥匙的齿轮。

微控制器的软件部分用C编写。

沉浸在盒子制造和填充的细节中,我们不由自主地考虑了看似简单的物体的复杂性。


总计:锁控制单元可以通过Wi-Fi接受打开命令。

人脸识别部分


我们需要一个面部识别单元,如果需要打开它,它将向城堡发送一个“打开”命令。 由于采用了模块化架构,因此它可以在智能家居中的小型服务器上运行,也可以作为Internet上的Web服务。 我们还需要具有锁定控制单元的局域网中的Wi-Fi点:它是瘦客户端或家庭服务器。 我们将服务器直接部署在旧笔记本电脑上,也就是说,我们将服务器和瘦客户端结合在一起。 他们通过USB将相机插入笔记本电脑。
对于识别本身,我们在麻省理工大学的开放许可下停止了Python库人脸识别

每个项目参与者的几张照片都被上传到模型中-正面,侧面和自然。 从理论上讲,您上传到模型的照片越多,其准确性就越高,但是在大多数情况下,Facebook上的化身​​或eychars数据库中的图片都足够。

我们在Technoserv Cloud中部署了基础架构即服务,并进行了快速调试。 部署包含所有服务的新虚拟机需要20分钟。 然后,他们将所有带有库的代码上载到可以工作的便携式计算机上,以进行自主工作。

系统选择画面中最大的脸部,并以0.5秒的频率识别2次。

网路摄影机摆脱了90年代遗忘的事物。 已经存在,但是足够了。

总识别时间略超过三秒钟。 这是因为笔记本电脑确实很旧,没有视频卡。 借助vidyuha和快速的网络摄像机,识别速度将大大提高。

他们立即编写了一个用于语音识别的连接器,因为仅面部不可靠(稍后会详细介绍),因此有两个因素是必需的。

选择一个库后,花了6个小时左右的时间来调试或多或少地调试了原型。

我们还将蓝牙扬声器连接到笔记本电脑,以便他可以讲话。 笔记本电脑本身被藏在一个带有感谢信的壁橱中,例如嵌入式设备。


测验


库描述说:“使用深度学习构建的dlib的最新人脸识别功能构建。 “该模型在Wild基准的Labeled Faces上的准确性为99.38%。” 自然,不会有99.38%,但是要少得多。 由于您需要加载普通照片(以及更多),因此请设置普通相机并均衡光线。 但是由于在您开门时,她设法制作4-5帧,因此通常几乎立即打开。

错误:几次门被弄糊涂了,没有让我们马上走。 其他部门的陌生人无法进入。

您可以在门口做鬼脸,她了解一切并打开。

当然,根据员工的照片可以打开。 我们在下一个版本中(在这两天之后)添加了整个人识别模块,并且该模块仅向半身开放。

然后,他们对颜色进行了测试(下采样库,将黑白图像进行处理),面部动作和眨眼-您需要一个更好的摄像头才能看到一个人还适合的状态,一切都会好起来的。

也就是说,当然不需要,因为需要第二个因素-例如声音。 但适用于不重要的门。 也要考虑通过门的员工。 在检查点检查员工是否与通行证相符。 您还可以识别出门边回家的狗。 如果您回想一下模式识别的历史,那么最早的工业应用之一就是美国开发商将一只邻居猫养在草坪上。 他在半蹲状态中获得了猫的认可,并将灌溉系统连接到他的小型服务器。 几天后,猫意识到最好不要胡扯。 没关系 没地方

事实证明该机壳具有未来感和体积,在商业版本中,除了带麦克风的摄像头和带视听助手的小屏幕外,门上什么都没有。

在家里重复


链接到上面的库。


做两个
#/usr/bin/env python """      : """ import os import face_recognition import cv2 import random from pygame import mixer import requests import datetime import time known_faces = [ 'Emp1' , 'Emp2' , 'Emp3' ] faces_folder = 'faces' welcome_folder = 'welcome' known_faces_encodings = [face_recognition.face_encodings(face_recognition.load_image_file(os.path.join(faces_folder, i +".jpg")))[0] for i in known_faces] def init_recognition(): pass def face_detection(face_encodings): name = "Unknown" for face_encoding in face_encodings: matches = face_recognition.compare_faces(known_faces_encodings, face_encoding) if True in matches: first_match_index = matches.index(True) name = known_faces[first_match_index] return name def unlock(): unlock_url = 'http://192.168.4.1/yes' unlock_req = requests.get(unlock_url) #return unlock_req.status_code def lock(): lock_url = 'http://192.168.4.1/no' lock_req = requests.get(lock_url) #return lock_req.status_code def welcome(type): messages = { 'hello': [os.path.join(welcome_folder, file) for file in ['hello_01.wav', 'hello_02.wav', 'hello_03.wav', 'hello_04.wav', 'hello_05.wav']], 'welcome': [os.path.join(welcome_folder, file) for file in ['welcome_01.wav', 'welcome_02.wav', 'welcome_03.wav']], 'unwelcome': [os.path.join(welcome_folder, file) for file in ['unwelcome_01.mp3', 'unwelcome_02.mp3', 'unwelcome_03.wav', 'unwelcome_04.wav', 'unwelcome_05.wav']], 'whoareyou': [os.path.join(welcome_folder, file) for file in ['whoareyou_01.wav', 'whoareyou_02.wav', 'whoareyou_03.wav', 'whoareyou_04.wav']] } mixer.init() mixer.music.load(random.choice(messages[type])) mixer.music.play() def main(): current = datetime.datetime.now() vc = cv2.VideoCapture(0) if vc.isOpened(): is_capturing = vc.read()[0] else: is_capturing = False user_counter = 0 while is_capturing: is_capturing, frame = vc.read() small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) rgb_small_frame = small_frame[:, :, ::-1] face_locations = face_recognition.face_locations(rgb_small_frame) face_encodings = face_recognition.face_encodings(rgb_small_frame, face_locations) if len(face_encodings) > 0: user_counter += 1 if user_counter > 6: welcome('hello') print('hello') time.sleep(2) user = face_detection(face_encodings) timing = datetime.datetime.now() - current if timing.seconds > 4: if user in ['Emp3']: welcome('unwelcome') print('go home, ' + user) lock() elif user in known_faces: welcome('welcome') print('welcome, ' + user) unlock() else: welcome('whoareyou') print('who is there?') current = datetime.datetime.now() user_counter = 0 time.sleep(0.5) if __name__ == '__main__': main() 


在脚本本身中,员工的名称(Emp1,Emp2)与目录中带有其照片的文件相对应,您需要添加自己的名称。 分辨率无关紧要,至少可以为640x480。 有两类员工-有针对性的,要跳过的员工和立即送回家的员工。

作为相机,我们使用了最简单的罗技网络摄像头。 除了使用笔记本电脑,还可以使用微控制器,但是您需要了解如何在其上放置python和选定的库。

结果


在同一楼层与我们合作的邻近部门的销售商都感受到了这项技术。 覆盖的锁盒看起来特别酷,它以什么声音打开门! 不要相信,但是内部的技术推广和外部的技术推广是必要的。

我们被问了几次为什么下班后才这样做。

答案是因为我真的很想逗我们的家伙,让他们感到我们在工作设备上使用的技术。 因为它是硬件和软件的原型,并且在大型项目之前是一个很小的培训课程。 原型本身不太可能在某个地方使用,但具有教育功能和道德标准。

好吧,我们确保了工业原型的生产速度。 我们通常会进行快速(2-3周)的生产试点项目。 顺便说一句,如果有趣的是快速计算出自动化程度并进行试验-这仅仅是我们团队的专业化。 电子邮件tmishin@technoserv.com(如果有)。

参加过一次精彩的黑客马拉松后,感觉就像。

现在我们有了一个玩具。

一位同事昨天奔跑并展示了一架带喷火器无人机的录像带。 我们似乎有两个主意...

我还告诉所有这些事实,实际上是3-4年前,编写用于视频监控的工业探测器非常昂贵且时间长。 要控制传送带上的物料部分的大小,在有异物的情况下停止运转,在危险区域工作时要关闭等。 今天,它正在非常非常快地完成。 而且便宜得多。 速度不如门快,但飞行员在2周内是一个非常现实的估计。

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


All Articles