随着世界各国重新开启,与新型冠状病毒一起生活正在成为新的生活方式。但是,为了阻止病毒的传播,我们需要把感染冠状病毒的人进行隔离。
根据疾控中心的说法,发烧是感染冠状病毒的主要症状,高达83%带症状的患者有发烧的迹象。许多国家/地区强制要求学校、大学、办公室和其他工作场所进行体温检测和戴口罩。
目前,体温检测是用无接触式温度计手动完成的。手动检查效率低下、不切实际(在人流量大的地方),而且风险很大。
为了解决这些问题,我设计了一个终端,通过使用面部定位技术和无接触式红外温度传感器实现体温检测过程自动化,并利用深度学习神经网络进行口罩检测。
这种终端的使用不局限于学校、大学、办公室和其他工作场所,还可以用于医院等高风险区域。该装置也可用于火车站、公共汽车站、机场等。
我用于这个项目中的方法是建立一个简单的安装设置过程,以便任何没有计算机视觉或深度学习经验的人都可以使用它。这是一个功能齐全、随时可用的项目。我已经使这个项目可通过为每一个独立的部分或完整的版本添加代码文件进行高度定制。因此,可以单独使用本项目的任何部分。
得益于Amazon AWS的成果,我能够使用AWS EC2实例的高性能计算能力训练用于口罩检测的深度学习模型。
第0步:工作原理
首先,基于TensorFlow的深度学习神经网络尝试检测目标人物是否戴了口罩。通过使用许多不同的实例对系统进行训练以防止误报,使系统变得健壮。

一旦系统检测到口罩,它会要求用户摘下口罩,以便进行面部定位。该系统使用DLIB模块进行面部定位,以找到人体额头上的最佳测温点。

接着,利用舵机的PID控制系统,将额头上选定的点对准温度传感器。对准后,系统使用无接触式红外温度传感器读取温度读数。


如果温度在正常人体体温范围内,则允许这个人通行,并向管理员发送一封带有图片和其他细节(如体温等)的电子邮件。

第1步:软件安装
安装树莓派系统

- 从树莓派下载页面下载适用于您的操作系统的树莓派镜像工具。
- 将SD卡连接到计算机,选择最新版本的树莓派操作系统,然后单击“写入”将操作系统烧写到您的SD卡上。
- 将SD卡插入树莓派,连接显示器,然后接通电源。等待几分钟,直到树莓派启动。
- 通过单击屏幕右上角的WIFI图标并输入你的WIFI密码。
设置树莓派触摸屏
注意:我用的是普通的3.5英寸触摸屏。你可以使用其它型号,但是强烈推荐使用官方树莓派触摸屏。如果你选择使用3.5英寸的触摸屏,你将需要动手焊接一些引脚。
参考官方教程设置官方树莓派触摸屏。
参考这个教程设置普通3.5英寸触摸屏。
安装树莓派摄像头

参考官方教程设置树莓派摄像头V1/V2。
安装软件包和库
在终端中逐个执行以下命令来安装各种软件包和库。

更新系统,为安装做好准备
更新树莓派操作系统
$ 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、回车和Ctr+X保存更改并关闭文件。
接着运行以下命令使更改生效。
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
然后运行
$ sudo raspi-config
并导航到高级选项 => 内存拆分, 把128更改为16 (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的重要依赖项
$ sudo apt-get install build-essential cmake unzip pkg-config
$ sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libgtk-3-dev
$ sudo apt-get install libcanberra-gtk*
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install python3-dev
安装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"
$ ./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、回车和Ctr+X保存更改并关闭文件。
接着运行以下命令使更改生效。
$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start
然后运行
$ sudo raspi-config
并导航到高级选项 => 内存拆分, 把16更改为128 (16 => 128)。
然后重新启动树莓派。
从GitHub下载源代码
$ mkdir covid
$ cd covid
$ git clone https://github.com/saksham2001/Covid-Project
设置环境变量
$ sudo nano /etc/profile
这将打开一个文件,如果你想收到电子邮件提醒,在文件的末尾添加以下几行
export SEND_EMAIL="TRUE"
export EMAIL_ID="your-email-id@something.com"
用您的电子邮箱地址替换“your-email-id@something.com"
export EMAIL_PWD="your-email-password"
用您的电子邮箱密码替换“your-email-password”
export COUNTER_ID=0
设置邮箱
要使用电子邮件提醒服务,您需要一个Gmail帐户,并且您需要允许不太安全的APP。或者,如果使用两阶段身份验证,则可能需要创建APP密码。
第2步:安装硬件

电路接线
如电路图所示,连接舵机X和舵机Y。按照电路图接好所有的连接线。摄像头必须连接到摄像头接口,树莓派显示器可以连接到显示器接口。如果您使用的是普通的3.5英寸触摸屏,则可以将屏幕连接到所需的GPIO接口。连接到舵机的GPIO仍然是悬空的,你需要焊接以获得传感器的5v电压,传感器的SDA、SCL引脚也需要焊接。
注意:舵机X是控制左右移动的。舵机Y是控制上下移动的。
设置温度传感器
温度传感器连接好后,运行以下命令
$ 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
sensor = MLX90614(bus, address=0x5A)
打开源代码文件
$ cd ~/covid
$ nano temp_checker.py
重复一次,找到下面这行代码,并更改5A
sensor = MLX90614(bus, address=0x5A)
第3步:验证
$ cd ~
$ cd covid
运行完整的应用程序
$ python3 app.py
运行不带摇动和倾斜模块的应用程序
$ python3 no_pan.py
只运行体温检查代码
$ python3 temp_check.py
只运行口罩检测代码
$ python3 mask_detection.py
只运行电子邮件发送代码
$ python3 email_sender.py
第4步:3D打印树莓派外壳和摄像头与传感器外壳
你可以用下面提供的文件3D打印外壳,或者可以用纸板、木头等制作你自己的临时外壳。

我3D打印的是由Stephen Wilson为我的3.5英寸触摸屏设计的外壳。

如果您使用的是官方树莓派显示器,请尝试在ThingVerse网站上查找外壳。我很喜欢这款,但还没用过。

至于摄像头和传感器外壳,我自己定制了一个,为的是使摄像头和传感器可以对齐。如果你想要修改外壳,可能需要更改代码中的对齐点。
注意:这些外壳是针对树莓派2代/3代设计的,不适用于树莓派4代。对于树莓派4代,你需要找到一个不同的外壳。以下附件所提供的摄像头和传感器外壳文件并没有为传感器预留螺丝孔(因为传感器的形状和尺寸各不相同)。如果你需要螺丝孔请自行修改这些文件。

第5步:故障排除
如果口罩检测不能正常工作,该怎么办?
口罩检测模型是在非常有限的照明条件和有限的口罩颜色下用合成数据训练的。如果模型不能很好地满足您的使用条件,可能需要按照下面给出的步骤重新培训模型。
注意:这可能是棘手的,如果你在任何一个步骤卡住随时与我联系!
1 使用命令在树莓派上拍摄一些戴口罩和不戴口罩的照片
$ raspistill -o image-name.jpg
每次拍照时更改图像名称。
2 到这里的Google Collab笔记本并复制它。在运行时=>更改运行时类型中将运行时类型更改为GPU。
3 然后在笔记本上运行前4个单元格。这将创建两个文件夹:戴口罩和不戴口罩。将您拍摄的图像分别添加到这些文件夹并运行所有其他单元格。
4 运行之后将创建一个新的模型文件mask_detector.h5。下载这个模型并用它替换树莓派上covid=>models中的旧模型。
如果体温检测不能正常工作,该怎么办?
体温检测需要适当的照明。确保有适当的照明,同时舵机工作良好。
在此,向Adrian Rosebrock致敬,感谢他那令人惊叹的计算机视觉博客。
定制零件和外壳
电路图
完整代码
直接下载:ZIP压缩包
或前往作者GitHub代码仓库下载最新版本
英文链接:TouchFree: Automated Temperature Checkup and Mask Detection
英文作者:Saksham Bhutani [YouTube, GitHub]
中文翻译:fibx