Не поймите меня неправильно. С туалетами у меня проблем нет. Это одно из лучших изобретений в истории, но на самом деле это не самые лучшие изображения для продажи недвижимости!

Итак, вот проблема: у нас есть сотни тысяч объявлений, и наша замечательная маркетинговая команда сообщила, что время от времени изображение туалета будет появляться в нашем маркетинговом фиде для кампаний CPC и электронных писем, что на самом деле не идеально для нас. продвижение списков наших клиентов.

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

С точки зрения науки о данных это не особенно сложная задача. Это проблема классификации обычных изображений, когда все, что нам нужно сделать, это обучить двоичный классификатор, чтобы определять, содержит ли данное изображение туалет / ванную комнату или нет. Мы могли проявить больше фантазии (учитывая прогнозируемый спрос со стороны наших гуру маркетинга 🔮) и обучить мульти-классификатор, который не только использовался бы для выбора изображения, не связанного с туалетом, но и помог бы Мы проверим, какие типы изображений свойств дадут наивысший коэффициент конверсии, но на этом этапе поиск туалетов - это главная задача.

Данные, данные и другие данные:

Как и в большинстве случаев лучших разработок в области науки о данных, это оказалось не так просто, как кажется.

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

Выбор статистически репрезентативной выборки в нашем случае был проблемой взвешенной выборки, когда мы присвоили более высокие относительные веса наиболее рекламируемым местоположениям. То есть местоположения с наибольшим количеством активных объявлений. Как только мы определили эти списки, мы передаем этот список pandas для выборки следующим образом:

Этот процесс известен как стратифицированная выборка, которая представляет собой простую выборку из совокупности, которую можно в дальнейшем сгруппировать в субпопуляции. В нашем случае мы сгруппировали листинг по местонахождению и типу (аренда, покупка, коммерческий и т. Д.). Мы могли бы расширить его, включив количество просмотров, ценовые категории и т. Д. Здесь качество данных представляет собой наиболее важную часть, поскольку мы будем использовать предварительно обученную модель и настраивать только последний слой (подробнее об этом чуть позже! )

В итоге мы отобрали около 40 000 изображений из миллионов, которые нам нужны для начала обучения.

Выбор модели:

Мы используем AWS и Google Cloud Platform для поддержки нашей инфраструктуры. Первым делом нужно было выяснить, можем ли мы использовать API машинного обучения, доступные в любом из них. Например, Amazon Rekognition - отличная платформа, и она может быть действительно полезной для многих случаев использования. Однако есть два фактора, если вы решите полагаться на готовые API машинного обучения:

  • Расходы
  • Сложность

При обработке миллионов изображений свойств стоимость использования API может стать очень значительной. Зачем платить несколько тысяч долларов в месяц, если вы потенциально можете обучить модель, соответствующую вашим потребностям, за небольшую часть стоимости? Особенно когда точность результатов не гарантируется!

Вам также нужно будет подумать о том, как интегрировать API с существующим конвейером, извлечь (и, возможно, сопоставить) ответ прогнозов в соответствии с вашими потребностями. И позаботьтесь о перемещении ваших данных, если они находятся в другой среде или даже в другом регионе AWS. Видите ли, сложности могут действительно накапливаться, когда мы думаем о том, чтобы воплотить это в жизнь, поэтому на самом деле это не так просто, как просто вызвать API.

Передача обучения на помощь

Я исследовал как Keras / Tensorflow, так и Pytorch как самые популярные фреймворки для машинного обучения, однако лично я предпочитаю использовать Pytorch. Torchvision предлагает потрясающий выбор наборов данных и моделей, на которых можно учиться и использовать в своих проектах. Это также отличное место для начала, если вы новичок и хотите сосредоточиться на проблемах компьютерного зрения.

Итак, во-первых, что такое Трансферное обучение?

Трансферное обучение - это процесс использования модели, обученной в одной области, для использования в качестве отправной точки в другой (связанной) области.

Мы использовали Pytorch Resnet18; Resnet прошел предварительное обучение на наборе данных Imagenet с тысячами классов ILSVRC2015. Ансамбль этих моделей занял 1-е место в задании по классификации ILSVRC 2015. Подробнее об этом наборе данных Kaggle здесь.

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

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

Если у вас есть базовые представления о Pytorch, вы можете выполнить полное руководство по обучению переносу здесь. Вы также можете узнать больше о потенциале создания моделей собственными силами из этой блестящей публикации на Airbnb.

Данные, опять же

Поскольку у нас не так много размеченных данных, как мы упоминали ранее, нам пришлось запустить процесс разметки вручную, прежде чем мы сможем обучить модель. Для быстрого начала было собственноручно пометить данные (и огромный привет моей коллеге Джемме Бэтти за ее помощь!). На данный момент нам не нужны ограничивающие рамки, и это сделало маркировку столь же интуитивно понятной, как простое перетаскивание файлов изображений в несколько каталогов, каждый из которых представляет метку класса. Затем мы использовали класс Torchvision ImageFolder для автоматического выбора этих классов на основе структуры каталогов, как указано в этом фрагменте кода.

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

Модель Производительность

К счастью, у нас не было проблемы дисбаланса классов, поэтому мы использовали точность проверки для измерения производительности модели. За 10 эпох обучения нам удалось получить точность порядка 88%. Наш процесс маркировки данных все еще продолжается, и точность может повыситься с увеличением количества данных, если в модели еще есть место, прежде чем она начнет переобучаться.

Другими словами, если ваша модель еще не переоборудована, она все равно может изучать закономерности из ваших данных (путем добавления дополнительных данных, введения дополнения данных, увеличения сложности модели и т. Д.)

Вывод

  • Чтобы обучить классификатор изображений, вам не нужно начинать с нуля, если вы можете использовать переносное обучение для решения своей проблемы.
  • Сбор и обработка данных обычно важнее, чем выбор модели. Мы могли бы получить близкие результаты, используя другую предварительно обученную модель. Возможно, с большим количеством данных и / или итераций обучения. Большая часть времени и усилий, потраченных на решение этой проблемы, была связана со сбором данных, маркировкой и другими задачами, связанными с инфраструктурой.

Спасибо за чтение. Не стесняйтесь комментировать, задавать вопросы или обращаться к нам.

Вот и все! Спасибо за чтение!

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