Jump to content
Compvision.ru
BashOrgRu

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

Recommended Posts

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

my.xml

haarcascade_frontalface_alt_tree.xml

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Файлы разнятся на столько, что я уже думаю не нужно ли как то запустить 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;
            }
        }
    }
}

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Первый этап обработки исключения типа "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) пройдены..Вроде успех..Мой каскад почти копия (только числа другие), каскада с совой из статьи с хабра...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

ButtonRun.txt

Edited by barsukov

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

6972928.png

Share this post


Link to post
Share on other sites

Если вы скачали этот проект, то заметьте, что на странице скачивания написано "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, как я и писал выше.

Share this post


Link to post
Share on other sites

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

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

Edited by barsukov

Share this post


Link to post
Share on other sites

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

 

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

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;
            }
        }
    }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×