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

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

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

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

Ответы [ 4 ]

25 голосов
/ 13 ноября 2011

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

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

Шаг 1

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

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

  • sklearn.feature_extraction (особенно подмодуль image )

  • sklearn.cluster.spectral_clustering

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

Шаг 2

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

Шаг 3

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

Шаг 4

обучать, проверять и проверять свой классификатор

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

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

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

2 голосов
/ 13 ноября 2011

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

  • Собственные лица , название для всех алгоритмов, которые используют собственные векторы для распознавания лиц.
  • Мешок слов или визуальные слова подходят.
0 голосов
/ 27 декабря 2016

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

0 голосов
/ 13 декабря 2016

Вы можете попробовать построить модель, загрузив данные о тренировках (изображения комиксов) в 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
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...