С помощью всего 10 строк кода Python вы можете создать собственную модель машинного зрения для быстрой и точной идентификации массивных изображений. Приходите и попробуйте!
визуальный
Роль эволюции сделала обработку изображений человеком очень эффективной.
Вот, показываю фото.
Если я спрошу вас об этом:
Сможете ли вы определить, кто на картинке кошка, а кто собака?
Вы можете сразу почувствовать, что вас сильно оскорбили. И спросил меня вслух: как вы думаете, у меня проблемы с IQ? !
Успокойте свой гнев.
Изменить вопрос:
Можете ли вы описать свой собственный способ различения изображений кошек и собак как строгие правила и научить компьютер, чтобы он мог различать тысячи изображений для нас, людей?
Для большинства людей то, что они чувствуют в это время, не унижение, а давление.
Если вы настойчивый человек, вы можете попробовать разные критерии: цвет пикселя определенной позиции изображения, форму края определенной части, длину непрерывного цвета определенной позиции по горизонтали...
Вы сообщаете компьютеру эти описания, и он может назвать кошку слева и собаку справа.
Проблема в том, что компьютернастоящийСможете ли вы отличить изображения кошек от собак?
У меня есть еще одно фото для вас.
Вы обнаружите, что почти все определения правил необходимо переписать.
Когда машине, наконец, удалось правильно идентифицировать животных на этих двух картинках приближенным оппортунистическим методом, я достал новую картинку...
Через несколько часов вы решаетесдаться.
Не расстраивайтесь.
То, с чем вы столкнулись, не является новой проблемой. Даже у судей были такие же проблемы.
В 1964 году в деле «Якобеллис против Огайо» судья Поттер Стюарт из Верховного суда США сказал: «Я не собираюсь давать концепцию конкретной проблемы классификации изображений в кино. Краткое и четкое определение. .но,Я узнаю это, когда увижу"(Я узнаю это, когда увижу).
Оригинальный текст выглядит следующим образом:
Я не буду сегодня пытаться дальше определять виды материалов, которые, как я понимаю, охватываются этим кратким описанием («жесткая порнография»), и, возможно, мне никогда не удастся сделать это внятно, но я узнаю это, когда увижу, и кинофильм, задействованный в данном случае, не таков.
Учитывая нужды строительства духовной цивилизации, этот абзац не будет переводиться.
Человек не может подробно, конкретно и точно описать компьютеру правила распознавания образов, значит ли это, что компьютер не может распознать изображение?
конечно, нет.
В декабре 2017 года журнал Scientific American назвал «визуальный искусственный интеллект» (ИИ, который видит как человек) одной из новых технологий 2017 года.
Вы уже слышали о магии беспилотных автомобилей, верно? Можно ли это сделать без машинного распознавания изображений?
Может быть, ваш друг (не раз) показывал вам, как разблокировать новый iPhone X с помощью распознавания лиц? Можно ли это сделать без машинного распознавания изображений?
В области медицины способность компьютера анализировать научные изображения (например, рентгеновские снимки) превзошла возможности врачей с многолетним опытом. Можно ли это сделать без машинного распознавания изображений?
Вы можете внезапно почувствовать себя немного потерянным — чудо ли это?
нет.
Что делает компьютер, так этоучиться.
Изучив достаточное количество примеров, машина может построить собственную модель из данных. Среди них может быть задействовано большое количество критериев суждения. Однако людям также не нужно сообщать машинам. Это полностью самостоятельное понимание и освоение.
Вы можете быть взволнованы.
Что ж, позвольте мне сообщить вам еще одну приятную новость - вы тоже можетебез трудаСоздайте систему классификации изображений!
Не верю? Пожалуйста, следуйте моему введению ниже, чтобы попробовать его.
данные
Мы больше не признаем кошек и собак, этот вопрос немного новый.
Давайте различать роботов-котов, не так ли?
Да, я говорю о Дораэмоне.
Отличить его от кого?
Сначала я хотел найти тираннозавра рекса, но потом подумал, что это обман, потому что они оба выглядели такими настоящими.слишком большая разница.
Поскольку Дораэмон — робот, давайте найдем другого робота, чтобы отличить его.
Когда речь заходит о роботах, я сразу об этом думаю.
Да, робот ВАЛЛЕ.
Я подготовил для вас 119 фотографий Дораэмона и 80 фотографий Валл-И. Картинка загружена наЭтот проект на гитхабе.
Пожалуйста, нажмитеэта ссылка, загрузите сжатый пакет. Затем разархивируйте его локально. как нашдемонстрационный каталог.
После распаковки вы увидите папку с изображениями в каталоге, который содержит два подкаталога, doraemon и walle.
Открой каталог doraemon, посмотрим, какие там картинки.
Как видите, образы Дораэмона действительно разнообразны. Различные сцены, цвета фона, выражения, действия, ракурсы... и так далее.
Эти изображения имеют разный размер и соотношение сторон.
Давайте снова посмотрим на Валл-И, и это аналогичная ситуация.
Данные уже доступны, давайте подготовим конфигурацию среды.
окрестности
Мы используем Anaconda, интегрированную среду выполнения Python.
пожалуйста, перейдите кэтот URLЗагрузите последнюю версию Анаконды. Прокрутите страницу вниз, чтобы найти место загрузки. В зависимости от системы, которую вы используете в настоящее время, веб-сайт автоматически порекомендует вам подходящую версию для загрузки. Я использую macOS, а формат загружаемого файла — pkg.
В левой части страницы загрузки указана версия Python 3.6, а в правой части — версия 2.7. Пожалуйста, выберите версию 2.7.
Дважды щелкните загруженный файл pkg и установите его шаг за шагом в соответствии с подсказками на китайском языке.
После установки Anaconda нам нужно установить TuriCreate.
Перейдите в свой «Терминал» (Linux, macOS) или «Командную строку» (Windows) и перейдите в каталог примера, который мы только что скачали и разархивировали.
Выполните следующую команду, чтобы создать виртуальную среду Anaconda с именем turi.
conda create -n turi python=2.7 anaconda
Затем мы активируем виртуальную среду turi.
source activate turi
В этой среде мы устанавливаем последнюю версию TuriCreate.
pip install -U turicreate
После установки выполнить:
jupyter notebook
Это входит в среду ноутбука Jupyter. Давайте создадим новую записную книжку Python 2.
Появляется пустой блокнот.
Щелкните имя блокнота в верхнем левом углу и измените его на осмысленное имя блокнота «demo-python-image-classification».
Теперь, когда подготовка завершена, мы можем приступить к написанию программ.
код
Во-первых, мы читаем в пакете TuriCreate. Это фреймворк машинного обучения, приобретенный Apple, который предоставляет разработчикам очень простой интерфейс для анализа данных и искусственного интеллекта.
import turicreate as tc
Указываем папку image, где находятся изображения.
img_folder = 'image'
Как было сказано ранее, под изображением находятся две папки: Doraemon и Wall-E. Обратите внимание: если в будущем вам потребуется идентифицировать другие изображения (например, кошки и собаки), сохраните изображения разных категорий в разные папки на изображении, а имена этих папок будут именами категорий изображений (кошка и собака).
Затем мы позволяем TuriCreate считать все файлы изображений и сохранять их во фрейме данных.
data = tc.image_analysis.load_images(img_folder, with_path=True)
Здесь могут быть сообщения об ошибках.
Unsupported image format. Supported formats are JPEG and PNG file: /Users/wsy/Dropbox/var/wsywork/learn/demo-workshops/demo-python-image-classification/image/walle/.DS_Store
В этом примере несколько.DS_Store
Файл, который TuriCreate не распознает, не может быть прочитан как картинка.
Эти.DS_Store
Файл — это скрытый файл, созданный системой Apple macOS для сохранения пользовательских свойств каталога, таких как положение значка или цвет фона.
Мы можем игнорировать эту информацию.
Далее давайте посмотрим, что находится во фрейме данных.
data
Как видите, данные содержат два столбца информации, первый столбец — это адрес изображения, а второй столбец — описание длины и ширины изображения.
Поскольку мы использовали 119 изображений Doraemon и 80 изображений Wall-E, общее количество данных составляет 199 штук. Проверка целостности чтения данных пройдена.
Затем нам нужно сообщить TuriCreate информацию о метках различных изображений. То есть на картинке Дораэмон или ВАЛЛ-И?
Вот почему в начале вы должны поставить разные картинкиСохранить категориюв другую папку.
На этом этапе мы используем имя папки, чтобы пометить изображение.
data['label'] = data['path'].apply(lambda path: 'doraemon' if 'doraemon' in path else 'walle')
Этот оператор помечает изображения в каталоге doraemon как doraemon во фрейме данных. В противном случае он считается валле.
Давайте посмотрим на фрейм данных после маркировки.
data
Видно, что количество записей данных (строк) такое же, но есть дополнительный столбец метки (label) для обозначения категории изображения.
Сохраним данные.
data.save('doraemon-walle.sframe')
Это действие сохранения позволяет сохранить текущий результат обработки данных. Для последующего анализа нужно только прочитать файл sframe, и не нужно разбираться с папкой с нуля.
Из этого примера вы можете не увидеть никакого преимущества. Но представьте, если на вашем изображении несколько G или даже несколько T, будет очень много времени читать файл и отмечать его с нуля каждый раз, когда вы выполняете анализ и обработку.
Давайте углубимся во фрейм данных.
TuriCreate предоставляет очень удобныйexplore()
Функции, которые помогают нам интуитивно исследовать информацию фрейма данных.
data.explore()
В это время TuriCreate откроет страницу, чтобы показать нам содержимое фрейма данных.
Первоначально печатая фрейм данных, мы можем видеть только размер изображения, но в это время мы можем просматривать содержимое изображения.
Если вам кажется, что картинка слишком маленькая, ничего страшного. Наведите указатель мыши на миниатюру, чтобы увидеть увеличенное изображение.
Исследование фрейма данных завершено. Вернемся к блокноту и продолжим писать код.
Здесь мы позволяем TuriCreate разделить фрейм данных на обучающий набор и тестовый набор.
train_data, test_data = data.random_split(0.8, seed=2)
Учебный набор используется для наблюдения и обучения машины. Компьютер строит собственную модель, используя данные обучающей выборки. Но насколько хорошо работает модель (например, насколько точна классификация)? Нам нужно использовать тестовый набор для проверочного тестирования.
Это точно так же, как учителя не должны использовать экзаменационные вопросы, чтобы ученики делали домашнее задание и практиковались. Только те вопросы, которые учащиеся не видели ранее, позволяют определить, усвоили ли учащиеся правильный метод решения задач или запомнили ответы на домашние задания.
Мы попросили TuriCreate разделить 80% данных на обучающий набор, а оставшиеся 20% отложить на тестирование. Здесь я установил случайное начальное значение равным 2, чтобы обеспечить согласованность разделения данных. для повторной проверки наших результатов.
Что ж, давайте заставим машину наблюдать за каждым фрагментом данных в обучающем наборе для обучения и попробуем построить модель самостоятельно.
Когда следующий код выполняется в первый раз, ему нужно некоторое время подождать. Потому что TuriCreate необходимо загрузить некоторые данные с официального сайта Apple. Эти данные около 100M или около того.
Требуемое время зависит от скорости вашего подключения к серверам Apple. Во всяком случае, здесь я, загрузка довольно медленная.
К счастью, только в первый раз вам нужно скачать. Последующие повторные выполнения будут пропускать шаг загрузки.
model = tc.image_classifier.create(train_data, target='label')
После завершения загрузки вы увидите обучающую информацию для TuriCreate.
Resizing images...
Performing feature extraction on resized images...
Completed 168/168
PROGRESS: Creating a validation set from 5 percent of training data. This may take a while.
You can set ``validation_set=None`` to disable validation tracking.
Вы обнаружите, что TuriCreateh поможет вам изменить размер изображения и автоматически зафиксировать особенности изображения. Затем он извлечет 5% данных из обучающего набора в качестве проверочного набора и итеративно найдет оптимальную конфигурацию параметров для получения наилучшей модели.
Здесь могут быть некоторые предупреждающие сообщения, просто игнорируйте их.
Когда вы видите следующее сообщение, это означает, что обучение успешно завершено.
Видно, что после нескольких раундов как точность обучения, так и точность проверки уже очень высоки.
Далее мы используем полученную модель классификации изображений, чтобы делать прогнозы на тестовом наборе.
predictions = model.predict(test_data)
Мы сохраняем предсказанный результат (последовательность меток, соответствующих серии изображений) в переменной предсказания.
Затем мы позволяем TuriCreate сообщить нам, как наша модель работала на тестовом наборе.
Не спешите смотреть вниз, угадайте, какова правильная скорость результата? От 0 до 1, угадай число.
Когда закончите гадать, вперед.
metrics = model.evaluate(test_data)
print(metrics['accuracy'])
Это результат правильной ставки:
0.967741935484
Когда я впервые увидел это, я был в шоке.
Мы использовали только более 100 данных для обучения, и нам удалось получить такую высокую точность распознавания на тестовом наборе (данные изображения, которые машина не видела).
Чтобы убедиться, что это не ошибка в части кода, вычисляющей точность, давайте посмотрим на результаты предсказания.
predictions
Вот последовательность распечатанных предсказанных токенов:
dtype: str
Rows: 31
['doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'walle', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'walle']
Тогда посмотрите на настоящую этикетку.
test_data['label']
Вот фактическая последовательность токенов:
dtype: str
Rows: 31
['doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'walle', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'doraemon', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'walle', 'doraemon', 'doraemon', 'walle', 'walle', 'doraemon', 'walle']
Давайте выясним, какие изображения были неверно предсказаны.
Конечно, вы можете проверить их по одному. Но если в вашем тестовом наборе тысячи данных, это будет неэффективно.
Метод нашего анализа заключается в том, чтобы сначала найти предсказанную последовательность маркера (прогнозы) и исходную последовательность маркера (test_data['label']
), а затем показать эти несоответствия в тестовом наборе данных.
test_data[test_data['label'] != predictions]
Мы обнаружили, что из 31 тестовых данных только одно предсказание метки было неверным. Первоначальный токен — Wall-E, и наша модель предсказывает Doraemon.
Мы получаем исходный путь к файлу, соответствующий этой точке данных.
wrong_pred_img_path = test_data[predictions != test_data['label']][0]['path']
Затем мы читаем изображение в переменную img.
img = tc.Image(wrong_pred_img_path)
предоставлено TuriCreateshow()
функцию, давайте взглянем на содержимое этого изображения.
img.show()
Поскольку одна из проблем глубокого обучения заключается в том, что модель слишком сложна, мы не можем точно сказать, как машина неправильно идентифицировала изображение. Но нетрудно заметить, что у этой картинки есть некоторые особенности — помимо ВАЛЛ-И есть еще один робот.
Если вы видели этот фильм, то должны знать отношения между двумя роботами. Здесь мы нажимаем без стола. Проблема в том, что круглоголовый робот с круглым мозгом в правом верхнем углу сильно отличается от угловатого ВАЛЛ-И. Но не забывайте, у Дораэмона тоже круглая голова.
принцип
Следуя коду из приведенного выше раздела, вы уже должны знать, как создать собственную систему классификации изображений. Без каких-либо знаний о принципах разработанная вами модель проделала большую работу. не так ли?
Если вам не интересен принцип, пропустите этот раздел и посмотрите «Резюме».
Если вы любите докапываться до знаний, поговорим о принципе.
Хотя вы написали всего 10 строк кода, построенная вами модель достаточно сложна и длинна. Это легендарная сверточная нейронная сеть (CNN).
Это тип модели глубокого машинного обучения. Простейшая сверточная нейронная сеть выглядит так:
В крайнем левом углу находится входной слой. То есть изображение, которое мы ввели. В данном случае Дораэмон и Валл-И.
В компьютере изображения хранятся слоями в соответствии с разными цветами (RGB, а именно красный, зеленый, синий). Как пример ниже.
В зависимости от разрешения компьютер сохраняет изображения каждого слоя в матрицу определенного размера. В соответствии с определенной позицией строки и столбца сохраняется только число.
Вот почему, когда вы запускаете код, вы обнаружите, что первое, что делает TuriCreate, — это изменяет размер изображения. Потому что, если входные изображения имеют разный размер, следующие шаги выполнить невозможно.
С входными данными он входит в следующий слой по порядку, который является сверточным слоем.
Сверточные слои могут показаться загадочными и сложными. Но принцип очень прост. Он состоит из нескольких фильтров. Каждый фильтр представляет собой небольшую матрицу.
При его использовании на входных данных перемещайте эту маленькую матрицу, умножайте ее на числа в той позиции, которая перекрывается с матрицей, и складывайте их вместе. Таким образом, исходная матрица после «свертки» становится числом.
Следующая анимация наглядно объясняет этот процесс для вас.
Этот процесс заключается в постоянном поиске определенного признака в матрице. Это может быть форма края или что-то в этом роде.
Следующий слой называется «Объединяющий слой». Перевод просто бестолковый. Я думаю, что гораздо лучше перевести на «сводный слой» или «слой выборки». В дальнейшем мы будем называть это «слоем выборки».
Цель выборки - не заставить машину думать, что «она должна быть в верхнем левом углу квадрата с острым краем». Фактически, на изображении объект, который мы хотим идентифицировать, может быть смещен. Следовательно, нам нужно размыть положение признака с помощью совокупной выборки и расширить его от «конкретной точки» до «определенной области».
Если это заставляет вас чувствовать, что это недостаточно интуитивно понятно, обратитесь к следующей анимации.
Вот "максимальная выборка" (Max-Pooling). Возьмите исходный диапазон 2x2 в виде блока, найдите из него максимальное значение и запишите его в новую матрицу результатов.
Полезным правилом является то, что по мере того, как количество слоев продолжает двигаться вправо, общее результирующее изображение (фактически формально его следует называть матрицей) будет становиться все меньше и меньше, а вот количество слоев будет становиться все больше и больше. .
Только таким образом мы можем извлечь из изображения обычную информацию и попытаться уловить достаточное количество закономерностей.
Если вы все еще не удовлетворены, пожалуйста, посетитеэтот сайт.
Это дает вам наглядный анализ того, что происходит на каждом уровне сверточной нейронной сети.
Верхний левый угол — это место ввода данных пользователем. Пожалуйста, используйте мышь, чтобы написать число (0-9). Не имеет значения, если письмо уродливо.
Я ввел 7.
Глядя на результат, модель правильно определяет, что первый вариант — 7, а второй вариант — 3. правильный ответ.
Рассмотрим детали построения модели.
Подводим мышку к первому сверточному слою. Остановитесь на любом пикселе. Компьютер сообщает нам, какие пиксели в предыдущем слое графики получены путем обнаружения признаков.
Точно так же, наведя указатель мыши на первый слой пула Max, компьютер также может визуально показать нам, из каких блоков пикселей был взят образец пикселя.
Этот сайт стоит вашего времени, чтобы поиграть некоторое время. Это может помочь вам понять значение сверточной нейронной сети.
Просмотрите наш пример графика:
Следующий слой называется Fully Connected Layer, который на самом деле сжимает все матрицы, выводимые предыдущим слоем, в одно измерение и превращает их в длинный выходной результат.
После этого находится выходной слой, соответствующий результат — это классификация, которую нам нужно позволить машине понять.
Если вы посмотрите только на последние два слоя, вы можете легко связать их с глубокой нейронной сетью (DNN), которую вы изучили ранее.
Теперь, когда у нас уже есть глубокие нейронные сети, зачем использовать слои свертки и выборки, чтобы сделать модель такой сложной?
Здесь есть два соображения:
Во-первых, это объем вычислений. Входной объем данных изображения, как правило, относительно велик.Если мы напрямую подключим его к выходному слою с несколькими глубокими нейронными слоями, количество входных и выходных данных каждого слоя будет очень большим, а общий объем вычислений невообразим.
Во-вторых, захват особенностей шаблона. Даже если используется очень большой объем вычислений, эффект распознавания глубоких нейронных сетей для шаблонов изображений может быть неудовлетворительным. Потому что он усваивает слишком много шума. Внедрение сверточных слоев и слоев выборки может эффективно отфильтровывать шум и подчеркивать влияние шаблонов в изображениях на результаты обучения.
Вы можете подумать, что мы написали всего 10 строк кода, а используемая сверточная нейронная сеть должна быть похожа на картинку выше, только 4 или 5 слоев, верно?
Это не так.Количество слоев, которые вы используете, составляет целых 50 слоев!
Его научное название Resnet-50 является результатом исследований и разработок Microsoft, выигравшей конкурс ILSRVC в 2015 году. В наборе данных ImageNet его эффект классификации и распознавания былза пределами человеческого.
Я приложил адрес соответствующей бумаги кздесь, если вы заинтересованы, вы можете обратиться к нему.
Пожалуйста, посмотрите на нижний на картинке выше, как он примерно выглядит.
Достаточно глубины, достаточно сложности.
Если у вас раньше были какие-то знания о глубоких нейронных сетях, это будет еще более невероятно. Как с таким количеством слоев и таким небольшим объемом обучающих данных мы можем получить такие хорошие результаты тестов? А если вы хотите получить хороший тренировочный эффект, то не должен ли процесс обучения большого количества снимков занимать много времени?
Да, если ты самСоздать с нуляА Resnet-50 и обучение на наборе данных ImageNet, даже если у вас хорошее железо (GPU), это займет много времени.
Если вы тренируетесь на собственном ноутбуке... забудьте об этом.
Так действительно ли TuriCreate чудо? Можете ли вы достичь результатов классификации высокого уровня, не занимая много времени на обучение и нуждаясь только в небольшой выборке?
Нет, в науке о данных чудес не бывает.
В чем причина этого, казалось бы, чудесного эффекта? Этот вопрос оставлен как вопрос для размышления, пожалуйста, используйте поисковые системы и сайты вопросов и ответов, чтобы найти ответ.
резюме
Благодаря этой статье вы освоили следующее:
- Как установить платформу машинного обучения Apple TuriCreate в виртуальной среде Anaconda.
- Как читать данные изображения в папке в TuriCreate. И используйте имя папки, чтобы отметить изображение.
- Как обучить глубокую нейронную сеть в TuriCreate различать изображения.
- Как использовать набор тестовых данных для проверки эффекта классификации изображений. И найти неправильно классифицированные изображения.
- Базовый состав и принцип работы сверточной нейронной сети (CNN).
Однако из-за нехватки места мы не упомянули и не объяснили подробно следующие вопросы:
- Как получить обучающие и тестовые данные изображения в пакетах.
- Как использовать функцию предварительной обработки для преобразования форматов изображений, которые TuriCreate не может распознать.
- Как построить сверточную нейронную сеть (CNN) с нуля, чтобы полностью контролировать слои и параметры модели.
- Как получить эффект классификации высокого уровня, не занимая много времени на обучение и нуждаясь только в небольшой выборке (ключевые слова подсказки: трансферное обучение, трансферное обучение).
Пожалуйста, подумайте над вышеуказанными вопросами на практике. Добро пожаловать, чтобы оставить сообщение и отправить электронное письмо, чтобы обменяться со мной своими мыслями.
обсуждать
Вы уже выполняли задачи по классификации изображений? Как вы с этим справились? Какие полезные инструменты вы использовали? Каковы преимущества и недостатки по сравнению с нашим методом? Добро пожаловать, чтобы оставить сообщение, поделиться своим опытом и мыслями со всеми, мы обменяемся и обсудим вместе.
Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Жилан" (nkwangshyi).
Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.