VGG16 — сверточная сеть для выделения признаков изображений

23 ноября 2018
vgg16 нейронная сеть

VGG16 — сверточная сеть для выделения признаков изображений

VGG16 — модель сверточной нейронной сети, предложенная K. Simonyan и A. Zisserman из Оксфордского университета в статье “Very Deep Convolutional Networks for Large-Scale Image Recognition”. Модель достигает точности 92.7% —…

VGG16 — модель сверточной нейронной сети, предложенная K. Simonyan и A. Zisserman из Оксфордского университета в статье “Very Deep Convolutional Networks for Large-Scale Image Recognition”. Модель достигает точности 92.7% — топ-5, при тестировании на ImageNet в задаче распознавания объектов на изображении. Этот датасет состоит из более чем 14 миллионов изображений, принадлежащих к 1000 классам.

VGG16 — одна из самых знаменитых моделей, отправленных на соревнование ILSVRC-2014. Она является улучшенной версией AlexNet, в которой заменены большие фильтры (размера 11 и 5 в первом и втором сверточном слое, соответственно) на несколько фильтров размера 3х3, следующих один за другим. Сеть VGG16 обучалась на протяжении нескольких недель при использовании видеокарт NVIDIA TITAN BLACK.

слои vgg16

Датасет

ImageNet — набор данных, состоящий из более чем 15 миллионов размеченных высококачественных изображений, разделенных на 22000 категорий. Изображения были взяты из интернета и размечены вручную людьми-разметчиками с помощью краудсорсинговой площадки Mechanical Turk от Amazon.

В 2010 году, как часть Pascal Visual Object Challenge, началось ежегодное соревнование — ImageNet Large-Scale Visual Recognition Challenge (ILSVRC). В ILSVRC используется подвыборка из ImageNet размером 1000 изображений в каждой из 1000 категорий. Таким образом, тренировочный сет состоял из примерно 1.2 миллионов изображений, проверочный — 50000 изображений, тестовый — 150000 изображений. Так как ImageNet состоит из изображений разного размера, то их необходимо было привести к единому размеру 256х256. Если изображение представляет из себя прямоугольник, то оно масштабируется и из него вырезается центральная часть размером 256х256.

Архитектура

Архитектура VGG16 представлена на рисунке ниже.

Архитектура нейросети vgg16

На вход слоя conv1 подаются RGB изображения размера 224х224. Далее изображения проходят через стек сверточных слоев, в которых используются фильтры с очень маленьким рецептивным полем размера 3х3 (который является наименьшим размером для получения представления о том,где находится право/лево, верх/низ, центр).

В одной из конфигураций используется сверточный фильтр размера 1х1, который может быть представлен как линейная трансформация входных каналов (с последующей нелинейностью). Сверточный шаг фиксируется на значении 1 пиксель. Пространственное дополнение (padding) входа сверточного слоя выбирается таким образом, чтобы пространственное разрешение сохранялось после свертки, то есть дополнение равно 1 для 3х3 сверточных слоев. Пространственный пулинг осуществляется при помощи пяти max-pooling слоев, которые следуют за одним из сверточных слоев (не все сверточные слои имеют последующие max-pooling). Операция max-pooling выполняется на окне размера 2х2 пикселей с шагом 2.

После стека сверточных слоев (который имеет разную глубину в разных архитектурах) идут три полносвязных слоя: первые два имеют по 4096 каналов, третий — 1000 каналов (так как в соревновании ILSVRC требуется классифицировать объекты по 1000 категориям; следовательно, классу соответствует один канал). Последним идет soft-max слой. Конфигурация полносвязных слоев одна и та же во всех нейросетях.

Все скрытые слои снабжены ReLU. Отметим также, что сети (за исключением одной) не содержат слоя нормализации (Local Response Normalisation), так как нормализация не улучшает результата на датасете ILSVRC, а ведет к увеличению потребления памяти и времени исполнения кода.

Конфигурация

Конфигурации сверточных сетей представлены на рисунке 2. Каждая сеть соответствует своему имени (A-E). Все конфигурации имеют общую конструкцию, представленную в архитектуре, и различаются только глубиной: от 11 слоев с весами в сети A (8 сверточных и 3 полносвязных слоя) до 19 (16 сверточных и 3 полносвязных слоя). Ширина сверточных слоев (количество каналов) относительно небольшая: от 64 в первом слое до 512 в последнем с увеличением количества каналов в 2 раза после каждого max-pooling слоя.

vgg16
Рисунок 2

Реализация

К сожалению, сеть VGG имеет два серьезных недостатка:

  1. Очень медленная скорость обучения.
  2. Сама архитектура сети весит слишком много (появляются проблемы с диском и пропускной способностью)

Из-за глубины и количества полносвязных узлов, VGG16 весит более 533 МБ. Это делает процесс развертывания VGG утомительной задачей. Хотя VGG16 и используется для решения многих проблем классификации при помощи нейронных сетей, меньшие архитектуры более предпочтительны (SqueezeNet, GoogLeNet и другие). Несмотря на недостатки, данная архитектура является отличным строительным блоком для обучения, так как её легко реализовать.

[Pytorch]

[Tensorflow]

[Keras]

Результаты

