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

prim.ko

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

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

  • Посещение

  • Days Won

    2

prim.ko last won the day on August 25

prim.ko had the most liked content!

Репутация

3 Новичек

О prim.ko

  • Звание
    Эксперт

Profile Information

  • Расположение
    Россия, Сибирь, Красноярск
  • Интересы
    ML, CV, C++, Embedding, Python
  1. Добрый день. Не совсем ясна одна вещь, связанная с преобразованием изображений. К примеру имеется изображение, полученное камерой. Камера внизсмотрящая. Известно положение камеры в мировом пространстве. Их однозначно определяет акселерометр. Мне необходимо воспользоваться данными с акселерометра для афинных преобразований полученного изображения. Как я понял для этого необходимо перевести координаты двумерных точек на изображении в однородные координаты [x,y]-> [x,y,1], и умножить вектор на матрицу поворота. Необходимо ли где-то использовать матрицу внутренних параметров камеры? В конечном итоге необходимо откорректировать проекцию изображения.
  2. Добрый день. Товарищи, кто сможет поделиться аккаунтом на https://www.cityscapes-dataset.com/login/ для скачивания датасета? Мне уже 2 недели не отвечают по двум заявкам.
  3. Так, ну вроде бы похоже на правду. Установил проверку на выход предсказания равному кол-ву классов, то есть 5 и пока работает вроде: if bottom[0].count != 5*bottom[1].count Не гуд вот, что: DIGITS не визуализирует отрицательную ошибку на графике:
  4. День добрый. Возникло желание прикрутить к caffe Jaccard index: Jaccard Тренирую сеть для задачи семантической сегментации, используя датасет с 5 классами. Непременно нужно прикрутить jaccard в python layer. Для этих целей я переделал код, который реализует dice loss: https://github.com/NVIDIA/DIGITS/tree/digits-5.0/examples/medical-imaging Получается, что я не совсем понимаю как устроены блобы в Caffe. Есть подозрение, что необходимо по-другому передавать axis, при суммировании всех предсказаний и масок: def forward(self, bottom, top): smooth = 1e-12 label = bottom[1].data[:,0,:,:] # compute prediction prediction = np.argmax(bottom[0].data, axis=1) # area of predicted contour a_p = np.sum(prediction, axis=self.sum_axes) # area of contour in label a_l = np.sum(label, axis=self.sum_axes) # area of intersection a_pl = np.sum(prediction * label, axis=self.sum_axes) # dice coefficient dice_coeff = np.mean((2.*a_pl+smooth)/(a_p + a_l+smooth)) top[0].data[...] = dice_coeff Получилась следующая реализация: import random import numpy as np import caffe import math class Jaccard(caffe.Layer): """ A layer that calculates the Jaccard coefficient """ def setup(self, bottom, top): if len(bottom) != 2: raise Exception("Need two inputs to compute Jaccard coefficient.") # compute sum over all axes but the batch and channel axes self.sum_axes = tuple(range(1, bottom[0].data.ndim - 1)) def reshape(self, bottom, top): # check input dimensions match if bottom[0].count != 2*bottom[1].count: raise Exception("Prediction must have twice the number of elements of the input.") # loss output is scalar top[0].reshape(1) def forward(self, bottom, top): smooth = 1e-12 label = bottom[1].data[:,0,:,:] # compute prediction prediction = np.argmax(bottom[0].data, axis=1) # area of predicted contour a_p = np.sum(prediction, axis=self.sum_axes) # area of contour in label a_l = np.sum(label, axis=self.sum_axes) # area of intersection a_pl = np.sum(prediction * label, axis=self.sum_axes) # jaccard coef jaccard_coef = np.mean((a_pl+smooth) / (a_p + a_l - a_pl + smooth)) jaccard_coef=0 top[0].data[...] = jaccard_coef def backward(self, top, propagate_down, bottom): if propagate_down[1]: raise Exception("label not diff") elif propagate_down[0]: #crossentropy loss_crossentropy = 0 for i in range(len(prediction)): loss_crossentropy = loss_crossentropy - prediction[i] * (label[i] - (prediction[i] >= 0)) - math.log(1 + math.exp(prediction[i] - 2 * prediction[i] * (prediction[i] >= 0))) bottom[0].diff[...] = -(math.log(jaccard_coef) + loss_crossentropy) else: raise Exception("no diff") Код ошибки error code 1. Если установить кол-во классов равное 2 и использовать код dice loss из вышеприведенной ссылки, все прекрасно заходит. Ошибка в индексах. Есть какие-нибудь соображения?
  5. Хороший обзор плат arm+fpga https://m.geektimes.ru/post/292803/
  6. finetuning

    На этот счет хочу еще проверить возможно ли будет загружать несколько классов в один модуль, используя один файл, но несколько python layers. Удобно для ошибки и data test aug будет использовать
  7. finetuning

    Интересная сетка. Для сегментации? С какой целью делаются множественные crop?
  8. finetuning

    То есть подход следующий, я правильно понял? 1) загружаем веса 2) Изменяем свою сеть. Объявляем столько слоев из прототипа модели VGG-16 сколько необходимо, в своем прототипе модели. Вот на этом моменте замораживаем добавленные слои. Здесь попрошу подробнее разъяснить. Свои слои при этом выбрасываются? Оставляются только выходы из своей модели? 3) Получили необходимый loss, возвращаем все слои на место?
  9. finetuning

    При этом память GPU больше потребляется, в отличие от обучения своей сеткой с нуля? В Keras понравилось, что мы предсказываем с VGG-16 в отдельной итерации на трогая память GPU. А тут как?
  10. Добрый вечер. Интересует как можно обучить модель с использованием vgg-16 предобученной? В keras это как говорит @ternaus из ods "делается мизинцем левой ноги". Причем вообще не глядя в монитор. https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html . А для Caffe можно так же просто? Интуитивно догадываюсь, что нужно как-то замораживать слои все сверточные и обучать только выход. И еще, например входы vgg-16 224*244*3. Моя сетка запрашивает на вход изображение 256*256. Изменять свою сеть?
  11. error 1 всегда преследует созданный пользователем python файл. В данном случае функцию doAugmentation лучше поместить в класс RotationLayer import random import numpy as np import caffe class RotationLayer(caffe.Layer): def setup(self, bottom, top): print('In Setup') #assert len(bottom) == 2, 'requires 2 layer.bottom' #assert bottom[0].data.ndim >= 3, 'requires image data' #assert bottom[1].data.ndim >= 3, 'requires image data' #assert len(top) == 2, 'requires 2 layer.top' def reshape(self, bottom, top): # Copy shape from bottom print('In Reshape') #top[0].reshape(*bottom[0].data.shape) #top[1].reshape(*bottom[1].data.shape) def forward(self, bottom, top): # Copy all of the data print('In Forward') #top[0].data[...] = bottom[0].data[...] #top[1].data[...] = bottom[1].data[...] #for ii in xrange(0, top[0].data.shape[0]): # [top[0].data[ii, :, :, :],top[1].data[ii, :, :, :]] = doAugmentation(top[0].data[ii, :, :, :],top[1].data[ii, :, :, :]) def backward(self, top, propagate_down, bottom): pass def doAugmentation(self): print("aug") #print('In Augmentation') #ang=random.uniform(-30,30) #return [ndimage.rotate(img, ang, reshape=False),ndimage.rotate(mask, ang, reshape=False)] Если используешь DIGITS в определении модели можно указать module: "digits_python_layers"
  12. Есть замечательный туториал по работе с TensorRT и внутренней камерой jetsona. Там работает все без унылой OpenCV - на gstremer`e вытягивается сразу на GPU. Перепилил код под свои нужды и все замечательно. DetectNet к примеру на 2 класса выдает - 15 fps (480*360) https://github.com/dusty-nv/jetson-inference#image-segmentation-with-segnet
  13. Да. Jetson TX. Если не вру, то python layer вообще не участвует в deploy
  14. Ага, помню когда я взвешивал выборку camvid, в которой 325 картинок. , ну она еще с segnet идет в комплексе, получились немного другие цифры ежели у автора. Там даже issue открыли в git, в котором у народа такие же цифры вышли. Автор молчит:) Некоторые цифры в классах на порядок отличались. Caffè - потому что она единственная собирается без боли под TX*. К тому же есть TensoRT, которые вообще песня:)
×