Страницы

Поиск по вопросам

Показаны сообщения с ярлыком распознавание-образов. Показать все сообщения
Показаны сообщения с ярлыком распознавание-образов. Показать все сообщения

среда, 5 февраля 2020 г.

Какой метод распознавания актуален для распознавания рукописных букв (кириллица)?

#нейронные_сети #машинное_обучение #распознавание_образов #распознавание_символов


Если стоит задача в распознавании рукописных букв, то какой метод/алгоритм машинного
обучения наиболее актуален и даёт более точные результаты в этой сфере на текущий момент?
К примеру, лучше использовать нейронные сети, или можно вполне обойтись методами машинного
обучения без ИНС? 

Сейчас передо мной стоит задача распознавания рукописных букв (кириллица). Буквы
будут распознаваться по отдельности (не слова целиком). На вход буду подавать таблицы
с различным рукописным написанием букв русского алфавита. Нужна помощь в избрании наиболее
оптимального алгоритма/метода для распознавания рукописных символов.
    


Ответы

Ответ 1



Когда речь идет о распознавании изображений то сразу возникает ответ - Сверточная нейронная сеть. Ваш случай тому не исключение. Сразу скажу что существует много готовых решений с уже готовой архитектурой НС, поэтому самому писать ничего не нужно. Если C++ или Python, советую Tensorflow. Чтобы понять как работают Сверточные НС, почитайте мой ответ на похожий вопрос.

Ответ 2



Не нужно никаких нейронных сетей, тем более свёрточных. Берите Tesseract, тренируйте на почерк и используйте. Сам Tesseract использует НС, но не свёрточную :-) Совсем недавно сделал проект - используется Tesseract для выявления charboxes, затем Tesseract пытается распознать то что выявил, параллельно эти же charboxes пытается распознать алгоритм на базе OpenCV kNN. Для того, что не распознано, есть GUI, в котором можно выделить charbox и указать вручную что это за символ. В результате формируются данные для тренинга tesseract (то что он не смог сам распознать и было введено вручную), и данные для тренинга kNN (то что tesseract распознал и то что вручную введено). После >10 тренировок на символ он начинает довольно устойчиво распознаваться обеими системами.

пятница, 27 декабря 2019 г.

Поиск изображения в изображении

#c_sharp #cpp #распознавание_образов


Пишу автокликер для одной мобильной игры (скрин ниже). Задача находить на карте объекты.
Точнее, программа делает скриншот экрана игры запущенной в эмуляторе Bluestacks, получаю
bitmap, и нужно искать объекты на карте по фрагментам на скриншоте. Подскажите алгоритм
поиска фрагмента на изображении?


    


Ответы

Ответ 1



