31. ledna 2021

Využití Google Cloud AI pro hledání správných odpovědí z televizní soutěže Kalendárium

Naprogramoval jsem aplikaci, která hledá (resp. spíš zná) správné odpovědi na soutěžní otázky z pořadu Kalendárium a to vše pomocí Google Cloud AI. Jde o několik integrací na API, část algoritmizace, vyhodnocení a shrnutí výsledků do jednoho emailu. Dnes vám popíšu jak jsem to udělal.


Mám rád pořad České televize Kalendárium, který je vysílán pravidelně každou neděli dopoledne. Na konci každého dílu je zobrazena fotka znamé osoby, která slaví v daném týdnu výroči (včetně datumu narození a úmrtí). Soutěžící mají za úkol poznat o koho jde. A zde mě napadlo, zda by tato činnost nemohla být zautomatizována pomocí technologií.


Integraci na televizní vysílání jsem měl vymyšlenou dvěma způsoby, ale nakonec mi to ulehčilo práci zobrazování fotky na stránkách pořadu

Celou aplikaci jsem se rozhodl napsat v technologii Google Apps Script, která nabízí online IDE editor, provoz aplikace v cloudu a možnost rychlého napojení na Google služby.



První krokem je načtení obrázku s danou osobou a rokem narození ze stránek pořadu České televize.
Pro snadnější parsování dat z HTML jsem si v Apps Scriptech vytvořil vlastní knihovnu, která toto zjednodušuje (viz můj článek Easy data scraping with Google Apps Script in 5 minutes)


Po zparsování HTML dostaneme URL adresu obrázku, na kterém je fotka a text:


Rozpoznávání jsem rozdělil na dvě oblasti - analýza obrazu s detekcí textu a analýza obrazu s detekcí webu.. K obojímu využívám naučené modely Google v rámci Google Cloud Platformy dostupné přes API.

Analýza textu

Pro první část využívám Google Cloud Vision API a jeho funkci Text detection. Ta umí v obrázku udělat OCR a najít viditelný text. Technicky stačí zavolatjeden request na REST API. 

Takhle zhruba vypadá výsledek


Nejdůležitější je text s datumem narození:

 K d o t o b y l ? * 4 . 2 . 1 9 0 1 - * 1 0 . 1 2 . 1 9 8 7

Dalším krokem je prostý dotaz do Google s těmito datumy. Aby to nebylo tak jednoduché, tak Google neposkytuje API ke svému vyhledávači. Lze to obejít přes Google Custom Search Engine. Ta vám poskytuje možnost naklikat si vlastní vyhledávač nad definovaným rozsahem internetu (tj. přidáte jaké stránky má a nemá prohledávat). Poté můžete své dotazy pokládat přes API


Vyhledávání na Google jsem použil i v jiných projektech, tak jsem si připravil vlastní knihovnu SearchApp kam stačí dát pouze ID parameter vyhledávače Custom Search Engine a pak dále API klíč od Google.

Takto vypadá výsledek v JSONu, kdy v poli items jsou jednotlivé výsledky vyhledávání. Zde je už jen algoritmus, který z <TITLE>  stránky vytáhne text, resp. nejčastěji opakované jméno.


Prvním kandidátem na správnou odpověď je Jascha Heifetz.

Analýza obrazu

Pro zvýšení přesnosti probíhá ještě čistá analýza obrazových dat.  

Nejdříve je potřeba obrázek oříznout, aby se použila pouze fotka s osobou. Pro ořezávání vypublikoval mikroslužbu (funkci) postavenou na nodejs s balíček Jimp. Tato funkce je nasazena v Google Cloud Functions a funguje jako jednoduché API (dostane obrázek - ořízne - vrátí obrázek)



Takto oříznutou fotku pošlu na Google Cloud Vision API, ale tentokrát s příznakem "WEB_DETECTION". To mi vrátí zda se na internetu neobjevuje podobná fotka a zda Google už danou osobou nezná.

Výsledkem je opět JSON. 
Z nalezených stránek s obrázkem (objekt WebPage) mě zajímá pouze jejich TITLE, který opět použiju jako vstupní zdroj. Opět pomocí algoritmus zpracuji jako jméno/text se vyskytuje nejčastěji.


Dále umí Google vrátit tzv. WebEntity objekt, který identifikuje osoby z Google Knowledge Graphu




V příkladu vidíte, že největší skóre má osoba s identifikátorem kg:/m/01tbm7


Pro získání reálného jména jmen z nalezených idenitifkátorů jsem využil Google Knowledge Graph Search API 

Na JSON výsledků vidíte, že pod s kg:/m/01tbm7 se skrývá opět Jascha Heifetz,

A jsme u konce kdy zbývá jen sesbírat možné kandidaty. 

V tomto příkladě je vysoká pravděpodobnost, že na obrázku je "Jascha Heifetz", což byl litevský houslista židovského původu.

Aplikace napsaná v Google Apps Scriptu na můj email pošle odpověď, abych mohl před odesláním přeci jenom zkontrolovat, že se omylem nepošle třeba  "undefined" :)

Pro jednoduchost už mám připravenou šablonu textu a stačí v emailu kliknout na Poslat Gmail



Pro shrnutí celý zautomatizovaný zabere v cloudu cca 15 sekund, plně autonomní protože je nastaven na spuštění každou neděli. 

A takto soutěžím již delší dobu...


Pokud jste dočetli až jsem (tak jsem rád!) a možná ptáte zda jsem vyhrál předplatné Epocha na celý rok :)
Moje odpověď je ne. 

Kalendárium je oblíbené a vysílané v atraktivní čas, Očekávám že mají stovky až tisíce správných odpovědí každý týden od lidí, které baví dohledávat informace v encyklopediích a na internetu. Mě zas baví hledat zajímavé automatizace, nové možnosti integrace a využití Google v soukromém i pracovním životě.  Celou ukázku tak berte spíš hlavně jako inspiraci jak lze využívat Google Cloud Platform, Google Apps Script, Knowledge Graph a další technologie.









Zajímá tě více?