7.8 KiB
Вызов детектора объектов с вашего IoT-устройства - Wio Terminal
После публикации вашего детектора объектов его можно использовать с вашего IoT-устройства.
Скопируйте проект классификатора изображений
Большая часть вашего детектора объектов аналогична классификатору изображений, который вы создали в предыдущем уроке.
Задача - скопируйте проект классификатора изображений
-
Подключите вашу ArduCam к Wio Terminal, следуя шагам из урока 2 проекта по производству.
Вы также можете зафиксировать камеру в одном положении, например, подвесив кабель над коробкой или банкой, либо прикрепив камеру к коробке с помощью двустороннего скотча.
-
Создайте новый проект для Wio Terminal с использованием PlatformIO. Назовите этот проект
stock-counter
. -
Повторите шаги из урока 2 проекта по производству для захвата изображений с камеры.
-
Повторите шаги из урока 2 проекта по производству для вызова классификатора изображений. Большая часть этого кода будет использована для обнаружения объектов.
Измените код с классификатора на детектор изображений
Код, который вы использовали для классификации изображений, очень похож на код для обнаружения объектов. Основное отличие заключается в URL, который вы получили из Custom Vision, и результатах вызова.
Задача - измените код с классификатора на детектор изображений
-
Добавьте следующий директиву include в начало файла
main.cpp
:#include <vector>
-
Переименуйте функцию
classifyImage
вdetectStock
, изменив как название функции, так и вызов в функцииbuttonPressed
. -
Над функцией
detectStock
объявите пороговое значение для фильтрации любых обнаружений с низкой вероятностью:const float threshold = 0.3f;
В отличие от классификатора изображений, который возвращает только один результат на тег, детектор объектов возвращает несколько результатов, поэтому те, у которых низкая вероятность, нужно отфильтровать.
-
Над функцией
detectStock
объявите функцию для обработки предсказаний: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); } }
Эта функция принимает список предсказаний и выводит их в монитор последовательного порта.
-
В функции
detectStock
замените содержимое циклаfor
, который проходит по предсказаниям, следующим кодом: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);
Этот код проходит по предсказаниям, сравнивая вероятность с пороговым значением. Все предсказания с вероятностью выше порога добавляются в
list
и передаются в функциюprocessPredictions
. -
Загрузите и запустите ваш код. Направьте камеру на объекты на полке и нажмите кнопку C. Вы увидите вывод в мониторе последовательного порта:
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%
💁 Возможно, вам потребуется настроить значение
threshold
для ваших изображений.Вы сможете увидеть изображение, которое было сделано, а также эти значения на вкладке Predictions в Custom Vision.
💁 Вы можете найти этот код в папке code-detect/wio-terminal.
😀 Ваше приложение для подсчета запасов успешно завершено!
Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.