Использование OpenCV конечно должно быть более успешным. Я поэкспериментировал с AForge получилось тоже неплохо Вот класс работы с библиотекой, фактически само использование занимает 2 строки, каюсь, взял эту часть из интернета, остальное написал сам public class AforgeService { //найденные совпадения private TemplateMatch[] _matchings; /// /// Количество найденных совпадений /// public int CountMatchings { get => _matchings != null ? _matchings.Length : 0; } //ctor public AforgeService() { } /// /// Содержит ли исходное изображение представленый образец /// /// путь к файлу исходного изображения /// путь к файлу образца /// true если содержит public async Task IsContains(string pathOriginalImage, string pathSampleImage) { if (String.IsNullOrEmpty(pathOriginalImage)) throw new ArgumentNullException(nameof(pathOriginalImage)); if (String.IsNullOrEmpty(pathSampleImage)) throw new ArgumentNullException(nameof(pathSampleImage)); var sample = new Bitmap(pathSampleImage); var orig = new Bitmap(pathOriginalImage); //пользуемся библиотекой ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.921f); _matchings = await Task.Run(() => tm.ProcessImage(orig, sample)); return _matchings.Any(); } /// /// Получение коллекции найденных мест где находится образец /// /// коллекция найденных мест public List GetPlaces() { List result = new List(); if (CountMatchings == 0) return result; int id = 0; foreach (var match in _matchings) { FoundPlace place = new FoundPlace { Id = ++id, Similarity = match.Similarity, Top = match.Rectangle.Top, Left = match.Rectangle.Left, Height = match.Rectangle.Height, Width = match.Rectangle.Width }; result.Add(place); } return result; } } Этот класс для сохранения найденного места public class FoundPlace { public int Id { get; set; } public double Left { get; set; } public double Top { get; set; } public double Width { get; set; } public double Height { get; set; } public double Similarity { get; set; } } Это класс вьюмодели public class MainViewModel : INotifyPropertyChanged, IDisposable { public event PropertyChangedEventHandler PropertyChanged; private readonly IMainWindow _mainWindow; private string _pathOriginalImage; //ctor public MainViewModel(IMainWindow mainWindow) { _mainWindow = mainWindow; } /// /// Флаг запуска поиска, для выкл./вкл. кнопок /// private bool _IsSearching; public bool IsSearching { get => _IsSearching; set { _IsSearching = value; SelectSampleCommand.RaiseCanExecuteChanged(); SearchCommand.RaiseCanExecuteChanged(); } } /// /// Исходное изображение (поле игры) /// public string OriginalImage { get => @"~\..\Assets\Original.jpg"; } /// /// Образец для поиска /// private string _SampleImage; public string SampleImage { get => _SampleImage; set { _SampleImage = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SampleImage))); SearchCommand.RaiseCanExecuteChanged(); } } /// /// Текстовое сообщение о процессе /// private string _Message; public string Message { get => _Message; set { _Message = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Message))); } } /// /// Список найденных мест для ListBox /// private List _Places; public List Places { get { return _Places; } set { _Places = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Places))); } } private FoundPlace _SelectedPlace; public FoundPlace SelectedPlace { get => _SelectedPlace; set { _SelectedPlace = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedPlace))); _mainWindow.DrawPlace(_SelectedPlace); } } /// /// Кнопка Выбрать /// private RelayCommand _SelectSampleCommand; public RelayCommand SelectSampleCommand { get => _SelectSampleCommand = _SelectSampleCommand ?? new RelayCommand(OnSelectSample, CanSelectSample); } private bool CanSelectSample() { if (IsSearching) { return false; } return true; } private void OnSelectSample() { string file = _mainWindow.SelectSample(); if (String.IsNullOrEmpty(file)) return; SampleImage = file; } /// /// Кнопка Искать /// private RelayCommand _SearchCommand; public RelayCommand SearchCommand { get => _SearchCommand = _SearchCommand ?? new RelayCommand(OnSearch, CanSearch); } private bool CanSearch() { if (String.IsNullOrEmpty(SampleImage) || IsSearching) { return false; } return true; } private async void OnSearch() { Message = "Ждите..."; IsSearching = true; AforgeService service = new AforgeService(); try { using (OverrideCursor cursor = OverrideCursor.GetWaitOverrideCursor()) { string pathOrigin = GetOriginalImage(); bool isContains = await service.IsContains(pathOrigin, SampleImage); if (isContains) { Places = service.GetPlaces(); } else { Places = new List(); } } } catch (Exception ex) { var message = $"Возникла ошибка: {ex.Message}"; _mainWindow.ShowMessage(message, "Ошибка"); } finally { Message = $"Найдено мест: {service.CountMatchings}"; IsSearching = false; } } /// /// Получение пути к оригинальному изображению (полю игры) /// /// private string GetOriginalImage() { if (!String.IsNullOrEmpty(_pathOriginalImage) && File.Exists(_pathOriginalImage)) { return _pathOriginalImage; } _pathOriginalImage = Path.Combine(Path.GetTempPath(), "Original.jpg"); Uri imgUri = new Uri("pack://application:,,,/Assets/Original.jpg"); StreamResourceInfo imgStream = Application.GetResourceStream(imgUri); using (Stream imgs = imgStream.Stream) using (FileStream fs = File.Create(_pathOriginalImage)) { byte[] ar = new byte[imgs.Length]; imgs.Read(ar, 0, ar.Length); fs.Write(ar, 0, ar.Length); } return _pathOriginalImage; } /// /// IDisposable /// public void Dispose() { if (!String.IsNullOrEmpty(_pathOriginalImage) && File.Exists(_pathOriginalImage)) { File.Delete(_pathOriginalImage); } } } Весь пример можно скачать здесь

Ответ 2



Думаю, тебе хватит функционала реализованного в OpenCV OpenCV (англ. Open Source Computer Vision Library, библиотека компьютерного зрения с открытым исходным кодом) — библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. (с) Википедия. Вот неплохие уроки по ней, а вот то, что тебе в теории может пригодиться.

Ответ 3



Есть большая, сложная и популярная область технологий, называемая распознанием образов. По большей части там используются глубокие нейронные сети, но не только. И вряд ли в Вашем случае нужна такая сложность (хотя и может вдохновить на правильный вектор дальнейших действий). Простой способ – разбить игровое поле на части (кажется, в данной игре это особенно актуально) и сверять каждую часть на сходство с известными предметами. Если же предметы могут находиться в случайных местах, а не только на заданной сетке, то нужен более продвинутый анализ: можно сначала сверять по сетке, затем по той же сетке со смещение на половину (или даже треть и две трети). Ещё можно масштабировать, брать некий хэш от части изображения... Кстати, если не удастся добиться 99% точности (что в принципе возможно, ведь все предметы будут статично, а не поворачиваться под разным освещением, как в реальном мире), то можно компенсировать точность продуманностью кликов: сохранять позиции, куда уже безуспешно кликах, чтобы в следующие разы не тупить, не тратить время. Тогда главное, чтобы алгоритм поиска выдавал как можно меньше ложно отрицательных срабатываний, а ложно положительные будут быстро отсекаться на практике. Полезные ссылки: Закрытый вопрос на ruSO, но всё же с некоторыми интересными идеями. Статья о распознании образов (Хабр) Метод Виолы-Джонса для поиска и распознания лиц (Хабр)

Ответ 4



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

среда, 25 декабря 2019 г.

Распознавание лиц на изображениях — как это работает?

#распознавание_образов


Хочется быстро и относительно поверхностно въехать в тему распознавания графических
образов: как даже простенькие фотоаппараты-мыльницы распознают лица/улыбки?
Что прочесть? — жажду ответов тех, кто написал в итоге своё распознавание чего-то.    


Ответы

Ответ 1



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

вторник, 24 декабря 2019 г.

Как распознать шрифт на изображении? [закрыт]

#изображения #шрифты #распознавание_образов


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it's
on-topic for Stack Overflow на русском.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        

Какой шрифт использован на прикрепленной картинке?
Каким методом/сервисом такое можно узнать?



    


Ответы

Ответ 1



1) Похоже на Plakette Serial Regular 2) Например, этим