VGG16 существенно превосходит в производительности прошлые поколения моделей в соревнованиях ILSVRC-2012 and ILSVRC-2013. Достигнутый VGG16 результат сопоставим с победителем соревнования по классификации (GoogLeNet с ошибкой 6.7%) в 2014 году и значительно опережает результат Clarifai победителя ILSVRC-2013, который показал ошибку 11.2% с внешними тренировочными данными и 11.7% без них. Что касается одной сети, архитектура VGG16 достигает наилучшего результата (7.0% ошибки на тесте), опережаю одну сеть GoogLeNet на 0.9%.

Было показано, что глубина представления положительно влияет на точность классификации, и state-of-the-art результат на соревновательном датасете ImageNet может быть достигнут с помощью обычной сверточной нейронной сети с значительно большей глубиной.

Нейронную сеть научили обнаруживать галактики

7 ноября 2018

Нейронную сеть научили обнаруживать галактики

Исследователи из Университета Западной Австралии создали сеть ClaRAN, которая определяет расположение галактик в глубоком космосе, анализируя излучение черных дыр, полученное с помощью радиотелескопов. Анализ излучения Черные дыры находятся в центре…

Исследователи из Университета Западной Австралии создали сеть ClaRAN, которая определяет расположение галактик в глубоком космосе, анализируя излучение черных дыр, полученное с помощью радиотелескопов.

Анализ излучения

Черные дыры находятся в центре большинства галактик и излучают мощные радиосигналы, которые распространяются далеко за пределы галактики. Исследователи обнаруживают это излучение с помощью радиотелескопов. Проблема состоит в том, что радиосигналы рассеиваются далеко от источника, поэтому местоположение галактики трудно распознать. Команда из ученых из Университета Западной Австралии обучила алгоритм ClaRAN обнаруживать излучение и распознавать его источник со средней точностью 83,6% и эмпирической точностью 90%.

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

 

Особенности модели

В работе использована Faster R-CNN, разработанная исследователями Microsoft и Facebook. Команда университета изменила алгоритм, обучив его распознаванию радио- и инфракрасного излучения на изображениях. Для обучения использовался набор данных с 6141 изображениями и разными видами излучения.

Модель находит источники излучения в заданной области и классифицирует тип галактики. ClaRAN обучена различать 6 классов радиогалактик.

Кроме того, ClaRAN — первая модель для классификации источников радиоизлучения с открытым исходным кодом. В дальнейшем исследователи планируют улучшать точность алгоритма. Он обладает большим потенциалом в изучении данных, полученных с телескопов.

AlexNet — свёрточная нейронная сеть для классификации изображений

1 ноября 2018

AlexNet — свёрточная нейронная сеть для классификации изображений

AlexNet — сверточная нейронная сеть, которая оказала большое влияние на развитие машинного обучения, в особенности — на алгоритмы компьютерного зрения. Сеть с большим отрывом выиграла конкурс по распознаванию изображений ImageNet LSVRC-2012…

AlexNet — сверточная нейронная сеть, которая оказала большое влияние на развитие машинного обучения, в особенности — на алгоритмы компьютерного зрения. Сеть с большим отрывом выиграла конкурс по распознаванию изображений ImageNet LSVRC-2012 в 2012 году (с количеством ошибок 15,3% против 26,2% у второго места).

Архитектура AlexNet схожа с созданной Yann LeCum сетью LeNet. Однако у AlexNet больше фильтров на слое и вложенных сверточных слоев. Сеть включает в себя свертки, максимальное объединение, дропаут, аугментацию данных, функции активаций ReLU и стохастический градиентный спуск.

Особенности AlexNet

  1. Как функция активации используется Relu вместо арктангенса для добавления в модель нелинейности. За счет этого при одинаковой точности метода скорость становится в 6 раз быстрее.
  2. Использование дропаута вместо регуляризации решает проблему переобучения. Однако время обучения удваивается с показателем дропаута 0,5.
  3. Производится перекрытие объединений для уменьшения размера сети. За счет этого уровень ошибок первого и пятого уровней снижаются до 0,4% и 0,3%, соответственно.

Датасет ImageNet

ImageNet — набор из 15 миллионов помеченных изображений с высоким разрешением, разделенных на 22 000 категорий. Изображения собраны в интернете и помечены вручную с помощью краудсорсинга Amazon’s Mechanical Turk. Начиная с 2010 года проводится ежегодный конкурс ImageNet Large-Scale Visual Recognition Challenge (ILSVRC), являющийся частью Pascal Visual Object Challenge. В челлендже используется часть датасета ImageNet с 1000 изображений в каждой из 1000 категорий. Всего получается 1,2 миллиона изображений для обучения, 50 000 изображений для проверки и 150 000 — для тестирования. ImageNet состоит из изображений с разным разрешением. Поэтому для конкурса их масштабируют до фиксированного разрешения 256 × 256. Если изначально изображение было прямоугольным, то его обрезают до квадрата в центре изображения.

Архитектура

Рисунок 1

Архитектура сети приведена на рисунке 1. AlexNet содержит восемь слоев с весовыми коэффициентами. Первые пять из них сверточные, а остальные три — полносвязные. Выходные данные пропускаются через функцию потерь softmax, которая формирует распределение 1000 меток классов. Сеть максимизирует многолинейную логистическую регрессию, что эквивалентно максимизации среднего по всем обучающим случаям логарифма вероятности правильной маркировки по распределению ожидания. Ядра второго, четвертого и пятого сверточных слоев связаны только с теми картами ядра в предыдущем слое, которые находятся на одном и том же графическом процессоре. Ядра третьего сверточного слоя связаны со всеми картами ядер второго слоя. Нейроны в полносвязных слоях связаны со всеми нейронами предыдущего слоя.

