Блог проекта AI Builders

Постановка задачи

Недавно, незадолго до того, как присоединиться к этой программе AI Builders, я обнаружил, что на Reddit существует довольно МНОГО кошачьих субреддитов. Несмотря на то, что их список существует, он довольно обширен и состоит из более чем 800 сабреддитов. Но что, если бы мы захотели узнать, в какой из них находится наш кот? Или, может быть, что, если мы наткнемся на породу кошек, которая покажется нам очень милой, и захотим найти фотографии похожих кошек? Ну, это несколько причин, почему я решил начать этот проект.

Процесс сбора данных

Поскольку цель этого проекта — точно классифицировать и давать рекомендации по кошачьим сабреддитам, наиболее разумным местом для их получения является, конечно же, сам Reddit.

В этом проекте мы использовали gallery-dl для пакетной загрузки изображений из каждого субреддита, представленного в виде списка, разделенного новой строкой, а затем слегка сжали изображение с помощью ImageMagick, чтобы сохранить разумный размер набора данных.

Однако, проанализировав данные, которые мы получили с первой попытки, мы видим, что результаты не совсем хорошие, всего около 70–80% для классификации отдельных категорий с явной разницей в цвете меха. Человек, вероятно, может сделать это легко и точно, поэтому мы знаем, что данные, безусловно, нуждаются в улучшении.

Проверив данные вручную, мы обнаружили, что в сабреддите есть некоторые изображения, которые не способствуют обучению, такие как мемы, плакаты, посты в социальных сетях или другие вещи, на которых вообще нет кота.

Чтобы решить эту проблему, мы сначала отфильтровали данные вручную, так как наша тестовая партия состоит всего из 6 категорий, в каждой из которых примерно по тысяче изображений. Это заняло некоторое время, но результат немного улучшился, увеличив точность набора тестов на 4 процента.

Однако я еще не был полностью удовлетворен, очевидно, поскольку эта ранняя модель состоит всего из 6 категорий, и каждая из них может быть легко различима человеком. Поскольку производительность модели зависит от данных, вводимых в модель, если мы добавим мусор, мусор просто вернется обратно. Итак, как мы можем получить более качественные данные?

Одно из решений, с которым я столкнулся, состояло в том, чтобы указать галерее-dl сортировать сообщения по «самым популярным», то есть по топу, а не по тому, что было опубликовано недавно (новое). Это помогло решить проблему низкого качества изображения, поскольку люди с большей вероятностью будут голосовать за более качественные (и симпатичные) изображения. Это помогло значительно повысить точность модели (около 10%).

Однако остается еще одна проблема. Как мы можем автоматизировать удаление изображений, отличных от кошек? Поскольку мы планируем расширить модель, чтобы иметь возможность распознавать множество субреддитов, а это означает, что потребуется загрузить и очистить гораздо больше, что сделает ручную фильтрацию невыгодной. Решение, предложенное нашим наставником, состояло в том, чтобы использовать конвейер «классификации изображений с нулевым выстрелом» от Huggingface, способный классифицировать обычные объекты (ноутбуки) для обнаружения и удаления изображений, где он не обнаруживает кошку. После просмотра результатов это было очень приемлемо, поэтому мы продолжили. Из-за этого наша окончательная точность для маленькой модели (v2) составила 94%.

Как только мы справились со сбором и очисткой базовых данных, пришло время расширить набор данных до большего количества категорий. Сначала мы попробовали, выбрав 45 субреддитов из списка, упомянутого выше, выбрав те, которые должны быть классифицированы (v1). Затем мы отфильтровали сабреддиты с почти идентичными кошками, получив 40 сабреддитов (v2). Тем не менее, все еще есть несколько субреддитов, которые были достаточно похожи друг на друга, из-за чего результаты оценки оставались низкими. Чтобы справиться с этим, мы вместо этого переключились на оценку top-k (3), увеличив точность с 60% до 74% в нашей модели v2.

