Jump to content
Compvision.ru
Sign in to follow this  
Cfr

Трекинг объектов.

Recommended Posts

Надо исходить из того, как человек распознает людей или подсчитывает их - Например я охранник сижу где в охранке, и смотрю на камеры - лично я смотрел бы на видео. хоп че то появилось (детектор движения) нахожу где голова у субъекта и смотрю куда она движется, а как я голову определю? по цвету! выделяется же голова у него на плечах. так и тут надо действовать. зачем от природы отделяться.

не думаю что всё так просто ибо голова определяется только в контексте самого человека.

небольшой офтоп про visual perception

catman.gif

An interesting observation from the cat's LGN study is the apparent pre-processing of information prior to the visual cortex. A frame from the cat's LGN movie shows that the LGN or retina enhances cat like features of human faces.

http://www.biotele.com/vision.html

типа кошки видят людей как больших котов.

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

Share this post


Link to post
Share on other sites

кстати говоря оказывается это называется People Counting / Human Counting / Customer Counting System

/watch?v=wUORIaySoIg

думаю всего лишь обученные классификаторы на рамках.

оказывается есть еще всякие навороченные счетчики

http://www.vcount.ru/products/

http://www.vcount.ru/products/vcount_3d/ -типа кинекта карта глубины.

что то типа трекера по точкам

http://www.edwardrosten.com/work/rosten_2006_thesis_presentation.pdf

Share this post


Link to post
Share on other sites

Здравствуйте уважаемые форумчане!

Скажите пожалуйста, при использовании распознавания людей средствами openCV, и в частности, алгоритмом HOGа, какой минимальный размер фигуры человека (в пикселах) сможет распознать метод detectMultiScale? Я получаю с камеры изображение где высота человека начинается от 50-60 пикселей и больше.

Share this post


Link to post
Share on other sites

Я вернулся, меня месяц не было) Всем привет!)

Я перешел на новую opencv 2.4 ! перевел свой проект на новые функции ..

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

Меня больше заинтересовало другое...

Например по этой ссылке можно увидеть видео подобно работающей системы

Видно что система в общем работает все таки не на предложенном мной принципе цветовой сегментации. Для решения этой задачи надо узнать а на каком принципе работает данная система.

есть вот это видео

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

Готовые решения подобной задачи уже есть

http://www.myaudience.com/count/overview

или вот здесь - модуль подсчета посетителей

http://www.macroscop.com/products/Intelligent_modules/

Короче говоря, мне до сих пор непонятен принцип подсчета посетителей / people counting ) Прошу помочь мне разобраться)

UPD: http://www.youtube.com/watch?feature=player_embedded&v=EmPEqIWJgSk

посмотрев видео, там говорится что предварительно надо задать прямоугольник примерного размера человека.

А что если действительно - просто смотрится какое кол-во пикселей занимает движущийся объект на картинке и разделить всю получившуюсь площадь на размер прямоугольника, грубо говоря

прямоугольник например размером 50*50 = 2500

выделение переднего плана показывает что на картинке есть некоторая площадь размером 6000 квадратов

6000/2500 = 2,4 , то есть у нас 2 человека на картинке... идея работать будет не?

Edited by Predatorxxx

Share this post


Link to post
Share on other sites

в описании к видео - здесь кстати показан алгоритм

Background substraction, binarisation, erosion/dilatation, blob tracking, shape coefficients.



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

Share this post


Link to post
Share on other sites

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

про третье

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

коэффициенты формы - скорее всего что то типа моментов Ху.

Share this post


Link to post
Share on other sites

Доброго времени суток!

Подскажите пожалуйста, с помощью каких средств OpenCV можно выделить маркеры на изображении?

Маркер:

post-5970-0-15270700-1349204749_thumb.jp

Примеры изображений:

post-5970-0-00697100-1349204600_thumb.jppost-5970-0-49561100-1349204619_thumb.jp

Share this post


Link to post
Share on other sites

Добрый день. В поисках решения проблемы people counting нашел на stackoverflow.com на португальском языке статью в которой рассказывается как решается (хотя бы даже примерно) данная проблема.

Основывается это все, как я и догадывался, на сегментации по цвету. Но сам алгоритм сегментации по цвету мне не понятен (он описывается в статье, но без подробностей).

Суть текущей версии в том, что я иду по картинке слева направо, сверху вниз. пиксель 0,0 помечаю за уровень 0. далее следующий пиксель 0,1 я должен сравнить с левым текущим и понять а близок ли он по цвету? если близок то ему присваивается такой же уровень 0, если не близок то присваивается НОВЫЙ УРОВЕНЬ 1. сравнение происходит следующим образом (R+G+B ) у текущего кадра и у того который сравниваю должны отличаться не более чем на порог.

