Обнаружение объектов. Часть 2: Локализация и классификация |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-02-11 18:00 Простая локализация и классификация объектов с использованием сборки сверточной нейронной сети с помощью Tensorflow/Keras на Python. В моем предыдущем посте я писал о простой проблеме локализации объекта: предсказании ограничивающей рамки одного прямоугольника на нейтральном фоне. Однако этот подход был ограничен одной формой и не позволял различать несколько форм. В этом посте я решу эту проблему, расширив предыдущую модель, чтобы она могла классифицировать и форму объектов. Для этого я создам простой игрушечный набор данных и построю простую CNN с двумя головками: головкой регрессии для прогнозирования ограничивающей рамки и головкой классификации для распознавания формы. Задание Входные данные сети — это изображение с черным фоном, отображающее одну из трех фигур: прямоугольник, круг или треугольник. Для простоты я решил использовать изображения в оттенках серого вместо цветных. Три формы.У сети две основные цели: локализация объекта и классификация формы. Локализация происходит путем прогнозирования ограничивающей рамки фигуры, которая имеет форму , где это координаты верхнего левого угла, а и ширина и высота соответственно. Для классификации будет использоваться вектор горячего кодирования. Таким образом, конечный целевой вектор имеет форму , где первые три позиции отвечают за классификацию формы ( прямоугольник, круг, треугольник ), а последние четыре — за предсказание ограничивающей рамки. Создать набор данных Как и в предыдущем посте, я создам набор данных самостоятельно, используя numpy и OpenCV. Визуализация осуществляется с помощью matplotlib. Изображения будут иметь форму , а минимальный размер каждого объекта в пикселях . Для каждого класса будет создано 10 000 изображений.
Создание прямоугольников довольно простое. Сначала создается массив изображений с размерностью , где соответствует цветовому каналу (серый = 1). Тогда , , и генерируются случайным образом с соблюдением минимального размера. После этого функция OpenCV используется для добавления прямоугольника в массив черных изображений. Функция возвращает изображение, а также целевой вектор, который состоит из горячего кодирования классификации , указывающего, что фигура представляет собой прямоугольник, и соответствующих значений ограничивающей рамки .
Изображение круга генерируется аналогичным образом, но вместо генерации случайной ширины и высоты случайным образом генерируется радиус.
Наконец, нам нужна функция для создания треугольников. Это делается путем генерации случайных , , и , с помощью которых можно создать четыре точки прямоугольника. Затем одна из этих четырех точек случайным образом удаляется, а оставшиеся три точки используются как углы треугольника.
Теперь мы можем собрать все вместе и создать наш набор данных следующим образом.
Позже мы также реализуем функцию, которая преобразует вектор горячего кодирования в письменную метку. Например, прямоугольник .
Теперь давайте отобразим некоторые из наших данных, чтобы проверить, правильно ли они сработали. Некоторые образцы набора данных игрушек. Подготовьте данные При обработке изображений принято нормализовать значение пикселя по центру вокруг 0, что я и сделаю, разделив значения изображения на 255 (максимальное значение RGB) и вычитая 0,5. Кроме того, я перетасую данные, так как на данный момент образцы заказаны.
Следующим шагом является разделение набора данных на обучающий, проверочный и тестовый набор.
Сверточная нейронная сеть Цель сети — предсказать ограничивающую рамку, а также класс объекта. Следовательно, у нас есть регрессия, а также проблема классификации. Для задач регрессии среднеквадратическая ошибка обычно является подходящей функцией потерь, тогда как для задач классификации часто лучше использовать категориальную перекрестную энтропию. Кроме того, для классификации обычно используется функция активации Softmax, поскольку она преобразует выходные данные в распределение вероятностей, где каждый выходной сигнал находится в диапазоне, и все выходные данные в сумме дают 1.
Следовательно, чтобы иметь как результаты классификации, так и результаты регрессии, нам нужно разделить выходные данные сетей на две части. Тогда архитектура будет следующей: Сетевая архитектура с главой регрессии и классификации.Для двух голов сети (регрессии и классификации) нам нужно разделить целевой вектор .
Теперь пришло время построить окончательную модель. Эта сеть не представляет собой линейный стек слоев, поэтому нам нужно использовать функциональный API Tensorflow, который позволяет реализовать две выходные головки.
Как вы можете видеть в этом блоке кода, мы сначала создаем простой линейный стек сверточных слоев и слоев с максимальным пулом, которые свертывают изображение. Затем входные данные сглаживаются и добавляется выпадающий слой, чтобы предотвратить переобучение. Теперь самое сложное. Выходные данные слоя исключения передаются как в плотный слой для классификации с активацией Softmax, так и в плотный слой для регрессии. Чтобы лучше представить себе, что произошло, давайте построим модель. Архитектура модели с формами ввода/вывода. Теперь ясно видно, что выходные данные слоя исключения передаются как в классификацию, так и в головку регрессии. Пришло время скомпилировать модель.
Я использую Оптимизатор Адама и два разных Потери, по одному на каждую голову. Головка классификации обучается с использованием категориальной перекрестной энтропийной потери и головы регрессии со среднеквадратической ошибкой. Пришло время обучить модель. Здесь важно передать разделенную версию целевого вектора .
Обучение модели в течение 35 эпох на моей установке (графический процессор: Nvidia GeForce GTX 1050 Ti, процессор: Intel i5-3470) занимает около 3 минут 57 секунд. Полученные результаты Оценивая историю процесса обучения, можно увидеть, как уменьшаются потери обеих головок, а точность классификации увеличивается с течением времени. Потеря для обеих глав по эпохам, а также точности классификации по эпохам.Давайте оценим модель на (невидимых) тестовых данных.
В классификации модель работает достаточно хорошо, с потерей точности в %. Но, по правде говоря, эту задачу для сети освоить не так уж и сложно. Но и потеря среднеквадратической ошибки для регрессии ограничивающего прямоугольника кажется хорошей. Опять же, как упоминалось в предыдущем посте, точность регрессии ограничивающей рамки не является хорошим показателем оценки. Среднее значение пересечения по объединению здесь является лучшим показателем точности.
Среднее Пересечение над Союзом — это не так уж и плохо. Давайте визуализируем некоторые примеры нашего тестового набора: Результирующие прогнозы ограничивающего прямоугольника и соответствующая достоверность классификации, а также IoU.Каждая из фигур была правильно распознана, и каждая ограничивающая рамка была предсказана относительно точно. Заключение В этом сообщении блога мы создаем простую сверточную нейронную сеть, которая способна локализовать и классифицировать фигуру на нейтральном фоне. Для этого мы разделили голову сети на голову регрессии и классификации ограничительной рамки. Однако по-прежнему существует недостаток: модель может классифицировать и локализовать только один объект на изображении. Как мы можем классифицировать и локализовать несколько объектов на изображении? В следующем посте я попытаюсь решить эту проблему и построить модель, которая сможет распознавать несколько фигур на изображении. Если у вас есть какие-либо комментарии или сомнения по поводу того, что я уже сделал, не стесняйтесь оставлять комментарии или писать по электронной почте. Источник: johfischer.com Комментарии: |
|