Jump to content
Compvision.ru

Smorodov

Главные администраторы
  • Content count

    3,774
  • Joined

  • Last visited

  • Days Won

    337

Everything posted by Smorodov

  1. Можно еще нейронку обучить например как здесь: https://github.com/orobix/retina-unet
  2. FCN

    В 32 шаг свертки больше, результат грубее получается чем в 16 или 8. Восьмерка самая аккуратная по опыту. А так то там, можно вероятности получить размыть и по порогу отсечь должно как раз дать плавные границы.
  3. NamedWindow

    Встроенной функции нет, надо цепляться к WinAPI.
  4. У меня такие же проблемы были с утилиткой для аннотации. Сейчас пишу сам, на Qt, с полигонами и Live wire, может еще и другие типы добавлю. Но пока не готово, как будет, может на гитхаб выложу, если что стОящее получится.
  5. Есть еще https://lear.inrialpes.fr/people/klaeser/software_image_annotation но что то под Убунтой файловая панелька пустая. Так что не знаю как насчет больших файлов.
  6. Opencv 2.3.2 + C++Builder XE2

    Это старые файлы, видимо они потерялись. Сейчас я не работаю с C++ builder, поэтому не могу их загрузить заново.
  7. Ну оно вообще-то долго собирается, но процесс конечный.
  8. Выделение области

    Ну так найдите центры контуров, и отсортируйте.
  9. Выделение области

    Для 3 версии: http://docs.opencv.org/3.3.0/d3/dc0/group__imgproc__shape.html#gacb413ddce8e48ff3ca61ed7cf626a366 Про C# не знаю, пишу на C++.
  10. Выделение области

    Документация на boundingRect http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=boundingrect#boundingrect
  11. Работающая версия питонского слоя для поворота изображения и маски: import caffe import random import numpy as np from scipy import ndimage def doAugmentation(img,mask): #print("aug") #print('In Augmentation') ang=random.uniform(-30,30) return [ndimage.rotate(img, ang, reshape=False, axes=(1,2)),ndimage.rotate(mask, ang, reshape=False,axes=(1,2))] 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, :, :, :]=bottom[0].data[...] top[1].data[ii, :, :, :]=bottom[1].data[...] [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
  12. Пытаюсь соорудить слой для рандомного поворота обучающих пар import caffe import random import os import numpy as np from scipy import ndimage def doAugmentation(img,mask): print('In Augmentation') ang=random.uniform(-30,30) return [ndimage.rotate(img, ang, reshape=False),ndimage.rotate(mask, ang, reshape=False)] 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 Уже оставил только логи, но и они не выводятся. Вставляю в prototxt это так: # data layer layer { name: "data" type: "Data" top: "data" include { phase: TRAIN } data_param { batch_size: 1 backend: LMDB } transform_param { mean_value: 104.008 mean_value: 116.669 mean_value: 122.675 mirror: true } } layer { name: "label" type: "Data" top: "label" include { phase: TRAIN } data_param { batch_size: 1 backend: LMDB } } layer { name: "data" type: "Data" top: "data" include { phase: TEST } data_param { batch_size: 1 backend: LMDB } transform_param { mean_value: 104.008 mean_value: 116.669 mean_value: 122.675 mirror: true } } layer { name: "label" type: "Data" top: "label" include { phase: TEST } data_param { batch_size: 1 backend: LMDB } } layer { # Use Power layer for input scaling name: "scale" bottom: "data" top: "scaled" type: "Power" power_param { scale: 0.00390625 } } layer { type: 'Python' name: 'RotationLayer' top: 'scaled' top: 'label' bottom: 'scaled' bottom: 'label' python_param { module: 'rotation_layer' layer: 'RotationLayer' } exclude { stage: "deploy" } } В DIGITS, в Python Layers путь к питонскому исходнику указал. Получаю ERROR: error code 1 и вывод: Top shape: 1 3 800 600 (1440000) Top shape: 1 3 800 600 (1440000) Memory required for data: 17280000 Creating layer label Creating Layer label label -> label Opened lmdb /home/andrey/digits_jobs/20170904-201718-d3ff/train_db/labels ReshapePrefetch 1, 1, 800, 600 output data size: 1,1,800,600 Setting up label Top shape: 1 1 800 600 (480000) Memory required for data: 19200000 Creating layer scale Creating Layer scale scale <- data_data_0_split_0 scale -> scaled Setting up scale Top shape: 1 3 800 600 (1440000) Memory required for data: 24960000 Creating layer RotationLayer UPD: Запихнул в caffe/python который есть в PYTHONPATH, теперь ERROR: error code -6 Мне питонские слои пока не доводилось использовать, что может быть не так ?
  13. Нашел причину в логах caffe, версия protobuf ему не нравится. Установлена 2.6.1, а он хочет 3.1.
  14. finetuning

    Да, для бинарной сегментации, это FCN8s немного переделанная. Там к изображению вначале поля приделываются, наверное для лучшей свертки. А потом кропается постепенно. Хотел еще повороты приделать но питонский слой не осилил, лень пока копаться пока учится вроде нормально.
  15. finetuning

    Как я понял, он читает vgg19.caffemodel и смотрит совпадают ли названия и свойства слоев, если все совпадает грузятся веса. Прототип сетки уже содержит нужный кусок из VGG19, вот туда и грузятся веса, а все что осталось не тронутым инициализируется случайными числами (надо прописать свойства weight_filler { type: "xavier" } bias_filler { type: "constant" } ). Приаттачил свою сетку, которую сейчас мучаю. Там первые слои как раз VGG можно узнать по нулевой скорости обучения. train_val(1).prototxt
  16. finetuning

    Тут с замороженными слоями тоже меньше памяти лопает и учится быстрее.
  17. Не, дохлый номер, ошибка 1 ушла, теперь ошибка -6. Чего-то я здесь недопонимаю.
  18. finetuning

    Я делал в DIGITS, там при создании сетки указывается модель для загрузки (под окошком с текстом модели). Он прогрузит все слои которые имеют то же имя что и в caffemodel файле. Если не нужно их учить, что скорость обучения ставим в 0. param { lr_mult: 0.0 decay_mult: 1.0 } param { lr_mult: 0.0 decay_mult: 0.0 } и учим, по поводу входного блоба, думаю лучше смастабировать входное изображение до размера входа сети. А после выход смасштабировать обратно. Хотя у меня сейчас вход 600х800 на vgg19 и ничего, учится.
  19. написать 360 Player

    Нет, опенсвшной фунуции нет. Интерполяцию можно написать чтобы квадраты сгладить. Можно просто увеличить изображение перед тем как применять эффект линзы и брать пиксели уже с увеличенного изображения, соответственно нужно подправить коэффициенты. Можно еще remap приспособить, там и интерполяция есть. что то типа такого: void applyLens_remap(Mat& src,float x,float y, float R, float M, Mat& dst) { Mat tmp=src.clone(); Mat mapx=Mat(tmp.size(),CV_32FC1); Mat mapy=Mat(tmp.size(),CV_32FC1); for(int i=0;i<src.rows;++i) { for(int j=0;j<src.cols;++j) { mapx.at<float>(i,j)=j; mapy.at<float>(i,j)=i; } } for(int i=y-R;i<y+R;++i) { for(int j=x-R;j<x+R;++j) { float x1=j-x; float y1=i-y; float r=sqrt(x1*x1+y1*y1); if(r<R) { float F = 1 + (R-r)/R*(M-1); // float F = 1 + (R*R-r*r)/(R*R)*(M-1); int x_sampl=round(x+x1/F); int y_sampl=round(y+y1/F); if(x_sampl>=0 && y_sampl>=0 && x_sampl<src.cols && y_sampl<src.rows) { mapx.at<float>(i,j)=x_sampl; mapy.at<float>(i,j)=y_sampl; //tmp.at<Vec3b>(i,j)=src.at<Vec3b>(y_sampl,x_sampl); } } } } remap(src,dst,mapx,mapy,INTER_LINEAR); //circle(tmp,Point(x,y),R,Scalar::all(255),1,CV_AA); //dst=tmp.clone(); }
  20. написать 360 Player

    Да тут то все просто. #include <iostream> #include <string> #include <opencv2/opencv.hpp> using namespace cv; void applyLens(Mat& src,float x,float y, float R, float M, Mat& dst) { Mat tmp=src.clone(); for(int i=y-R;i<y+R;++i) { for(int j=x-R;j<x+R;++j) { float x1=j-x; float y1=i-y; float r=sqrt(x1*x1+y1*y1); if(r<R) { float F = 1 + (R-r)/R*(M-1); // float F = 1 + (R*R-r*r)/(R*R)*(M-1); int x_sampl=round(x+x1/F); int y_sampl=round(y+y1/F); if(x_sampl>=0 && y_sampl>=0 && x_sampl<src.cols && y_sampl<src.rows) { tmp.at<Vec3b>(i,j)=src.at<Vec3b>(y_sampl,x_sampl); } } } } circle(tmp,Point(x,y),R,Scalar::all(255),1,CV_AA); dst=tmp.clone(); } int main(int argc, const char *argv[]) { Mat img=imread("lena.jpg"); imshow("src",img); Mat dst; applyLens(img,256,256, 200, 0.5, dst); applyLens(dst,256,256, 150, 3, dst); imshow("result",dst); waitKey(0); }
  21. написать 360 Player

    Думаю тут больше OpenGL подходит, там вообще с текстурами проблем не будет, да и всякие cubemap-ы есть со sky box-ами, ну и аппаратное ускорение тоже штука не лишняя. Еще тут посмотрите: http://proj4.org/projections/qsc.html
  22. Есть еще вариант удалить мелкие контуры, некоторые отдельные буквы печатного текста можно таким образом подчистить.
  23. разлиновку можно убрать по гистограмме, если инвертировать изображение и найти суммы вдоль строк пикселей, это даст пики на местах линий. А вот выковыривать текст это задачка много сложнее. Можно попробовать нейронку натренироватьб если на вход подавать изображение с печатным текстом, а на выход очищенную надпись, то может и сработать, но нужно большой датасет руками делать, самому почистить штук 1000-2000 таких изображений.
  24. Честно говоря, думал что если caffe собран с включенной cudnn, то он ее будет по умолчанию использовать. А так да, cudnn сильно ускоряет процесс и экономит память.
  25. Довольно удобный краткий справочник с картинками: http://www.asimovinstitute.org/neural-network-zoo/
×