Таким образом, AlexNet содержит 5 сверточных слоев и 3 полносвязных слоя. Relu применяется после каждого сверточного и полносвязного слоя. Дропаут применяется перед первым и вторым полносвязными слоями. Сеть содержит 62,3 миллиона параметров и затрачивает 1,1 миллиарда вычислений при прямом проходе.  Сверточные слои, на которые приходится 6% всех параметров, производят 95% вычислений.

Обучение

AlexNet проходит 90 эпох. Обучение занимает 6 дней одновременно на двух графических процессорах Nvidia Geforce GTX 580, что является причиной того, что сеть разделена на две части. Используется стохастический градиентный спуск со скоростью обучения 0,01, импульсом 0,9 и распадом весовых коэффициентов 0,0005. Скорость обучения делится на 10 после насыщения точности и снижается в 3 раза в течение обучения. Схема обновления весовых коэффициентов w имеет вид:

где i — номер итерации, v — переменная импульса, а epsilon — скорость обучения. В ходе всего этапа обучения скорость обучения выбиралась равной для всех слоев и корректировалась вручную. Последующая эвристика заключалась в том, чтобы разделить скорость обучения на 10, когда количество ошибок при проверке переставало уменьшаться.

Примеры использования и реализация

Результаты показывают, что большая, глубокая сверточная нейронная сеть способна достигать рекордных результатов на очень сложных датасетах, используя только обучение с учителем. Через год после публикации AlexNet все участники конкурса ImageNet стали использовать сверточные нейронные сети для решения задачи классификации. AlexNet была первой реализацией сверточных нейронных сетей и открыла новую эру исследований. Сейчас реализовать AlexNet стало проще с помощью библиотек глубокого обучения: PyTorch, TensorFlow, Keras.

Результат

Сеть достигает следующего уровня ошибок первого и пятого уровней: 37,5% и 17,0%, соответственно. Лучшая производительность, достигнутая в ходе конкурса ILSVRC-2010, составляла 47,1% и 28,2% при использовании подхода, в котором усредняются предсказания, полученные шестью моделями с разреженным кодированием, обученных на различных векторах свойств.  С тех пор достигнуты результаты: 45,7% и 25,7% при использовании подхода, в котором усредняются предсказания двух классификаторов, обучаемых на векторах Фишера. Результаты ILSVRC-2010 приведены в таблице 1.

 

 

 

Слева: восемь тестовых изображений ILSVRC-2010 и пять ярлыков, которые наиболее вероятны по мнению модели. Правильная метка записывается под каждым изображением, а вероятность показана красной полосой, если она находится в верхней пятерке. Справа: пять тестовых изображений ILSVRC-2010 в первом столбце. В остальных столбцах показаны шесть обучающих изображений.

Нейронная сеть от Google AI выявляет раковые метастазы с точностью 99%

25 октября 2018

Нейронная сеть от Google AI выявляет раковые метастазы с точностью 99%

Google AI разрабатывают алгоритмы глубокого обучения для обнаружения раковых новообразований. Недавно алгоритм LYNA, первый раз представленный командой в 2017 году, достиг 99% точности в обнаружении метастаз рака молочной железы. В…
Google AI разрабатывают алгоритмы глубокого обучения для обнаружения раковых новообразований. Недавно алгоритм LYNA, первый раз представленный командой в 2017 году, достиг 99% точности в обнаружении метастаз рака молочной железы. В будущем разработка может использоваться для ускорения диагностики и уточнения диагнозов патологоанатомов.

Инструмент для помощи патологоанатомам

В основе LYNA (Lymph Node Assistant) лежит алгоритм Inception-v3 — open source модель для распознавания изображений, которая уже использовалась ранее для диагностики рака легких, меланомы и ретинопатии. Работу модели протестировали на двух наборах данных с образцами патологий рака молочной железы. В обоих наборах алгоритму удалось правильно отличить слайд с метастатическим раком от слайда без рака в 99% случаев. Кроме того, модель точно определила области с метастазами и другие подозрительные регионы на каждом слайде. Многие из них слишком малы, чтобы быть обнаруженными вручную. Таким образом, ещё одно из возможных применений  LYNA — выделение проблемных зон для патологоанатомов для помощи в анализе и постановке окончательного диагноза.
Слева: лимфатический узел с небольшой метастатической опухолью молочной железы. Справа: тот же слайд, с зонами, выделенными алгоритмом.

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

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

Нейросеть оценивает незабываемость природной сцены

15 октября 2018
незабываемая сцена

Нейросеть оценивает незабываемость природной сцены

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

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

При перенасыщении визуальными образами, субъекты проявляют тенденцию запоминать или же забывать одни и те же снимки. Это применимо в основном к общим изображениям, фотографиям объектов и лиц. Тем не менее, сложно отыскать признаки, определяющие запоминаемость естественной сцены. На 2018 год методы прогнозирования визуальной запоминаемости естественной сцены не развиты.

