Как получить «фотографию» из полей распознавания лиц?

#c# #face-detection

#c# #распознавание лиц

Вопрос:

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

Фотография, означающая изображение всего лица, шеи, волос и ушей человека того же общего размера, что и другая фотография.

В настоящее время я использую
http://askernest.com/archive/2008/05/03/face-detection-in-c.aspx
для реализации OpenCV и я использую

 harrcascade_frontalface_default.xml  
harrcascade_frontalface_alt.xml  
harrcascade_frontalface_alt2.xml  
harrcascade_frontalface_alt_tree.xml
  

как мои каскады.

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

Моя проблема состоит из 3 частей.

  • Мой текущий процесс довольно медленный. Как я могу ускорить процесс обнаружения?
    Редактировать: Я обнаружил, что время обработки напрямую связано с размером фотографии. Уменьшение размера фотографий может оказаться полезным.

  • Один каскад не определит все лица, с которыми я сталкиваюсь, поэтому я использую их все. Это, конечно, приводит к множеству различных квадратов и нескольким ложным срабатываниям. Какой метод я могу использовать для выявления ложных срабатываний и исключения их из расчета среднего квадрата? например. Песочный человекУэйн
    Редактировать: я использую среднее значение в пределах стандартного отклонения. Скоро опубликуем код.

  • Я не совсем уверен в том, как наилучшим образом найти фотографию, учитывая квадратные координаты лица. Где я могу найти соотношение лица и фотографии?
    Редактировать : Решил эту проблему. Предполагая, что все мои головы являются соотношениями их лиц.

     static public Rectangle GetMugshotRectangle(Rectangle rFace)
    {
        int y2, x2, w2, h2;
    
        //adjust as neccessary
        double heightRatio = 2;
    
        y2 = Convert.ToInt32(rFace.Y - rFace.Height * (heightRatio - 1.0) / 2.0);
        h2 = Convert.ToInt32(rFace.Height * heightRatio);
        //height to width ratio is 1.25 : 1 in mugshots
        w2 = Convert.ToInt32(h2 * 4 / 5);
        x2 = Convert.ToInt32((rFace.X   rFace.Width / 2) - w2 / 2);
    
        return new Rectangle(x2, y2, w2, h2);
    }
      

    Песочный человек
    Мне просто нужно избавиться от этих ложных срабатываний.

Хорошо, сделайте эти 4 вопроса.

  • Наша камера, которую мы будем использовать, в настоящее время не работает, поэтому у меня нет способа захвата изображений на данный момент. Где я могу найти изображения людей в полный рост, которые не являются чистым pron, таким как поиск изображений Google для изображений всего тела?
    Редактировать : «Стоящий человек» обеспечивает хороший поиск 🙂

Комментарии:

1. Это Томас Хейден Черч?

2. Это песочный человек в «Человеке-пауке», ха-ха

Ответ №1:

Один каскад может делать то, что делают все ваши каскады, если он настроен таким образом, плюс он не дает вам нескольких результатов, по которым можно судить. Используемые вами каскады, возможно, отличаются набором обучающих картинок, из которых они сделаны, или некоторыми параметрами.

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

Комментарии:

1. Именно там я получил свои текущие каскады. Я пока не уверен, что хочу предпринимать усилия по созданию своего собственного каскада. У меня точно нет 5000 изображений с 1000 уникальными лицами.

2. Возможно, существуют какие-то «правила добавления», которые применяются к каскадам, поэтому новый каскад может быть построен из нескольких, которые ведут себя так, как если бы он был обучен со всеми изображениями каскадов. Но для меня это тоже звучит сложно..

Ответ №2:

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

Шаги, которые я предпринял, были следующими.

  1. Загрузите изображение, если его высота или ширина превышает 500 пикселей, создайте новое изображение версии, уменьшенной до максимальной высоты или ширины 500 пикселей. Сохраните масштаб.
  2. Запустите реализацию C # OpenCV в Ask Ernest на всех кадрах с фронтальным изображением лица во время обучения.
  3. По какой-то причине прямоугольники, созданные Ask Ernest, необходимо увеличить в 1,3 раза
  4. Для сгенерированных прямоугольников используйте стандартное отклонение для удаления ложных срабатываний. Я сделал это для каждого угла прямоугольника, найдя расстояние, на котором каждый угол прямоугольника был удален от среднего местоположения угла. Я отметил любой прямоугольник, у которого был неисправный угол, и удалил его из списка прямоугольников-кандидатов.
  5. Получите средний прямоугольник из оставшихся прямоугольников и примените «GetMugshotRectangle» сверху в вопросе.
  6. Снова увеличьте прямоугольник фотографии, используя масштаб, который мы сохранили на шаге 1.
  7. Вырежьте фотографию из исходного изображения и сохраните в новом месте.

Готово!

Ответ №3:

Я предлагаю вам использовать каскадный файл Хаара для верхней части тела, который вернет вам прямоугольник до плеча. Пожалуйста, найдите каскадный файл Head and shoulders по адресу «http://alereimondo.no-ip.org/OpenCV/34«