Computer Vision – hledáme podobné obrázky pomocí AI

17. 5. 2020 Azure, Programming

Chcete si vytvořit aplikaci, která bude popisovat a kategorizovat obrázky pomocí umělé inteligence a potom najde další k němu podobné? Tak dnes si takový jednoduchý příklad ukážeme.

Chcete si to jen vyzkoušet?

Tento projekt je také dostupný ve webové verzi na adrese related-pics.now.sh a tak není potřeba k vyzkoušení umělé inteligence žádné programování. Ale pokud máte chvíli na seberozvoj, můžeme se na to pustit.

O projektu

Tento projekt je určen k demonstraci služby Computer Vision v Azure za využití služby PixaBay. Do námi vytvořeného programu budeme schopni vložit adresu na obrázek a poté dostat obrázky, o kterých si myslí náš program, že jsou mu podobné.

Co budeme potřebovat?

Instalace Pythonu

V této podkapitole si ukážeme, jak na instalaci Pythonu 3.8.2

Výběr verze Pythonu
Vybereme stránku Python 3.8.2
Stránka s instalacemi Pythonu 3.8.2
Klikneme na instalační médium pro Windows
Instalační soubor pro Python 3.8.
Zaškrtneme políčko „Add Python 3.8. to PATH“, aby byl přísupný pod příkazem python

Poté na nás vyskočí Windows okno, na kterém zvolíme volbu ANO

Instalace proběhla úspěšně

klikneme na tlačítko „Close“ a můžeme dále pokračovat

Instalace Visual Studio Code

Na stránce code.visualstudio.com klikneme na tlačítko „Download for Windows“

Obrázek stránek https://code.visualstudio.com/

Ihned poté by mělo stahování začít – po stažení soubor otevřeme a přijmeme licenční podmínky – a klineme „Next“.

Vybereme instalační destinaci, klikneme next, necháme další stránku se zástupci jak je, a klikneme Next ještě jednou.

Okno s instalační cestou VS Code
Vytvoření zástupce VS Code

Nakonec už jen zatrhneme políčko pro přidání VS Code do naší systémové cesty (PATH), klikneme Install a máme hotovo.

Extra možnosti v instalaci VS Code
Dokončení instalace VS Code

Jdeme na to!

V této sekci článku si krok po kroku ukážeme, jak si vytvořit vlastní Computer Vision program.

Poté pár vteřin počkáme a je hotovo.

Získávání API klíčů

Tato kapitola se věnuje získávání klíčů API (aplikační programovací rozhraní), neboli klíč, který nám umožní se na našich službách (Azure a PixaBay autentifikovat).

Azure

Nejprve budete potřebovat aktivní předplatné Azure for Students, anebo jiné. Návod na aktivaci najdete zde:

Poté se můžeme přesunout na Microsoft Azure Portal.

Microsoft Azure Portal Dashboard

Zde vyhledáme pojem „Computer Vision.“

Vyhledávací pole na Azure Portalu

Poté ze sekce „Marketplace“ klikneme na „Computer Vision,“ vyplníme formulář a vybereme „Create new.“

Zakládaci formulár na Computer Vision
Pro lokaci vybereme ten nejblíže k nám a pro „Resource group“ vytvoříme nový prostředek.

Poté v postranním menu vybereme „All resources“ u projektu, který jsme právě vytvořili a přejdeme na „Quick start,“ kde najdeme naše údaje, které budeme nadále potřebovat.

Obrázek Quickstart stránky v Azure

PixaBay

Stránka API dokumentace služby PixaBay
Zkopírujeme text se zeleným pozadím.

Nastavování systémových proměnných

Otevřeme si ve Windows Command Prompt [v české verzi příkazový řádek].

Zapínání příkazového řádku ve Windows

Nastavíme „COMPUTER_VISION_SUBSCRIPTION_KEY,“ „COMPUTER_VISION_ENDPOINT“ a „PIXABAY_API_KEY“ proměnné příkazem setx (za každým příkazem pro exekuci stiskneme Enter).
Příkazy si můžete jednoduše jeden po druhém zkopírovat a vložit do CMD.