Предыдущие работы

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

  • Ученые из Массачусетского технологического института натренировали MemNet на крупной базе изображений, и добились точности прогнозирования близкой к тому, как человеческий разум ранжирует фотографии.
  • В MIT также создали базу данных для оценки запоминаемости человеческих лиц. Они дополнительно исследовали вклад отдельных признаков (например, доброта, степень доверия) на запоминаемость, но такие характеристики лишь частично объяснили степень запоминаемости лиц.

Новый подход

Исследователи Бэйханского университета в Пекине создали базу данных LNSIM. В базе данных LNSIM 2632 изображений естественных сцен. Для получения этих изображений из датасетов MIR Flickr, MIT1003, NUSEF и базы данных AVA было выбрано 6,886 изображений, из которых затем отобрали исключительно природные сцены.

Рис: 1 Примеры фотографий из датасета LNSIM
Рис: 1 Примеры фотографий из датасета LNSIM

Специальная игра на память используется для количественной оценки запоминаемости каждого изображения в базе данных LNSIM. Разработано программное обеспечение, в котором было задействовано 104 субъекта (47 женщин и 57 мужчин). В их числе не было добровольцев, которые участвовали в отборе изображений. Схема нашей игры приведена на рисунке 2.

Процедура проведения игры. Каждый уровень занимает около 5,5 минут, всего имеется 186 изображений. Эти 186 изображений состоят из 66 целевых, 30 наполнительных и 12 изображений на бдительность. Временные интервалы для установки эксперимента обозначены выше.

В этом эксперименте было использовано 2632 целевых изображения, 488 изображений на бдительность и 1200 изображений-наполнителей, все они были неизвестны испытуемым. Изображения на бдительность и наполнители были случайным образом отобраны из 6886 изображений. Образцы на бдительность повторялись в пределах 7 изображений, чтобы быть уверенным, что испытуемые сосредоточены на игре. Изображения-наполнители были представлены один раз, так чтобы можно было задать расстояние между одинаковыми целевыми изображениями или изображениями бдительности. После сбора данных каждому изображению присваивается оценка для определения запоминаемости. Кроме этого, для оценки того, как человеческий разум ранжирует фотографии субъекты разделяются на две независимые группы (группы 1 и 2).

Анализ запоминаемости естественной сцены

Датасет LNSIM собран для лучшего понимания влияния низко-, средне-,  высокоуровневых рукописных образов и глубоких образов (deep features) на запоминаемость природной сцены.

Низкоуровневые образы — пиксели, SIFT и HOG2 — оказывают влияние на запоминаемость общих изображений. Чтобы оценить это влияние, регрессия опорных векторов (SVR) для каждого низкоуровневого образа использует тренировочный датасет для предсказания запоминаемости, а затем оценивает SRCC этих низкоуровневых образов с запоминаемостью в тестовом наборе.  Ниже в таблице 1 представлены результаты SRCC для естественных сцен, SRCC для общих изображений используется в сравнении. Очевидно, что пиксели (ρ = 0,08), SIFT (ρ = 0,28) и HOG2 (ρ = 0,29) не так эффективны для запоминаемости, как ожидалось, особенно по сравнению с их эффективностью для общих изображений

Таблица 1: Корреляция между низкоуровневыми образами и запоминаемостью природной сцены

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

Образы GIST среднего уровня описывают пространственную структуру изображения. Однако в таблице 2 показано, что SRCC у GIST составляет всего 0,23 для естественной сцены, что намного меньше, чем ρ = 0,38 для общих изображений. Это говорит о том, что структурная информация, предоставляемая функцией GIST, менее эффективна для прогнозирования значений запоминаемости на естественных сценах.

Таблица 2: Корреляция между среднеуровневыми образами и запоминаемостью природной сцены

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

  • Задача 1 (Классификации): пятерых участников попросили указать, какие категории сцен они видят на изображениях. Каждому участнику попадалось случайное изображение. Участникам нужно было выбрать подходящую категорию сцены для каждого из них
  • Задача 2 (Подтверждение): Отдельная задача выполнялась на одном и том же наборе изображений путем случайного выбора новых пятерых участников после Задания 1. Участников попросили дать ответ “да” или “нет” на вопрос про каждое изображение. Ответ по умолчанию был установлен на «Нет».

Все изображения относились к категориям на основе большинства голосов после задач 1 и 2.

Далее SVR обучалась для распознавания категории сцен. Определение категории сцены достигает производительности SRCC (ρ = 0,38), превосходя результаты комбинаций низкоуровневых образов. 

На рисунке ниже горизонтальная ось представляет категории сцены в порядке убывания средних значений запоминаемости. Средний балл варьируется от 0,79 до 0,36, что дает представление о том, как меняется запоминаемость в зависимости от категории сцены. Распределение на рисунке ниже показывает, что некоторые редкие классы изображений, такие как северное сияние, как правило, являются более запоминающимися, в то время как обычные классы, такие как горы, более вероятно, скорее будут забыты. Возможно, это связано с тем, как часто категория встречается в повседневной жизни.

Сравнение средних значений запоминаемости и стандартного отклонения для каждой категории сцен

Чтобы понять, как глубокие образы влияют на запоминаемость естественной сцены, настроенная сеть MemNet обучается на базе данных LNSIM, используя евклидово расстояние между предсказанными и известными значениями запоминаемости как функцию потерь. Выходные значения последнего скрытого слоя извлекаются как глубокий образ (размер: 4096). Чтобы оценить корреляцию между глубоким образом и запоминаемостью естественной сцены, аналогично со случаем рукописных образов, предсказатель SVR с гистограммой пересечения ядра обучается для работы с глубокими образами.

