Technologie „umělé inteligence“ jsou snadno dostupné a dají se využívat i zábavným způsobem. Krásným příkladem je využití Google Cloud AI k hledání odpovědí v televizní soutěži, jak jej na svém blogu popsal Ivan Kutil, CTO a Google Cloud Architect ve firmě AppSatori. S jeho svolením inspirativní návod publikujeme i zde.
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.
Schéma procesu automatického hledání odpovědi na otázky z Kalendária
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 známé osoby, která slaví v daném týdnu výročí (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í.
Jak na to? Přes Google Apps Script
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.
Otázka zveřejněná v televizním pořadu • Proces usnadnil fakt, že je otázka zveřejněna i na webu 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 z parsová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čí zavolat jeden 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 parametr 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 identifikátorů jsem využil Google Knowledge Graph Search API. Na JSON výsledků vidíte, že pod kg:/m/01tbm7 se skrývá opět Jascha Heifetz.
A jsme u konce, kdy zbývá jen sesbírat možné kandidáty. V tomto příkladu je vysoká pravděpodobnost, že na obrázku je Jascha Heifetz, což byl litevský houslista židovského původu.
Odeslání odpovědi raději s kontrolou
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ý proces zabere v cloudu cca 15 sekund. Je 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!), možná se ptáte, zda jsem v soutěži už někdy vyhrál.
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 hlavně jako inspiraci, jak lze také využívat Google Cloud Platform, Google Apps Script, Knowledge Graph a další technologie.