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

maxfashko

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

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

  • Посещение

  • Days Won

    2

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


  1. Добрый день. Подскажите пожалуйста, имеется ли достоверная информация на тему сравнения точности обученных моделей на grayscale и RGB изображениях. Может личный опыт в данном вопросе? Насколько может различаться точность при классификации объектов сверточными сетями, в зависимости от используемого цветового пространства? Понимаю, что вопрос затрагивает множество факторов, относящихся к самим данным, но есть ли что-то от чего можно отталкиваться в данном вопросе?


  2. Похоже, что понял, как это дело должно выглядеть:

    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. Это нормально?


  3. 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к)

    В спецификациях производитель пишет:

    Цитата
    Sensor
    1/2.3” Effective pixels:12 M
    Lens
    FOV ( Field Of View ) 94° 20 mm ( 35 mm format equivalent )
    f/2.8
    focus at ∞
    ISO Range
    100-3200(video) 100-1600(photo)
    Electronic Shutter Speed
    8 s to 1/8000 s
    Max Image Size
    4000 x 3000
    Still Photography Modes
    Single shot
    Burst shooting: 3/5/7 frames
    Auto Exposure Bracketing (AEB):
    3/5 Bracketed frames at 0.7EV Bias
    Time-lapse
    HDR
    Video Recording Modes
    UHD: 4096×2160 (4K) 24 / 25p
    3840×2160 (4K) 24 / 25 / 30p
    2704×1520 (2.7K) 24 / 25 / 30p
    FHD: 1920×1080
    24 / 25 / 30 / 48 / 50 / 60 / 120p
    HD: 1280×720 24 / 25 / 30 / 48 / 50 / 60p
    Max. Bitrate Of Video Storage

    То есть теперь для того чтобы мне найти вертикальный и горизонтальный углы обзора необходимо воспользоваться формулой:

    H = 2*arctan(35/2*2.8)= arctan(12.5) = 85

    Что-то не похоже на правду. Мне необходимо для расчета FOV брать данные, которые получены при калибровке? Если да, то как будет выглядеть процедура определения углов зрения?


  4. 5 часов назад, Smorodov сказал:

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

    Спасибо!


  5. 9 часов назад, iskees сказал:

    Была подобная задача, но не угол нужно было определить, а расстояние на плоскости пройденное объектом, но одно к другому сводится. Решалась так:

    1. задаем условно 4 точки на кадре 

    2. Замеряем чему эти точки соответствует на плоскости (или какому углу)

    3. рассчитываем коэффициенты для полинома второго порядка, решая систему уравнений

    4. получаем результат.

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

    Не до конца понял, как вычислить тангаж по Вашему методу. С креном все ясно:

    Берем две точки прямой, характеризующую линию горизонта, отнимаем их и вычисляем arctan, переводя в градусы.

    В случае расчета тангажа известно только расстояние между двумя прямыми: линией горизонта, которую мы получили аппроксимацией (неба, земли) и линией, характеризующей продольную ось бпла. По каким формулам происходит расчет?

    58e0963fbe1ac_0989_006.jpg.b05fc141fba8db330c578ff366229b1c.jpg

     


  6. 21 час назад, Smorodov сказал:

    Тут горизонт не просматривается :) 

    Но можно RANSAC-ом найти прямые, или тем-же Хафом, или LSD, но RANSAC скорее всего будет лучше работать.

    С креном понятно, разобрался, а что насчет тангажа? Как коеффицент угловой меры от пикселя выразить? Как расстояние пересчитать на угол раствора?


  7. 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)

    igm_0.jpg.7651db1cbeb31b946944052d7f87154b.jpgline_3blur.jpg.65ec2e90f7d3e694908fd5b5147cdd03.jpgline_10blur.jpg.844b970f3e7e8dfb54c0f9bf993e67f5.jpg


  8. Только что, Smorodov сказал:

    В контуре еще найти нужно правильный кусок.

    Можно попробовать так: применить морфологию (erode + dilate) это уберет мелкие детали, после размыть, Sobel, затем по порогу границу. Дальше собрать эти точки, и запихнуть в fitLine. 

    Мы все это проделываем ведь с исходным изображением? Получается, что в  результате работы Sobel у меня не будет тогда контуров захватывающих границы изображения (верх, левая, правая)?

    Как то это все тянет на долгие вычисления...


  9. Только что, BeS сказал:

    Заблюрить и посчитать производную по Y?

    Я думал сделать это через контур,а затем у scipy есть sp.polyfit(). И если взять полином первой степени то получу прямую. 

    Как реализовать Ваш метод не допонимаю

     


  10. Да, глупости пишу... :wacko:

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

    58dce2770d649_result_segment.PNG.86769eefce818960f3b585e48d11aa30.PNG

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


  11. День добрый. Ситуация поставила меня в тупик:

    # имеем изображение
    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)

     


  12. 9 часов назад, BeS сказал:

    Зная угол крена БПЛА (IMU по идее должен уметь его давать), можно просто довернуть картинку так, чтобы крен стал нулевым и запускать сегментацию на выровненой картинке.

    Самое смешное, что мне необходимо не брать в учет показания датчиков, а выстраивать свои показания, опираясь только на картинку:mellow:


  13. 1 час назад, Smorodov сказал:

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

    Кстати, насчет областей. на данный момент у меня всего два класса на изображениях. В будущем я захочу добавить к примеру воду, леса и т.д. Придется выкидывать тренировочную выборку, которая используется сейчас? Так как на данных изображениях могут быть: вода, лес, дома. Они будут вносить ошибку? Или есть способ использовать в последующем данную выборку совместно с расширенной (многоклассово-размеченной)


  14. 1 час назад, BeS сказал:

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

    Расскажите подробнее пожалуйста об этом.

    1 час назад, Smorodov сказал:

    Может здесь обычный graph cut пойдет, и не нужно городить сетку ?

     

    Скриншот 2017-03-28 12.02.15.png

    Как вариант, стоит рассмотреть данный вариант. Тут суперпиксели?

    А сетка потом будет больше областей распознавать, пока два класса только. Поэтому ее взял, и на небе с землей стал обучать пока.

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


  15. Вечер добрый. Назрел вопрос. Натренировал сетку по двум классам на изображениях приведенных ниже ( 25к в train (200*120px) ). В итоге при ровном положении камеры на бпла картинку распознает более менее сносно, даже есть инвариантность к небольшим поворотам. Но вот как только крен бпла увеличивается, получается жесть. Собственно, ожидаемо. Как с этим бороться? Генерировать новые данные для обучения на основе имеющихся, но с поворотом? Или идти путем создания новых реальных данных, которые необходимо будет разметить?

    train.thumb.PNG.f3890b05179270b3ea58eb294bb4f821.PNG

     

    result_segment.thumb.PNG.d8d8c0d6f19abf8d7dc9b3eafd56e0b0.PNG


  16. Понятно, там все проще, да. Я пробовал с 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


  17. 9 минут назад, Smorodov сказал:

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

    Это выставляется все настройками test в solver.prototxt?

    То есть test_iter=1000 - это то, сколько итераций по тестовой выборке алгоритм отработает.

    Тестовая выборка тоже в solver.prototxt устанавливается?

    Я о том, что идет процесс тренировки, затем после заданной итерации начался процесс тестирования, не останавливая обучение 


  18. other.pdf

    Возник вопрос. Собственно как определить, что необходимо остановиться при обучении сети? Данные вот такие:

    Цитата

    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.943957

    I0324 20:02:33.049631  6554 solver.cpp:214] Iteration 200, loss = 0.236956

     

    Собственно тоже не совсем понятно, что же происходит у нас на этапе тестирования, где я указал test_iter=1000


  19. 1 час назад, BeS сказал:

    на инференсе tensorflow может и обогнать кафю (особенно если квантизовать сеточку в 8 бит)

    Что значит квантизировать?

    1 час назад, BeS сказал:

    Это да, caffe совсем не дружелюбен в плане разработки чего-нибудь сильно кастомного :(

    Можете привести пример?


  20. Bes, есть ли что-то подробнее описывающее процесс создания таких сеток? Например на Caffe. Нам необходимо только описать структуру сети в конфигурации, или нужно еще что-то на крестах писать?

    Будет ли лучшим решением использовать Caffe, если переписывать данную сетку? Или стоит посмотреть на theano, tensorflow.

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

    Про Caffe знаю, что можно выбросить питоновский интерфейс и пользоваться чистыми крестами, это подходит очень кстати.


  21. Добрый день. 

    Расскажите пожалуйста о вашем опыте работы с torch. Минусы и плюсы, а так же отзывы о производительности. Не будет ли проблем интеграции решения на данном фреймворка с другими модулями программы? Там насколько я понимаю Lua.

    Смотрю в сторону данного фреймворка потому, что имеется реализация многообещающей сетки ENet https://github.com/e-lab/ENet-training

    Производительность колоссальная по сравнению с тем же SegNet на Jetson TX1. Авторы утверждают прям о реалтайме.

    20170322_010150.thumb.png.c4041a2eee3c72db34b9a8755affb825.png

    Если есть какие то ограничения на данный фреймворк, и захочется переписать сетку на тот же Caffe, это возможно?

×