Подтвердить что ты не робот

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

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

Я предполагаю, что лучший способ сделать это - (1) применить некоторый алгоритм к изображению, который преобразует его в набор признаков, и (2) использовать набор тренировок и один из многих возможных алгоритмов машинного обучения для корреляции наличие/отсутствие определенных признаков с конкретным символом, присутствующим в ячейке.

Итак, мои вопросы: (a) это правильный подход, (b) поскольку существует ряд алгоритмов классификации и алгоритмов ML для проверки, что является хорошей методологией для поиска правильного, и (c) какие алгоритмы вы начинаете с того, что мы по существу проводим упражнение по классификации на мультфильме.

4b9b3361

Ответ 1

Итак, я думаю, что вы на правильном пути w/r/t ваш шаг 1 (примените некоторый алгоритм к изображению, который преобразует его в набор функций).

Этот проект более сложный, чем большинство проблем ML, потому что здесь вам действительно нужно будет создать свой набор учебных данных из необработанных данных (отдельные кадры, содержащие мультфильмы). Например, возьмите фрейм, выделите два символа в этом фрейме, Дилберт и персонаж с рогами (босс Дилберта, я верю, не знаю его имени), извлеките эти два символа из этого фрейма и добавьте к каждому соответствующему ярлыку класса ( например, "1" для Dlibert).

Шаг 1

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

Если вам нравится python (или R, учитывая, что вы можете использовать привязки python-to-R, такие как RPy), я настоятельно рекомендую вам посмотреть sklearn. В частности, эта отличная библиотека (которая была первоначально разработана под зонтиком проекта SciPy scikits и поэтому использует NumPy + SciPy для вычисления матриц) имеет несколько алгоритмов сегментации изображений, одна из которых основана на спектральная кластеризация. Для этого шага в вашем проекте вы, скорее всего, захотите посмотреть эти два файла scikits.learn

  • sklearn.feature_extraction (например, подмодуль изображения)

  • sklearn.cluster.spectral_clustering

В комплекте с этими двумя модулями находятся два хороших примера сценариев, один сегментирование цифровой фотографии и other, сегментируя изображение, состоящее из трех частично наложенных кругов с минимальным контрастом w/r/t друг друга и w/r/t фон - оба, я подозреваю, являются более трудными проблемами, которые разложения, которые вам нужно выполнить. Другими словами, sklearn имеет два полных, хорошо документированных примера скрипта, включенных в исходный дистрибутив, оба из которых относятся к данным процесса, аналогичным вашим. Любой или оба будут отличным шаблоном для этого шага.

Шаг 2

Итак, первый шаг; здесь вторая: сортировать все компоненты разложенных изображений в группы, по одной группе для каждого символа Дильберта. Затем присвойте ярлык класса каждой группе, например, если на вашем этапе декомпозиции есть четыре символа, тогда достойный выбор для ярлыков классов - "0", "1", "2" и "3". Добавьте эти метки классов в составные матрицы (продукты разложения с шага 1), чтобы каждая символьная матрица сопоставлялась с соответствующим классом (символ Дилберта).

Шаг 3

Выберите подходящую технику ML. У вас есть много вариантов для этого шага; единственным критерием является то, что этот метод находится в контролируемой категории (потому что вы назначили метки классов своим данным) и что он функционирует как классификатор (т.е. возвращает метку класса по сравнению с регрессором, который выводит числовое значение). Учитывая, что это персональный проект, я бы выбрал тот, который кажется вам наиболее интересным. Некоторые из них удовлетворяют только что упомянутым критериям: многослойный персептрон (нейронная сеть), машина векторной поддержки (SVM) и k-ближайшие соседи (kNN).

Шаг 4

тренировать, проверять и тестировать классификатор

Альтернативная техника: Соответствие шаблонов

Как только шаг 1 будет завершен (каждое изображение разбивается на множество объектов, некоторые из которых, без сомнения, будут представлять символы), вы можете вручную просеять эти продукты разложения и собрать образцы для каждого символа в мультфильме. Шаблоны .

Затем вы сравниваете объекты, сегментированные с изображением, с помощью этого набора уникальных шаблонов. В scikit-image, еще один scipy scikit, вы можете использовать метод match_template, которому вы передаете образ шаблона и изображение кандидата, и этот метод возвращает 2D-массив, показывающий корреляцию между пикселями (между -1 и 1).

Ответ 2

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

Ответ 3

Вы можете попробовать создать модель, загрузив свои учебные данные (изображения комиксов) в demo.nanonets.ai (бесплатно использовать)

Затем запросите API, используя следующий (код Python):

import requests
import json
import urllib
model_name = "Enter-Your-Model-Name-Here"
url = "http://static5.businessinsider.com/image/525464f969bedd0b0422cfb6/dilbert-creator-scott-adams-presents-his-10-favorite-comics-of-all-time.jpg"
files = {'uploadfile': urllib.urlopen(url).read()}
url = "http://demo.nanonets.ai/classify/?appId="+model_name
r = requests.post(url, files=files)
print json.loads(r.content)

ответ выглядит так:

{
  "message": "Model trained",
  "result": [
    {
      "label": "Dilbert",
      "probability": 0.97
    },
    {
      "label": "PHB",
      "probability": 0.025
    },
    {
      "label": "Ratbert",
      "probability": 0.005
    }
  ]
}

Ответ 4

Этот вопрос был задан на 5 лет назад, поэтому приведенные выше ответы устарели, учитывая тот факт, что глубокое обучение изменило лицо компьютерного видения на протяжении последних 3-4 лет. Решение, основанное на глубоком обучении, предполагает обучение Сверторной нейронной сети, которая будет изучать функции и выполнять классификацию в сквозной системе обучения. Однако, поскольку в одном изображении могут присутствовать несколько мультфильмов, стандартная потеря поперечной энтропии softmax, используемая при классификации изображений, может оказаться неприемлемой. Следовательно, независимая логистическая регрессия должна использоваться как функция потерь. Порог для каждого класса может быть получен на основе точности, полученной по установленному набору проверки. Даже для мультфильмов лучше использовать предварительно обученную модель, инициализированную с использованием imagenet вместо тренировки с нуля (https://arxiv.org/pdf/1611.05118v1.pdf, хотя финальная задача в этой статье отличается, они все еще обрабатывают мультфильмы). Если у вас много данных, предварительная подготовка может быть не такой важной. Эта задача может быть выполнена с использованием стандартных библиотек, таких как caffe/torch и т.д.