понедельник, 23 декабря 2019 г.

Архитектура сервиса по распознаванию образов

#архитектура #нейронные_сети #искусственный_интеллект #распознавание_образов


Вопрос к разработчикам проектов по распознаванию образов. Как лучше организовать
архитектуру подобного сервиса?

Сейчас склоняюсь к решению использовать для работы с данными (а особенно для обучения)
специализированные GPU-инстансы Amazon EC2 P2. На серверах установлено ПО только для
работы искусственных нейронных сетей (Python, Anaconda, Keras, TensorFlow). В production-режиме
сервер на вход принимает изображения с метаданными (как именно обработать изображение
и какие данные вернуть), на выходе возвращает JSON-массив в зависимости от типа метаданных.
Никакой особой логики там не хранится, вся аналитика происходит на серверах web-приложений.

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

Взаимодействие web-приложения с нейронной сетью осуществляется через API-запросы
к GPU-серверам. Далее результат уже выдается на клиенты (аналогично с клиентов  все
идет на web-приложение, а затем на обработку в нейронную сеть).

Теперь основные вопросы:


На каком участке вы проводите аналитику? (например, чтобы определить, что на фотографии
на человеке надет синий мужской пиджак к нейронной сети выполняется каскад запросов
"поиск мужчины"->"поиск пиджака"->"определение цвета пиджака". для получения более
высокого качества ответа и снижения нагрузки на сеть каждый запрос выполняется отдельно
при утвердительном предыдущем). Имеет ли смысл реализовывать все варианты поиска в
рамках единой нейросети или лучше создать множество отдельных нейросетей, заточенных
под достаточно простые задачи?
Как вы оптимизируете потребление ресурсов на этапах обучения и работы сети? Пока
на уме только вариант с созданием специализированного GPU-кластера под обучение в рамках
облачного хостинга и его периодическое включение по мере надобности (иначе дорого получается).

    


Ответы

Ответ 1



