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.
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.
Pokud se chystáte na hudební festival Colours of Ostrava, tak už asi pomalu začínáte pokukovat po programu a seznamu interpretů. Pár kapel znáte, ale možná si říkáte co dalšího by vám nemělo uniknout. V tu chvíli si možná i postesknete, že chybí možnost poslechnout si nejlepší písničky od každého zpěváka. A toto trauma jsem vyřešil a sestavil jsem playlist nejlepších písníček podle Spotify.
Naprogramoval jsem skript, který mi našel na Spotify 3 nejpopulárnější písničky každého zpěváka a seřadil podle popularity písníček (číslo 0-100)
Konečný seznam je dostupný níže nebo jako playlist YouTube:
A jak jsem na to šel? Zde popíšu jen stručně v bodech a snad najdu čas rozepsat více na svém anglickém blogu.
1) Vytvořil jsem si Google Apps Script projekt
2) Vložil jsem do projektu svoji knihovnu na scraping dat3) Našel jsem si jak se načítají účastníci do stránek https://www.colours.cz/4) Při requestu z Apps Scriptů jsem modifikoval Cookie, abych byl jako anglicky mluvící uživatel (kvůli budoucím screenshotům na blog)
5) Stáhnul jsem si všechny interprety do Google Tabulky
6) Našel jsem jak funguje Spotify API. Nejdříve dotaz na vyhledání zpěváka/skupiny a podle jeho ID nalezení nejlepších písníček (https://developer.spotify.com/web-api/console/get-artist-top-tracks/)
7) Uložení TOP 3 písníček od každého zpěváka do Google Tabulky.
8) Napojení na YouTube API a nalezení videa hledané písničky
9) Uložení do speciálního playlistu
Co se týče dat, původně jsem plánoval napojit se na LAST.FM, ale tam mi data nepřijdou tolik relevantní protože to poslouchá cílovka geeků. Spotify je více rozšířeno mezi běžnými uživateli a lze očekávat zajímavější data. Navíc jsem si chtěl zkusit jejich API.
Cca 24 kapel jsem nenašel (z celkových 124). Opravu a ruční hledání jsem nedělal, takže tam budou asi pouze známější.
Rozhodl jsem se po dlouhé době pro několik věcí - napsat článek v češtině (občas bloguju anglicky na http://kutil.org), pohrát si daty a zkusit něco nového/netradičního (čti: to co nikdo ještě nezkusil). A tak jsem si naprogramoval robota, který zjišťuje kolik lidí je na pobočce v České spořitelně (ČSAS). Výsledky najdete na konci článku.
Když jsem poprvé viděl mobilní aplikaci Lístkomat od České spořitelny, tak mě příjemně překvapilo o jak pokrokové řešení se jedná. Pro připomenutí: jde o bezplatnou aplikaci, pomocí které můžete virtuální objednat na pobočku, zjisti jak dlouho budete čekat a kolik lidí je před vámi.
Přemýšel jsem, zda by těchto dat a vztahů nešlo nějak využít.
Po dlouhé době jsem se k myšlence vrátil a během krátké chvíle vytvořil prototyp. Pomocí reverzního inženýrství (= to jsou ti lidé s titulem gni.) jsem odchytil jaké HTTP requesty mobilní aplikace posílá.
O to více byla zajímavá samotná implementace (=střeva, backend, server), protože na pozadí jde opravdu o tak dlouho avizované Web API, tj. REST URL s tokenem při zasláíní requestu a JSON na výstupu.
Informace o pobočkách jsou např na URL adrese http://csas.cz/webapi/api/v1//qmatic/branches/ID
kde místo ID je číslo pobočky (20-780)
Připojil jsem se a do Google Tabulky stáhnul všechny veřejné a dostupné informace o pobočkách.(white hat, neasi). Pak jsem si opět v Tabulkách pana Googla a pomocí Google Apps Scriptů (=když jsem ten Google Developer Expert, howgh!) naprogramoval triggery/spouštěče, které se každých zhruba 10 minut připojí na toto API a zjisti kolik lidí je na dané pobočce.
A celý tento zázrak jsem nechal běžet od 14.9 do {dnesni_datum}. Po prvním týdnu (= 5 dní) jsem měl cca 12 000 záznamů, které jsem měl jako řádky uložené stále v Google Tabulce. Nakonec jsem udělal kontigenční tabulku s agregací podle poboček a hodin.
Výsledek? Největší nával je na Štefánikově (průměr 10 lidí ve frontě) s odstupem pak Vítězné náměstí (průměr 3 lidi) a Sokolovská (průměr 2 a půl člověka). Časově není překvapivé, že nejvíc lidí chodí na pobočku 15-17h. Podrobná data najdete najdete zde nebo jako embed níže.