Pojďme programovat elektroniku | Arduino | Kamera

Pojďme programovat elektroniku: Kamera pro Arduino i Raspberry Pi, která vidí

  • Představte si robotické autíčko s kamerou
  • S kamerou, která opravdu vidí věci
  • Na trhu je jich několik a my si dnes vyzkoušíme americkou Pixy2

Vzpomínáte, když jsme si v našem seriálu oživili jednoduchou kameru pro Raspberry Pi? Pomohla nám tehdy jednoduchá (a přitom docela mocná) knihovna Picamera pro Python, pomocí které jsme mohli pořizovat statické snímky, video, nebo proud, který jsme posílali ke zpracování nějakému dalšímu programu.

Třeba etalonu počítačového vidění – knihovně OpenCV (Open Source Computer Vision Library), která se postarala o detekci osob před kamerou a uložila snímky jejich obličejů. OpenCV toho samozřejmě umí mnohem více a mohli bychom skrze ni data z kamery napojit třeba na strojové učení a neuronovou síť, která bude v reálném čase detekovat předměty nebo i identifikovat konkrétní členy domácnosti, pracoviště aj.

Intel Neural Stick

K tomu bychom už ale potřebovali přeci jen výkonnější hardware – třeba Neural Stick od Intelu. Na první pohled vypadá jako o něco rozměrnější USB dongle, v nitru se však skrývá VPU čip Movidius Myriad 2. VPU, tedy Vision Processing Unit, je procesor optimalizovaný pro zpracování vizuálních dat pomocí technik A.I.

f4c235db-6f76-4843-be63-f4255655726d
Intel Neural Compute Stick: Počítačové vidění v malém USB donglu. Připojíte jej třeba k průmyslové kameře načež začne v reálném čase hledat ve videu SPZky, osoby aj.

Do jeho paměti tedy nejprve nahrajete některý z modelů neuronové sítě, třeba model rozpoznávání koček, a vše spustíte. Poté můžete do čipu skrze USB a aplikační rozhraní od Intelu posílat jednotlivé framy videa z kamery a Movidius Myriad 2 v nich bude bleskovou rychlostí hledat kočky, o čemž vás bude informovat.

Mimochodem, právě tímto čipem jsou vybavené mnohé chytřejší (a dražší) drony, třeba ty od DJI, které platformu Movidius používají k automatickému sledování a natáčení osob aj.

5ad95ae9-581e-4eab-8ed3-702611270af0
Čip Movidius používají i některé drony pro automatické sledování osob aj. Třeba ty od DJI.

Neural Stick od Intelu je tedy ve své podstatě takový maličký A.I. superpočítač s relativně malou spotřebou, který svým specializovaným výkonem hravě překoná běžný desktop s obecným procesorem.

Edge TPU Dev Board

Ještě zajímavější přitom bude sledovat blížící se rodinu Edge TPU od Googlu, který používá své velké procesory TPU (Tensor Processing Unit) pro strojové učení v datacentrech, nicméně Edge TPU jsou jejich miniaturní verzí a aplikací srovnatelné právě s Movidiem od Intelu. Google chystá dva prototypovací mikropočítače.

2d796777-10f1-4076-89d0-84bf83c868a7
Edge TPU Dev Board, aneb „Raspberry“ od Googlu s armovým čipsetem a koprocesorem Edge TPU pro strojové učení. Až jej Google představí bastlířské komunitě, mohlo by to být velké.

První se podobá Raspberry Pi a bude postavený na armové platformě od NXP (1 GB RAM, 8GB eMMC, Wi-Fi, Bluetooth), no a druhý svým form-faktorem kopíruje právě Intel Neural Stick, bude se totiž jednat o drobný USB akcelerátor.

19501bb2-43af-4b88-af55-4db297b13d28
Edge TPU Accelerator, aneb odpověď na Intel Compute Stick, tedy USB-C dongle pro počítačové vidění od Googlu. Video/obraz by měl pomocí neuronové sítě analyzovat rychlostí 100 fps.

Podstatné je to, že tyto destičky osazené A.I. koprocesorem Edge TPU zvládnou aplikovat modely neuronových sítí rychlostí 100 fps i více! To znamená, že když byste kameru připojenou na prototypovací desku s tímto čipem namířili třeba na svou kočku, software ji může identifikovat už během prvních 10 milisekund a předá tuto informaci zpět, aby vaše hypotetická elektronika mohla v reakci na to zaštěkat.