Ваши вопросы говорят о том что, вы не осознаете всей сложности проблемы поиска мужчины на фото, не говоря уж о поиске пиджака. Хотя бы найти объект произвольного размера на фото по меркам на конец 2017 года - это уже передний край науки. Сначала начните с простого. Попытайтесь хотя бы в общих чертах решить вашу проблему, о которой ни слова в вопросе. Арендуете ли вы для этого один сервер, или купите подходящую видеокарту - дело второе. Можно и без видеокарт. Как только вы поймете что для радикального уменьшения ошибки обучения вам нужны годы на ваших мощностях, тогда можно будет говорить об аренде кластера. И тогда вы можете обратиться к документации на TensorFlow чтобы узнать как конкретно решаются подобные проблемы.

Алгоритм распознания геометрических фигур

#алгоритм #распознавание_образов


Задача: нужно определить, что нарисовал пользователь по заданному шаблону. Например
"квадрат", "круг", "треугольник". Всего два цвета: черный и белый (без серого шума).

Порекомендуйте хорошую документацию или хороший алгоритм.
    


Ответы

Ответ 1



Я бы посоветовал нейросеть. Хотя, обучение нейросети на 170 символов будет достаточно долгим процессом. Вот несколько ссылок по теме: Теория нейронных сетей Простейшая нейросеть для разпознавания символов (с примером)

Ответ 2



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

Ответ 3



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

Ответ 4



Преобразование Хафа и обобщённое преобразование Хафа

среда, 11 декабря 2019 г.

С помощью чего решить задачу по распознаванию органов на УЗИ

#opencv #нейронные_сети #искусственный_интеллект #распознавание_образов


Не так давно решил изучать нейронные сети, еще новичок. Понял, что сетей на самом
деле много. Не знаю какую выбрать.

Раньше с помощью OpenCV работал со снимками УЗИ, с помощью фильтров выделял контуры
органов, но проблема была в том, что руками приходилось подбирать параметры для фильтров,
что было не удобно.



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


Ответы

Ответ 1



Если Вы хотите решать задачу именно с помощью нейронных сетей, то одним из распространенных вариантов являются Fully Convolutional neural networks. К примеру: https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf С точки зрения конкретного инструментария, то практически любой современный фреймворк (TensorFlow, Torch, MXNet, Caffe, etc..) и даже высокоуровные wrapper'ы вроде Keras без проблем справятся с реализацией такого рода сетей.

Распознавание животных на аэрофотоснимках

#распознавание_образов


Имеется коллекция изображений размером 5184x3156, полученных в процессе аэрофотосъёмки,
на которых необходимо распознать степных сайгаков. Примеры входных данных: №1, №2, №3.

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


    


Ответы

Ответ 1



Каких-либо конкретных методов решения задачи не могу дать, но однозначно необходимо применять коррелятор двумерного изображения. В качестве алгоритмов использовать быстрый алгоритм взаимной корреляции (на основе БПФ). С уважением, maxspb89.

Ответ 2



Adobe Photoshop Extended помогает считать объекты в изображении. Два варианта: ручной режим: кликать мышкой по каждому найденному глазами сайгаку; автоматический: подсчитает количество выделенных областей. Надо обработать картинку фильтрами и настройками уровней и т.п. так, чтобы сайгаки отличались от всего остального, например, цветом (фон белый, они черные, но при этом черные только они). Это вполне можно сделать. Затем выбор по цвету (чёрный), и автоматически подсчитать количество отдельных выделенных областей. При однородности изображений достаточно один раз настроить такую обработку, и можно анализировать изображения пачкой. Как бы я обрабатывал картинку: выбрал из трёх каналов тот, в котором сайкаги наиболее контрастны, и дальше работал только с ним; методом частотного разложения выделил объекты размера сайгаков в отдельный слой; уровнями, фильтром Find Edges или другими добился белого фона без "мусора" и черных пятен сайгаков; Select - Color range - выбрать все чёрные области: сосчитать их. При одинаковом масштабе снимков (и размере сайгаков на них) можно загнать всю последовательность действий в File - Automate - Batch... и применить ко всем изображениям в папке.

четверг, 5 декабря 2019 г.

Настройка распознавания лиц в OpenCV

#java #cpp #opencv #распознавание_образов #javacv