таким образом для пикселя i,j я должен R+G+B сравнить с пикселем i-1,j-1 ; i-1,j ; i-1,j+1 ; i, j-1

к сожалению картинка удручающая. цвета толком не выделяются как видно из прикрепленной картинки.

ВОПРОС че делать? есть ли методы цветовой сегментации, можете ли вы рассказать о них?

С нетерпением, жду ответа)

#include <iostream>	// for standard I/O

#include <string>   // for strings

#include <iomanip>  // for controlling float print precision

#include <sstream>  // string to number conversion

#include <math.h>

#include <opencv2/opencv.hpp> 

#include <opencv2/opencv_modules.hpp>        



using namespace std;

using namespace cv;




Mat reduceIm(Mat& frame)

{

	int a,b=0;

	a=b=8;

	int rcols=floor((double)frame.cols/a);

	int rrows=floor((double)frame.rows/B);

	Mat newframe(rrows,rcols,CV_8UC3);


	Mat_<Vec3b> _newframe = newframe;

	Mat_<Vec3b> _frame = frame;

	int i1,j1,i,j;


	for ( i1=0; i1<rrows;i1++)

		for ( j1=0;j1<rcols;j1++)

		{

			int sr[3]={0,0,0};

			for ( i=0+b*i1; i<b*(i1+1);i++)

				for ( j=0+a*j1; j<a*(j1+1); j++)

				{

				/*	sr[0]+=frame.at<uchar>(i*3,j);

					sr[1]+=frame.at<uchar>(i*3+1,j);

					sr[2]+=frame.at<uchar>(i*3+2,j);

				}

					newframe.at<uchar>(i1*3,j1)=sr[0]/16;

					newframe.at<uchar>(i1*3+1,j1)=sr[1]/16;

					newframe.at<uchar>(i1*3+2,j1)=sr[2]/16;*/

					sr[0]+=_frame(i,j)[0];

					sr[1]+=_frame(i,j)[1];

					sr[2]+=_frame(i,j)[2];

				}

				_newframe(i1,j1)[0]=sr[0]/a/b;

				_newframe(i1,j1)[1]=sr[1]/a/b;

				_newframe(i1,j1)[2]=sr[2]/a/b;

				newframe = _newframe;

				}



		return newframe;


}


int color(Vec3b a)

{

	int b = a[0]+a[1]+a[2];

	return b;

}



Mat levelIm(Mat &im)

{

	Mat im1 = im;

	int level = 0;

	int porog=50;

	int prev00,prev01,prev02,prev10 = 0;


	int i,j ;


	Mat_<Vec3b> _im1 = im1;

	Mat_<Vec3b> _im = im;

	//int levels[im1.rows][im1.cols];

	//????

	int levels[100][100];

	levels[0][0]=level;


	for (i=0; i<im.rows;i++)

	for (j=1; j<im.cols;j++)

	{

		if (j!=0)

			if (abs(color(_im(i,j))- color(_im(i,j-1)))<porog) 

			{levels[i][j]=levels[i][j-1]; continue;}


		if (i!=0)

		{

			if (abs(color(_im(i,j))-color(_im(i-1,j)))<porog) 

			{levels[i][j]=levels[i-1][j]; continue;}

			if (abs(color(_im(i,j))-color(_im(i-1,j+1)))<porog) 

			{levels[i][j]=levels[i-1][j+1]; continue;}

		}


		if (i!=0 && j!=0)

		if (abs(color(_im(i,j))-color(_im(i-1,j-1)))<porog) 

		{levels[i][j]=levels[i-1][j-1]; continue;}


		level = level+1;

		levels[i][j]=level;

	}



	for (i=0; i<im.rows;i++)

	for (j=1; j<im.cols;j++)

	{

		_im1(i,j)[0] = ceil((double)levels[i][j]*255/level);

		_im1(i,j)[1] = ceil((double)levels[i][j]*255/level);

		_im1(i,j)[2] = ceil((double)levels[i][j]*255/level);

	}

	im1=_im1;

	cout<<"level"<<level;

	cvNamedWindow("2",CV_WINDOW_FREERATIO);

	imshow("2",im1);

	return im1;


}


int main()

{

	namedWindow("video",CV_WINDOW_FREERATIO);


	Mat frame;

	Mat seg;


		frame = imread("E://T_SEG.jpg");

		if(!frame.data) return -1;

		imshow("video",frame);


		blur(frame,frame,Size(3,3));

		imshow("blur",frame);

	//	imshow("seg",seg);

		cout<<"cols="<<frame.cols<<" rows = "<<frame.rows;


		Mat frame1;

		frame1 = reduceIm(frame);


		cvNamedWindow("1",CV_WINDOW_FREERATIO);

		imshow("1",frame1);


		Mat frame2;

		frame2 = levelIm(frame1);




	cvWaitKey(0);


	return 0;

}

