현재 코로나 상황이 지속되며 악화되고 있는 상황이다. 감염자 수의 증가세는 가라앉지 않고 있으며, 앞으로도 방역에 많이 힘써야한다. 전파를 줄이기 위해서는 감염자를 조기에 발견하여 접촉자 수를 줄여야만 하는데, 현재 이를 위해 대부분의 건물의 입구에 열화상 온도계를 설치하여 발열 검사를 시행하고 있다. 하지만 측정된 온도값들은 겨울철에는 체온보다 상당히 낮게나오는 경우가 많다. 이러한 측정 결과는 발열 증상이 있는 사람의 온도가 정상적인 범주의 사람으로 분류될 수 있음을 뜻하여 측정 방식의 신뢰도에 의문을 제기하게 된다. 적외선 측정 방식에서 이러한 문제를 개선하여 발열자의 검출률을 높이는 것이 이 프로젝트의 목표이다.
기존 열화상 온도계의 펌웨어나 소스 코드를 알 수 없어 정확히 어떤 방식으로 측정하는지는 알 수 없었으나, 문의를 통해 들은 내용으로는 열화상 이미지 내에서 가장 높은 온도를 보이는 픽셀 주변의 온도를 평균으로 하여 온도를 출력한다고 한다. 일반적으로 설치된 열화상 온도계들은 얼굴이 화면에 표시된 타원형의 경계에 얼굴을 맞추어야 측정을 하는데, 이러한 경계 속 최대 온도값의 주변 평균 온도를 측정하는 것으로 보인다. 그렇지 않으면 화면 안에 더 높은 온도의 물체가 담기는 상황은 적지 않게 발생할 수 있으므로 경계를 의도적으로 이용하는 것으로 생각된다. 하지만 그렇다고 해도 사람의 얼굴이 정확히 경계와 일치할 수는 없으므로 경계에서 얼굴을 제외한 부분의 온도값이 사람의 얼굴 온도보다 높다면 측정의 결과는 달라지게 될 것이다. 따라서 컬러 이미지에서 얼굴의 윤곽을 만든 후 열화상 이미지와 매칭시켜 배경의 영향을 제거한다.
안면 온도 측정에서 실제 체온보다 낮거나 같은 온도가 측정되는데, 그 중 이마의 온도가 가장 신뢰도가 높다고 알려져 있다. 온도가 낮게 측정되는 경향은 실제 발열자의 측정 온도가 정상 범주로 판단될 가능성을 야기한다. 온도가 낮게 측정되는 것은 실내보다 기온이 낮은 바깥 환경에 노출되어서 안면의 피부 온도가 낮아지기 때문인데, 사람이 얼마나 바깥에서 노출되었는지는 측정하기 쉽지 않다. 안면 온도 저하 문제를 해결하기 위해 안면 온도의 부위별 분포를 분석하여 보정 계수를 정하는 방법을 취한다.
라즈베리파이 4, FLIR Lepton 3.5 적외선 센서가 마운트 된 PureThermal2 보드, 파이 카메라 모듈을 3D 프레임에 마운트하여 HW를 세팅한다.
라즈베리파이의 OS는 Raspbian Buster(2022-01-28)를 설치.
파이썬 버전은 Default인 3.7이 아닌 3.8.3으로 세팅하기 위해 3.8.3을 설치하고 venv로 가상 환경을 관리한다.
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev wget libbz2-dev
# Python 3.8.3 설치
wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -xf Python-3.8.3.tgz
cd Python-3.8.3
./configure --enable-optimizations
make
sudo make altinstall
# 가상환경 만들기
python3.8 -m venv .env3_8
source .env/bin/activate
pip install ipython
pip install ipykernel
pip install opencv-python
sudo raspi-config
# Interface - Enable Camera
vcgencmd get_camera # supported=1, detected=1이면 완료
raspistill -o test.jpg
# PureThermal Project 설치
https://github.com/groupgets/purethermal1-uvc-capture.git
# libuvc 설치
sudo apt-get install cmake
sudo apt-get install libusb-1.0.0-dev
sudo apt-get install libjpeg-dev
git clone https://github.com/groupgets/libuvc
cd libuvc
mkdir build
cd build
cmake ..
make && sudo make install
sudo ldconfig -v
pip install smbus
python aht10.py
안면 온도에서 실체온을 추정할 때에 정확한 추정을 위해서는 안면의 부위별 온도를 측정하여야 한다. 이를 위해서는 실화상 이미지에서 안면 추출 후 부위를 나누어야한다.
# MediaPipe 설치
git clone https://github.com/google/mediapipe.git
# Bazel 설치
sudo apt-get install -y openjdk-8-jdk
git clone https://github.com/PINTO0309/Bazel_bin.git
cd Bazel_bin/3.7.2/armhf/
./install.sh
which bazel # Bazel 설치 확인
sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev -y
# mediapipe/examples/desktop/hello_world/BUILD의 cc_binary에 추가
linkopts = [
"-latomic"
]
cd ~/mediapipe
export GLOG_logtostderr=1
bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/hello_world:hello_world
열화상 이미지에서는 환경에 따라 안면 추출이 불가한 경우가 발생하므로 실화상 이미지에서 안면을 추출하여 열화상 이미지로 적용해야하는데, 일반적으로 적외선 카메라의 해상도가 실화상 카메라의 해상도보다 작고, 두 카메라의 시야각이 다르며 동일한 위치, 방향이 아니므로 두 이미지를 매칭하기 위해서는 이러한 문제를 해결해야한다.
위의 과정에서 사용한 방법은 아래를 참고하였다.
1,2의 과정을 거쳐 추출된 열화상 이미지에서 온도를 측정하는데, 측정된 온도가 실제 해당 부위 온도와 일치하는 지에 대해 조사하고 보정하는 과정이 필요하다.
Number | Device | Information | Price(₩) |
---|---|---|---|
1 | RASPBERRY PI 4 MODEL B 8G | Link | 135,000 |
2 | RASPBERRY PI CAMERA MODULE V2 | Link | 35,000 |
3 | FLIR Lepton 3.5 | Link | 190,851 |
4 | PureThermal 2 - Flir Lepton Smart I/O Module | Link | 126,807 |
5 | 3D Frame(Self-Designed) |
안녕하세요~ 글 잘 봤습니다.
온도 측정 관련해서 궁금한 것이 있어 댓글 남겨요.
Lepton 3.5를 이용해서 프로젝트 하시는 동안 온도 정확도에 대한 이슈는 없으셨나요?
주변 온도에 영향을 많이 받을 것 같은데 어떻게 해결하셨는지 궁금해서요.
좋은 글 포스팅 해주셔서 감사합니다~