У меня есть набор изображений для обучения: для двух персон по 10 изображений и 80
изображений различных персон для проверки достоверности распознавания. Имеется 3 контрольных
изображения, по 1 с каждой персоной и одна общая с десяткой персон (в которую входят
первые две и несколько из 80). На всех изображениях персоны расположены фронтально.
Хотелось бы в результате распознавания на всех 3 контрольных изображениях опознать
две персоны, для которых производилось обучение с помощью 10 изображений.
Проблема заключается в том, что все 3 алгоритма (LBPH, Fisherfaces, Eigenfaces) не
справились с этой задачой (на одном или двух изображениях помечают персону другой,
причем для которой было всего 1 обучающее изображение), очевидно, у меня где-то ошибка
в последовательности обучения или распознавания, или я чего-то не учел.

Добавление изображения для обучения:


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


Добавление изображения для распознавания:


Определить все лица на изображении в градации серого и для каждого выполнить
сделать новое изображение на основе позиции
для алгоритов кроме LBPH привести изображения к одному размеру
Histogram Equalization
отправить на распознавание


Буду рад принять любые советы и ответить на Ваши вопросы, спасибо за помощь!
    


Ответы

Ответ 1



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

Ответ 2



Процесс распознавания лица можно разбить на 3 стадии: выделение области с лицом нормализация изображения сравнение и анализ OpenCV предоставляет утилиты для 1 и 3 стадии, а вот 2 стадию (самую сложную) возлагает ответственность на пользователя. Алгоритмы LBPH, Fisherfaces, Eigenfaces достигают 90% точности распознавания на специально подготовленных изображениях (нормализованных). Если взять подборку AT&T, то можно заметить, что у них все изображения: имеют одинаковый размер (ширина и высота), все приведены к градации серого с нормализацией, однотонный фон, лица отцентрированы и произведено выравнивание на основе опорных точек и произведены другие методы нормализации. Пример выполнения процесса нормализации. Разбор и анализ алгоритмов распознавания, используемых в OpenCV. AT&T Facedatabase. Таким образом, проблема низкой точности распознавания в моем случае заключалась в том, что изображения имели низкий уровень нормализации. Для повышения уровня точности нужно либо добавлять различные алгоритмы для нормализации изображений, либо использовать для распознавания более современные алгоритмы, основанные на нейронных сетях и машинном обучении После нормализации на основе алгоритма из статьи существенно увеличилась точность определения (я добавил поворот и масштабирование изображения на основе положения глаз).

среда, 4 декабря 2019 г.

Распознавание номера телефона на картинке

#python #python_3x #распознавание_образов #библиотека


Как можно распознать номер телефона на картинке?
    


Ответы

Ответ 1



Например, pytesseract: from PIL import Image import pytesseract import io import requests image_bytes = requests.get('http://placehold.it/200x100').content image = Image.open(io.BytesIO(image_bytes)) text = pytesseract.image_to_string(image) print(text) # 200x100

воскресенье, 1 декабря 2019 г.

Ансамбль сверточных нейронных сетей для распознавания образов?

#машинное_обучение #искусственный_интеллект #распознавание_образов #нейронные_сети


Целесообразно ли использовать ансамбль сверточных нейронных сетей (convolutional
neural network) для задач распознавания образов?

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


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


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



Также я обратил внимание на следующую русскоязычную статью датируемую 2012 годом:


  Актуальные вопросы использования сверточных нейронных сетей и их комитетов в распознавании
образов цифр (Кузьмицкий Н.Н., 2012, pdf)


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

Вот одна из таблиц сравнения точности распознавания комитетами нейросетей и системы
KADMOS:


  




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

И все-таки как же обстоят дела в этом вопросе? На данный момент, имеются ли значимые
преимущества использования ансамбля сверточных нейронных сетей перед вариантом с одной
нейронной сетью (без ансамбля) в задачах распознавания образов или нет?
    


Ответы

Ответ 1



