Хостинг Analytics Vidhya

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

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

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

Есть 5 классов кораблей, которые необходимо обнаружить, а именно:

Описание набора данных

В последовательности 6252 изображения и 2680 изображений в тестовых данных. Категории судов и их соответствующие коды в наборе данных следующие:

  • Есть три файла, а именно train.zip, test.csv и sample_submission.csv, которые имеют следующую структуру.

  • train.zip содержит изображения, соответствующие как поезду, так и тесту, а также истинные метки для изображений набора поездов в train.csv

Метрика оценки

Метрика оценки для этого соревнования - взвешенный балл F1.

Государственное и частное разделение

Публичная таблица лидеров основана на случайно выбранных 30% тестовых изображений, в то время как частная таблица лидеров будет оцениваться на оставшихся 70% тестовых изображений.

Подход

Моя подготовка к этому хакатону началась за 3 недели до даты начала, когда он был объявлен как хакатон компьютерного зрения. Я хотел освежить в памяти глубокое обучение, особенно компьютерное зрение, поэтому поискал лучшее онлайн-руководство по DL и наткнулся на золотую жилу, fastai!

Мне потребовалось целых 3 недели, чтобы закончить эти 7 двухчасовых уроков, пытаясь просмотреть их по частям во время двухчасового пути на работу и с очень небольшой практикой в ​​течение двух выходных между ними.

Взлом начинается - 1/3

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

Я начал со встроенной resnet50 архитектуры с предварительно обученными ImageNet весами для обучения модели, а вскоре начал экспериментировать с различными встроенными resnet и densenet моделями. Посмотрев на производительность различных архитектур моделей, доступных в fastai, я решил использовать встроенные архитектуры resnet152 и densenet161 для построения начальных моделей.

После внимательного изучения функции get_transform изменил значения по умолчанию на get_transforms(max_lighting=0.4, max_zoom=1.2, max_warp=0.2, max_rotate=20, xtra_tfms=[flip_lr()])). Мои заявки варьировались от 0.92977 до 0.96650. К концу первой недели я уверенно входил в топ-15.

Взлом усиливается - 2/3

На второй неделе хака я смог многому научиться и многого добиться. Я просматривал конспекты лекций fastai classes 2018 года и узнал о функциях TTA, lr_find() и learn.recorder.plot(suggestion=True) и о технике прогрессивного изменения размера изображения, которые на удивление не затронуты в версии курса 2019 года. Используя эти новые приемы, я смог достичь единственной лучшей densenet161 модели с 0.974822 баллом.

Я понял, что мы можем использовать предварительно обученные модели из этой замечательной коллекции, https://github.com/Cadene/pretrained-models.pytorch в fastai, и использовал этот учебник, чтобы понять структуру головы и тела fastai моделей. Но когда я хотел использовать архитектуры моделей, такие как senet154, se_resnet152, polynet, с использованием ядер Kaggle, у меня не хватало памяти графического процессора. Узнал о трюке learn.to_fp16(), но он бесполезен на Tesla K80 с ядрами Kaggle, поскольку у него нет ядер Tensor, чтобы воспользоваться преимуществами обучения Mixed Precision.

Я решил создать учетную запись GCP с более быстрым GPU Tesla V100 с тензорными ядрами и последовал этому руководству. Обработка запроса на увеличение квоты графического процессора заняла около 3 часов. Я запустил senet154, se_resnet152 models, воспользовавшись обучением смешанной точности.

К настоящему времени у меня было около 17 моделей, и я решил собрать их. Поскольку в столбце выходной категории были отдельные классы, я использовал простой режим для всех представлений, mode(df, axis=1)[0], который дал оценку 0.980409, что помогло мне преодолеть отметку 0,98.

К концу второй недели я настроил среду GCP для более быстрого изучения более крупных моделей, 8-е место в Public LB, но у меня почти не было идей.

Кульминация взлома - 3/3

В свежее утро понедельника третьей и последней недели соревнований, во время повседневной рутинной прокрутки веб-сайтов HackerNews и Towards Data Science, я вижу новую модель SOTA в наборе данных ImageNet, EfficientNet . Я быстро поискал его в Pytorch и нашел это удивительное репозиторий GitHub, в котором были предварительно обученные модели B0-B3. Я также нашел эту статью о подходе победителя, занявшего 1-е место в Intel Scene Classification Challenge.

Я быстро понял, что мне не хватало техники увеличения смешивания и техники удаления сбивающих с толку изображений, которые были очень полезны для участника в достижении вершины. Поэтому включил эти изменения в свой код, и пока я читал о mixup() на странице fastai документов, я узнал о ResizeMethod.SQUISH методе, который позволяет не обрезать изображение по центру до определенного размера, например 224*224,, а сжимать все изображение до необходимого размера. Затем удалили около 100 самых запутанных изображений в наборе поездов и увеличили обучающий набор, указав valid_pct=0.1.

Ниже моя последняя функция get_data,

Ниже представлена ​​модель EfficientNet B3 в fastai,

Я запускал модели B0, B1, B2 и B3 с этим конвейером кода, с единственной лучшей моделью B3, дающей 0.981322 на Public LB. Взял режим этих моделей, который выдал 0.98224. Запустил этот конвейер с resnet152 и densenet161 и взял режим этих представлений с лучшей единственной моделью B3, которая дала 0.979470 на Public LB. Затем последняя подача, которая поставила меня на 5-е место в Public LB, была 3-мя лучшими подачами, которые до сих пор дали оценку 0.988798.

Заключительная заявка сильно подошла к публичной LB и поставила меня на 9-е место в Private LB. Моя заявка в режиме resnet152, densenet161 и efficientnet-b3 показала лучший результат на Private LB и дала бы мне 4-е место. Вот ссылка на Private LB.

Тем не менее, этот хакатон стал для меня исключительным опытом. Спасибо Team AV за такой потрясающий хакатон. Надеюсь встретить всех вас на DataHack Summit 2019. ✌️

Обновление: Код для обучения EfficientNet с использованием FastAI опубликован здесь. Пожалуйста, проголосуйте за ядро ​​Kaggle, если оно вам пригодится.

Спасибо за прочтение! Если вам понравилась эта статья, напишите мне в LinkedIn или Twitter.