Detekce obličeje pomocí termokamery¶
Cvičení je zaměřené na práci s termokamerami. Termokamera je zařízení, které snímá obraz v IR spektru, podobně jako RGB kamery, které snímají ve viditelném spektru. Výstupem termokamery je Radiometric image
, ve kterém je v každém pixelu zakódována hodnota nasnímané teploty v proprietárním formátu. Dnešní pokročilejší software dovoluje exportovat nasnímané obrázky ve formátu csv
, ve kterém jsou umístěné skutečné hodnoty teplot ve škále pro nás známé.
Termokamery jsou aktivně používané v průmyslu, např. pro kontrolu zahřívání elektických součástek nebo kotrolu vadností solárních panelů pomocí dronů.
Parametry pro snímání termokamerou¶
V souvislosti s termokamerou rozlišujeme u měřených materiálů 3 hlavní vlastnosti: emisivitu, transmisivitu a reflexivitu. Pomocí termokamery měříme množství energie, kterou daný materiál vyzařuje, odráží a propouští.
- emisivita: schopnost materiálu vyzařovat absorbované teplo do okolí
- reflexivita: schopnost materiálu odrážet okolní teplo
- transmisivita: Schopnost materiálu propouštět teplo
Tyto vlastnosti jsou bezrozměrné veličiny nabývajících hodnot $\langle0;1\rangle$ a jejich součet je pro každý materiál 1. Tedy celková energie dopadající na čidlo termokamery je součet energie, kterou těleso vyzařuje, odráží a propouští.
Obyčejně mají materiály vysokou emisivitu a nízkou reflexivitu a transitivitu. Budeme zkoumat atypické materiály s vysokou reflexivitou (chovají se jako zrcadlo) a transmitivitou (jeví se jako průhledné).
Tepelné vlastnosti žárovek¶
Nejčastěji nacházíme 3 druhy žárovek - žárovky klasické, zářivky a LED.
Klasické žárovky¶
Princip klasické žárovky je založený na zahřívání tenkého, nejčastěji wolframového vodiče elektrickým proudem, který jím protéká. V dnešní době jsou nahrazovány jinými typy žárovek kvůli malé efektivitě (většina spotřebované elektřiny - až 95% - je přeměněna na tepelnou energii a zbytek na světlo). Životnost těchto žárovek se pohybuje od 800 do 1000 hodin.
Kompaktní zářivky¶
Mají životnost od 6000 do 16000 hodin a jejich spotřeba je o 80 % nižší než u klasických žárovek. Základem zářivky je těleso, které se skládá nejčastěji z dlouhé skleněné trubice obsahující žhavící elektrody. Je naplněna rtuťovými parami a argonem. Uvnitř trubice nastává doutnavý výboj, který z velké části září v ultrafialové oblasti. Stěny trubice jsou pokryty luminoforem, který UV záření absorbuje a sama září ve viditelné oblasti.
LED žárovky¶
V součastnosti jsou nejoblíbenějším typem žárovek. Mají na stejnou světelnost nejnižší spotřebu a vydrží svítit až padesát tisíc hodin. Ve spodní části LED žárovky se nachází elektronika, která mění střídavý proud na stejnosměrný (který LED vyžaduje). U některých typů LED žárovek lze ve spodní části také nalézt elektroniku na ovládání barvy a jasu pomocí dálkového ovládání. Nad elektronikou se nachází pouze samotná LEDka zakrytá difuzním obalem.
Import knihoven a konfigurace¶
from collections import OrderedDict
import numpy as np
import cv2
from improutils import *
Pomocné funkce¶
Z následujících funkcí je potřeba vybírat ty vhodné pro splnění úkolu.
Třída pro práci s popisnými charakteristikami tvarů a jednotlivé dílčí funkce. Pozor, že funkce níže jako parametr berou obrázek a NE konturu!
Další zajímavé funkce
crop_by_bounding_rect(...)
crop_contour(...)
contour_to_image(...)
- a všechny ostatní, co naleznete v
improutils
Normalizace obrázku a převedení do BGR
def normalize_image(img):
scaled = ((img - img.min()) * (1/(img.max() - img.min()) * 255)).astype('uint8')
return cv2.cvtColor(scaled, cv2.COLOR_GRAY2BGR)
Načtení CSV souboru do obrázku
def load_csv(file_path):
lines = ""
with open(file_path, "r") as f:
lines = f.readlines()
lines = [line.replace(",", ".") for line in lines]
with open(file_path, "w") as f:
f.writelines(lines)
return np.genfromtxt(file_path, delimiter=';')[:, :-1]
Úkol¶
Detekujte obličej na termosnímku, použijte znalosti klasifikace pomocí tvarových chrakteristik z předchozího cvičení.
1) Získejte termosnimek s obličejem¶
Přejděte k učitelskému počítači a nechte se vyfotit termokamerou. Snímky, které vám budou zaslány na e-mail, si stáhněte a jeden z nich načtěte.
Pro zjednodušení zobrazování lze použít pomocnou funkci normalize_image
, která převede csv obrázek na BGR obrázek.
file_path = '' ###
img_csv = ...(file_path) ###
plot_images(...(img_csv)) ###
2) Segmentace obličeje¶
Vymyslete způsob, jak se dá segmentovat obličej v termosnímku. Využijte znalosti o teplotě lidské kůže (NEPOŽÍVEJTE normalizované šedotónové obrázky s hodnotami jasu, neboť to nebude fungovat obecně!). Zkuste experimentovat s parametry na více snímkách s vámi a vaším kolegou.
bin_mask = ...(img_csv, ?, ?) ###
plot_images(bin_mask)
3) Získejte vlastnosti segmentovaných objektů¶
Získejte kontury segmentovaných objektů, a odfiltrujte šum, např. pomocí plochy kontury. Dejte pozor na to, že obličej může mít na různých snímkách různé rozměry.
U získaných kontur spočtěte popisné tvarové charakteristiky a vypište jejich hodnoty (viz Pomocné funkce). Použijte znalosti z minulého cvičení.
contours_bin, _, conts = ...(bin_mask, ?) ###
faces = apply_mask(img_csv, contours_bin) ###
plot_images(faces)
# výpis hodnot tvarových charakteristik
for contour in conts:
print('Délka: ', len(contour))
print('Plocha: ', cv2.contourArea(contour))
### další charakteristiky
print('--------------------------------')
4) Vyberte ručně významné vlastnosti a jejich hodnoty na odlišení obličeje od ostatních objektů¶
Vytvořte proměnné pro prahy (limity) hodnot tvarových charakteristik použitelných pro filtraci kontur. Vytvořte vhodné podmínky pro filtraci kontur.
# Příklad, jak by mohly vypadat proměnné pro prahy (limity)
..._thresh = ###
..._thresh = ###
### ...
filtered_conts = []
for contour in conts:
face_candidate = ... ### vytvoření obrázku z kontury
# vhodný počet podmínek
if ... and ...:
filtered_conts.append(contour)
print('Počet nalezených obličejů je ' + str(len(filtered_conts)))
5) Udělejte vizualizaci výsledné detekce¶
Použijte aproximace obdélníkem nebo elipsou pro demonstrační účely (ukázka).
demo_image = ...(img_csv) ###
for cont in filtered_conts:
### nakreslení obdélníku/elipsy do obrázku
plot_images(demo_image)
6) Vyzkoušejte vás detekční algoritmus na referenčním obrázku¶
filenames = ['data/1.csv', 'data/2.csv']
### celý algoritmus v jednom včetně vizualizace konečného výsledku