Наконец, все еще были некоторые категории, которые полагались на тонкие детали, из-за чего ИИ просто не мог их хорошо классифицировать, например, для сонных кошек, злых кошек, толстых кошек или маленьких кошек, в итоге около 32 субреддитов с точностью 84%. на v3, что вполне приемлемо для несерьезных вариантов использования.

Исследовательский анализ данных

Поскольку мы получаем данные из Reddit, мы можем указать, сколько изображений мы хотим загрузить, в результате чего в большинстве категорий будет около 900 изображений (±100).

В процессе очистки обычно удаляется около 50 изображений, поэтому ее влияние на неравенство данных не столь значительно.

Метрики и базовые показатели

Поскольку мы пытаемся создать собственную модель ИИ, нам нужен способ оценить, насколько хороша наша модель, и одним из способов является сравнение нашей точности и других показателей с существующей моделью ИИ. В нашем тесте мы переключили нашу модель и использовали конвейер Huggingface (тот, который мы использовали ранее для очистки наших данных) в оценочной записной книжке. Базовому уровню удалось получить только 59% с оценкой top-k и 39% без нее. По сравнению с нашей последней моделью v3.5, имеющей 86% и около 60% соответственно.

Обучение и оценка модели

В этом проекте мы обучали нашу модель с помощью библиотеки fastai с архитектурой Resnet50. Чтобы оценить нашу модель, мы просто повторили процесс сбора данных снова, через месяц после первоначального сбора, с сортировкой, установленной как «Лучшие сообщения в этом месяце», отфильтровав старые сообщения, которые, возможно, уже использовались в наборе данных для обучения/тестирования. Для процесса оценки было собрано около 100 изображений в каждой категории.

После получения данных мы просто загружаем нашу сохраненную модель, затем получаем список прогнозов. Поскольку мы используем процесс оценки top-k для оценки нашей модели классификации/рекомендации, если основная истина (т. е. то, чем на самом деле является изображение) находится в одной из трех лучших рекомендаций, предложенных моделью, мы примем ее как правильную, затем передайте исправленные значения в scikit-learn, чтобы он мог сгенерировать для нас отчет о классификации. Результаты приведены ниже:

Вот краткая версия, на случай, если текст выше покажется вам слишком маленьким:

Анализ ошибок

Во-первых, модель может работать не так хорошо, как обычно, если сделанное изображение не покрывает большую часть тела кошки, снято под странным углом или далеко. Это вполне понятно, учитывая, что большинство обучающих изображений содержат большую часть тела кошки.

Кроме того, несмотря на то, что мы прошли множество итераций обучающих данных, от улучшения их качества до исключения почти идентичных, в финальном режиме (с точностью 86%) все еще есть проблемы с классификацией похожих и перекрывающихся субреддитов. Например, сиамские кошки и рэгдоллы — это два сабреддита с кошками, очень похожими друг на друга, и иногда модель путается между ними. Кроме того, некоторые категории, такие как стандартная кошка, акварельные кошки и пегие кошки, по-прежнему имеют перекрывающиеся области, и, как вы можете видеть ниже, если кому-то повезет, он может соответствовать всем трем, что иногда приводит к неправильной классификации модели. их.

Развертывание

Чтобы сделать нашу модель общедоступной, нам нужно развернуть нашу модель в простом в использовании приложении, чтобы люди могли использовать нашу модель без необходимости приобретать технические знания, необходимые для ее настройки. В этом проекте наша демонстрация была настроена в Flask, веб-фреймворке Python из-за его простоты и гибкости. После обучения модели мы просто экспортировали модель в файл (.pkl), а затем загружали файл при запуске сервера, подготавливая его к использованию, когда пользователь загружает свое изображение. Вы можете сами опробовать демо здесь.

Благодарности

Наконец, я хотел бы поблагодарить всех наставников и ассистентов программы AI Builders за помощь и поддержку в этом путешествии.

Спасибо за чтение, и хорошего дня!

Ссылки