Na uvedení a ceník si ještě nějaký pátek počkáme. Snad bude Google v rámci možností lidový a nezabije tyto unikátní prototypovací desky příliš vysokou cenou.

Pixy2

V každém případě, na americkém Amazonu seženete Intel Neural Compute Stick včetně dopravy do Česka za cirka 100 dolarů a cena Edge TPU snad bude podobná.

Nebylo by tam něco levnějšího a hlavně jednoduššího? My tu přeci programujeme v C/C++ drobné prográmky pro Arduino a neřešíme mnohem komplikovanější strojové učení. Bylo. Třeba CMUcam!

04dce0d8-cf24-4e59-bd63-61ff54393d4e3fe53310-8ef5-49e5-9df0-2bdfb8d5eca2ad1607b5-13c7-4672-b9eb-35ad0630986d
Do redakce nám dorazila nejnovější verze CMUcam pod obchodním označením Pixy2

CMUcam, tedy Carnegie Mellon University camera, je už podle svého plného názvu někdejší studentský projekt z této věhlasné univerzity, který měl pomoci fanouškům robotiky k tomu, aby nemuseli ve svém kódu řešit jakoukoliv analýzu obrazu, a tedy počítačové vidění.

Vše za ně udělá přímo kamera, jejíž součástí je armový čip LPC4330FET100 od NXP, který se postará o veškerou analýzu obrazu a to při rychlosti okolo 60 fps. Jedno filmové políčko tedy zpracuje zhruba za 17 milisekund.

515a32b9-9c8a-4773-b736-5af33349075c
CMUcam je open source/open-hardware, abyste si ji však nemuseli stavět a programovat sami, Charmed Labs ji nabízí pod obchodním názvem Pixy a stará se také o obslužné nástroje a dokumentaci.

Kamera CMUcam je podobně jako Arduino open-source. Abyste si ji ale nemuseli podle návrhu pájet z dílčích součástek sami, inženýři z texaských Charmed Labs ji nechali smontovat pod názvem Pixy a vyvíjejí také povedenou konfigurační a testovací aplikaci PixyMon pro Windows, MacOS a Linux, ve které snadno na několika ukázkách ověříte její funkčnost a hlavně ji nastavíte pro různé scénáře bez složitého programování (s pomocí API je však i to samozřejmě plně ve vaší moci).

924ec6cb-c1d8-48dc-9178-5619f8bdab5d
Mozkem Pixy je čip LPC4330FET100 (kombinovaný ARM Cortex-M4/M0) od NXP. Obsah obrazu z kamery analyzuje rychlostí 60 fps.

O samotný prodej se pak stejně jako v případě Arduina a Raspberry Pi postará síť distributorů z celého světa. Mně nakonec dorazila poslední verze Pixy2 z britského e-shopu Cool Components, který ji nabízí, a teď nejspíše polovinu čtenářů odradím, za 56 liber (okolo 1 600 korun).

Fajn, co to tedy umí?

Možná jste si všimli, že ačkoliv jsem už několik odstavců věnoval kameře, vůbec tu nepadlo slovo o specifikaci samotného snímacího čipu. O obrazový výstup tu totiž opravdu až tak nejde. Ale pro puntičkáře: Jedná se o CMOS snímač Aptina MT9M114 s rozlišením 1,26 megapixelů (1 296 × 976 pixelů).

Jak to, že u kamery nejde o obrazový výstup? Protože výstupem jsou v prvé řadě stavové informace o tom, co kamera právě vidí. Jedná se o zařízení pro počítačové vidění a nikoliv o běžnou kameru pro pořizování fotek a videa. K obrazu se samozřejmě skrze USB dostanete, ale jeho kvalita nebude nikterak závratná.

0264c746-9100-4ebb-85f3-61b4d351e24c1260d7d3-ebd8-437d-a346-44d971150b45e94fc556-2506-4714-91a2-a78204cce19a
Kameru můžete s PC nebo prototypovací elektronikou spojit buď pomocí USB, anebo piny pro digitální a analogovou komunikaci a napájení (5 až 10 V). Spodní řada pinů slouží k přímému ovládání servomotorů k otáčení kamery, které můžete dokoupit.

