maxfashko
-
Количество публикаций
86 -
Зарегистрирован
-
Посещение
-
Days Won
2
Сообщения, опубликованные пользователем maxfashko
-
-
Похоже, что понял, как это дело должно выглядеть:
FOV(w) = arctan(W / fy)
FOV(h) = arctan(H / fx), где:
H - будет размер картинки
fx - значение из матрицы калибровки внутренних параметров
2.3815068922917403e+03 0. 1920
0. 2.3815068922917403e+03 1080
0. 0. 1.
Вот и получается, что мой угол обзора камеры равен 77,4 и 48,78. Вот только в даташите указано, что FOV = 94 (это я как понимаю диагональ), если посчитать мои значения, выйдет 91.7. Это нормально?
-
12 часа назад, Smorodov сказал:Точное значение можно посчитать если учесть угол обзора, естественно, это верно если камера откалибрована.
Имеется отснятое видео шахматной доски, камерой, которая будет использоваться (видео очень долго обрабатывает, пришлось взять только часть изображений из отснятого). Воспользовался программой для калибровки, расположенной по адресу:
opencv_dir/samples/cpp/tutorial_code/calib3d/camera_calibration/
https://yadi.sk/i/Bv0iUR9j3GahHm
Изменил конфиг только для расположения изображений калибровки. Настройки доски не менял. Получил на выходе xml файлик с конфигом
https://yadi.sk/d/56EX60qE3GagqpКамера используется в Phantom 4 (4к)
В спецификациях производитель пишет:
ЦитатаSensor1/2.3” Effective pixels:12 MLensFOV ( Field Of View ) 94° 20 mm ( 35 mm format equivalent )f/2.8focus at ∞ISO Range100-3200(video) 100-1600(photo)Electronic Shutter Speed8 s to 1/8000 sMax Image Size4000 x 3000Still Photography ModesSingle shotBurst shooting: 3/5/7 framesAuto Exposure Bracketing (AEB):3/5 Bracketed frames at 0.7EV BiasTime-lapseHDRVideo Recording ModesUHD: 4096×2160 (4K) 24 / 25p3840×2160 (4K) 24 / 25 / 30p2704×1520 (2.7K) 24 / 25 / 30pFHD: 1920×108024 / 25 / 30 / 48 / 50 / 60 / 120pHD: 1280×720 24 / 25 / 30 / 48 / 50 / 60pMax. Bitrate Of Video StorageТо есть теперь для того чтобы мне найти вертикальный и горизонтальный углы обзора необходимо воспользоваться формулой:
H = 2*arctan(35/2*2.8)= arctan(12.5) = 85
Что-то не похоже на правду. Мне необходимо для расчета FOV брать данные, которые получены при калибровке? Если да, то как будет выглядеть процедура определения углов зрения?
-
5 часов назад, Smorodov сказал:Ну так камера-то (как и человеческий глаз кстати) видит не в пикселях и не в метрах, а в угловых единицах. Есть угол зрения камеры по вертикали и по горизонтали, если смещаетесь на какое то расстояние от оптической оси камеры, то можно найти угол, он будет пропорционален расстоянию от центра изображения. Точное значение можно посчитать если учесть угол обзора, естественно, это верно если камера откалибрована.
Спасибо!
-
9 часов назад, iskees сказал:Была подобная задача, но не угол нужно было определить, а расстояние на плоскости пройденное объектом, но одно к другому сводится. Решалась так:
1. задаем условно 4 точки на кадре
2. Замеряем чему эти точки соответствует на плоскости (или какому углу)
3. рассчитываем коэффициенты для полинома второго порядка, решая систему уравнений
4. получаем результат.
Есть момент что чем ближе к краю кадра тем менее точно полином второго порядка соответствует реальным искажениям объективов.
Не до конца понял, как вычислить тангаж по Вашему методу. С креном все ясно:
Берем две точки прямой, характеризующую линию горизонта, отнимаем их и вычисляем arctan, переводя в градусы.
В случае расчета тангажа известно только расстояние между двумя прямыми: линией горизонта, которую мы получили аппроксимацией (неба, земли) и линией, характеризующей продольную ось бпла. По каким формулам происходит расчет?
-
21 час назад, Smorodov сказал:Тут горизонт не просматривается
Но можно RANSAC-ом найти прямые, или тем-же Хафом, или LSD, но RANSAC скорее всего будет лучше работать.
С креном понятно, разобрался, а что насчет тангажа? Как коеффицент угловой меры от пикселя выразить? Как расстояние пересчитать на угол раствора?
-
2 часа назад, 2expres сказал:Я правильно понимаю, что это задача определения угла горизонта для беспилотника?
Да, отклонения по крену
-
10 часов назад, Smorodov сказал:Можно попробовать так: применить морфологию (erode + dilate) это уберет мелкие детали, после размыть, Sobel, затем по порогу границу. Дальше собрать эти точки, и запихнуть в fitLine.
В целом то, что у меня получилось похоже на правду, но со странностями. Я что-то упустил?
# -*- coding: utf-8 -*- import numpy as np import cv2 image = cv2.imread('../data/segment_video/igm_0.jpg') img = cv2.dilate(image, np.ones((8,8), np.uint8), iterations = 1) img = cv2.blur(img,(3,3)) img = cv2.Sobel(img,cv2.CV_8U,1,1,ksize=5) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) _, contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] # then apply fitline() function [vx,vy,x,y] = cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01) # Now find two extreme points on the line to draw line lefty = int((-x*vy/vx) + y) righty = int(((gray.shape[1]-x)*vy/vx)+y) #Finally draw the line cv2.line(img,(gray.shape[1]-1,righty),(0,lefty),255,2) cv2.imshow('result',img) cv2.imshow('img',image) cv2.waitKey(0) cv2.destroyAllWindows()
Линия вписывается в зависимости от blur, чем выше значение, тем точнее.
Исходное, blur(3,3), blur (10,10)
-
Только что, Smorodov сказал:В контуре еще найти нужно правильный кусок.
Можно попробовать так: применить морфологию (erode + dilate) это уберет мелкие детали, после размыть, Sobel, затем по порогу границу. Дальше собрать эти точки, и запихнуть в fitLine.
Мы все это проделываем ведь с исходным изображением? Получается, что в результате работы Sobel у меня не будет тогда контуров захватывающих границы изображения (верх, левая, правая)?
Как то это все тянет на долгие вычисления...
-
Только что, BeS сказал:Заблюрить и посчитать производную по Y?
Я думал сделать это через контур,а затем у scipy есть
sp.polyfit().
И если взять полином первой степени то получу прямую.Как реализовать Ваш метод не допонимаю
-
Да, глупости пишу...
Мне вот что не понятно, как выбрать определенный отрезок от найденного контура на изображении, чтобы затем с ним работать?
Например отрезок обведенный красным. Или есть гораздо более простой способ получить линию, разделяющую два цвета, для последующей аппроксимации?
-
День добрый. Ситуация поставила меня в тупик:
# имеем изображение cv2.LUT(img_3ch,label_colours,result) result = result.astype(float)/255 #теперь, чтобы работать с изображением его необходимо перевести в int result_int = result.astype(int) #в конечном итоге, какими бы преобразованиями я не пользовался, np заполняем массив нулями result_int = result.astype(np.int64) #конечной целью служит выделить контур на изображении gray_image = cv2.cvtColor(result_int, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray_image, 127, 255, 0) im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
-
9 часов назад, BeS сказал:Зная угол крена БПЛА (IMU по идее должен уметь его давать), можно просто довернуть картинку так, чтобы крен стал нулевым и запускать сегментацию на выровненой картинке.
Самое смешное, что мне необходимо не брать в учет показания датчиков, а выстраивать свои показания, опираясь только на картинку
-
1 час назад, Smorodov сказал:Да здесь вначале разбивается на суперпиксели, затем graph cut. Ну если больше областей, тогда наверное сетка нужна, graph cut можно инициализировать результатами с сетки для уточнения границ областей, хотя это может быть тяжеловато для мобильного девайса.
Кстати, насчет областей. на данный момент у меня всего два класса на изображениях. В будущем я захочу добавить к примеру воду, леса и т.д. Придется выкидывать тренировочную выборку, которая используется сейчас? Так как на данных изображениях могут быть: вода, лес, дома. Они будут вносить ошибку? Или есть способ использовать в последующем данную выборку совместно с расширенной (многоклассово-размеченной)
-
1 час назад, BeS сказал:з.ы. можно, кстати, попробовать саму картинку доворачивать в соответствии с данными от IMU...так может быть даже точнее получится за счет меньшей вариативности в таргетном распределении...
Расскажите подробнее пожалуйста об этом.
1 час назад, Smorodov сказал:Как вариант, стоит рассмотреть данный вариант. Тут суперпиксели?
А сетка потом будет больше областей распознавать, пока два класса только. Поэтому ее взял, и на небе с землей стал обучать пока.
Кстати, каким образом можно задать заранее сегменты неба (синий) и земли (зеленый), если предварительно не известно, что на изображении?
-
Только что, BeS сказал:Сверточные сети не инвариантны к повротам, т.ч. нужно аугментировать данные.
А как же субдискретизация? Она ведь для создания инвариантности и служит?
-
Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить?
-
Понятно, там все проще, да. Я пробовал с DIGITS SegNet обучать, и не вышло.
Хорошо, указал я тестовую и тренировочную сетку:
Цитатаtrain_net: "/home/maksim/learning/skyfinder/Models/train.prototxt"
test_net: "/home/maksim/learning/skyfinder/Models/test.prototxt"
test_initialization: false
test_iter: 100
test_interval: 100Каждые 100 итераций консоль выдает:
ЦитатаI0324 21:50:17.667479 14168 solver.cpp:294] Iteration 100, Testing net (#0)
I0324 21:50:28.657519 14168 solver.cpp:343] Test net output #0: label = 4
I0324 21:50:28.657542 14168 solver.cpp:343] Test net output #1: label = 4
I0324 21:50:28.657546 14168 solver.cpp:343] Test net output #2: label = 4......................................................
I0324 21:50:28.805891 14168 solver.cpp:343] Test net output #23999: label = 0
I0324 21:50:28.805896 14168 solver.cpp:343] Test net output #24000: prob = 0.211419
.......................................................
I0324 21:50:29.709029 14168 solver.cpp:343] Test net output #143997: prob = 0.236837
I0324 21:50:29.709034 14168 solver.cpp:343] Test net output #143998: prob = 0.235051
I0324 21:50:29.709038 14168 solver.cpp:343] Test net output #143999: prob = 0.227755Собственно что это за информация?
В тестовой выборке у меня 9729 изображений.
Это сетка сегментирует мои изображения в тестовой выборке?
Если да, то почему этих "prob" и "label" так много? prob - 143 тысячи, label - 23 тысячи?
по идее должно ведь только 100 картинок из тестовой выборки обрабатываться с батчем равным 1
-
9 минут назад, Smorodov сказал:Обычно, когда точность на тестовой выборке идет вниз, а точность на обучающей вверх, тогда пора остановиться, ну или или когда точность на тестовой выборке перестала расти.
Это выставляется все настройками test в solver.prototxt?
То есть test_iter=1000 - это то, сколько итераций по тестовой выборке алгоритм отработает.
Тестовая выборка тоже в solver.prototxt устанавливается?
Я о том, что идет процесс тренировки, затем после заданной итерации начался процесс тестирования, не останавливая обучение
-
Возник вопрос. Собственно как определить, что необходимо остановиться при обучении сети? Данные вот такие:
Цитатаtest_initialization: false
test_iter: 1000
test_interval: 2000
max_iter: 10000000При запуске обучения я устанавливаю писать в лог файл. По мере обучения я его парсю и смотрю, что же там вышло:
Цитатаpython caffe_root/tools/extra/parse_log.py mylog.log ./
gnuplot
gnuplot> set datafile separator ','
gnuplot> plot 'mylog.log.train' using 1:4 with line # accuracy throughout the iterations
gnuplot> plot 'mylog.log.train' using 1:5 with line # loss throughout the iterationsТакие графики очень не информативны, и понять по ним, когда же необходимо остановиться нельзя.
Когда итерации достигают величины тестирования:
ЦитатаIteration 2000, Testing net (#0)
I0324 20:02:32.915902 6554 solver.cpp:343] Test net output #0: accuracy = 0.658568
I0324 20:02:32.915961 6554 solver.cpp:343] Test net output #1: loss = 0.247929 (* 1 = 0.247929 loss)
I0324 20:02:32.915966 6554 solver.cpp:343] Test net output #2: per_class_accuracy = 0.439028
I0324 20:02:32.915985 6554 solver.cpp:343] Test net output #3: per_class_accuracy = 0.943957I0324 20:02:33.049631 6554 solver.cpp:214] Iteration 200, loss = 0.236956
Собственно тоже не совсем понятно, что же происходит у нас на этапе тестирования, где я указал test_iter=1000
-
Просто оставлю это здесь, может конечно повторюсь, но все же.
- 1
-
1 час назад, BeS сказал:на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит)
Что значит квантизировать?
1 час назад, BeS сказал:Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного
Можете привести пример?
-
Bes, есть ли что-то подробнее описывающее процесс создания таких сеток? Например на Caffe. Нам необходимо только описать структуру сети в конфигурации, или нужно еще что-то на крестах писать?
Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow.
Задача поставлена так: как можно быстрее, без задержек производить сегментацию на выше описанном железе. Думаю в дальнейшем на плате будет еще что-нибудь крутиться.
Про Caffe знаю, что можно выбросить питоновский интерфейс и пользоваться чистыми крестами, это подходит очень кстати.
-
Добрый день.
Расскажите пожалуйста о вашем опыте работы с torch. Минусы и плюсы, а так же отзывы о производительности. Не будет ли проблем интеграции решения на данном фреймворка с другими модулями программы? Там насколько я понимаю Lua.
Смотрю в сторону данного фреймворка потому, что имеется реализация многообещающей сетки ENet https://github.com/e-lab/ENet-training.
Производительность колоссальная по сравнению с тем же SegNet на Jetson TX1. Авторы утверждают прям о реалтайме.
Если есть какие то ограничения на данный фреймворк, и захочется переписать сетку на тот же Caffe, это возможно?
-
Эти датчики уже используются. Задача стоит именно средствами компьютерного зрения дополнительно расчитывать отклонения.
Производительность grayscale по сравнению с RGB
в Вопросы по нейросетям и ИИ
Опубликовано · Report reply
Добрый день. Подскажите пожалуйста, имеется ли достоверная информация на тему сравнения точности обученных моделей на grayscale и RGB изображениях. Может личный опыт в данном вопросе? Насколько может различаться точность при классификации объектов сверточными сетями, в зависимости от используемого цветового пространства? Понимаю, что вопрос затрагивает множество факторов, относящихся к самим данным, но есть ли что-то от чего можно отталкиваться в данном вопросе?