0

Я думал о том, чтобы сделать небольшой проект, который предполагает распознавание простых двумерных объектов с использованием какого-то машинного обучения. Я думаю, что лучше, что у меня есть каждая сеть, посвященная распознаванию только одного типа объектов. Итак, вот мои два вопроса:Как обучить распознавание одного объекта?

  1. Какую сеть следует использовать? Эти два, о которых я могу думать, могут работать, это простые сети прямой передачи и сети Hopfield. Поскольку я также хочу знать, насколько вход выглядит как цель, сети Хопфилда, вероятно, не подходят.

  2. Если я использую что-то, что требует контролируемого обучения, и мне нужен только один выходной блок, который указывает, насколько ввод выглядит как цель, какие контр-примеры следует показывать в процессе обучения? Просто давая положительные примеры, я уверен, что не сработает (сеть будет просто учиться всегда говорить «да»).

Изображения будут низкого разрешения и черно-белого.

+0

Существует много методов машинного обучения для выполнения описанной задачи, но вы специально ссылаетесь на нейронные сети - это намеренно? – etov

+0

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

ответ

3

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

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

В частности, в отношении вопросов, связанных с NN, я бы предложил использовать прямую сеть, которую относительно легко построить и обучить, с уровнем вывода softmax, который позволяет назначать вероятности различным классам. Если вы используете единую сеть для классификации, вопрос об отрицательных примерах не имеет значения; для каждого класса другие классы были бы его негативными примерами. Если вы решите использовать разные сети, вы можете использовать те же самые встречные примеры (например, другие классы), но, как правило, я предлагаю показывать не более 2-10 отрицательных примеров на один положительный пример.

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

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

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

+0

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

+0

Это все еще немного неясно: «Я всегда знаю, каким должен быть объект» - так есть несколько классов объектов, и вы хотели бы обучить сеть за класс? например вы хотите идентифицировать лица с одной сетью, цветы с другой и т. д.? если это так, то «объекты», которые вы хотели бы добавить, - это дополнительные «классы»? – etov

+0

Это приложение для рисования. Например, я прошу пользователя нарисовать дерево, и сеть оценивает чертеж в соответствии с тем, насколько он выглядит как дерево. «Объекты» - это дополнительные «классы», да. –

2

Имейте игру с FindObject и посмотрите, нравится ли вам обнаружение объекта с помощью OpenCV с использованием функции обнаружения/описания. Если это похоже на хорошее совпадение, вы можете попробовать демонстрацию find_obj.py, включенную в пакет opencv.

Тем не менее, я нашел демо довольно запутанным, так как я еще не был знаком с базовыми понятиями. Я сделал более линейную демоверсию, которая описывает вещи и указывает на некоторые подводные камни, если вы хотите check it out on github.

+0

Я вижу из вашего комментария еще один ответ, что вы на самом деле не ищете объекты, а скорее измеряете качество объекта. Обнаружение объекта, о котором я говорил, вероятно, не поможет. Интересная проблема. Пожалуйста, напишите, если вы получите решение. – KobeJohn

Смежные вопросы