UPD: у кого есть watershed segmentation / алгоритм сегментации по водоразделу ? киньте плиз

real-time-people-couting.pdf

post-4978-0-02066200-1349356266_thumb.jp

post-4978-0-45148300-1349356362_thumb.jp

post-4978-0-93044000-1349356366_thumb.jp

Share this post


Link to post
Share on other sites

Ну есть еще mean-shift segmentation (в примерах opencv), k-means segmentation, суперпиксели,

плюс к тому,

можете еще Edison-а поковырять: http://coewww.rutgers.edu/riul/research/code/EDISON/index.html

и тут:

http://www.lapix.ufsc.br/sms/byalgorithm.html

Share this post


Link to post
Share on other sites

Подскажите методы сопровождения людей в кадре.

В кадре очень много движущихся объектов (не людей) поэтому вычитания фона не подходит. Использую SVM-HOG из примеров им нахожу людей и нужно сопоставить их в разных кадрах. Пробовал SURF вроди как работает но часто сбивается видимо из-за движения людей и изменения фона и вообще картина не очень качественная. также люди часто пресекаются и пропадают из виду. Вопрос быстродействия не критичен можно хоть 0,1сек потратить на это, также есть GPU.

Share this post


Link to post
Share on other sites

Подскажите методы сопровождения людей в кадре.

В кадре очень много движущихся объектов (не людей) поэтому вычитания фона не подходит. Использую SVM-HOG из примеров им нахожу людей и нужно сопоставить их в разных кадрах. Пробовал SURF вроди как работает но часто сбивается видимо из-за движения людей и изменения фона и вообще картина не очень качественная. также люди часто пресекаются и пропадают из виду. Вопрос быстродействия не критичен можно хоть 0,1сек потратить на это, также есть GPU.

Посмотрите вот эту ссылку:

http://www.robots.ox.ac.uk/ActiveVision/Publications/benfold_reid_cvpr2011/benfold_reid_cvpr2011.html, как раз Ваша задача.

Ещё посмотрите пример blobtrack из примеров OpenCV, там используется фильтр частиц (Particle Filter) для разруливания коллизий (столкновения объектов заслон одного другим и т.д.)

Share this post


Link to post
Share on other sites
я иду по картинке слева направо, сверху вниз. пиксель 0,0 помечаю за уровень 0. далее следующий пиксель 0,1 я должен сравнить с левым текущим и понять а близок ли он по цвету? если близок то ему присваивается такой же уровень 0, если не близок то присваивается НОВЫЙ УРОВЕНЬ 1. сравнение происходит следующим образом (R+G+B ) у текущего кадра и у того который сравниваю должны отличаться не более чем на порог.

таким образом для пикселя i,j я должен R+G+B сравнить с пикселем i-1,j-1 ; i-1,j ; i-1,j+1 ; i, j-1

к сожалению картинка удручающая. цвета толком не выделяются как видно из прикрепленной картинки.

велосипед.

если с английским нормально, то прочитайте http://en.wikipedia.org/wiki/Segmentation_(image_processing)

там Region-growing methods похоже на то что вы описали. ну и про другие там прочитайте.

не очень понятно что вы собрались сегментировать, если у вас вроде как должен получиться движущийся блоб от вычитания фона(или вы его еще собрались на части делить?)

хорошей сегментации быть не может так же как и хорошего выделения границ(ну по крайней мере я не знаю).минимум это постоянно надо подгонять параметры или пользоваться какими либо эвристиками, а в хорошем случае это мы опять возвращаемся к обучению(или Trainable Segmentation,Model based segmentation)

watershed segmentation вроде есть в опенцв.

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

еще могу порекомендовать программу fiji(imagej) там можно попробовать быстро некоторые основные алгоритмы, а так она больше для мед. изображений, но там много чего есть.

еще удобно что там можно записать макрос и применить для большого объема изображений.

http://www.imagej.ru/resursi-dlya-razrabotchika/sozdanie-prosteyshego-makrosa-v-programme-imagej.html

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

Share this post


Link to post
Share on other sites

Не помню уже: ты выкладывал своё эталонное видео, на котором всё должно работать? Если нет, то выложи или дай ссылку.

Share this post


Link to post
Share on other sites

Ага, понятно.

У меня есть одна идейка: найти полный оптический поток (в OpenCV есть реализация нескольких алгоритмов, штуки 4-5), а по нему либо просто сегментировать объекты, либо построить карту глубины (deph map) и использовать для её для сегментациии. Работы по сегментации и построению карты глубины из оптического потока я видел.

