Хостинг 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, если оно вам пригодится.