Kameru tedy připojíte ke své elektronice buď skrze USB (PC, Raspberry Pi), sběrnici SPI (Arduino), případně pomalejší sériovou linku a I2C a nechybí dokonce ani analogový výstup, kdy informaci (souřadnice X a Y nalezeného objektu) vyjadřuje výše napětí na signálních vodičích.

Pixy můžete díky této šíři konektivity klidně připojit i k primitivnímu Arduinu Uno s čipem, který má titěrnou 2kB RAM, takže by pole pixelů z plnohodnotné kamery nedokázal spolehlivě analyzovat. Namísto toho dostane po kabelu třeba souřadnice středu a rozměry červeného míčku, se kterým právě máváte před objektivem.

e015ad39-4a12-466a-8e98-8b9b3cd788de696d736b-1395-4e1b-b300-81b32aac6ce127994c9e-8a6d-438d-a8d6-0bfd96495709
Součástí balení je kabel pro přímé spojení s konektorem ICSP na mnoha deskách Arduino. V takovém případě pak bude kamera komunikovat s destičkou Arduina pomocí sběrnice SPI. V Arduinu stačí použít knihovnu a jen poslouchat, kdy dorazí nějaký údaj.

Kdyby bylo naše Arduino mozkem třeba jednoduchého autíčka s baterií a elektromotorem, podle souřadnic snadno spočítá, že červený míček není přesně uprostřed zorného pole kamery, a dá povel motoru, aby autíčko natáčel tak dlouho, dokud míček nebude uprostřed, načež se k němu rozjede.

2ddb0ac2-f530-4308-aa67-c06c7929ce7b
Po spojení kamery s Arduinem stačí do jeho vývojového prostředí doinstalovat ovládací knihovnu, jejíž součástí je i několik příkladů. K dispozici jsou také knihovny v C++ a pro Python (Raspberry Pi).

Jak už jsem napsal výše, procesor kamery Pixy2 pracuje s frekvencí 60 fps, takže jeden snímek analyzuje za necelých 17 milisekund a předá informaci o objektu (nebo i vícero objektech), které v nich našel. To je poměrně slušné skóre, které se přibližuješ oněm A.I. koprocesorům. Jak je to možné?

Robote, sleduj červený míček!

Slušná rychlost je dána jednodušší technikou statistické analýzy obrazu podle barvy. Ovladač kamery tedy v proudu dat nenajde komplexní obraz kočky, jak to umí neuronové sítě, ale pouze dostatečně kontrastní a barevné objekty – třeba onen červený pěnový míček, který si i může nasvítit sadou vestavěných LED diod.

Co je však nejdůležitější, tyto objekty nerozpoznává automaticky, ale kameru musíte nejprve naučit. Musíte ji říci, co má vlastně v obrazu hledat.

7e513e10-cd31-4268-a0f4-df180084dad10da610db-ab50-4603-9e59-322c460b9081dc1e4e72-c1a1-4e12-99c0-db85b0a133041c86d336-d460-42f7-a55d-dec7ef4d0e0df514998a-80f6-4cc0-97f9-fa02734c18c2
Učení rozpoznávání objektu stisknutím tlačítka, anebo pomocí aplikace PixyMon. Kamera si umí pamatovat sedm různých objektů, vzhledem k použité technice by se však mělo jednat o barevně výrazné předměty.

Řídící čip kamery má paměť na sedm objektů, přičemž k učení slouží buď tlačítko přímo na kameře, nebo můžete kameru naučit dopředu, když ji máte připojenou k počítači pomocí aplikace PixyMon.

Naučil jsem kameru detekovat červený míček a takhle to vypadá v programu PixyMon:

V takovém případě prostě obdélníkem označíte kýžený objekt v obrazu, a když jej kamera napříště uvidí, dá vám o tom vědět. Jelikož PixyMon komunikuje s kamerou skrze dokumentované API, nakonec můžete učení vyvolat i svým vlastním programem třeba ze zmíněného Arduina, Raspberry Pi a dalších destiček, ke kterým bude kamera připojená.

