5.4 KiB
Wywołaj detektor obiektów z urządzenia IoT - Wio Terminal
Po opublikowaniu detektora obiektów, można go używać z urządzenia IoT.
Skopiuj projekt klasyfikatora obrazów
Większość kodu detektora obiektów jest taka sama jak kod klasyfikatora obrazów, który stworzyłeś w poprzedniej lekcji.
Zadanie - skopiuj projekt klasyfikatora obrazów
-
Podłącz ArduCam do Wio Terminal, postępując zgodnie z krokami z lekcji 2 projektu produkcyjnego.
Możesz również ustabilizować kamerę w jednej pozycji, na przykład zawieszając kabel nad pudełkiem lub puszką, albo przymocowując kamerę do pudełka za pomocą taśmy dwustronnej.
-
Utwórz nowy projekt Wio Terminal za pomocą PlatformIO. Nazwij ten projekt
stock-counter
. -
Powtórz kroki z lekcji 2 projektu produkcyjnego, aby przechwycić obrazy z kamery.
-
Powtórz kroki z lekcji 2 projektu produkcyjnego, aby wywołać klasyfikator obrazów. Większość tego kodu zostanie ponownie użyta do wykrywania obiektów.
Zmień kod z klasyfikatora na detektor obrazów
Kod używany do klasyfikacji obrazów jest bardzo podobny do kodu do wykrywania obiektów. Główna różnica polega na adresie URL, który uzyskałeś z Custom Vision, oraz wynikach wywołania.
Zadanie - zmień kod z klasyfikatora na detektor obrazów
-
Dodaj następującą dyrektywę include na początku pliku
main.cpp
:#include <vector>
-
Zmień nazwę funkcji
classifyImage
nadetectStock
, zarówno nazwę funkcji, jak i wywołanie w funkcjibuttonPressed
. -
Nad funkcją
detectStock
zadeklaruj próg, aby odfiltrować wykrycia o niskim prawdopodobieństwie:const float threshold = 0.3f;
W przeciwieństwie do klasyfikatora obrazów, który zwraca tylko jeden wynik na tag, detektor obiektów zwraca wiele wyników, więc te o niskim prawdopodobieństwie muszą zostać odfiltrowane.
-
Nad funkcją
detectStock
zadeklaruj funkcję do przetwarzania przewidywań: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); } }
Funkcja ta przyjmuje listę przewidywań i drukuje je na monitorze szeregowym.
-
W funkcji
detectStock
zastąp zawartość pętlifor
, która przechodzi przez przewidywania, następującym kodem: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);
Pętla przechodzi przez przewidywania, porównując prawdopodobieństwo z progiem. Wszystkie przewidywania o prawdopodobieństwie wyższym niż próg są dodawane do
list
i przekazywane do funkcjiprocessPredictions
. -
Wgraj i uruchom kod. Skieruj kamerę na obiekty na półce i naciśnij przycisk C. Zobaczysz wynik na monitorze szeregowym:
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%
💁 Może być konieczne dostosowanie wartości
threshold
do odpowiedniego poziomu dla Twoich obrazów.Będziesz mógł zobaczyć obraz, który został zrobiony, oraz te wartości w zakładce Predictions w Custom Vision.
💁 Kod ten znajdziesz w folderze code-detect/wio-terminal.
😀 Twój program liczący zapasy zakończył się sukcesem!
Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.