Перейти к содержимому
Compvision.ru
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

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

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

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


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

кстати говоря оказывается это называется 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

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


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

http://www.vision.ee.ethz.ch/boostingTrackers/index.htm

еще трекинг использует online boosting

есть сорцы и бинарники

http://vision.cs.utexas.edu/projects/ers/

наверно можно выделять объект на который обучено ,есть код.

  • Like 1

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


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

Спасибо за отличный ресурс.

еще трекинг использует online boosting

есть сорцы и бинарники

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


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

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

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

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


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

Документ в тему:

http://www.robots.ox.ac.uk/ActiveVision/Publications/benfold_reid_cvpr2011/benfold_reid_cvpr2011.html

Видео с этой странички:

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


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

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

Я перешел на новую 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 человека на картинке... идея работать будет не?

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

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


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

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

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



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

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


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

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

про третье

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

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

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


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

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

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

Маркер:

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

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

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

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


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

Думаю это должно подойти:

http://www.compvision.ru/forum/index.php?showforum=20

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


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

Добрый день. В поисках решения проблемы 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

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


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

Ну есть еще 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

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


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

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

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

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


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

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

В кадре очень много движущихся объектов (не людей) поэтому вычитания фона не подходит. Использую 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) для разруливания коллизий (столкновения объектов заслон одного другим и т.д.)

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


Ссылка на сообщение
Поделиться на других сайтах
я иду по картинке слева направо, сверху вниз. пиксель 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

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

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


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

Уже два месяца читаю статьи и не могу решить эту задачу : people counting

Ищу человека, который помог бы мне решить эту задачу!

https://www.free-lance.ru/projects/1355803/razrabotka-programmyi-podscheta-potoka-lyudey-.html

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


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

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

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


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

вот мои тестовые видео:

T_CAMERA_A - один человек ходит

T_CAMERA_C - два человека ходят

T_SEG - картинка, которую я использовал для сегментации голов, определения головы.

тестовые видео.rar

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

Я ответил:

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Итого.

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

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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×