5.34. Afronding

De image-module is de grootste API die de cam beschikbaar stelt, en het hoofdstuk behandelde zojuist de grote lijnen ervan: hoe een afbeelding in het geheugen wordt voorgesteld, hoe de camera individuele pixels leest en schrijft, hoe ze in vastgelegde frames tekent, hoe ze deze rekenkundig en geometrisch transformeert, hoe ze deze met drempelwaarden classificeert en filtert, hoe ze er metingen en detecties uit haalt, hoe ze er gedrukte symbolen uit decodeert, hoe ze de ene afbeelding met een andere vergelijkt, en hoe ze de resultaten op en van de cam krijgt.

De toolkit is met opzet breed. Een klassieke computer vision-pijplijn die op een kleine ingebedde camera draait, doet het meeste van zijn werk voordat er iets bij een machine learning-model aankomt, als er al een is – drempelwaarden ruimen de invoer op, filters verwijderen ruis, regio’s verkleinen de zoekruimte, blob- en lijndetectoren lokaliseren kandidaten, gelijkenisscoring beslist of de kandidaat interessant is, en de I/O-laag overhandigt het resultaat aan wat de volgende fase ook uitvoert. Elke pagina in dit hoofdstuk behandelde een van die bewerkingen; de juiste pijplijn voor een bepaalde toepassing is een opeenvolging ervan, samengesteld in de volgorde die het probleem vereist.

5.34.1. Het pijplijnpatroon

De meeste niet-triviale cam-toepassingen volgen dezelfde grote lijn. Leg een frame vast van de sensor. Voorverwerk het: converteer formaten, egaliseer het histogram, vervaag ruis weg. Lokaliseer de regio’s of kenmerken van belang: blobdetectie, lijndetectie, templatematching, codedecodering. Analyseer wat is gevonden: geometrische metingen, gelijkenisscoring, statistieken. Beslis wat te doen op basis van de analyse: activeer een GPIO, rapporteer een payload, leg-en-log, overhandig het frame aan een ML-model. Voer de beslissing of het vastgelegde artefact uit: opslaan, coderen, verzenden, terugtekenen in het frame voor de IDE-voorvertoning.

Geen enkele hoofdstukpagina behandelde elke stap; het hoofdstuk behandelde de bouwstenen die de pijplijn samenstelt. Het kiezen welke blokken te gebruiken en in welke volgorde is het werk van het toepassingsscript.

5.34.2. Waar het hoofdstuk naartoe leidt

De image-module behandelt afbeeldingen als afbeeldingen – pixels, regio’s, tekenen, detecties. Veel werk aan vastgelegde gegevens past niet in dat kader. Het berekenen van statistieken over een willekeurige numerieke array, het uitvoeren van gevectoriseerde rekenkunde op ruwe sensorgegevens, het toepassen van een aangepaste matrixtransformatie waar geen image-modulemethode achter zit, het voorbereiden van gegevens voor een machine learning-model dat een specifieke tensorlay-out wil – dat zijn allemaal taken voor een numerieke-arraybibliotheek, niet voor een beeldverwerkingsbibliotheek.

Het volgende hoofdstuk behandelt precies dat. De ulab.numpy-module die met MicroPython op de cam wordt meegeleverd, is een subset van NumPy, en twee bruggen verbinden deze met de image-module: to_ndarray() kopieert de pixels van een frame naar een ndarray voor numeriek werk, en de Image-constructor accepteert een ndarray om een nieuwe afbeelding op te bouwen uit het resultaat, klaar om weer te geven, op te slaan of terug te voeren in de image-bibliotheek. De twee modules stellen samen – elk doet wat de ander niet doet, en samen dekken ze het numerieke en beeldverwerkingswerk dat een ingebedde-vision-toepassing nodig heeft.