SRCC глубокого образа составляет 0,44, что превышает показатели для рукописных образов. DNN действительно хорошо работает для прогнозирования запоминаемости естественной сцены, поскольку глубокий образ показывает довольно высокую точность предсказания. Тем не менее, нет никаких сомнений в том, что точно настроенная сеть MemNet также имеет свое ограничение, поскольку она по-прежнему не достигает человеческих результатов (ρ = 0,78).

DeepNSM

Настроенная (fine-tuned) сеть MemNet служит базовой моделью для прогнозирования запоминаемости природной сцены. В предлагаемой архитектуре DeepNSM deep features прикрепляются к элементу из категории естественных сцен, чтобы точно предсказать запоминаемость изображений естественных сцен. Обратите внимание, что «deep feature» это образ размера 4096, извлеченный из базовой модели.

Рис: 2. Архитектура модели DeepNSM
Рис: 2. Архитектура модели DeepNSM

Архитектура модели DeepNSM представлена ​​на рисунке 2. В модели DeepNSM вышеупомянутый образ из категории объединен с deep feature, полученными из базовой модели. На основе такой связи элементов, дополнительные полносвязные слои (включая один скрытый слой размера 4096) служат для прогнозирования запоминаемости естественных сцен. При обучении базовые слои и модели ResNet инициализируются индивидуально подготовленными моделями, а добавленные полносвязные слои случайным образом инициализируются.

Вся сеть совместно обучается методом end-to-end, используя оптимизатор Adam с евклидовым расстоянием, принятым в качестве функции потерь.

Сравнение с другими моделями

Показатели модели DeepNSM в прогнозировании запоминания природной сцены в отношении SRCC (ρ). Модель DeepNSM тестируется как на тестовом наборе базы данных LNSIM, так и на базе базы данных NSIM. Производительность SRCC модели DeepNSM сравнивается с самыми современными методами прогнозирования запоминаемости, включая MemNet, MemoNet и Lu et al. Среди них MemNet и MemoNet — новейшие методы DNN для общих изображений, которые превзошли обычные методы, используя вручную построенные образы. Lu et al. это современный способ предсказания запоминаемости природной сцены.

Показатели SRCC DeepNSM и сравниваемых методов.
Рис 3. Показатели SRCC DeepNSM и сравниваемых методов

На рисунке 3 показатели SRCC DeepNSM и три сравниваемых метода. DeepNSM достигает значений Ρ = 0,58 и 0,55 по базам LNSIM и NSIM, соответственно. Это значительно превосходит современные методы DNN, MemNet и MemoNet. Результаты демонстрируют эффективность DeepNSM в прогнозировании запоминаемости природной сцены.

Выводы

Ученые из Пекина исследовали запоминаемость естественной сцены дата-ориентированным подходом. Они создали базу данных LNSIM для анализа запоминаемости человеком естественной сцены. Изучив соотношение запоминаемости со низко-, средне- и высоко- уровневыми образами стоит отметить, что высокоуровневые образы играют важную роль в прогнозировании запоминаемости естественной сцены.

TensorFlow туториал. Часть 3: работа с данными

26 сентября 2018
tensorflow анализ и работа с данными

TensorFlow туториал. Часть 3: работа с данными

Пора переходить к работе с реальными данными! Мы будем работать с дорожными знаками Бельгии. Дорожный трафик — понятная тема, но не помешает уточнить, какие данные включены в датасет, перед тем…

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


Перед прочтением статьи рекомендуем изучить:


В этом разделе вы получите всю необходимую для продолжения изучения туториала информацию:

  • Текст на дорожных знаках в Бельгии обычно приведен на голландском и французском языках. Это полезно знать, но для датасета, с которым вы будете работать, это не слишком важно!
  • В Бельгии шесть категорий дорожных знаков: предупреждающие знаки, знаки приоритета, запрещающие знаки, предписывающие знаки, знаки, связанные с парковкой и стоянкой у дорог, и, наконец, обозначения.
  • 1 января 2017 года с бельгийских дорог было снято более 30 000 дорожных знаков. Это были запрещающие знаки, ограничивающие максимальную скорость вождения.
  • Снятие знаков связано с длительной дискуссией в Бельгии (и во всем Европейском Союзе) о чрезмерном количестве дорожных знаков.

Загрузка датасета

Теперь, когда вы знакомы со спецификой бельгийского трафика, пришло время скачать датасет. Вы должны скачать два zip-файла в разделе «BelgiumTS for Classification (cropped images)» с названиями «BelgiumTSC_Training» и «BelgiumTSC_Testing».

Совет. Если вы скачали файлы или сделаете это после прочтения туториала, взгляните на структуру папок, которые вы загрузили! Вы увидите, что папки тестирования и обучения содержат 61 подпапку, соответствующую 61 типам дорожных знаков, которые вы будете использовать для классификации в этом туториале. Кроме того, вы обнаружите, что файлы имеют расширение .ppm или Portable Pixmap Format. Вы скачали изображения дорожных знаков!