Данный ответ представляет собой перевод ответа пользователя Franck Dernoncourt в следующем вопросе на англ. языке. На данный момент, имеются ли значимые преимущества использования ансамбля сверточных нейронных сетей перед вариантом с одной нейронной сетью (без ансамбля) в задачах распознавания образов? Эмпирически, ансамбли сверточных нейронных сетей (CNNs) часто дают некоторое преимущество в сравнении с одной сверточной нейросетью. Пример классификации изображений приведен в статье авторов Krizhevsky Alex, Ilya Sutskever и Geoffrey E. Hinton: "ImageNet classification with deep convolutional neural networks/Классификация изображений ImageNet с использованием сверточных нейронных сетей (ENG, 2012, PDF)" Там приведена следующая таблица: Перевод: Сравнение коэффициента ошибок на ILSVRC-2012 на проверочном/контрольном (validation) и тестовом (test) множествах. Курсивом обозначены лучшие результаты, достигнутые другими алгоритмами. Модели со звездочкой* были предварительно обучены классификации всей базы изображений ImageNet 2011 (осенний релиз). Более подробно см. раздел 6. На примере машинного перевода (c использованием LSTM сетей) имеется статья авторов: Sutskever Ilya, Oriol Vinyals, и Quoc V. Le: Sequence to sequence learning with neural networks/Обучение типа “последовательность-в-последовательность” с нейронными сетями (ENG, 2014, PDF) В статье приведена таблица: Перевод: Эффективность LSTM на WMT 2014 на тестовом множестве "С английского на французский (ntst14)". Обратите внимание, что ансамбль из 5 LSTM сетей с размером пучка (beam size) 2 дешевле, чем одна LSTM-сеть с размером пучка 12.

суббота, 30 ноября 2019 г.

Распознавание лиц на видео и поиск совпадений в базе данных

#изображения #видео #нейронные_сети #распознавание_образов #распознавание


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

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

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


Ответы

Ответ 1



Советую использовать фреймворк компании Neurotechnology: SentiVeillance SDK Обнаружение лица в реальном времени Одновременное отслеживание нескольких лиц или объектов в на кадре Расширенное обнаружение и классификация людей и отслеживание транспортных средств Классификация по половому признаку, оценка возраста, распознование наличие очков и волос на лице Поддержка больших систем наблюдения за счет подключения до 10 камер на одном компьютере и быстрая синхронизация между сетевыми компьютерами Кроссплатфовренный SDK, поддерживающий несколько языков программирования Подробнее... Так же на сайте доступны для скачки 30-ти дневная триал версия и демо приложение. Цена лицензии

Ответ 2



Как я понял, вам требуется готовая система распознавания лиц. The MegaFace Benchmark Можете посмотреть качество существующих алгоритмов по международному конкурсу The MegaFace Benchmark: http://megaface.cs.washington.edu/results/fgnetresults.html http://megaface.cs.washington.edu/results/fgnetresults_challenge2.html Там же приводятся названия алгоритмов/компаний к которым вы можете обратиться, чтобы купить/получить доступ к API их алгоритмов (коммерческие решения) или получить исходный код (open source решения). Из российских компаний хорошие позиции по качеству распознавания занимает NTechLab. Использование готовых API Также хорошим решением будет использование готового API качественного сервиса для распознавания лиц, чем писать с нуля свою собственную систему и выводить ее на конкурентный уровень качества (на что уйдут годы работы, т.к. для нормального качества распознавания недостаточно библиотеки Open CV, там надо внедрять полноценную 3D реконструкцию лица). Например, вот хороший вариант: https://www.faceplusplus.com/ У них множество API на самые разные случаи распознавания лиц (Face Searching, Face Detection, Return Face Attributes, Return Face Details) с возможностью ведения собственной базы данных "подозрительных" лиц (Add Face, Remove Face, Create FaceSet). В базовом варианте система бесплатна, в расширенном функционале они берут 0.001$ за запрос, а также можно купить лицензию на месяц/год. У вас приложение ориентировано на коммерческий сектор, потенциальные клиенты поймут, если вы включите в стоимость количество распознаваемых лиц (даже при ежедневном трафике магазина в 1000 человек дополнительные расходы у вас будут всего 1$). Алгоритм работы Можете использовать такое решение: Направляем анализируемые видеопотоки на собственные сервера, где проводим их покадровый разбор и сжатие информации до получения набора различающихся между собой фотографий. При помощи библиотеки Open CV вытаскиваете из получившегося набора фотографии лиц, по которым требуется провести распознавание. Сверяем фотографии по схожести хэшей или базовым признакам (чтобы не отправлять на распознавание повторно фото одного и того же лица в разные моменты времени или с другого ракурса). Если фотография лица уникальная, то отправляем ее через API сервиса (тот же Face++ или любой другой), получаем результат. В случае нахождения совпадения по базе выводим предупреждение пользователям системы (через SMS, Push-уведомления или интерактивный web-интерфейс на WebSockets). Отдельным моментом будет формирование базы "подозрительных" лиц. Если вы планируете ее делать "на лету" по данным вашего приложения, то можете сделать интерфейс добавления на основе снимка из видеопотока.

