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

iskees

Пользователи
  • Количество публикаций

    202
  • Зарегистрирован

  • Посещение

  • Days Won

    19

Сообщения, опубликованные пользователем iskees


  1. Если не нужны большие вычислительные ресурсы и вы пишете под винду(хотя там и линукс образы есть) то стоит посмотреть в сторону azure. Пишете asp.net приложение в которое можно встроить и саму обработку (opencv работает без проблем) и для развертывания нужно будет только загрузить пакет, настраивать ничего не надо. Если нужно что то специфическое то там есть обычный rdp доступ и ставьте туда что хотите. Да и цены ниже чем у амазона но нет действительно мощных машин.


  2. В качестве эксперимента решил запустить распознавание номеров на Raspberry PI, весь код у меня на C# которого на малине мягко сказать нет. Путем перебора (с++ как бы то что нужно но "религия" не позволяет, питон это вообще не серьезно)остановился на java+javacv. Написал мааленькую тестовую программку для поиска номера которая в прицепе 60-70% находит и что приятно удивило запускается вообще без изменения как на винде так и на Raspberry (референсы только другие указать). А вот время печалит на винде с i5(2.8ггц в одно ядро разумеется) 8мс и на малине аж 160мс. Наверное есть какие то способы это ускорить но увы в яве не селен так-как вообще до вчера "в глаза ее не видел".

    Ну и собственно код, правда он жутко грязные так как вырван из "контекста" да и как уже сказал языка не знаю вообще

    
    public class main{
    
    
    	public static void main(String[] args) 
    
    	{
    
    		BufferedImage img;
    
    		try {
    
    			img = ImageIO.read(new File("D:\\ScropionFoto\\машины\\1\\А011СС93 86-21 28 13.jpg") );
    
    
    		IplImage image= IplImage.createFrom(img);
    
    		IplImage gray= cvCreateImage(new CvSize(image.width(),image.height()), image.depth(), 1);
    
    		if (image.nChannels()>1)
    
    		cvCvtColor (image, gray,CV_BGR2GRAY);
    
    		else
    
    			gray=image;
    
    		SearchRectangle sar=new  SearchRectangle();
    
    		ArrayList<CvRect> t=new ArrayList<CvRect>();
    
    		t.add(new CvRect(0,0,image.width(),image.height()));
    
    		StopWatch w=new StopWatch();
    
    		w.start();
    
    		for(int j=0;j<1000;j++)
    
    		{
    
    		sar.Search(gray,t, 0, 40, 10, false);
    
    
    		}
    
    		w.stop();
    
    		for(int i=0;i<sar.CoordinatesRectangle.size();i++)
    
    		{
    
    			if (sar.CoordinatesRectangle.get(i).height()>0 && sar.CoordinatesRectangle.get(i).width()>image.width()*0.2 && sar.CoordinatesRectangle.get(i).width()<image.width()*0.5 && Math.abs(sar.CoordinatesRectangle.get(i).width()/sar.CoordinatesRectangle.get(i).height()-4.5)<1)
    
    			cvDrawRect(image,new CvPoint( sar.CoordinatesRectangle.get(i).x(),sar.CoordinatesRectangle.get(i).y()) ,
    
    					new CvPoint( sar.CoordinatesRectangle.get(i).x()+ sar.CoordinatesRectangle.get(i).width(),sar.CoordinatesRectangle.get(i).y()+ sar.CoordinatesRectangle.get(i).height())
    
    			, cvScalar(0.0, 256.0, 0.0, 0.0) , 3, 0, 0);
    
    
    		}
    
    		for(;
    
    		{
    
    
    			cvShowImage( String.valueOf(w.getElapsedTime()/1000), image);
    
    			if ((char)cvWaitKey(30)==27)
    
    				break;
    
    		}
    
    		} catch (IOException e) {
    
    			// TODO Auto-generated catch block
    
    			e.printStackTrace();
    
    		}
    
    	}
    
    	}
    
    
    public class SearchRectangle {
    
    
    	public ArrayList<CvRect> CoordinatesRectangle;
    
    	private IplImage OriginalImage;
    
    
    	public void Search(IplImage image, ArrayList<CvRect> searchArea,
    
    			int smotch, int up, int down, Boolean addon) {
    
    		//////////////фигня
    
    		CoordinatesRectangle = new ArrayList<CvRect>();
    
    		OriginalImage = image;
    
    		for (int index = 0; index < searchArea.size(); index++) {
    
    			CvRect r = searchArea.get(index);
    
    			if ((OriginalImage.height() >= r.y())
    
    					& (OriginalImage.width() >= r.x())) {
    
    				IplImage tsubimage;
    
    				if ((r.width() < image.width() | r.height() < image.height())) {
    
    					cvSetImageROI(image, r);
    
    					tsubimage = cvCreateImage(
    
    							new CvSize(r.width(), r.height()), image.depth(),
    
    							image.nChannels());
    
    					cvCopy(image, tsubimage);
    
    				} else
    
    					tsubimage = image;
    
    				double wkmin = Math.max(310.0 / image.width(), 0.4);
    
    				double wkmax = Math.min(800.0 / image.width(), 1);
    
    				IplImage subimage;
    
    				double kw = 1;
    
    				double kh = 1;
    
    
    				if (addon) {
    
    					CvSize sizeimage = new CvSize((int) (Math.round(tsubimage
    
    							.width() * wkmin)), (int) (Math.round(tsubimage
    
    							.height() * wkmin)));
    
    					subimage = cvCreateImage(sizeimage, tsubimage.depth(),
    
    							tsubimage.nChannels());
    
    					cvResize(tsubimage, subimage);
    
    
    					kw = tsubimage.width() / (sizeimage.width() * 1.0);
    
    					kh = tsubimage.height() / (sizeimage.height() * 1.0);
    
    					if (image != tsubimage)
    
    						cvReleaseImage(tsubimage);
    
    				} else {
    
    					if (wkmax < 0.9) {
    
    						CvSize sizeimage = new CvSize(
    
    								(int) (Math.round(tsubimage.width() * wkmax)),
    
    								(int) (Math.round(tsubimage.height() * wkmax)));
    
    						subimage = cvCreateImage(sizeimage, tsubimage.depth(),
    
    								tsubimage.nChannels());
    
    						cvResize(tsubimage, subimage);
    
    						kw = tsubimage.width() / (sizeimage.width() * 1.0);
    
    						kh = tsubimage.height() / (sizeimage.height() * 1.0);
    
    						if (image != tsubimage)
    
    							cvReleaseImage(tsubimage);
    
    						;
    
    					} else
    
    
    						subimage = tsubimage;
    
    
    				}
    
    				IplImage smooth;
    
    
    				if (smotch > 0) {
    
    					smooth = cvCreateImage(new CvSize(subimage.width(),
    
    							subimage.height()), subimage.depth(),
    
    							subimage.nChannels());
    
    					cvSmooth(subimage, smooth, CV_GAUSSIAN, smotch);
    
    
    				} else
    
    					smooth = subimage;
    
    				//////////сам поиск
    
    				IplImage dst = cvCreateImage(
    
    						new CvSize(smooth.width(), smooth.height()),
    
    						smooth.depth(), smooth.nChannels());
    
    				cvCanny(smooth, dst, up, down, 3);
    
    				CvMemStorage storage = CvMemStorage.create();
    
    				CvSeq contour = new CvSeq(null);
    
    				cvFindContours(dst, storage, contour,
    
    						Loader.sizeof(CvContour.class), CV_RETR_LIST,
    
    						CV_CHAIN_APPROX_SIMPLE);
    
    				 dst.release();
    
    
    				while (contour != null && !contour.isNull()) {
    
    					if (contour.elem_size() > 0)
    
    					{
    
    
    						CvBox2D box = cvMinAreaRect2(contour, null);
    
    
    						if (Math.abs(box.angle()) < 30)
    
    
    							CoordinatesRectangle.add(new CvRect(Math.round(box
    
    									.center().x() - box.size().width() / 2),
    
    									Math.round(box.center().y()
    
    											- box.size().height() / 2), Math
    
    											.round(box.size().width()), Math
    
    											.round(box.size().height())));
    
    
    						contour = contour.h_next();
    
    					}
    
    				}storage.release();
    
    
    				if (smooth != subimage)
    
    					cvReleaseImage(smooth);
    
    				if (image != subimage)
    
    					cvReleaseImage(subimage);
    
    			}
    
    		}
    
    
    	}
    
    }
    
    
    [/code]

    post-5717-0-45775800-1395099173_thumb.pn


  3. Canny не проблема я даже вроде из стандартных примеров делал. А как искать контуры. Каким методом? Объект может быть искажен. Поворот, перспектива, наклон.

    Самое интересное что потом все равно все сведется к Распознавание символов. :)

    А положение рамки может тока влиять на особенность номера, ну там транзитный или обычный. 77 регион или 777

    FindContours - поиск контуров


  4. Вы молодец! Ну даже теперь и не знаю что и спросить! :) так как не можите, а мне то интересно :) эх-х-х все равно молодец!

    Ну я не могу говорить про свою реализацию. А про чужую очень даже могу. Можно конечно пробовать на классификаторах, но я бы посоветовал попробовать Canny(или бинаризация) потом поиск контуров, отсеиваете те что не подходят по пропорциям и вуаля у вас номер. ну а потом сегментация и распознавание символов и эти два этапа самые сложные. https://arsocn.codeplex.com/ диплом с которого все начиналось какие то наметки там уже были


  5. За Англорусский спасибо! :)

    Я примерно так и догадывался. Что для моей ситуации не утешительно так как придется искать другой пример или править этот код. Что бы испытать свой файлик.

    Может есть у кого готовенький исходник которому можно подсунуть картину?

    Вы очень уверенно говорите! Что то сами делали или знакомые?

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

    Поделитесь лучше если не секрет про распозновалку номеров. Ну вот хочется решить эту задачку. Если хотите могу аську оставить... Уж больно мне понравилось как комерческие продукты работают. У меня на одном компе 5 каналов с HD камер пережовывают. Красота!

    Если вы iss пробовали то там точно с контрастом работают, работает быстро но цены кошмар.

    Делал программу по распознаванию номеров с нуля на opencv, не текущий момент в районе 200 комплексов(камера+комп) висят и активно нас штрафуют :D , а пока ее писал разумеется смотрел как работают другие программы. Собственно по этому и не могу рассказывать подробности реализации. А про лица, сейчас просто работаю над детекцией лиц с последующим ..., использую стандартный каскад который вполне справляется но если сделаете свой который будет лучше с радостью попробую.


  6. а как надо?

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

    Если вам чисто для интереса то может стоит попробовать на лицах. В этом случае могу дать позитивные и отрицательные примеры (13000/12000) и если что то получится еще и по тестирую ваш каскад на реальных камерах.


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


  8. Недавно опубликовали (статья+код) неплохие детекторы лицевых точек:

    1. http://www.humansensing.cs.cmu.edu/intraface/download.html

    2. http://www.ics.uci.edu/~xzhu/face/

    Так вот вопрос: как можно улучшить точность распознавния за счет особых точек?

    У меня есть следующие соображения:

    1. Сравнение геометрии лиц

    2. Сравнение признаков в районе точек

    2.1. Составление общего вектора признаков

    2.2. Классификация каждой точки (области: глаз или выравненная линия с 2мя глазами и т.д.)

    3. Выравнивание в том числе в 3D

    4. Сравнение с нужным ракурсом

    5. По видеоряду с разными ракурсами построить 3D лицо

    Но есть следующие опасения:

    1. Точность геометрии не очень высока... можно использовать только в совокупности с основным методом даст ли это приемущество не знаю...

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

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

    3. Посмотрел пару статей по 3D выравниванию, но результаты не впечатляют

    4. Думаю неплохо, но нужна большая база на каждого человека

    5. Сложно

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

    1. Сравнение геометрии лиц - в реальных условиях не работает

    2.Сравнение признаков в районе точек- Пробовал ничего не вышло

    3. выравнивание даже 2д дает ощутимый прирост

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

    • Like 1

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

    1. число ложных сработок/число предъявляемых лиц

    или

    2. число ложных сработок/(число предъявляемых лиц * число лиц в базе)


  10. В идеальных условиях найти глаза и определить закрыты они или нет задача тривиальная. Haar для лица потом haar глаз или asm и вырезанные квадраты области глаз перевести в дескриптор hog вполне справится и все это дело в svm.


  11. Есть еще один аспект в работе с IP камера, в новых процах интел начиная с иви бридж кажется появилась технология intel quick sync-аппаратное декодирование видео, а с ip камер видео как раз нужно декодировать причем на лету. Разница между процессором с intel quick sync и без него огромная, без этой технологии проц просто на получении видео грузится на 30%,а с ней на 2-5%. Применительно к C# для работы с IP камерами я использую AForge, работает со всеми камерами, получение в отдельном потоке правда возвращает битмапы но opencv без проблем их коверетирует, возможно и на C++ он есть.

    • Like 1

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


  13. Наконец то руки дошли. В программе добавилась разметка фотографий(одна область на фото, результат в xml) и главное автоматическое создание HOG-SVM классификато), выбираем файл с размеченными фото, жмем кнопку, ждем и получаем вектор (случайно выбираются неготивные образцы, считается вектор потом он примнется и промахи добавляются к неготивными. и так пока ошибка не упадет). Видео примера

    • Like 1
  14. HOG


    Пытался создать HOG-SVM классификатор но столкнулся с тем, что не получается обучить классификатор который был бы с ошибкой первого рода ниже 30%. Возник вопрос: есть ли метод или готовая программа оценки применимости того или иного классификатора, который(ая) по небольшому набору образцов дал(а) бы вероятность получения хорошего классификатора? Например на 10 фото выделяем объекты и получаем ответ что hog плох а haar вполне не плох.


  15. "Чтобы сравнить производительность вычислений на видеокарте и на процессоре я написал несколько тестов производительности на базе Qt. Можете их скачать здесь. К моему удивлению, у меня видеокарта nvidia GeForce 9600M GS считает в разы медленнее чем процессор intel Centrino 2."

    не знаю как на вашем железе но вот у себя протестировал дефолтный поиск лица и глаз хааром. cpu core i5 3ГГц против gforce gt 635m. разница 20 раз. В использовании GPU есть такой момент: перегон в видеопамять изображение, инициализация вычисления все это относительно долго. Так что если вы банально вычитаете изображения то потери времени на все эти дела будет больше времени выигранном на самом параллельность вычислении. По этому у автора и результат такой противоречивый получился.


  16. Есть контура в них прямоугольники и еще сбоку сверху или еще где-то прилипший другой контур, причем не факт что там вообще есть прямоугольник. Как проверить есть ли там прямоугольник и выделить его? условия на все дело не больше 3-5мс

    post-5717-0-70198500-1366062139_thumb.pn

×