Давайте начнем с импорта данных в рабочую область. Начнем со строк кода, которые отображаются под пользовательской функцией load_data():

  • Сначала установите ROOT_PATH. Этот путь к каталогу, в котором находятся данные для обучения и тестирования.
  • Затем добавьте пути к вашему ROOT_PATH с помощью функции join(). Сохраните эту пути в train_data_directory и test_data_directory.
  • Вы увидите, что после этого можно вызвать функцию load_data() и передать в нее train_data_directory.
  • Теперь сама функция load_data() запускается путем сбора всех подкаталогов, присутствующих в train_data_directory; она делает это с помощью спискового включения, что является естественным способом составления списков — то есть, если вы найдете что-то в train_data_directory, вы проверяете, папка ли это и, если так и есть, добавляете ее в свой список. Помните, что каждый подкаталог представляет собой метку.
  • Затем вам нужно перебрать подкаталоги. Сначала вы инициализируете два списка, labels и images. Затем вы собираете пути подкаталогов и имена файлов изображений, которые хранятся в этих подкаталогах. После этого можно собрать данные в двух списках с помощью функции append().
def load_data(data_directory):

directories = [d for d in os.listdir(data_directory)

if os.path.isdir(os.path.join(data_directory, d))]

labels = []

images = [] for d in directories:

label_directory = os.path.join(data_directory, d)

file_names = [os.path.join(label_directory, f)

for f in os.listdir(label_directory)

if f.endswith(".ppm")]

for f in file_names:

images.append(skimage.data.imread(f))

labels.append(int(d))

return images, labels

ROOT_PATH = "/your/root/path"

train_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Training")

test_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Testing")

images, labels = load_data(train_data_directory)

Обратите внимание, что в приведенном выше блоке данные для обучения и тестирования находятся в папках с названиями «training» и «testing», которые являются подкаталогами другого каталога «TrafficSigns». На компьютере это может выглядеть примерно так: «/Users /Name /Downloads /TrafficSigns», а затем две подпапки под названием «training» и «testing».

Исследование данных

Когда данные загружены, пришло время для их исследования! Для начала можно провести элементарный анализ с помощью атрибутов ndim и size массива images:

Обратите внимание, что переменные images и labels являются списками, поэтому вам, возможно, придется воспользоваться np.array() для преобразования переменных в массив в рабочей области. Но здесь это уже сделано для вас!

# Вывести размерность 'images'
print(images.ndim)

# Вывести количество элементов в 'images'
print(images.size)

# Вывести первое значение 'images'
images[0]

Обратите внимание, что значение images[0], которое вы вывели, на самом деле представляют собой одно изображение, представленное массивами в массиве! Это может показаться нелогичным, но вы привыкните к этому, когда будете работать с изображениями в проектах машинного или глубокого обучения.

Далее, обратимся к labels, но на этот раз никаких сюрпризов не будет:

# Вывести размерность 'labels'
print(labels.ndim)

# Вывести число элементов в 'labels'
print(labels.size)

# Вывести длину массива 'labels'
print(len(set(labels)))

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

Совет. Попробуйте добавить в свои массивы следующие атрибуты, чтобы получить дополнительную информацию о распределении памяти: длину одного элемента массива в байтах и ​​общее количество байтов, занимаемых элементами массива: flags, itemsize и nbytes.

Затем можно изучить распределение дорожных знаков по типам:

# Импортировать модуль 'pyplot'
import matplotlib.pyplot as plt

# Построить гистограмму с 64 точками - значениями 'labels'
plt.hist(labels, 62)

# Вывести график
plt.show()

Отлично! Давайте посмотрим на полученную гистограмму:

изучение данных в tensorflow

Хорошо видно, что не все типы дорожных знаков одинаково представлены в датасете. Это то, с чем вы столкнетесь позже, когда будете работать с данными, прежде чем приступать к моделированию нейронной сети. На первый взгляд видно: количество знаков типов 22, 32, 38 и 61 определенно преобладает над остальными. Запомните это, в следующем разделе вам пригодится эта информация.

Визуализация данных

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

Давайте посмотрим на несколько случайных знаков:

  • Во-первых, убедитесь, что вы импортируете модуль pyplot пакета matplotlib под общепринятым названием plt.
  • Затем создайте список из 4 случайных чисел. Они будут использоваться для выбора дорожных знаков из массива images, загруженного в прошлом разделе. В нижеследующем примере это будут числа 300, 2250, 3650 и 4000.
  • Затем для каждого элемента этого списка, от 0 до 4, вы создаете графики без осей (чтобы они не мешали сосредоточиться на изображениях). На этих графиках вы увидите конкретные изображения из массива images, которые соответствует номеру индекса i. На первом шаге цикла вы получите i = 300, во втором — 2250 и так далее. Наконец, нужно расположить графики так, чтобы между ними было достаточно пространства.
  • Последнее — выведите ваши графики с помощью функции show()!

Код:

# Импорт модуля 'pyplot' 'matplotlib`

import matplotlib.pyplot as plt

# Задание (случайных) номеров изображений, которые вы хотите вывести

traffic_signs = [300, 2250, 3650, 4000]

# Заполнение графиков изображениями

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images[traffic_signs[i]])

plt.subplots_adjust(wspace=0.5)

plt.show()

Как можно догадаться, знаки каждого из 62 типов отличаются друг от друга.

Но что еще можно заметить? Взглянем на изображения ниже:

работа с данными

Эти четыре изображения имеют разный размер!

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

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

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

# Импорт 'matplotlib'