вторник, 27 ноября 2018 г.

Распознавание лиц на изображениях — как это работает?

Хочется быстро и относительно поверхностно въехать в тему распознавания графических образов: как даже простенькие фотоаппараты-мыльницы распознают лица/улыбки? Что прочесть? — жажду ответов тех, кто написал в итоге своё распознавание чего-то.


Ответ

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

понедельник, 19 ноября 2018 г.

Архитектура сервиса по распознаванию образов

Вопрос к разработчикам проектов по распознаванию образов. Как лучше организовать архитектуру подобного сервиса?
Сейчас склоняюсь к решению использовать для работы с данными (а особенно для обучения) специализированные GPU-инстансы Amazon EC2 P2. На серверах установлено ПО только для работы искусственных нейронных сетей (Python, Anaconda, Keras, TensorFlow). В production-режиме сервер на вход принимает изображения с метаданными (как именно обработать изображение и какие данные вернуть), на выходе возвращает JSON-массив в зависимости от типа метаданных. Никакой особой логики там не хранится, вся аналитика происходит на серверах web-приложений.
Обучающие и тестовые выборки хранятся в отдельном кластере (обычные сервера с большим дисковым пространством). Туда же загружаются изображения из сети найденные собственными поисковыми ботами (через соцсети и поисковые системы).
Взаимодействие web-приложения с нейронной сетью осуществляется через API-запросы к GPU-серверам. Далее результат уже выдается на клиенты (аналогично с клиентов все идет на web-приложение, а затем на обработку в нейронную сеть).
Теперь основные вопросы:
На каком участке вы проводите аналитику? (например, чтобы определить, что на фотографии на человеке надет синий мужской пиджак к нейронной сети выполняется каскад запросов "поиск мужчины"->"поиск пиджака"->"определение цвета пиджака". для получения более высокого качества ответа и снижения нагрузки на сеть каждый запрос выполняется отдельно при утвердительном предыдущем). Имеет ли смысл реализовывать все варианты поиска в рамках единой нейросети или лучше создать множество отдельных нейросетей, заточенных под достаточно простые задачи? Как вы оптимизируете потребление ресурсов на этапах обучения и работы сети? Пока на уме только вариант с созданием специализированного GPU-кластера под обучение в рамках облачного хостинга и его периодическое включение по мере надобности (иначе дорого получается).


Ответ

Ваши вопросы говорят о том что, вы не осознаете всей сложности проблемы поиска мужчины на фото, не говоря уж о поиске пиджака. Хотя бы найти объект произвольного размера на фото по меркам на конец 2017 года - это уже передний край науки.
Сначала начните с простого. Попытайтесь хотя бы в общих чертах решить вашу проблему, о которой ни слова в вопросе. Арендуете ли вы для этого один сервер, или купите подходящую видеокарту - дело второе. Можно и без видеокарт. Как только вы поймете что для радикального уменьшения ошибки обучения вам нужны годы на ваших мощностях, тогда можно будет говорить об аренде кластера. И тогда вы можете обратиться к документации на TensorFlow чтобы узнать как конкретно решаются подобные проблемы.

Алгоритм распознания геометрических фигур

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


Ответ

Я бы посоветовал нейросеть. Хотя, обучение нейросети на 170 символов будет достаточно долгим процессом. Вот несколько ссылок по теме: Теория нейронных сетей Простейшая нейросеть для разпознавания символов (с примером)

понедельник, 8 октября 2018 г.

Настройка распознавания лиц в OpenCV