Díky oficiální knihovně pro Arduino je detekce objektů velmi jednoduchá. Takto by mohl vypadat program, který do sériové linky vypíše polohu a velikost objektů, které kamera právě vidí:

// Knihovna pro ovladani kamery Pixy2
#include <Pixy2.h>

// Objekt kamery
Pixy2 pixy;

// Uvodni funkce setup,
// ktera se zpracuje jen jednou po spusteni Arduina
void setup() 
  // Nastartovani seriove linky do PC
  Serial.begin(115200);
  Serial.println("Nejlepsi detektor cervenych micku v Brne");
  // Nastartovani kamery Pixy2
  pixy.init();
}

// Smycka loop se opakuje stale dokola
// tak rychle, jak to cip jen dokaze
void loop() {
  // Zjistit, jestli Pixy2 vidi nejake naucene objekty
  // CCC = Color Connected Objects
  pixy.ccc.getBlocks();
  // Pokud Pixy2 vidi nejake objekty
  if (pixy.ccc.numBlocks) {
    // Napis do seriove linky jejich pocet
    Serial.print("Nalezeno ");
    Serial.print(pixy.ccc.numBlocks);
    Serial.println(" objektu!");
    // Projdi objekt za objektem a do seriove linky
    // vypis jejich souradnice v obrazu, sirku a vysku
    for (int i = 0; i < pixy.ccc.numBlocks; i++) {
      Serial.print("\tObjekt ");
      Serial.print(pixy.ccc.blocks[i].m_signature);
      Serial.print(": X=");
      Serial.print(pixy.ccc.blocks[i].m_x);
      Serial.print(", Y=");
      Serial.print(pixy.ccc.blocks[i].m_y);
      Serial.print(", Sirka=");
      Serial.print(pixy.ccc.blocks[i].m_width);
      Serial.print(", Vyska=");
      Serial.println(pixy.ccc.blocks[i].m_height);
    }
  }
}

Za šestnáct stovek tedy můžete dodat základní počítačové vidění pro svého robota, které má přirozeně své limity, ale v běžných situacích funguje skvěle.

61b1af75-d871-41d0-9dee-487b650021d9
Velmi rychlý detektor objektů před kamerou na primitivním Arduinu, které by jinak pro podobnou analýzu pixelů v obrazu nemělo výkonný čip.

Aplikace PixyMon zároveň nabízí hromadu pokročilého nastavení, kde lze chování jemně doladit třeba v případech, kdy bude kamera naučený objekt nacházet i tam, kde nemá být.

8fbd8fae-09cd-457c-a39d-0bf8e9f970d3cfbad365-ac9d-4629-a6ad-a15bec47b5cec08fde99-5526-4a87-b222-7e2439247a5bff1ff085-1695-40c5-abf8-874ef4eefe01b1f7b855-71e3-496d-95b8-e940de34d74a
Nastavení kamery v programu PixyMon počínaje vyladěním detekce objektů a konče výběrem nízkoúrovňového komunikačního rozhraní (SPI, I2C, UART, analog). Na výkonnějších mikropočítačích (Raspberry Pi) bude samozřejmě nejvhodnější ze všech nejrychlejší USB, které může přenášet i surový obraz.

Jízda po černé čáře na steroidech

Základní schopností každého autonomního robůtka je jízda po černé (respektive vůči okolí kontrastní) čáře. Jedná se o jednu z nejjednodušších navigačních metod, kdy si robot pomocí sady optických čidel (zpravidla pár IR dioda/detektor) osahává povrch pod sebou.

1c816e59-92d0-44ab-965e-15969920febcb4a9c4b2-4a75-4af8-83f6-a21d65c7db1bfc4d2a82-eb81-46e2-b562-fd7846480797
Pětikanálový analogový detektor „černé čáry.“ Napětí na signálních vodičích každého snímače bude odpovídat tomu, jak moc černé/bílé se pod ním zrovna nachází, čili stačí natočit hypotetické autíčko tak, aby bylo nejvíce černé vždy pod čidlem uprostřed.

Bílá a černá barva mají dostatečně velký vzájemný kontrast a odlišnou odrazivost, když tedy bude některá z diod/čidel nad černou čárou, zatímco ty ostatní budou nad bílým podkladem (třeba kancelářský papír, světlý povrch stolu aj.), každý ze senzorů na svém signálním vodiči nastaví jinou hodnotu napětí, nebo digitální hodnotu.