import matplotlib.pyplot as plt

# Задание (случайных) номеров изображений, которые вы хотите вывести

traffic_signs = [300, 2250, 3650, 4000]

# Заполнение графиков изображениями и вывод размеров

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images[traffic_signs[i]])

plt.subplots_adjust(wspace=0.5)

plt.show()

print("shape: {0}, min: {1}, max: {2}".format(images[traffic_signs[i]].shape, images[traffic_signs[i]].min(), images[traffic_signs[i]].max()))

Обратите внимание на то, как вы используется метод format() в строке «shape: {0}, min: {1}, max: {2}», чтобы заполнить аргументы {0}, {1} и {2}.

визуализация данных tensorflow

Теперь, когда вы увидели сами изображения, можно вернуться к гистограмме, которая была построена на первых этапах изучения датасета; вы можете легко сделать это, выводя по одному изображению из каждого типа знаков:

# Импорт модуля 'pyplot' 'matplotlib'

import matplotlib.pyplot as plt

# Задание типов

unique_labels = set(labels)

# Инициализация графика

plt.figure(figsize=(15, 15))

# Задание счетчика

i = 1

# Для каждого типа:

for label in unique_labels:

# Выбирается первое изображение каждого типа:

image = images[labels.index(label)]

# Задание 64 графиков

plt.subplot(8, 8, i)

# Выключение осей

plt.axis('off')

# Добавление заголовка каждому графику

plt.title("Label {0} ({1})".format(label, labels.count(label)))

# Увеличить значение счетчика на 1

i += 1

# Вывод первого изображения

plt.imshow(image)

# Вывод всего графика

plt.show()

Обратите внимание, что даже если вы определяете 64 графика, не на всех из них будут изображения (так как есть всего 62 типа знаков!). Обратите также внимание на то, что опять же, вы не выводите оси, чтобы не отвлекаться на них.

анализ данных в Tensorflow

Как было видно из гистограммы, количество фотографий знаков с типами 22, 32, 38 и 61 значительно больше остальных. Эта видно из из графика выше: есть 375 снимков с меткой 22, 316 снимков с меткой 32, 285 снимков с меткой 38 и, наконец, 282 снимка с меткой 61.

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

Давайте рассмотрим более подробно: видно, что метки 22 и 32 являются запретительными знаками, но метки 38 и 61 являются указательными знаками и знаками приоритета, соответственно. Это означает, что между этими четырьмя знаками нет непосредственной связи, за исключением того факта, что половина знаков, наиболее широко представленных в датасетах, являются запрещающими.

Извлечение признаков

Теперь, когда вы тщательно изучили свои данные, пришло время засучить рукава! Давайте кратко отметим, что вы обнаружили, чтобы убедиться, что вы не забыли какие-либо моменты:

  • Изображения имеют разный размер;
  • Есть 62 метки (помним, что нумерация меток начинаются с 0 и заканчиваются на 61);
  • Распределение типов знаков трафика довольно неравномерно; между знаками, которые в большом количестве присутствовали в наборе данных, нет никакой связи.

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

Масштабирование изображений

Чтобы сделать размеры изображений одинаковыми, можно воспользоваться функцией skimage или библиотекой Scikit-Image, которая представляет собой набор алгоритмов для обработки изображений.

Во втором случае случае будет полезен модуль transform, так как в нем есть функция resize(); она снова использует списковое включение, чтобы сделать разрешение снимков равным 28×28 пикселей. Повторюсь: вы увидите, что фактически составляете список — для каждого изображения в массиве image вы выполните операцию преобразования, которую позаимствуете из библиотеки skimage. Наконец, вы сохраняете результат в переменной images28:

# Импорт модуля 'transform' из 'skimage'

import transform

# Масштабирование изображений в 'image'

array images28 = [transform.resize(image, (28, 28)) for image in images]

Выглядит очень просто, не так ли?

Обратите внимание, что изображения теперь четырехмерны: если вы конвертируете images28 в массив и привязываете атрибут shape, видно, что размеры imeges28 равны (4575, 28, 28, 3). Изображения 784-мерные (потому что ваши изображения имеют размер 28 на 28 пикселей).

Вы можете проверить результат операции масштабирования путем повторного использования кода, который вы использовали выше, для построения 4 случайных изображений с помощью переменной traffic_signs; просто не забудьте изменить images на images28.

Результат:

результат визуализации данных tensorflow

Обратите внимание, что, поскольку вы изменили масштаб, значения min и max также изменились; сейчас они все лежат в одном диапазоне, что действительно здорово, потому что теперь вам не нужно производить нормировку данных!

Преобразование изображений в оттенки серого

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

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

Как и при масштабировании, вы можете использовать библиотеку Scikit-Image; в этом случае вам понадобится модуль color с функцией rgb2gray().

Это будет просто!

Однако не забудьте преобразовать переменную images28 в массив, так как функция rgb2gray() в качестве аргумента принимает именно массивы.

# Импорт `rgb2gray` из`skimage.color`

from skimage.color import rgb2gray

# Конвертация `images28` в массив

images28 = np.array(images28)

# Конвертация `images28` в оттенки серого

images28 = rgb2gray(images28)

Проверьте результат вашего преобразования в оттенки серого, выведя некоторые из изображений; для этого используйся несколько модифицированный код:

import matplotlib.pyplot as plt

