Obsah:

Detekce objektů pomocí desek Sipeed MaiX (Kendryte K210): 6 kroků
Detekce objektů pomocí desek Sipeed MaiX (Kendryte K210): 6 kroků

Video: Detekce objektů pomocí desek Sipeed MaiX (Kendryte K210): 6 kroků

Video: Detekce objektů pomocí desek Sipeed MaiX (Kendryte K210): 6 kroků
Video: 24. Detekce objektů, část VI: vylepšení přesnosti detekce 2024, Listopad
Anonim
Image
Image

Jako pokračování mého předchozího článku o rozpoznávání obrázků pomocí Sipeed MaiX Boards jsem se rozhodl napsat další tutoriál zaměřený na detekci objektů. V poslední době se objevil nějaký zajímavý hardware s čipem Kendryte K210, včetně Seeed AI Hat pro Edge Computing, M5 Stack M5StickV a DFRobot's HuskyLens (i když ten má proprietární firmware a cílenější pro úplné začátečníky). Díky své nízké ceně oslovil Kendryte K210 lidi, kteří chtějí do svých projektů přidat počítačové vidění. Ale jak už to u čínských hardwarových produktů bývá, chybí technická podpora a to se snažím svými články a videi vylepšit. Mějte však na paměti, že nejsem v týmu vývojářů Kendryte nebo Sipeed a nemohu odpovědět na všechny otázky týkající se jejich produktu.

S tímto vědomím začněme! Začneme krátkým (a zjednodušeným) přehledem toho, jak fungují modely rozpoznávání objektů CNN.

AKTUALIZACE KVĚTEN 2020: Když jsem viděl, jak jsou můj článek a video o detekci objektů s deskami K210 stále velmi populární a mezi nejlepšími výsledky na YouTube a Google, rozhodl jsem se článek aktualizovat, aby obsahoval informace o aXeleRate, frameworku založeném na Kerasu pro AI na Edge vyvíjím. aXeleRate v zásadě vychází ze sbírky skriptů, které jsem používal pro školení modelů rozpoznávání obrázků/detekce objektů - kombinované do jednoho rámce a optimalizované pro pracovní postup na Google Colab. Používání je pohodlnější a aktuálnější.

Starou verzi článku můžete stále vidět na webu steemit.com.

Krok 1: Vysvětlení architektury modelu detekce objektů

Vysvětlena architektura modelu detekce objektů
Vysvětlena architektura modelu detekce objektů
Vysvětlena architektura modelu detekce objektů
Vysvětlena architektura modelu detekce objektů

Modely rozpoznávání obrazu (nebo klasifikace obrázků) berou celý obrázek jako vstup a výstup seznamu pravděpodobností pro každou třídu, kterou se snažíme rozpoznat. Je to velmi užitečné, pokud objekt, který nás zajímá, zabírá velkou část obrázku a jeho umístění nás příliš nezajímá. Ale co když náš projekt (řekněme kamera pro sledování obličeje) vyžaduje, abychom znali nejen typ objektu na obrázku, ale také jeho souřadnice. A co projekt vyžadující detekci více objektů (například pro počítání)?

Tady jsou případy, kdy se hodí modely detekce objektů. V tomto článku použijeme architekturu YOLO (podíváte se pouze jednou) a zaměříme vysvětlení na vnitřní mechaniku této konkrétní architektury.

