5.6 KiB
Roep je objectdetector aan vanaf je IoT-apparaat - Wio Terminal
Zodra je objectdetector is gepubliceerd, kan deze worden gebruikt vanaf je IoT-apparaat.
Kopieer het project van de beeldclassifier
Het grootste deel van je voorraaddetector is hetzelfde als de beeldclassifier die je in een eerdere les hebt gemaakt.
Taak - kopieer het project van de beeldclassifier
-
Verbind je ArduCam met je Wio Terminal, volgens de stappen uit les 2 van het productieproject.
Je kunt er ook voor kiezen om de camera in een vaste positie te plaatsen, bijvoorbeeld door de kabel over een doos of blik te hangen, of de camera met dubbelzijdige tape aan een doos te bevestigen.
-
Maak een gloednieuw Wio Terminal-project met PlatformIO. Noem dit project
stock-counter
. -
Herhaal de stappen uit les 2 van het productieproject om beelden van de camera vast te leggen.
-
Herhaal de stappen uit les 2 van het productieproject om de beeldclassifier aan te roepen. Het grootste deel van deze code zal opnieuw worden gebruikt om objecten te detecteren.
Wijzig de code van een classifier naar een objectdetector
De code die je gebruikte om beelden te classificeren lijkt erg op de code om objecten te detecteren. Het belangrijkste verschil is de URL die wordt aangeroepen, die je hebt verkregen van Custom Vision, en de resultaten van de oproep.
Taak - wijzig de code van een classifier naar een objectdetector
-
Voeg de volgende include-richtlijn toe aan de bovenkant van het bestand
main.cpp
:#include <vector>
-
Hernoem de functie
classifyImage
naardetectStock
, zowel de naam van de functie als de oproep in de functiebuttonPressed
. -
Verklaar boven de functie
detectStock
een drempelwaarde om detecties met een lage waarschijnlijkheid eruit te filteren:const float threshold = 0.3f;
In tegenstelling tot een beeldclassifier die slechts één resultaat per tag retourneert, zal de objectdetector meerdere resultaten retourneren, dus alle met een lage waarschijnlijkheid moeten worden gefilterd.
-
Verklaar boven de functie
detectStock
een functie om de voorspellingen te verwerken:void processPredictions(std::vector<JsonVariant> &predictions) { for(JsonVariant prediction : predictions) { String tag = prediction["tagName"].as<String>(); float probability = prediction["probability"].as<float>(); char buff[32]; sprintf(buff, "%s:\t%.2f%%", tag.c_str(), probability * 100.0); Serial.println(buff); } }
Deze functie neemt een lijst met voorspellingen en print ze naar de seriële monitor.
-
Vervang in de functie
detectStock
de inhoud van defor
-lus die door de voorspellingen loopt met het volgende:std::vector<JsonVariant> passed_predictions; for(JsonVariant prediction : predictions) { float probability = prediction["probability"].as<float>(); if (probability > threshold) { passed_predictions.push_back(prediction); } } processPredictions(passed_predictions);
Deze lus doorloopt de voorspellingen en vergelijkt de waarschijnlijkheid met de drempelwaarde. Alle voorspellingen met een waarschijnlijkheid hoger dan de drempelwaarde worden toegevoegd aan een
list
en doorgegeven aan de functieprocessPredictions
. -
Upload en voer je code uit. Richt de camera op objecten op een plank en druk op de C-knop. Je zult de uitvoer zien in de seriële monitor:
Connecting to WiFi.. Connected! Image captured Image read to buffer with length 17416 tomato paste: 35.84% tomato paste: 35.87% tomato paste: 34.11% tomato paste: 35.16%
💁 Mogelijk moet je de
threshold
aanpassen naar een geschikte waarde voor jouw beelden.Je zult het beeld dat is genomen kunnen zien, en deze waarden in het tabblad Predictions in Custom Vision.
💁 Je kunt deze code vinden in de map code-detect/wio-terminal.
😀 Je voorraadtelprogramma was een succes!
Disclaimer:
Dit document is vertaald met behulp van de AI-vertalingsservice Co-op Translator. Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.