×

TouchFree v2:非接触式温度和面罩检查

消耗积分:0 | 格式:zip | 大小:0.15 MB | 2022-11-23

张燕

分享资料个

描述

全球各国都在重新开放,与新型冠状病毒一起生活正在成为新的生活方式。但是为了阻止病毒的传播,我们需要将感染冠状病毒的人与其他人分开。

根据疾病预防控制中心的数据,发烧是冠状病毒的主要症状,高达83%的有症状患者表现出一些发烧迹象。许多国家都要求学校、学院、办公室和其他工作场所必须进行体温检查和佩戴口罩。

目前,温度检查是使用非接触式温度计手动完成的。手动检查可能效率低下、不切实际(在人流量大的地方)和风险。

为了解决这些问题,我设计了一个自助服务终端,它使用面部标记和非接触式红外温度传感器以及使用深度学习神经网络的面罩检测来自动化温度检查过程,价格不到100 美元。

信息亭的使用不仅限于学校、学院、办公室、其他工作场所,还可以用于医院等高风险区域。该设备也可用于火车站、巴士站、机场等。

我对这个项目的方法是构建一个简化的设置过程,这样任何没有任何计算机视觉或深度学习经验的人都可以使用它。这是一个功能齐全且可以立即使用的项目。我通过为每个独立部分和完整版本添加代码文件,使这个项目高度可定制。因此,您可以单独使用项目的任何部分。

感谢 Amazon AWS Credit,我能够使用 AWS EC2 实例以良好的计算能力训练我的深度学习模型进行掩码检测。

v2 有什么新功能?

  • 全新的基于 Web 的仪表板设计,兼容几乎所有浏览器
  • 自对准功能
  • 以低于 100 美元的价格降低成本(带显示屏的 150 美元)
  • BalenaFin 支持大规模部署,使用蜂窝服务等等。
  • PC 支持 (Mac/Linux/Windows)
  • 远程访问

解释

 

首先,基于 Tensorflow 的深度学习神经网络试图检测这个人是否戴着面具。通过使用许多不同的示例对其进行训练以防止误报,该系统已变得健壮。

有一次,系统检测到它执行面部标记的面具。该系统正在使用 DLIB 模块进行面部标记,以在人的额头上找到最佳位置以获取温度。

然后通过使用带有伺服电机的 PID 控制系统,系统尝试将额头上的选定点与传感器对齐,或者如果在自对齐模式下,用户可以根据视觉线索对齐自己。校准后,系统使用非接触式红外温度传感器读取温度。

如果温度在正常的人体温度范围内,则允许此人继续并向管理员发送带有图片和其他详细信息(例如体温等)的电子邮件。

软件设置

BalenaFin 设置

pYYBAGN7IPCAF9cQAACy2nVfpag252.jpg
BalenaFin v1.0
 

1. 从 Balena Etchers下载页面为您的操作系统下载 Balena Etcher 。

2. 在此处下载 Balena 的 Raspbian 映像

3. 将 SD 卡连接到您的计算机,选择最新版本的 Raspberry Pi OS,然后单击Flash以将操作系统刷入您的卡。

4. 将 SD 卡连接到 Raspberry Pi,将其连接到显示器,然后为其供电。等待几分钟,直到 Raspberry Pi 启动。

5. 通过单击屏幕右上角的 Wifi 图标并输入您的 WiFi 与您的本地 WiFi 路由器连接

树莓派设置

 

1. 从 Balena Etchers下载页面为您的操作系统下载 Balena Etcher 。

2. 将 SD 卡连接到您的计算机,选择最新版本的 Raspberry Pi OS,然后单击Flash以将操作系统刷入您的卡。

3. 将 SD 卡连接到 Raspberry Pi,将其连接到显示器,然后为其供电。等待几分钟,直到 Raspberry Pi 启动。

4. 通过单击屏幕右上角的 Wifi 图标并输入您的 WiFi 与您的本地 WiFi 路由器连接

树莓派触摸屏设置

注意-我使用的是通用的 3.5 英寸触摸屏。除了强烈推荐官方 Raspberry Pi 触摸屏外,您可以使用任何其他触摸屏。如果您选择使用 3.5 英寸触摸屏,则必须焊接几个引脚。

按照设置您的官方 Raspberry Pi 触摸屏。

按照设置通用 3.5 英寸触摸屏。

树莓派相机设置

poYBAGN7IPOAYjbnAAA7Kej4G2k693.png
 

按照这个设置官方树莓派相机v1/v2。

在终端中一一输入以下命令,安装各种Packages和Libraries。

pYYBAGN7IPaATXRHAAApov3l9M0796.png
 

为安装做好 Pi 准备

更新树莓派操作系统

$ sudo apt-get update
$ sudo apt-get upgrade

更新 pip3

$ pip3 install --upgrade pip3

扩大交换大小和改变内存

注意 -这些需要在所有安装完成后更改回来。

$ sudo nano /etc/dphys-swapfile

将打开一个新文件。导航到CONF_SWAPSIZE=100并将其更改为CONF_SWAPSIZE=1024。然后单击 Ctr + O,然后单击 Enter,然后单击 Ctr + X 以保存更改。

然后运行以下命令以使更改生效。

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

然后,

$ sudo raspi-config

并导航到 Advanced Options => Memory Split 并从 128 => 16 更改。

然后重启树莓派。

安装要求

$ sudo pip3 install numpy
$ sudo pip3 install scipy
$ sudo pip3 install scikit-image
$ sudo pip3 install RPi.GPIO
$ sudo pip3 install smbus2
$ sudo pip3 install PyMLX90614

安装 OpenCV

为 OpenCV 安装重要的依赖项

安装 OpenCV

$ sudo apt-get install python3-opencv

安装 TensorFlow

注意 - 该模型是在Tensorflow -2.2 上训练的,如果您使用任何其他版本的 Tensorflow,它可能会导致一些问题。

$ sudo apt-get install -y libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran python-dev libgfortran5 \ libatlas3-base libatlas-base-dev libopenblas-dev libopenblas-base libblas-dev \ liblapack-dev cython libatlas-base-dev openmpi-bin libopenmpi-dev python3-dev
$ sudo pip3 install keras_applications==1.0.8 --no-deps
$ sudo pip3 install keras_preprocessing==1.1.0 --no-deps
$ sudo pip3 install h5py==2.9.0
$ sudo pip3 install pybind11
$ pip3 install -U --user six wheel mock
$ wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/master/tensorflow-2.2.0-cp37-cp37m-linux_armv7l_download.sh"
$ chmod u+x tensorflow-2.2.0-cp37-cp37m-linux_armv7l_download.sh
$ ./tensorflow-2.2.0-cp37-cp37m-linux_armv7l_download.sh
$ sudo pip3 uninstall tensorflow
$ sudo -H pip3 install tensorflow-2.2.0-cp37-cp37m-linux_armv7l.whl

检查安装

$ python3
>>> import tensorflow
>>> tensorflow.__version__
2.2.0
>>> exit()

如果这一步没有报错,说明你已经成功安装了Tensorflow。

安装 DLIB

$ pip3 install dlib

检查安装

$ python3
>>> import dlib
>>> exit()

如果这一步没有报错,说明你已经成功安装了DLIB。

更改交换大小和更改内存

$ sudo nano /etc/dphys-swapfile

将打开一个新文件。导航到CONF_SWAPSIZE=1024并将其更改为CONF_SWAPSIZE=100。然后单击 Ctr + O,然后单击 Enter,然后单击 Ctr + X 以保存更改。

然后运行以下命令以使更改生效。

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

然后,

$ sudo raspi-config

并导航到 Advanced Options => Memory Split 并从 16 => 128 更改。

然后重启树莓派。

下载代码

$ mkdir covid
$ cd covid
$ git clone https://github.com/saksham2001/TouchFree-v2

环境变量设置

$ sudo nano /etc/profile

这将打开一个文件,如果您想获得电子邮件警报,请在文件末尾添加以下行

export SEND_EMAIL="TRUE"
export EMAIL_ID="your-email-id@something.com"
使用您的电子邮件 ID 而不是“your-email-id@something.com”
export EMAIL_PWD="your-email-password"
使用您的电子邮件密码而不是“您的电子邮件密码”
export COUNTER_ID=0

电子邮件设置

要使用电子邮件警报服务,您需要一个 Gmail 帐户,并且您需要允许不太安全的应用程序。或者,如果您使用 2 因素身份验证,那么您可能需要创建应用程序密码。

硬件设置