Pokoušíme se určit, jaké objekty jsou na obrázku a jaké jsou jejich souřadnice. Protože strojové učení není magie a není to „myslící stroj“, ale pouze algoritmus, který pomocí statistik optimalizuje funkci (neuronovou síť), aby lépe vyřešil konkrétní problém. Tento problém musíme parafrázovat, aby byl více „optimalizovatelný“. Naivním přístupem by zde byl algoritmus minimalizující ztrátu (rozdíl) mezi jeho predikcí a správnými souřadnicemi objektu. To by fungovalo docela dobře, pokud máme na obrázku pouze jeden objekt. U více objektů volíme jiný přístup - přidáme mřížku a naše síť předvídá přítomnost (nebo nepřítomnost) objektu (objektů) v každé mřížce. Zní to skvěle, ale stále to v síti zanechává příliš mnoho nejistoty - jak vytvořit předpověď a co dělat, když je v jedné buňce mřížky více objektů se středem? Musíme přidat ještě jedno omezení - takzvané kotvy. Kotvy jsou počáteční velikosti (šířka, výška), z nichž některé (nejblíže velikosti objektu) budou změněny na velikost objektu - pomocí některých výstupů z neuronové sítě (konečná mapa funkcí).

Zde je tedy pohled na nejvyšší úroveň o tom, co se děje, když neuronová síť architektury YOLO provádí detekci objektu na obrázku. Podle funkcí detekovaných sítí extraktorů funkcí je pro každou buňku mřížky vytvořena sada předpovědí, která zahrnuje posun kotev, pravděpodobnost ukotvení a třídu kotvy. Potom zahodíme předpovědi s nízkou pravděpodobností a voila!

Krok 2: Připravte prostředí

Připravte prostředí
Připravte prostředí

aXeleRate je založen na nádherném projektu od penny4860, detektoru SVHN yolo-v2 digit. aXeleRate posouvá tuto implementaci detektoru YOLO v Kerasu na další úroveň a využívá svůj pohodlný konfigurační systém k provádění školení a převodu sítí rozpoznávání obrazu/detekce objektů a segmentace obrazu s různými backendy.

To jsou dva způsoby, jak používat aXeleRate: běží lokálně na počítači Ubuntu nebo v Google Colab. Pro spuštění v Google Colab se podívejte na tento příklad:

Notebook Colab pro detekci objektů PASCAL-VOC

Nyní je také mnohem jednodušší trénovat váš model lokálně a exportovat jej pro použití s hardwarovou akcelerací. Vřele doporučuji nainstalovat všechny potřebné závislosti do prostředí Anaconda, aby byl váš projekt oddělen od ostatních a nedocházelo ke konfliktům.

Stáhněte si instalační program zde.

Po dokončení instalace vytvořte nové prostředí:

conda create -n yolo python = 3.7

Pojďme aktivovat nové prostředí

aktivujte yolo

Před vaším bash shellem se zobrazí předpona s názvem prostředí, což znamená, že v tomto prostředí nyní pracujete.

Nainstalujte si aXeleRate na svůj lokální počítač pomocí

pip install git+https://github.com/AIWintermuteAI/aXeleRate

A pak spusťte toto a stáhněte si skripty, které budete potřebovat pro školení a odvozování:

klon git

Rychlé testy můžete spustit s testy_training.py ve složce aXeleRate. Bude spouštět školení a odvozování pro každý typ modelu, ukládat a převádět natrénované modely. Protože se jedná pouze o školení pro 5 epoch a datová sada je velmi malá, nebudete moci získat užitečné modely, ale tento skript je určen pouze pro kontrolu absence chyb.

Krok 3: Vycvičte model detekce objektů pomocí Keras

Trénujte model detekce objektů pomocí Keras
Trénujte model detekce objektů pomocí Keras

Nyní můžeme spustit konfigurační soubor s tréninkovým skriptem. Vzhledem k tomu, že implementace detektoru objektů YOLO Keras je poměrně komplikovaná, místo vysvětlování všech relevantních částí kódu vysvětlím, jak nakonfigurovat školení, a také popíšu příslušné moduly pro případ, že byste v nich chtěli sami provést nějaké změny.

Začněme příkladem hračky a vycvičme detektor racoonů. Ve složce /config, raccoon_detector.json je konfigurační soubor. Jako architekturu jsme vybrali MobileNet7_5 (kde 7_5 je alfa parametr původní implementace Mobilenet, řídí šířku sítě) a jako vstupní velikost 224x224. Podívejme se na nejdůležitější parametry v konfiguraci:

Typ je frontend modelu - Classifier, Detector or SegnetArchitecture is model backend (feature extractor)

- Full Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Další informace o kotvách naleznete zde

Štítky jsou štítky přítomné ve vaší datové sadě. DŮLEŽITÉ: Uveďte prosím seznam všech štítků přítomných v datové sadě.

object_scale určuje, jak moc penalizovat špatnou predikci důvěryhodnosti prediktorů objektů

no_object_scale určuje, jak moc penalizovat chybnou predikci spolehlivosti neobjektových prediktorů

coord_scale určuje, jak moc penalizovat předpovědi nesprávné polohy a velikosti (x, y, w, h)

class_scale určuje, jak moc penalizovat nesprávnou predikci třídy

augumentation - augumentace obrazu, změna velikosti, posunutí a rozmazání obrazu, aby se zabránilo nadměrnému přizpůsobení a větší rozmanitost datové sady.

train_times, validation_times - kolikrát se má opakovat datová sada. Užitečné, pokud máte augumentaci

povoleno

first_trainable_layer - umožňuje zmrazit určité vrstvy, pokud používáte předem vycvičenou síť funkcí

Nyní musíme stáhnout datovou sadu, kterou jsem sdílel na svém Disku Google (původní datová sada), což je datová sada pro detekci racoonů, obsahující 150 komentovaných obrázků.

Ujistěte se, že odpovídajícím způsobem změníte řádky v konfiguračním souboru (train_image_folder, train_annot_folder) a poté spusťte školení následujícím příkazem:

python axelerate/train.py -c configs/raccoon_detector.json

train.py čte konfiguraci ze souboru.json a cvičí model skriptem axelerate/networks/yolo/yolo_frontend.py. yolo/backend/loss.py je místo, kde je implementována funkce vlastní ztráty, a yolo/backend/network.py je místo, kde je model vytvořen (vstup, extraktor funkcí a detekční vrstvy dohromady). axelerate/networks/common_utils/fit.py je skript, který implementuje tréninkový proces a axelerate/networks/common_utils/feature.py obsahuje extraktory funkcí. Pokud hodláte používat trénovaný model s čipem K210 a firmwarem Micropython, kvůli omezení paměti si můžete vybrat mezi MobileNet (2_5, 5_0 a 7_5) a TinyYolo, ale zjistil jsem, že MobileNet poskytuje lepší přesnost detekce.

Protože se jedná o příklad hračky a obsahuje pouze 150 obrázků mývalů, měl by být tréninkový proces docela rychlý, a to i bez GPU, i když přesnost bude daleko od hvězd. Pro projekt související s prací jsem trénoval detektor dopravních značek a detektor čísel, oba soubory dat obsahovaly více než několik tisíc příkladů školení.

Krok 4: Převeďte jej na formát.kmodel

Převeďte jej do formátu.kmodel
Převeďte jej do formátu.kmodel

U aXeleRate se převod modelu provádí automaticky - to je asi největší rozdíl oproti staré verzi tréninkových skriptů! Navíc získáte modelové soubory a tréninkový graf úhledně uložené ve složce projektu. Také jsem zjistil, že přesnost vaiidace někdy nedokáže poskytnout odhad skutečné výkonnosti modelu pro detekci objektů, a proto jsem přidal mAP jako ověřovací metriku pro modely detekce objektů. Více o mAP si můžete přečíst zde.

Pokud se mAP, průměrná průměrná přesnost (naše validační metrika) nezlepší po dobu 20 epoch, trénink se předčasně zastaví. Při každém vylepšení mAP se model uloží do složky projektu. Po skončení tréninku aXeleRate automaticky převede nejlepší model na určené formáty - nyní si můžete vybrat „tflite“, „k210“nebo „edgetpu“.

Nyní k poslednímu kroku, ve skutečnosti provozujeme náš model na hardwaru Sipeed!

Krok 5: Spusťte firmware Micropython

Spusťte firmware Micropython
Spusťte firmware Micropython

S naším modelem detekce objektů s C kódem je možné spustit odvozování, ale kvůli pohodlí použijeme místo toho firmware Micropython a MaixPy IDE.

Stáhněte si MaixPy IDE odtud a firmware mikropythonu odtud. Zde můžete použít skript python kflash.py k vypálení firmwaru nebo si stáhnout samostatný nástroj GUI flash.

Zkopírujte model.kmodel do kořenového adresáře SD karty a vložte SD kartu do Sipeed Maix Bit (nebo jiného zařízení K210). Případně můžete.kmodel vypálit na flash paměť zařízení. Můj příklad skriptu čte.kmodel z flash paměti. Pokud používáte kartu SD, změňte prosím tento řádek

task = kpu.load (0x200000)

na

task = kpu.load ("/sd/model.kmodel")

Otevřete MaixPy IDE a stiskněte tlačítko připojit. Otevřete skript raccoon_detector.py ze složky example_scripts/k210/detector a stiskněte tlačítko Start. Měli byste vidět živý přenos z kamery s ohraničujícími rámečky kolem … no, mývalové. Přesnost modelu můžete zvýšit poskytnutím dalších příkladů školení, ale mějte na paměti, že je to pohádkový malý model (1,9 M) a bude mít potíže s detekcí malých předmětů (kvůli nízkému rozlišení).

Jednou z otázek, které jsem obdržel v komentářích k mému předchozímu článku o rozpoznávání obrázků, je, jak odeslat výsledky detekce přes UART/I2C na jiné zařízení připojené k vývojovým deskám Sipeed. V mém úložišti github najdete další ukázkový skript, raccoon_detector_uart.py, který (uhodli jste) detekuje mývaly a odešle souřadnice ohraničujících polí přes UART. Mějte na paměti, že piny používané pro komunikaci UART se liší od různých desek, to je něco, co si musíte ověřit v dokumentaci.

Krok 6: Shrnutí

Kendryte K210 je solidní čip pro počítačové vidění, flexibilní, i když je k dispozici omezená paměť. V mých tutoriálech jsme se zatím zabývali používáním pro rozpoznávání vlastních objektů, detekci vlastních objektů a spouštění některých úloh počítačového vidění založených na OpenMV. Vím jistě, že je také vhodný pro rozpoznávání obličejů a s trochou drobných úprav by mělo být možné provádět detekci pózy a segmentaci obrazu (aXeleRate můžete použít k trénování sémantického segmentačního modelu, ale odvození s K210 jsem ještě neimplementoval). Neváhejte se podívat na problémy s úložištěm aXeleRate a udělejte si PR, pokud si myslíte, že existují nějaká vylepšení, kterými můžete přispět!

Zde je několik článků, které jsem použil při psaní tohoto tutoriálu, podívejte se, pokud se chcete dozvědět více o detekci objektů pomocí neuronových sítí:

Detektory objektů ohraničujícího boxu: porozumění YOLO, podíváte se jen jednou

Porozumění YOLO (více matematiky)

Jemný průvodce, jak funguje lokalizace objektů YOLO s KERAS (část 2)

Detekce objektů v reálném čase s YOLO, YOLOv2 a nyní YOLOv3

Doufám, že znalosti, které nyní máte, můžete použít k vybudování úžasných projektů se strojovým viděním! Desky Sipeed můžete koupit zde, patří mezi nejlevnější možnosti dostupné pro ML na vestavěných systémech.

Pokud máte nějaké dotazy, přidejte si mě na LinkedIn a přihlaste se k odběru mého kanálu YouTube, abyste byli informováni o zajímavějších projektech zahrnujících strojové učení a robotiku.

Doporučuje: