Jump to content
Compvision.ru
al072

Увеличение скорости распознавания лиц

Recommended Posts

Хм...тут весь пайплайн работает не больше 100ms...смысл вообще по потокам бить? Может лучше немного код пооптимизировать и добиться реалтайма в одном потоке? Мне почему-то кажется, что у вас просто добавление openmp'шных прагм может разогнать все до реалтайма...

А вообще, обычно всю GUI'ню в один поток суют, процессинг в другой и заводят очередь кадров для обработки и вторую для вывода. Синхронизируют тупо мьютексами.

  • Like 1

Share this post


Link to post
Share on other sites

Я бы с радостью загнал все в один поток и радовался жизни, но вот только не знаю каким образом оптимизировать самую прожерливую функцию которая обрабатывает входное изображение (как я ранее писал она занимает порядка 45 миллисекунд). Пробовал оборачивать эту функцию в #pragma omp parallel, но результатов это не дало только стало еще хуже..

Можете помочь с примером кода или чуть подробней расписать как реализовать очереди кадров?

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

Цитата

 

cv::Mat frame; // необработанное изображение с камеры

cv::Mat processedframe;// обработанное изображение

void GUIня()

{

     while(true)

     {

              frame = getFrame();// получаем изображение с камеры

              FrameQuie(proccessedframe);// добавляем в очередь 

              ShowFromQuie(FrameQuie);// выводим из очереди

              Sleep(1);

     }

}

void proccessFrame()

{

     while(true)

     {

            processedframe = Processframe(frame);//Обработка

            Sleep(1);

     }

}

boost::thread thrd1(&GUIня,this);

boost::thread thrd2 (&proccessFrame,this);

 

1) как сделать очередь изображений и очередь вывода и есть ли в этом смысл? Если функция proccessFrame в любом случае занимает не менее 45 миллисекунд, то следовательно очередь вывода будет пополняться не ранее чем через 45 миллисекунд. То есть никакой оптимизации по времени мы не получим правильно?

2) куда расставлять mutex?

3) как синхронизировать потоки?

Извиняюсь за кучу вопросов, с потоками вообще раньше не работал.. Для реализации потоков прикрутил boost к проекту.

Share this post


Link to post
Share on other sites

Ну, за 45 ms лицо вряд ли сменится :) 

Соответственно, трекать и распознавать можно в разных потоках.

Распознал - обновил метку трека.

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 hour ago, al072 said:

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

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

  • Like 1

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.

×