Перейти к содержимому
Compvision.ru
BashOrgRu

Помогите с каскадом - создал но не такой как надо

Recommended Posts

Здравствуйте. Создал каскад, cascade.xml, вроде обучение завершилось. Написал программу, работает, но с каскадом распознавания лиц от emgu. с моим каскадом программа не работает. Прикладываю свой каскад и каскад от эмгу. Видно, что они сильно разнятся. Как мне сделать каскад как у них? У них даже структура каскада другая. Как сделать такую же?

my.xml

haarcascade_frontalface_alt_tree.xml

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очевидно, что важна обучающая выборка и число этапов обучения, критерий остановки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вместо HaarCascade попробуйте CascadeClassifier и должны будут загрузится оба каскада

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очевидно, что важна обучающая выборка и число этапов обучения, критерий остановки.

Файлы разнятся на столько, что я уже думаю не нужно ли как то запустить concert_cascade.c, правда я пока не понял как это сделать

 

Вместо HaarCascade попробуйте CascadeClassifier и должны будут загрузится оба каскада

Вы имели ввиду в коде?

Вот мой код, при замене в нем HaarCascade на CascadeClassifier выдает всякие ошибки, где именно заменить, если вы про код..?

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using Emgu.CV.Structure;
using Emgu.CV;
using System.Runtime.InteropServices;
 
 
 