pYYBAGN7IPmAPSvgAACRsqU0bQs722.png
 

按照威廉希尔官方网站 图中给定的方式连接伺服 X 和传感器 Y。所有的连接都可以按照图表进行。相机必须连接到相机连接器,树莓派显示器可以连接到显示连接器。如果您使用的是通用 3.5 英寸触摸屏,您可以将屏幕连接到所需的 GPIO。连接到 Servos 的 GPIO 仍然是免费的,但您需要焊接以获得传感器的 5v 和 SDA、SCL 引脚。

注意 -伺服 X 是左右移动的伺服。伺服 Y 是上下移动的伺服。

传感器设置

连接 Sensor 后,运行以下命令

$ sudo su -c 'echo "Y" > /sys/module/i2c_bcm2708/parameters/combined'
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
复制端口名称(本例中为 5a)
$ cd ~/covid
$ nano app.py

然后在给定行中更改 5A

传感器 = MLX90614(总线,地址 = 0x5A)

测试

$ cd ~
$ cd covid

使用 PID 校准运行完整的应用程序

$ python3 pi_app.py

使用自对准运行完整的应用程序

$ python3 pi_self_app.py

远程访问(可选)

$ sudo apt update 
$ sudo apt install snapd
$ sudo reboot

重启后

sudo snap install ngrok

启动远程访问

ngrok HTTP 8050

现在将给出一个网站地址,您可以在启动之前给出的 python 代码后查看仪表板。

外壳和相机传感器外壳

您可以使用下面给出的文件 3D 打印外壳,或者您可以使用纸板、木材等制作自己的临时外壳。

 

为我的 3.5 英寸触摸屏显示器3D 打印Stephen Wilson制作的外壳。

poYBAGN7IPuAAxLyAAC6oPyOZWc340.jpg
 

如果您使用的是官方 Raspberry Pi 显示器,请尝试在Thingiverse 上查找外壳。我非常喜欢这个,但还没有测试过。

poYBAGN7IP2AbiRWAACIuU9KTGc277.jpg
 

对于相机传感器外壳,我定制了它们,以便相机和传感器可以对齐。如果要更改外壳,可能需要更改代码中的对齐点。

注意 -这些案例适用于 Raspberry Pi 2/3,不适用于 Pi 4。对于 Pi 4,您需要找到不同的案例。下面附加的相机传感器外壳文件没有用于传感器的任何螺丝孔(因为传感器有多种形状和尺寸)。如果您想拥有螺丝孔,请随时编辑这些文件。

pYYBAGN7IQCAA8MIAACQXH8NtR0422.jpg
带有旧 GUI 的 PID Pan-Tilt
 

调试

口罩检测不正常怎么办?

面具检测模型已经在非常有限的照明条件和有限的面罩颜色下使用合成数据进行了训练。如果模型不能很好地适应您的条件,您可能需要根据下面给出的说明重新训练模型。

注意-如果您在任何步骤中遇到困难,这可能会很棘手,请随时与我联系!

1.使用以下命令在带面具不带面具的 Raspberry Pi 上拍摄一些照片-

$ raspistill -o image-name.jpg

每次单击图像时更改图像名称。

2. 转到此处的 Google Collab Notebook并复制它。在运行时更改运行时类型 => 将运行时类型更改为 GPU。

3. 然后在您的笔记本中运行前 4 个单元格。这将在带有 mask不带 mask的文件中创建两个文件夹将您拍摄的图像添加到这些文件夹并运行所有其他单元。

4. 然后将创建一个新模型作为mask_detector.h5 下载此模型并用它替换您树莓派上 covid => 模型中的旧模型。

如果温度检查不起作用,我该怎么办?

温度检查需要适当的照明。确保您有适当的照明并且您的伺服系统运行良好。

进一步改进的范围

目前,我正在使用 BalenaOS 开发该项目的 BalenaFin 特定版本,它允许为各种规模的企业轻松进行大规模部署。不幸的是,我没有足够的时间在截止日期之前完成它,但我很快就会发布它。在那个版本中,我在 BalenaOS 上使用了 2 个 docker 容器,一个使用 Balena Dash 用于基于 Web 的图形用户界面,另一个用于所有计算。


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

评论(0)
发评论

下载排行榜

全部0条评论

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

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.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:'TouchFree v2:非接触式温度和面罩检查',//标题 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.obk20.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);