setx COMPUTER_VISION_SUBSCRIPTION_KEY "your-key"
setx COMPUTER_VISION_ENDPOINT "your-key" 
setx PIXABAY_API_KEY  "your-key" 

Před kódem

Vytvoříme na disku našeho počítače složku computer-vision-demo.

Vytváření nové složky

V našem textovém editoru otevřeme složku, kterou jsme vytvořili.

Obrázek otevírání složky ve Visual studio Code

Vytvoříme soubor app.py.

Vytváření souboru ve VS code

Kód

Poznámka: Kód vždy otevřeme tak, že otevřeme náš soubor app.py. Pro jednodušší zobrazení je k dispozici také doplněk pro VS Code s názvem Python od Microsoftu (ke stažení zde).

Nainstalujeme a importujeme azure.cognitiveservices.vision.computervision.

 pip install azure-cognitiveservices-vision-computervision
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import TextOperationStatusCodes
from azure.cognitiveservices.vision.computervision.models import TextRecognitionMode
from azure.cognitiveservices.vision.computervision.models import VisualFeatureTypes
from msrest.authentication import CognitiveServicesCredentials

Dále naimportujeme systémové balíčky a balíček requests.

pip install requests
from array import array
import os
import sys
import time
import json
import requests

V našem kódu nastavíme proměnné z env.

subscription_key = os.environ['COMPUTER_VISION_SUBSCRIPTION_KEY']
endpoint = os.environ['COMPUTER_VISION_ENDPOINT']

Nastavíme URL adresu našeho obrázku, který bude program analyzovat.

remote_image_url = "https://studuj.digital/wp-content/uploads/2020/02/87803873.4jVCEG08._H8C0068copy.jpg"
2 čápi na střeše
Obrázek, který budeme analyzovat | Zdroj: pbase.com

Dále řekneme programu, jak má použít Azure s obrázkem. V našem případě ho budeme kategorizovat pomocí štítků.

tags_result_remote = computervision_client.tag_image(remote_image_url)

Poté se podíváme, jestli Azure vůbec nějaký štítek poznal a pokud ne, zobrazíme chybovou hlášku.

if (len(tags_result_remote.tags) == 0):
    print("No tags detected.")

Pokud nějaké ale najde, vytvoříme proměnnou se jménem pixabayUrl a nastavíme ji na URL adresu s naším API klíčem.

pixabayUrl = "https://pixabay.com/api/?key="+ pixabay +"&q=" 

Hned na to přidáme k URL adrese všechny tagy, které Azure detekoval.

   for i,tag in enumerate(tags_result_remote.tags):
        if i < int(percisionLvl):    
            print("#{} [{:.2f}]%".format(tag.name, tag.confidence * 100))   
            if i > 0: pixabayUrl += "+" + tag.name
            else: pixabayUrl += tag.name
   pixabayUrl += "&amp;image_type=photo&amp;pretty=true"

Teď už nám zbývá jen zavolat PixaBay API a zobrazit obrázky, které to našlo.

responce = requests.get(pixabayUrl)
jsonedResponce = json.loads(responce.text) # převedeme odpověď na jednodušše formátovatelný JSON

for i,hit in enumerate(jsonedResponce["hits"]): #Prolistujeme obrázky a vepíšeme je do konzole
   print(jsonedResponce["hits"][i]["largeImageURL"])
Výstup programu - odkazy na jednotlivé obrázky
Výstup našeho programu – URL odkazy obrázků, které jsou podle našeho programu podobné tomu, který jsme analyzovali

Závěr a výsledek

Je vidět, že náš program má ještě mouchy (orientuje se jen podle popisu obrázku a ne podle obrázku samotného), ale poznal hlavní součást obrázku a to byl i náš cíl. Výsledek je nakonec tento: (váš se může trochu lišit)