namespace WpfApplication1
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private Capture capture;
        private HaarCascade haarCascade;
        DispatcherTimer timer;
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            capture = new Capture();
            haarCascade = new HaarCascade(@"haarcascade_frontalface_alt_tree.xml");
            timer = new DispatcherTimer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = new TimeSpan(0, 0, 0, 0, 1);
            timer.Start();
        }
        void timer_Tick(object sender, EventArgs e)
        {
            Image<Bgr, Byte> currentFrame = capture.QueryFrame();
 
            if (currentFrame != null)
            {
                Image<Gray, Byte> grayFrame = currentFrame.Convert<Gray, Byte>();
 
                var detectedFaces = grayFrame.DetectHaarCascade(haarCascade)[0];
 
                foreach (var face in detectedFaces)
                    currentFrame.Draw(face.rect, new Bgr(0, double.MaxValue, 0), 3);
 
                image1.Source = ToBitmapSource(currentFrame);
            }
 
        }
        [DllImport("gdi32")]
        private static extern int DeleteObject(IntPtr o);
 
        public static BitmapSource ToBitmapSource(IImage image)
        {
            using (System.Drawing.Bitmap source = image.Bitmap)
            {
                IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap
 
                BitmapSource bs = System.Windows.Interop
                  .Imaging.CreateBitmapSourceFromHBitmap(
                  ptr,
                  IntPtr.Zero,
                  Int32Rect.Empty,
                  System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
 
                DeleteObject(ptr); //release the HBitmap
                return bs;
            }
        }
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Файлы разнятся на столько, что я уже думаю не нужно ли как то запустить concert_cascade.c, правда я пока не понял как это сделать

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, тогда не понятно выражение "с моим каскадом программа не работает". Не запускается? Падает с какой-то ошибкой? С какой? В каком месте? Как и чем обучался каскад? Точно ли он дообучился?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, тогда не понятно выражение "с моим каскадом программа не работает". Не запускается? Падает с какой-то ошибкой? С какой? В каком месте? Как и чем обучался каскад? Точно ли он дообучился?

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

Первый этап обработки исключения типа "Emgu.CV.Util.CvException" в Emgu.CV.dll
Программа "[416] WpfApplication1.vshost.exe" завершилась с кодом -1073741819 (0xc0000005) 'Access violation'.
Программа "[416] WpfApplication1.vshost.exe: Трассировка программы" завершилась с кодом 0 (0x0).
 
вот такое вот пишет Visual studio 2013 при моем каскаде..
 
Обучал по инструкции из вот этой статьи, шаг в шаг - http://habrahabr.ru/post/208092/
но его код у меня так и не заработал и я вот этот (приведенный выше) взял. По завершению обучения просто все прекратилось, все стадии (16) пройдены..Вроде успех..Мой каскад почти копия (только числа другие), каскада с совой из статьи с хабра...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Либо как вариант, помогите запустить проект с совой из статьи...Это тоже было бы отличным решением.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не пойму почему у вас не работает пример с совой, у меня работал хорошо. Файл с каскадом поместили в папку проекта и включили в solution explorer(не знаю как он на русском)? Добавлю также код кнопки из моего проекта, которая работает с Каскадом и выделяет найденную область как новое изображение, может пригодится.

upd. Также посмотрите в сети как создать проект с библиотеками EmguCV(проверьте, работают ли самые простые программы), в некоторых статьях забывают упомянуть что нужно в bin/Debug вашего проекта хранить не только библиотеки emgucv, но и opencv. Хотя, может и по-другому можно на них ссылаться, но так проще всего, как мне кажется.

ButtonRun.txt

Изменено пользователем barsukov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я имел ввиду заменить   ваше  private HaarCascade haarCascade; на CascadeClassifier как у  barsukov написано, разумеется весь остальной код править тоже надо под эот класс, но там не большая разница

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не пойму почему у вас не работает пример с совой, у меня работал хорошо. Файл с каскадом поместили в папку проекта и включили в solution explorer(не знаю как он на русском)? Добавлю также код кнопки из моего проекта, которая работает с Каскадом и выделяет найденную область как новое изображение, может пригодится.

upd. Также посмотрите в сети как создать проект с библиотеками EmguCV(проверьте, работают ли самые простые программы), в некоторых статьях забывают упомянуть что нужно в bin/Debug вашего проекта хранить не только библиотеки emgucv, но и opencv. Хотя, может и по-другому можно на них ссылаться, но так проще всего, как мне кажется.

я его скачиваю, распаковываю, открываю как проект в вижуалке (2013), пытаюсь запустить, и он выдает разные ошибки. Их приводить нет смысла, идея в том, что он не может найти каскад. Или ему не нравится битность операционки или дебаггера (ставил разные). Не совсем понял вашу строчку "Файл с каскадом поместили в папку проекта и включили в solution explorer", каскад в папку проекта клал, а как "включить в solution explorer "?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На картинке слева от кр.линии- как выглядит проект с добавленным .xml файлом, справа- как добавляется(Пр. кнопка на проекте, Добавить-Существующий элемент)

6972928.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если вы скачали этот проект, то заметьте, что на странице скачивания написано "If you can't run your project, just build it and make sure all opencv_xxxx.dll files and haarcascade_frontalface_alt_tree.xml in the same directory with your executable file. You can find those files inside C:\Emgu\emgucv-windows-x86 2.2.1.1150\bin.", что значит вам нужно внести все emgucv и opencv библиотеки в каталог bin/Debug, как я и писал выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

upd.Пока вас ждал уже запаковал и выложил, попробуйте.

Изменено пользователем barsukov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ваш код крашится на загрузке каскада

 

так работает, и что то фиксирует но не очень хорошо:

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using Emgu.CV.Structure;
using Emgu.CV;
using System.Runtime.InteropServices;
 
namespace WpfFaceDetectionTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
 
        private Capture capture;
        private Emgu.CV.CascadeClassifier haarCascade;
        DispatcherTimer timer;
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            capture = new Capture();
            if (File.Exists("haarcascade_frontalface_alt_tree.xml"))
                haarCascade = new CascadeClassifier(@"haarcascade_frontalface_alt_tree.xml");
            timer = new DispatcherTimer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = new TimeSpan(0, 0, 0, 0, 1);
            timer.Start();
        }
 
        void timer_Tick(object sender, EventArgs e)
        {
            Image<Bgr,Byte> currentFrame = capture.QueryFrame();
 
            if (currentFrame != null)
            {
                Image<Gray, Byte> grayFrame = currentFrame.Convert<Gray, Byte>();
 
                var detectedFaces = haarCascade.DetectMultiScale(grayFrame,1.1,5,new System.Drawing.Size(20,20), System.Drawing.Size.Empty);
                foreach (var face in detectedFaces)
                    currentFrame.Draw(face, new Bgr(0, double.MaxValue, 0), 3);
                    
                image1.Source = ToBitmapSource(currentFrame);
            }
            
        }
 
        [DllImport("gdi32")]
        private static extern int DeleteObject(IntPtr o);
 
        public static BitmapSource ToBitmapSource(IImage image)
        {
            using (System.Drawing.Bitmap source = image.Bitmap)
            {
                IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap
 
                BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    ptr,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
 
                DeleteObject(ptr); //release the HBitmap
                return bs;
            }
        }
    }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×