traffic_signs = [300, 2250, 3650, 4000]

for i in range(len(traffic_signs)):

plt.subplot(1, 4, i+1)

plt.axis('off')

plt.imshow(images28[traffic_signs[i]], cmap="gray") plt.subplots_adjust(wspace=0.5)

# Вывод графика

plt.show()

Обратите внимание, что вам обязательно нужно указать цветовую карту или cmap и выставить значение ‘gray’ для вывода изображений в оттенках серого. Это связано с тем, что imshow() по умолчанию использует тепловую цветовую карту.


Совет. Поскольку этот блок используется в туториале несколько раз, будет полезно подумать, как можно сделать его функцией 🙂

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

В следующей частиглубокое обучение c TensorFlow.


Интересные статьи:

Нейросеть распознаёт рак лёгких на ранних этапах с точностью 97%

20 сентября 2018
нейросеть обнаружение рака легких на ранних стадиях

Нейросеть распознаёт рак лёгких на ранних этапах с точностью 97%

По данным Американского онкологического общества, только в США у 200 000 людей ежегодно диагностируют рак лёгких. Исследователи из Университета Нью-Йорка разработали алгоритм, который поможет ускорить и упростить выявление заболевания на…

По данным Американского онкологического общества, только в США у 200 000 людей ежегодно диагностируют рак лёгких. Исследователи из Университета Нью-Йорка разработали алгоритм, который поможет ускорить и упростить выявление заболевания на ранних этапах. Нейросеть распознаёт два из наиболее распространённых видов рака лёгких с точностью 97%, что сопоставимо с результатами патологоанатомов. 

Как основу нейронной сети разработчики взяли Inception v3 — open source модель для распознавания изображений. Inception v3 уже успешно использовалась для диагностики меланомы и ретинопатии. Исследователи обучили нейросеть на 3000 изображений с результатами гистологии патологических тканей, используя графические процессоры NVIDIA Tesla с расширенной cuDNN и платформу TensorFlow. Работу алгоритма сравнили с результатами диагностики трёх независимых патологоанатомов.

«Наше исследование демонстрирует, что свёрточные нейронные сети, такие как Google Inception v3, могут быть использованы для анализа результатов гистологии и диагностики рака легких: алгоритм классифицирует здоровые и опухолевые ткани с точностью ~ 0,99 AUC, и различает типы рака лёгких с высокой точностью — 0,97 AUC, достигая аккуратности, сравнимой с результатами патологоанатома» — отметили исследователи в статье.

Работа опубликована в журнале Nature Medicine. Исходный код модели доступен на GitHub.


Интересные статьи:

Google запустил соревнование для оценки надежности ML-моделей

17 сентября 2018

Google запустил соревнование для оценки надежности ML-моделей

Google запустил конкурс для оценки надёжности работы моделей машинного обучения в решении задач распознавания объектов на изображениях. В основе челленджа простая классификационная задача «птица или велосипед». Классификатор должен определить, точно…

Google запустил конкурс для оценки надёжности работы моделей машинного обучения в решении задач распознавания объектов на изображениях. В основе челленджа простая классификационная задача «птица или велосипед». Классификатор должен определить, точно ли на изображении птица или велосипед, или изображение было изменено.

image1
Примеры ошибок классификаторов

Участвовать в соревновании можно в качестве «атакующего» или «защитника».

Цель защитника — создать модель, которая будет правильно маркировать чистые изображений птиц и велосипедов, и работать без погрешности на изображениях птицы или велосипеда, представленных атакующим. Цель атакующего — найти или создать изображение птицы, которое классификатор уверенно назовёт велосипедом (или наоборот). Можно использовать фотографии, изменять изображения с помощью 3D-рендеринга, создавать новые изображения птиц, используя генеративные модели и другие техники.

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

Google запустил Kaggle Challenge по созданию глобального классификатора изображений

12 сентября 2018
kaggle competition глобальный классификатор

Google запустил Kaggle Challenge по созданию глобального классификатора изображений

Информация в больших наборах данных с открытым исходным кодом таких как ImageNet, Open Images, Conceptual Captions часто искажена географически. В датасетах представлены данные только той страны, в которой они были…

Информация в больших наборах данных с открытым исходным кодом таких как ImageNet, Open Images, Conceptual Captions часто искажена географически. В датасетах представлены данные только той страны, в которой они были собраны. Это приводит к ошибкам моделей ML: алгоритмы работают менее эффективно на изображениях, полученных из других географических регионов.

google challenge
Примеры неточной классификации

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

Условия конкурса

Чтобы поощрить разработку методов машинного обучения, которые будут более надежными и географически инклюзивными, обучаясь на несовершенных наборах данных, Google объявил конкурс Inclusive Images на Kaggle совместно с NIPS Competition Track.

Конкурс официально стартовал 5 сентября и завершится 5 ноября. Результаты соревнования будут представлены на конференции NIPS 2018. Призовой фонд — $25 000. Так выглядит турнирная таблица на утро 12 сентября:

kaggle challenge inclusive dataset

Соревнование состоит из трёх этапов: сначала участникам нужно обучить модель на датасете Open Images, который содержит изображения, собранные в Северной Америке и Западной Европе. На втором и третьем этапах работа моделей будет оцениваться с помощью тестовых изображений, собранных волонтёрами в других географических регионах.

Подробности в блоге Google.


Интересные статьи по теме: