Как стать автором
Обновить

Тепловизионный контроль: бесконтактная биометрия против термометров, коронавируса и несознательных сотрудников

Время на прочтение 6 мин
Количество просмотров 9.8K
Всего голосов 19: ↑17 и ↓2 +15
Комментарии 26

Комментарии 26

Оборудование считывает температуру с термальной матрицы в нужных точках — в данном случае в области лба.

Просто интересно, а как вы поступаете с теми кто ходит в кепке?
Запретить, как нарушение корпоративного дресскода. Тем более в головном уборе в помещении — это нарушение норм этикета.

Так много умных слов…
А цель одна — следить и контролировать.
Прикрываясь благими намереньями (борьба за здоровье) все силы брошены на "найти" и "узнать" (идентифицировать).
Для контроля достаточно фиксации повышенной температуры (с тревожкой). Узнавать, идентифицировать — не нужно.
Для борьбы с вирусом — нужно бороться. За гигиену, чистоту (в том числе воздуха). За спортивный образ жизни (долгосрочная перспектива)…
Следить — естественно для автора важее.
Вопрос — " Кто платит за банкет?".

Заставить бы вас по этим системам жить. Надо купить билет на жд вокзале. На улице +38 в тени, но тени в радиусе нескольких сот метров от вокзала нет, в вокзал не пускают, потому что «температура повышена» — пока ты идешь по солнцепеку, перегреваешься так, что дурно. И вот так мы долбались 3 дня, пока не приехали в 5 утра (к этому времени солнце уже высоко, и температура выше 30), и одному человеку удалось пройти этот долбанный тепловизор.
Все эти попытки защиты от коронавируса путем слежки — это «театр эпидемиологической безопасности», Как сейчас в школах — на входе стоит толпа, и ждут, пока вахтерша термометром с али экспресса с точностью +- 1град измерит каждому температуру. И вот такой цирк везде.
заблаговременно прикладывайте пакеты со льдом к местам с которых снимают температуру.
это дичь и маразм — согласен, но помогает.
Тут и в РФ продаётся куча таких дорогих «термометров», которые запрещено использовать в медицинских целях. Вероятно потому, что на лбу не может быть также 36,6 градусов как при обычных замерах. Вот и подгоняют их. Как результат может быть и ±2-3 градуса.

Как решается следующая проблема


  • больной человек вспотел и как следствие остыли кожные покровы?
Вот она истинная цель коронобесия: внедрение систем тотального контроля, выработка у людей поведения абсолютного подчинения любому идиотскому закону, новая форма рабства без всяких поощрений, внедрение социального террора под страхом оказаться без работы, образования, получения медицинских услуг и т.д. О новый чудный мир. Поздравляю, мы уже в нём.
Бесконтактное измерение температуры людей в потоке пока нельзя назвать совершенным. Например, если в холодную погоду человек долго был на улице, на входе тепловизор покажет температуру на 1–2 °С ниже реальной.

Если бы это была единственная проблема. На температуру открытых участков кожи оказывает влияение множество факторов. Это и погода. Причём не обязательно холодная, но и наоборот слишком тёплая, осадки, ветер. Это и физическая нагрузка. И индивидуальные особенности организма: нормальная температура, телосложение, потливость… И всё это причудливо друг на друга накладывается. В итоге что толку в точности измерений в 0,3 или даже 0,1 градуса, когда температура открытых участков кожи может колебаться на единицы градусов?

Поправьте меня, если я не прав. А ещё лучше покажите статистику с ошибками первого и второго рода на объекте вроде вокзала или аэропорта в течение длительного времени. Чтобы менялись внешние условия, чтобы были люди, которые бежали на поезд с чемоданами — вот это всё.
Интересно, но много общей информации и ни какой технической конкретики. Например какие модули используются для определения температуры.
К слову, сейчас для себя открыл вот такой набор тепловизионной камеры:
www.sparkfun.com/products/14670 + www.sparkfun.com/products/16465 (у китайцев дешевле)
У меня банально сломался тепловизор Flir One Pro, и я вытащил из него модуль, докупил плату управления и получил возможность программно снимать картинку с тепловизионной камеры.
Сейчас делаю just for fun определение температуры людей в поле зрения тепловизионной камеры, и вот интересно было бы почитать как на практике происходит калибровка и достигается такая точность измерений.

А вон, на один комментарий первого уровня выше вашего довольно подробная статья. Там без практики, но довольно много деталей, на которые стоит обратить внимание.
Читал, однако в данной статье используются несколько иные методы (имхо более простые). Потому и интересно как они добились такой точности.
Сейчас делаю just for fun определение температуры людей


А вот это уже интересно. А как вы показания с лептона пересчитываете в температуру? Я знаю, как пересчитать RAW-данные с камеры Flir One Gen 2, но вот RAW-данные с лептона пересчитываются как-то иначе (сначала в RAW-данные камеры — вот как это сделать, я не знаю). Потому как с ними формула не работает.
Я не знаю как от модели к модели, но моя отдает сразу матрицу со значениями температур. Вроде в прошлых версиях было иначе, но мой модуль от Flir One Pro версии Lepton 3.5.
Вот мой рабочий код, который снимает картинку и выводит значения температур для каждого 15 пикселя, если он выше 30 градусов.
Получение изображения с модуля lepton через USB с преобразованием температур
import clr # needs the "pythonnet" package
import sys
import os
import time
import platform
import time
import numpy
from matplotlib import pyplot as plt
from collections import deque
from matplotlib import cm

clr.AddReference("LeptonUVC")
clr.AddReference("ManagedIR16Filters")
from Lepton import CCI
from IR16Filters import IR16Capture, NewIR16FrameEvent, NewBytesFrameEvent

def short_array_to_numpy(height, width, frame):
    return numpy.fromiter(frame, dtype="uint16").reshape(height, width)
def centikelvin_to_celsius(t):
    return (t - 27315) / 100

found_device = None
for device in CCI.GetDevices():
    if device.Name.startswith("PureThermal"):
        found_device = device
        break

if not found_device:
    sys.exit("Couldn't find lepton/ device")
else:
    lep = found_device.Open()
#print(lep.oem.GetSoftwareVersion())
#print(lep.sys.GetCameraUpTime())
lep.sys.RunFFCNormalization()
capture = None

def show_ir_frame(net_array, width, height):
    numpy_array = short_array_to_numpy(height, width, net_array)
    plt.clf()
    for y in range(height):
        for x in range(width):
            raw_temp = numpy_array[y][x]
            temp_cel = centikelvin_to_celsius(raw_temp)
            if y % 15 == 0 and x % 15 == 0:
                if temp_cel > 30:
                    plt.text(x + 1, y + 1, str(temp_cel), va='center', ha='center')
                    #print(str(temp_cel)+" ", end = '')
    raw_max = numpy_array.max()
    max_temp = centikelvin_to_celsius(raw_max)
    print(max_temp)
    plt.imshow(numpy_array, cmap=cm.plasma)
    plt.imsave('outfile.jpg',numpy_array)
    plt.show(block=False)
    plt.pause(10)

incoming_frames = deque(maxlen=10)
def got_a_frame(short_array, width, height):
    incoming_frames.append((height, width, short_array))
capture = IR16Capture()
capture.SetupGraphWithBytesCallback(NewBytesFrameEvent(got_a_frame))
capture.RunGraph()

while True:
    if len(incoming_frames) > 0:
        height, width, net_array = incoming_frames[-1]
        show_ir_frame(net_array, width, height)

Файлы которые должны быть в корне скрипта (взять из Lepton CCI SDK)
LeptonUVC.dll
LeptonUVC.xml
ManagedIR16Filters.dll
TIFFfile.dll

Правда как делать калибровку и добиться точности как в статье, я пока не придумал. Из чего сделать эталон. Сейчас у меня она на моей морде лица плавает +- 1-3 градуса.

Кстати пробовал скармливать вывод с лептона нейросети, думал оно распознает лицо и через какой-то dlib ловить то самое место в уголке глаза, но они не понимают тепловой профиль. Надо или переобучать сеть на тепловизионные снимки или получать изображение еще обычной камерой и совмещать.
Получение изображения с модуля lepton через USB с преобразованием температур


А, всё, понял. Вы не с лептоном непосредственно работаете, а с уже готовым блоком работы с лептоном — фактически, с аналогом flir one, только на другой базе. Сам лептон имеет SPI интерфейс и свой собственный протокол обмена.
Ну что значит не напрямую. Я использую вот такую обвязку www.sparkfun.com/products/14670, она же умеет и в SPI. Принципиальной разницы как получать RAW через SPI или usb нету, данные одинаковые. Там, кстати, питновские примеры из api как раз под SPI все, я переделывал под USB. Принципиально там отличие только пару строчек получения картинки с камеры, остальной код будет тот же.
Там их обвязок куча разных, можно хоть к камере подпаяться, мне просто через USB удобнее.
Принципиальной разницы как получать RAW через SPI или usb нету, данные одинаковые.


Уметь-то она умеет, но сдаётся мне, что это не RAW с лептона, а RAW после обработки на микроконтроллере.
Сомневаюсь что тот контроллер что-то там конвертирует, кроме как поддержку USB.
Вот, например, питоновский модуль для работы с лептоном по SPI github.com/groupgets/pylepton

Там такой же код:
image = capture(flip_v = False, device ="/dev/spidev0.0")
  cv2.imwrite(args[0], image)


по идее можно также делать…

numpy_array = short_array_to_numpy(height, width, image)

и дальше numpy_array[x][y] получаем значения градусов в конкретной точке в кельвинах. Можно проверить взяв любой jpeg с тепловизора, снятого по SPI.
Вся штука в том, что RAW с Flir One Gen 2 пересчитывается в температуру вот так:
image
Константы такие:
double PlanckR1=16528.178;
double PlanckB=1427.5;
double PlanckF=1.0;
double PlanckO=-1307.0;
double PlanckR2=0.012258549;

Однако, я ничего подобного не вижу в коде.
RAW с лептона по этой формуле перевести не получается, хотя по формату это такой же 14 бит RAW, что и с Flir One Gen 2 по USB (числа, впрочем, другие). Какие именно преобразования делает Flir One, я не выяснил. Но у него там точно есть термодатчик на калибровочной шторке и он 100% его как-то применяет для коррекции RAW.
Посмотрите вот сюда. cdn.sparkfun.com/assets/e/9/6/0/f/EngineeringDatasheet-16465-FLiR_Lepton_8760_-_Thermal_Imaging_Module.pdf
Это даташит к моему модулю www.sparkfun.com/products/16465

Особенно обратить внимание на вот это:
Radiometry enabled, TLinear enabled (default for Lepton 2.5 and 3.5)
• Radiometry enabled, TLinear disabled
• Radiometry disabled
3.5.1 Radiometry Enabled — TLinear
The radiometry enabled mode affects the transfer function between incident flux (scene temperature) and pixel
output. From an image-quality standpoint, both radiometry modes produce nearly identical performance (no
change in NEDT), and either mode is appropriate for strict imaging applications. However, for applications in
which temperature measurement is required, radiometry must be enabled to access the related calibration and
software features, such as TLinear and Spotmeter, which support these measurements. In radiometry enabled
mode, enabling the corresponding TLinear mode changes the pixel output from representing scene flux in 14-bit
digital counts to representing scene temperature values in Kelvin (multiplied by a scale factor to include
decimals). For example, with TLinear mode enabled with a resolution of 0.01, a pixel value of 30000 signifies that
the pixel is measuring 26.85°C (300.00K – 273.15K). The Lepton with Radiometry configuration is intended as a
fully radiometric camera; therefore, the factory defaults are defined to have both radiometry and TLinear modes
enabled.



Хочу заметить, что это все касается самого термомодуля, а не его обвязки под USB/SPI.

А вот тут упоминается ваша формула cdn.sparkfun.com/assets/d/4/d/6/c/Getting-Started-Guide-16465-FLiR_Lepton_8760_-_Thermal_Imaging_Module.pdf при работе в режиме с выключенным TLinear.

Так понимаю в некоторых версиях этот режим включен по дефолту и в RAW уже отдается непосредственно преобразованная температура.
Это всё я читал. Но из этих документов мало что понятно.

Так понимаю в некоторых версиях этот режим включен по дефолту и в RAW уже отдается непосредственно преобразованная температура.


Вот только для неё нужно ещё знать температуру шторки, которую, насколько я помню, лептон не измеряет. Тогда как?
Сложно сказать. Почитай hackaday.io/project/159615-lepton-35-thermal-imaging-camera/log/149651-lepton-agc
Да и вообще весь лог проекта hackaday.io/project/159615/logs человек свой тепловизор собрал. Тут репозитарий github.com/danjulio, много полезного кода, особенно вот github.com/danjulio/firecam/blob/master/firmware/components/lepton/lepton_utilities.c где как раз пересчет по вашей формуле.
Правда не знаю зачем он так заморочился. Я себе заказал тач дисплей под raspberry 3, подключу через USB будет самодельный тепловизор. А дальше сохранять в jpeg и можно открывать через Flir Tools.
человек свой тепловизор собрал.


Ну я как бы тоже собрал. :) И ПО для linux, windows и QNX сделал для Flir One.

Правда не знаю зачем он так заморочился.


Потому что энергопотребление низкое будет. И просто удобно.
Здорово! Читал как-то. Правда до тех пор, пока не сломался тепловизор, эта тема не интересовала. :)

Вот провел у себя пару тестов.
Получается в моём тепловизоре, который со шторкой, по умолчанию параметр TLinear (lep.rad.SetTLinearEnableState(1)) по умолчанию установлен в true, поэтому данные отдаются сразу просчитанные с зашитыми откалиброванными заводскими параметрами TempReflected и Emissivity и с учетом температуры на шторке (правда в этом я не уверен, но логически должно быть так).
Если выставить его в false, значения меняются, и скорее всего уже нужен пересчет по вашей формуле.
Для получения температуры камеры, есть 2 метода
CCI.sys.GetAuxTemperatureCelsius (это, наверное на плате) CCI.sys.GetFpaTemperatureCelsius (это на шторке). Но чтобы они где-то использовались, я не нашел
Надо будет попробовать покидать команды лептону по I2C. Может и включится требуемый режим.

А, да. Вдруг кому для Linux надо версию для Flir One Gen 2. Вот она.

github.com/da-nie/FlirOneControlForLinux
Зарегистрируйтесь на Хабре , чтобы оставить комментарий