Вопрос или проблема
У меня есть четкие изображения карт и размытые изображения карт. Моя задача — сделать фотографию, когда изображение не размыто, как вы можете видеть из описания, мне нужно, чтобы этот код работал в реальном времени на устройстве Android.
Я провел некоторые исследования по этой теме «Определение размытых изображений» и нашел несколько интересных решений.
- Применение преобразований OpenCV, таких как фильтр Лапласа или Собеля. Размытие изображения будет иметь меньше границ. А затем, используя такие техники, как SVM, определить, какое изображение имеет меньше границ.
- Использовать другие преобразования OpenCV, аналогичные Собелю, чтобы получить границы изображений и затем найти изображение с меньшим количеством границ.
Хотя эти преобразования дают хороший результат, они очень медленные. Мне нужно что-то, что имеет скорость, аналогичную детекции объектов tflite на Android. Учитывая эту логику, моим очевидным шагом было аннотировать изображения 1500 (размытых карт) против 1500 (четких карт) и дообучить модель ssdmobilenet, используя TensorFlow Object Detection API.
Мой набор данных
Однако, когда я экспортировал обученную модель на Android, результат был абсолютно неразборчивым, похоже, модель не усвоила ничего из данных. Мой вопрос: можно ли решить эту проблему с помощью API детекции объектов, как я упоминал выше? Если да, где я ошибаюсь? Если нет, какие самые быстрые альтернативы для определения размытия в реальном времени?
Одна из идей — использовать мелкую (с небольшим числом слоев) СNN. Глубокие СNN хорошо подходят для обнаружения объектов на изображениях. Мелкие сети сосредоточены на более низкоуровневых характеристиках, таких как границы, текстуры и цвета. Поэтому я предлагаю обучить более простую сеть на большем наборе данных, обучая ее на патчах изображений, а не на полных картах. Если большинство ваших патчей классифицируются как размытые, то вы классифицируете всю карту как размытое.
Я искал что-то подобное. Возможно, это поможет вам и другим.
Для скрипта камеры в реальном времени:
Для изображений в галерее:
На случай, если это поможет, я создал пакет Python под названием CleanVision, который точно обнаруживает размытые изображения (эффективно с помощью некоторых простых математических вычислений, над которыми мы усердно работали, чтобы гарантировать, что это хорошо работает на практике).
Ответ или решение
Чтобы эффективно обнаружить размытие изображений в реальном времени на устройствах Android с использованием TensorFlow и модели SSD MobileNet, необходимо учитывать несколько ключевых моментов. Давайте рассмотрим пошаговый подход к решению этой задачи.
1. Подход к решению проблемы
Процесс определения размытия изображения можно разделить на несколько этапов:
-
Сбор данных: У вас уже есть набор изображений с четкими и размытыми карточками. Убедитесь, что данные хорошо размечены и разнообразны. Это критически важно для успешного обучения модели.
-
Аугментация данных: Для улучшения качества модели вы можете применить аугментацию данных, чтобы увеличить разнообразие вашего обучающего набора. Это может включать случайные обрезки, повороты, изменения яркости и контраста.
-
Модель: Хотя SSD MobileNet эффективно распознает объекты, его использование для классификации изображений (четкие против размытых) может быть не самым подходящим вариантом. Рассмотрите возможность использования более простой архитектуры нейронной сети, специализированной на меньших особенностях, таких как размытость, которая может быстрее обрабатывать изображения и требовать меньше вычислительных ресурсов.
2. Обучение модели
-
Выбор архитектуры: Рассмотрите возможность использования небольшой сверточной нейронной сети (CNN), специально сконструированной для обнаружения размытия. Это может быть сеть с несколькими слоями, которая хорошо работает с низкоуровневыми признаками, такими как края и текстуры.
-
Обучение: Используйте ваш набор данных для обучения модели. Вам нужно будет настроить модель для классификации на две категории (размытое и четкое) и использовать подход генерации мини-батчей для повышения эффективности.
3. Экспорт модели для использования на Android
-
Используйте TensorFlow Lite для экспорта вашей модели. Убедитесь, что вы применяете подходящие опции оптимизации, чтобы модель работала эффективно на мобильных устройствах. Это может включать уменьшение размерности модели и применение квантизации.
-
Протестируйте модель на реальных данных, используя простые входные данные, чтобы убедиться, что она работает с заданным уровнем точности и скоростью.
4. Реализация на Android
-
Создание приложения: Используйте Android Studio и библиотеки TensorFlow Lite для интеграции вашей модели. Отслеживайте данные с камеры и передавайте их в модель для определения размытости.
-
Обработка изображений: Применяйте модель к кадрам, получаемым из камеры, чтобы проверить их четкость. Если изображение размытое, можно игнорировать его или повторить захват.
5. Дополнительные советы
-
Тестирование и отладка: Тестируйте модель в различных условиях освещения и с различными фонами. Это поможет улучшить устойчивость вашей модели к шумам и другим нежелательным эффектам.
-
Обратная связь и улучшения: Собирайте данные о работе вашего приложения и используйте их для будущих улучшений модели.
Альтернативные решения
Если использование SSD MobileNet не оправдывается по результатам, вы можете рассмотреть более простые методы на основе предварительных обработок изображений, таких как использование фильтров Лапласа или Собеля для определения четкости изображения с помощью мер на основе градиентов. Эти методы могут быть менее требовательными к ресурсам и давать результаты быстрее, но могут уступать по точности сложным моделям глубокого обучения.
Заключение
Подходы, основанные на глубоких нейронных сетях, могут быть мощными, но требуют значительных усилий в обучении и настройке. Использование более простых архитектур или традиционных методов обработки изображений может стать практичным решением для вашей задачи по выявлению размытости изображений на мобильных устройствах.