«SeeFood»: создание двоичного классификатора с использованием трансферного обучения
Силиконовая долина - одно из моих любимых шоу. У него безупречный комедийный тайминг, великолепный актерский состав и идеальная карикатура на все, что связано с технологиями. Одна из моих любимых сцен из сериала - это когда один из начинающих предпринимателей, Цзянь Ян, разрабатывает, казалось бы, бесполезное приложение, которое классифицирует еду как «хот-дог» или «не хот-дог».
Я не буду отдавать должное описанию сцены, поэтому вот видео.
Предупреждение: видео содержит нецензурную лексику.
Неудивительно, что существует уже много версий SeeFood. Без сомнения, это идея на миллиард долларов. Мы с моим парнем решили попробовать, чтобы оценить уровень сложности создания простого двоичного классификатора. Наше репо можно найти здесь.
Сбор данных
Первый шаг - найти достаточно изображений хот-догов, а не «хот-догов», чтобы научить наш классификатор тому, как выглядит хот-дог.
Используя Selenium, мы смогли собрать простой скрипт, который сканирует изображения Google для хот-догов. Через пару часов у нас было загружено 2000 изображений хот-догов.
Чтобы создать класс «не хот-дог», мы взяли образцы различных изображений из ImageNet. Наличие большого разнообразия этих изображений важно, потому что это не позволяет классификатору принимать решения, основанные исключительно на цвете, размере или форме.
Следующий шаг - это то, на что жаловался Цзянь Ян. Мы вручную просмотрели обе группы, чтобы убедиться, что все изображения правильно классифицированы. Этот шаг был невероятно утомительным и заставил нас проголодаться.
Передача обучения с помощью Inception V3
Трансферное обучение - это метод машинного обучения, позволяющий использовать знания, полученные от одной модели, на другую. Это экономит время и силы на обучение собственного классификатора и компенсирует нехватку данных. Для этого упражнения мы использовали модель Inception V3, предварительно обученную в ImageNet.
В Inception V3 уже есть класс хот-догов, но мы все равно решили доработать модель, чтобы усилить классификатор. В отличие от оригинального Inception V3, новый классификатор будет различать только хот-доги и «не хот-доги».
Для этого мы удалили слой soft-max предварительно обученной модели (уровень, который предсказывает вероятности) и заменили его новым слоем, который предсказывает только два важных для нас класса.
Тестирование модели
Этот шаг был непростым. Мы не хотели тестировать классификатор с изображениями, которые потенциально могли использоваться для обучения Inception V3, или с изображениями, которые мы скопировали. Это означает, что ни одно изображение хот-дога, найденное в Интернете, не было безопасным.
Однако это дало нам повод купить и съесть хот-доги.
Из исходных изображений, используемых для тестирования, Inception V3 правильно классифицировал хот-доги 9/10, в то время как наш классификатор правильно классифицировал хот-доги 10/10. Оба классификатора смогли идентифицировать «не хот-доги» со 100% точностью.