My poté čtením hodnot ze všech čidel zjistíme, ke kterému z nich je černá čára asi nejblíže a můžeme roztočit motory robota tak, aby se dostala pod prostředí čidlo.

Kamera provede kompletní matematiku za vás

Pixy2 to umí také a bez jakýchkoliv IR diod a čidel! Analýzu provádí na pixelové úrovni přímo v obrazu, mnohem komplexněji a opět slušnou rychlostí okolo 60 fps. Jednoduše řečeno, když Pixy2 uvidí v obrazu černou čáru, interpretuje ji jako vektor, který vede z bodu A do bodu B a informace o jejich souřadnicích opět pošle našemu ovládacímu mikropočítači.

a9305a84-1323-4d13-89c1-205ecc33b56a
Díky tomu, že Pixy2 vnímá celou čáru a nikoliv jen nejbližší oblast pod čidlem, ví že se za chvíli bude stáčet doprava, a tak tuto informaci jako vektor předá mikropočítači, který může zavčas natočit robota doprava.

Pixy2 tedy v podstatě provede kompletní matematiku za nás a my už jen dáme povel motorům. Tím to ale nekončí. Kamera Pixy2 je totiž dostatečně chytrá k tomu, aby věděla, po jaké černé čáře zrovna naviguje, takže když se v obrazu objeví náhodou nějaké další, dokáže je rozlišit.

611550a2-01da-4d3b-9fc3-ab96e15a26ef453d38f8-b278-48e0-94b6-b5504ca16fa267160d20-b710-4e1b-bd61-6b172fe68ae1
Pixy2 vidí křížení čar, a tak je rozliší na několik vektorů a pošle jejich souřadnice a úhly do našeho počítače, Arduina, Raspberry Pi atp.

A když ji nějaká bude křížit? V tom případě Pixy2 rozpozná, že se jedná o křižovatku a během několika milisekund nám pošle notifikaci. My tuto informaci v našem programu můžeme zpracovat a třeba odbočit. Pixy2 poté bude navigovat po nové trase.

Jízda podle dopravních značek – čárových kódů

A to stále není vše, jak by prohlásil Horst Fuchs. Firmware Pixy2 umí ještě jednu specialitu. Dokáže v obrazu identifikovat 16 přednastavených čárových kódů, kterým můžeme přidělit různé funkce.

939849b5-e9cc-4f7d-8600-5188f2a2c02e46928ee7-d951-4ee2-b19b-4c3a6654000c7844c2e9-2e28-4a68-bd6f-a8049fb110be
Šestnáct podporovaných čárových kódů a příklad situace, kdy může kód fungovat jako dopravní značka před křižovatkou černých čar na herním plánu.

Když tedy kamera nějaký takový čárový kód uvidí, dá vám skrze aplikační rozhraní vědět, že třeba právě spatřila kód číslo 1 a vy můžete zareagovat. Jeden čárový kód může třeba znamenat zákaz vjezdu, aby robot nevjel tam, kde nemá co dělat. Jiná značka mu dá zase povel, aby na následující křižovatce odbočil vlevo, nebo vpravo a tak dále.

Co dokáže Pixy2 v ukázce výrobce:

Anebo značku nepozorovaně nalepíte na záda kolegy a vypustíte do místnosti útočného robota. Jakmile ji spatří, informaci si přeloží třeba tak, že má okamžitě ignorovat všechny ctihodné zákony robotiky a cíl všemi dostupnými prostředky anihilovat.

Tak, to by mohlo pro začátek stačit a příště si ukážeme Pixy2 v akci přimontovanou na náš tank, který jsme si postavili nad Raspberry Pi v jednom z předchozích pokračování našeho seriálu.

Díky kameře mu dodáme více autonomie a bude si zvesela jezdit podle značek redakcemi našeho vydavatelství. Do dnešního článku se to už ale nevejde,

Autonomní roboti, povstaňte!

Diskuze (13) Další článek: Stát zvažuje, že síť pro 5G postaví sám. Proč je to dobrý nápad, proč je to špatný nápad

Témata článku: , , , , , , , , , , , , , , , , , , , , , , , , ,