У меня есть набор изображений для обучения: для двух персон по 10 изображений и 80 изображений различных персон для проверки достоверности распознавания. Имеется 3 контрольных изображения, по 1 с каждой персоной и одна общая с десяткой персон (в которую входят первые две и несколько из 80). На всех изображениях персоны расположены фронтально. Хотелось бы в результате распознавания на всех 3 контрольных изображениях опознать две персоны, для которых производилось обучение с помощью 10 изображений. Проблема заключается в том, что все 3 алгоритма (LBPH, Fisherfaces, Eigenfaces) не справились с этой задачой (на одном или двух изображениях помечают персону другой, причем для которой было всего 1 обучающее изображение), очевидно, у меня где-то ошибка в последовательности обучения или распознавания, или я чего-то не учел.
Добавление изображения для обучения:
считать изображения для обучения в градациях серого определить позицию лица и сделать новое изображение на основе этой позиции для алгоритов кроме LBPH привести изображения к одному размеру (я так и не смог определить, какой лучше всего размер использовать, наугад тыкал разные) Histogram Equalization добавить в вектор который потом пойдет в обучение
Добавление изображения для распознавания:
Определить все лица на изображении в градации серого и для каждого выполнить сделать новое изображение на основе позиции для алгоритов кроме LBPH привести изображения к одному размеру Histogram Equalization отправить на распознавание
Буду рад принять любые советы и ответить на Ваши вопросы, спасибо за помощь!


Ответ

Процесс распознавания лица можно разбить на 3 стадии:
выделение области с лицом нормализация изображения сравнение и анализ
OpenCV предоставляет утилиты для 1 и 3 стадии, а вот 2 стадию (самую сложную) возлагает ответственность на пользователя. Алгоритмы LBPH, Fisherfaces, Eigenfaces достигают 90% точности распознавания на специально подготовленных изображениях (нормализованных). Если взять подборку AT&T, то можно заметить, что у них все изображения: имеют одинаковый размер (ширина и высота), все приведены к градации серого с нормализацией, однотонный фон, лица отцентрированы и произведено выравнивание на основе опорных точек и произведены другие методы нормализации. Пример выполнения процесса нормализации. Разбор и анализ алгоритмов распознавания, используемых в OpenCV. AT&T Facedatabase
Таким образом, проблема низкой точности распознавания в моем случае заключалась в том, что изображения имели низкий уровень нормализации. Для повышения уровня точности нужно либо добавлять различные алгоритмы для нормализации изображений, либо использовать для распознавания более современные алгоритмы, основанные на нейронных сетях и машинном обучении
После нормализации на основе алгоритма из статьи существенно увеличилась точность определения (я добавил поворот и масштабирование изображения на основе положения глаз).

Распознавание номера телефона на картинке

Как можно распознать номер телефона на картинке?


Ответ

Например, pytesseract
from PIL import Image import pytesseract
import io import requests
image_bytes = requests.get('http://placehold.it/200x100').content image = Image.open(io.BytesIO(image_bytes)) text = pytesseract.image_to_string(image) print(text) # 200x100

четверг, 4 октября 2018 г.

Распознавание лиц на видео и поиск совпадений в базе данных

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


Ответ

Советую использовать фреймворк компании Neurotechnology:
SentiVeillance SDK
Обнаружение лица в реальном времени Одновременное отслеживание нескольких лиц или объектов в на кадре Расширенное обнаружение и классификация людей и отслеживание транспортных средств Классификация по половому признаку, оценка возраста, распознование наличие очков и волос на лице Поддержка больших систем наблюдения за счет подключения до 10 камер на одном компьютере и быстрая синхронизация между сетевыми компьютерами Кроссплатфовренный SDK, поддерживающий несколько языков программирования
Подробнее...
Так же на сайте доступны для скачки 30-ти дневная триал версия и демо приложение
Цена лицензии

Распознавание лиц на видео и поиск совпадений в базе данных

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


Ответ

Советую использовать фреймворк компании Neurotechnology:
SentiVeillance SDK
Обнаружение лица в реальном времени Одновременное отслеживание нескольких лиц или объектов в на кадре Расширенное обнаружение и классификация людей и отслеживание транспортных средств Классификация по половому признаку, оценка возраста, распознование наличие очков и волос на лице Поддержка больших систем наблюдения за счет подключения до 10 камер на одном компьютере и быстрая синхронизация между сетевыми компьютерами Кроссплатфовренный SDK, поддерживающий несколько языков программирования
Подробнее...
Так же на сайте доступны для скачки 30-ти дневная триал версия и демо приложение
Цена лицензии