Но! Скорость работы может быть достаточно медленной, возможно что потребуется использовать видеокарту для ускорения.

Отсюда у меня несколько вопросов:

1. Какой конфигураией в плане железа и требованиями ты располагаешь?

2. Можешь ли использовать CUDA или OpenCL для рассчётов?

3. Интересен ли тебе вообще такой подход?

4. Согласен ли поработать вдвоём со мной над этим? Результаты будем поначалу выкладывать в этот форум и как-нибудь синхронизировать. А там посмотрим.

Share this post


Link to post
Share on other sites

вначале ответы:

1. core i3 - 2100 , 3.1GHz , 4 Gb RAM . Требования - работа в режиме реального времени, достоверность > 91% (относительно ручного подсчета)

2. Да наверное могу , раньше не работал , научиться могу!

3. Да мне интересен подход, потому что лучше что-то чем ничего

4. согласен работать хоть вшестером, лишь бы был результат.

теперь соображения:

1 полный оптический поток - знаю. существуют способы лукаса-канаде, фарнебак и тд

2 сегментировать = я не знаю получится или нет, так как у человека все трясется, а когда он стоит, то у него вообще разные направления получаются

3 оптический поток вообще говоря трудоемкая операция (отсюда я понимаю что действительно придется использовать граф. процессор)

4 карта глубины? не, не слышал. что вы имеете ввиду?

Александр Кручинин написал:

А не пробовали пойти по более простому пути - а именно просто анализ отличий от фона, а затем ширину этого отличия. После этого посчитать горизонтальную проекцию отличий - т.е. просто свести к одномерной кривой в оси X. Если ширина олтичий от фона больше какого-то уровня, то предполагаем что два чел., если больше другого - 3 и т.п. а по Минимуму на одномерной кривой найти границы между объектами

Я ответил:

вот в этих видео вроде алгоритм не такой ((

вот здесь одна из циферок означает как раз таки то что вы говорили

В ответ получил

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

Share this post


Link to post
Share on other sites

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

Теперь по оптическому потоку. Один из самых лучших на сегодняшний день - это оптический поток Брокса. В OpenCV есть реализация одного из его алгоритмов (2004-го года) на CUDA, называется BroxOpticalFlow (пример использования для 2-х изображений тоже есть). Можешь посмотреть на его страницу: Brox publications.

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

если у тебя есть видеокарта Nvidia, то скомпилируй OpenCV с поддержкой CUDA и посмотри. Компилироваться будет очень долго, больше часа. Если нет, то будем думать о чём-нибудь другом.

Карта глубины - это серое изображение, тёмные участки которого соответствуют дальним объектам, а светлые - ближним. Она нужна, чтобы разделять людей друг от друга. То есть головы проходящих посетителей будут отображаться как яркие белые пятна.

Вообще, оптический поток - это обобщение простого вычитания фона. При нём определяется не только тот факт, что пиксель изменился, но и направление его смещения.

Два самых старых алгоритма (70-х или 80-х годов):

1. Локальный Лукаса-Канаде. Довольно быстрый, но точность страдает, есть проблема апертуры.

2. Глобальный Хорна-Чанка. Очень хорош по качеству.

Ну и дальше пошли всякие улучшения. В OpenCV есть эти оба, Брокса, SimpleFlow, Фарнербека. Может, ещё что-то не помню уже.

И сюда ещё зайди: Kitty benchmark. Посмотри на выдаваемые результаты.

Итого.

Самый первый этап - это "живое созерцание" (Ф. Энгельс). Предлагаю тебе опробовать перечисленные алгоритмы, посмотреть на их скорость и выдаваемый результат в виде цветной карты или поля векторов. Тогда ты на пальцах поймёшь, что вообще можно получить, оценишь скорость работы (таймер поставь, надо засекать время). Выбирай наиболее качественный алгоритм, скорость для начала не так важна. практика подсказывает, что вариант из OpenCV всегда можно ускорить в 2 и более раз, можно уменьшить внутри обрабатываемую картинку до предела необходимой точности. С этим проблем не будет.

Когда ты оценишь и поймёшь принципы работы, то приступим к написанию кода. Тестовые варианты можешь выкладывать сюда, буду помогать если что.

Такой вариант пойдёт?

Share this post


Link to post
Share on other sites

По его результатам + яркость и цвет пикселя можно провести сегментацию. Или, как я уже писал, построить карту глубины и сегментировать уже её. Если первый вариант не выгорит.

Share this post


Link to post
Share on other sites

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

Кстати. Если говорить вообще, то оптический поток даёт больше информации о сцене, чем просто вычитание фона. Больше информации, следовательно можно лучше кластеризовать. Нет?

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

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×