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

maxfashko

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

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

  • Посещение

  • Days Won

    2

Все публикации пользователя maxfashko

  1. cpu быстрее gpu

    В общем gui profiler никак не хотел загружать скомпилированное приложение, выдавал ошибку поэтому воспользовался версией для командной строки, но информации очень мало выдал. ==5705== Profiling result: Time(%) Time Calls Avg Min Max Name 73.18% 24.757ms 1 24.757ms 24.757ms 24.757ms void cv::cuda::device::resize_area<cv::cuda::device::IntegerAreaFilter<cv::cuda::device::BorderReader<cv::cuda::PtrStep<uchar3>, cv::cuda::device::BrdConstant<uchar3>>>, uchar3>(uchar3, cv::cuda::PtrStepSz<cv::cuda::PtrStep<uchar3>>) 26.79% 9.0619ms 1 9.0619ms 9.0619ms 9.0619ms [CUDA memcpy HtoD] 0.04% 12.992us 1 12.992us 12.992us 12.992us [CUDA memcpy DtoH]
  2. cpu быстрее gpu

    Smorodov, вы как всегда правы. Установка девайса помогла снизить время, но по-прежнему, процессор чуть быстрее. Gpu 0.1892 Cpu 0.1600 Дело в том, что программа построена так, что процесс ресайза это не главное действие, после ресайза изображение поступает на дальнейшую обработку, там пакетной обработки даже нет. Только если создавать несколько потоков, и одновременно обрабатывать несколько изображений. Сначала класссификация, затем ресайз, после этого сегментация. И так каждое изображение в своем потоке? Nuzhny, где это можно сделать? Подробнее пожалуйста. Компилятор не может наложить какие либо особенности? Компилировал nvcc resize.cpp -o resize 'pkg-config --cflags --libs opencv' -lopencv_gpu
  3. SegNet

    Все понял. Родная caffe-segnet не поддерживает multiple gpu. Что-то там изменили.
  4. SegNet

    Приветствую. Может быть у кого-то есть идеи по поводу следующей проблемы? Вот тут парень выложил caffe-segnet для задействовано нескольких gpu. https://github.com/developmentseed/caffe/tree/segnet-multi-gp Я собрал, запустил обучение на трех tesla m2090, но прироста скорости не заметил, 20 итераций по-прежнему выполняются около 40 секунд. К тому же я думал что при использовании нескольких gpu память будет шариться, и я смогу увеличить batch size. Но сеть ведет себя странно: | NVIDIA-SMI 352.39 Driver Version: 352.39 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla M2090 Off | 0000:19:00.0 Off | 0 | | N/A 59C P12 30W / 225W | 10MiB / 5375MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla M2090 Off | 0000:1A:00.0 Off | 0 | | N/A 59C P1 139W / 225W | 4812MiB / 5375MiB | 87% Default | +-------------------------------+----------------------+----------------------+ | 2 Tesla M2090 Off | 0000:1E:00.0 Off | 0 | | N/A 59C P0 159W / 225W | 4457MiB / 5375MiB | 19% Default | +-------------------------------+----------------------+----------------------+ | 3 Tesla M2090 Off | 0000:1F:00.0 Off | 0 | | N/A 59C P0 141W / 225W | 4457MiB / 5375MiB | 0% Default | +-------------------------------+----------------------+----------------------+ Я попытался попытался изменить batch size в segnet_train.prototxt (на m2090 работает только при значении 1, так как всего 5 gb ram) на значение 2 или 3. Но получил сообщение о нехватке памяти. Подскажите пожалуйста, могу ли я увеличить скорость обучения при использовании двух и более gpu? Если да, то что мне необходимо для этого сделать? Могу ли я увеличить upsample layer в segnet_train.prototxt чтобы память шарилась? layer { name: "upsample5" type: "Upsample" bottom: "pool5" top: "pool5_D" bottom: "pool5_mask" upsample_param { scale: 2 upsample_w: 30 upsample_h: 23 } } Я хочу изменить значения upsample_w : 45, upsample_h : 45 для того чтобы нейросеть могла принять на вход изображения 720*720. Возможно ли будет сделать это используя два и более gpu?
  5. Добрый вечер. Интересует собственно как расчитывать точность на сегментированных нейронной сетью изображениях? Имеем тестовую выборку, пропущенную через нейронную сеть, в которой есть файлы разметки и собственно файлы сегментированные сетью. Теперь как мы можем по полученным изображениям выяснить их точность? Понятное дело, что сегментированные файлы должны стремиться к изображениям аннотации. Написал следующий скрипт для расчета точности: #!/usr/bin/env python # -*- coding: utf-8 -*- # vim:fileencoding=utf-8 #use only 2 classes # object (60,40,222) color from PIL import Image import numpy as np import matplotlib.pyplot as plt import os from os import listdir from os.path import isfile, join labelPath = 'test/ground_truth' segmentPath = 'test/segment' resultFileName = 'test/result.txt' labelList = [] segmentList = [] resultArr = [] #get files in dir def list_files(path, files): # returns a list of names (with extension, without full path) of all files # in folder path for name in os.listdir(path): if os.path.isfile(os.path.join(path, name)): files.append(name) return files def main(): mean = 0 list_files(labelPath, labelList) list_files(segmentPath, segmentList) if len(labelList) != len(segmentList): print 'len '+labelPath+' != '+segmentPath return -1 for i in range (len(labelList)): #label img imgLabel = Image.open(labelPath+'/'+labelList[i]) w = imgLabel.size[0] #Определяем ширину. h = imgLabel.size[1] #Определяем высоту. pixLabel = imgLabel.load() #Выгружаем значения пикселей. #segment img imgSegment = Image.open(segmentPath+'/'+segmentList[i]) pixSegment = imgSegment.load() #Выгружаем значения пикселей. amountPixObjLabel = 0 amountPixLossLabel = 0 #amount pixels with object for k in range(0, w): for l in range(0, h): if pixLabel[k,l][0:3] == (60, 40, 222): #blue color object amountPixObjLabel+=1 #search differences for k in range(0, w): for l in range(0, h): if pixLabel[k,l][0:3] != pixSegment[k,l][0:3]: amountPixLossLabel +=1 #one pix = % onePix = float(100) / float(amountPixObjLabel) count = 100 - (amountPixLossLabel*onePix) mean += count resultArr.append(str(i)+' accuracy = '+str(count)) print str(i)+' accuracy = '+str(count) print 'Mean accuracy = '+str(mean / len(labelList)) resultArr.append('Mean accuracy = '+str(mean / len(labelList))) #write result resultFile = open(resultFileName, 'w') for item in resultArr: resultFile.write("%s\n" % item) main() Смысл такой: загружаем значения пикселей аннотированного изображения, затем делаем тоже самое с сегментированным изображением. Если в сегментированном изображении текущий пиксель отличается от пикселя в аннотированном, увеличиваем счетчик ошибочных пикселей по данному изображению. Затем расчитываем сколько пикселей составляет один процент от всех пикселей в объекте аннотированного изображения. И затем переводим наши ошибочные пиксели в проценты. Это и будет наша точность. file: ground_truth . file: segment Например для данного сообщения выводится значение accuracy = 96.9656336161
  6. Программа будет работать с объектами сфотографированными на белом, сероватом фоне. На примере ниже исходное фото, ручная разметка, сегментированное фото. Точность для данного примера составляет 0.997627852057 Исходное фото было "доведено" искусственно до размера 480х360. Надеюсь это не сильно влияет на результат.
  7. Smorodov, в общем реализовал скрипт, расчитывающий accuracy: Только вот в результате не уверен, слишком высокую точность выдает: accuracy = 0.996942198369 на изображении приведенном выше 1. В цикле подсчитываем кол-во P,N пикселей текущего изображения. 2. В цикле подсчитываем кол-во TN,TP пикселей текущего изображения, если текущий пиксель имеет одинаковое значение в изображениях ground_truth и segment Взгляните пожалуйста на код: from PIL import Image import numpy as np import matplotlib.pyplot as plt import os from os import listdir from os.path import isfile, join labelPath = 'test/ground_truth' segmentPath = 'test/segment' resultFileName = 'test/result.txt' labelList = [] segmentList = [] resultArr = [] colorClass1 = (60,40,222) #object colorClass2 = (128,128,128) #background #get files in dir def list_files(path, files): # returns a list of names (with extension, without full path) of all files # in folder path for name in os.listdir(path): if os.path.isfile(os.path.join(path, name)): files.append(name) return files def main(): #for calculation global value mean = 0 TP_g = 0 TN_g = 0 P_g = 0 N_g = 0 list_files(labelPath, labelList) list_files(segmentPath, segmentList) if len(labelList) != len(segmentList): print 'len '+labelPath+' != '+segmentPath return -1 for i in range (len(labelList)): TP = 0 TN = 0 P = 0 N = 0 #label img imgLabel = Image.open(labelPath+'/'+labelList[i]) w = imgLabel.size[0] #Определяем ширину. h = imgLabel.size[1] #Определяем высоту. pixLabel = imgLabel.load() #Выгружаем значения пикселей. #segment img imgSegment = Image.open(segmentPath+'/'+segmentList[i]) pixSegment = imgSegment.load() #Выгружаем значения пикселей. #calculate P, N (pixels of object and background) for k in range(0, w): for l in range(0, h): if pixSegment[k,l][0:3] == colorClass1: P+=1 if pixSegment[k,l][0:3] == colorClass2: N+=1 #calculate TP and TN (пиксели классифиц. как объект и явл. им) for k in range(0, w): for l in range(0, h): if pixLabel[k,l][0:3] == colorClass1 and pixSegment[k,l][0:3] == colorClass1: TP+=1 if pixLabel[k,l][0:3] == colorClass2 and pixSegment[k,l][0:3] == colorClass2: TN+=1 TP_g += TP TN_g += TN P_g += P N_g += N #calculate accuracy for current image currentAcc = float(TP+TN) / float(P+N) resultArr.append(str(i)+' accuracy = '+str(currentAcc)) print str(i)+' accuracy = '+str(currentAcc) #calculate mean global accuracy mean = float(TP_g+TN_g)/float(P_g+N_g) print 'Mean accuracy = '+str(mean) resultArr.append('Mean accuracy = '+str(mean)) #write result resultFile = open(resultFileName, 'w') for item in resultArr: resultFile.write("%s\n" % item) main()
  8. Спасибо! Поделитесь пожалуйста, что означают P, N ? Как я понял TP - это объект (синий), пиксели, которые верно сегментированы TN - это фон (серый), пиксели, которые верно сегментированы P, N - это кол-во файлов? То есть проходим циклом по картинке забирая хорошие "синие" пиксели. Затем так же но берем уже хорошие "серые" пиксели? Складываем и делим на кол-во?
  9. SegNet

    Smorodov, насчет теста, я правильно подхожу к тестированию? Делаю следующим образом: В качестве модели указываю ту, на которой тренировался (segnet_train.prototxt) ~/PassArtSegment/Segnet/caffe-segnet/build/tools/caffe test -gpu 0 -model ~/PassArtSegment/SegNet-Tutorial/Models/segnet_train.prototxt - weights ~/PassArtSegment/SegNet-Tutorial/Models/Training/segnet_iter_40000.caffemodel -iter 3000 2>&1 | tee test.log После чего парсим лог и получаем следующие графики точности и ошибки: Ну и если высчитать средние значения из лога то получаю: columnNumber = 2 data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()] mean = sum(data) / len(data) print(mean) //0.98666 для точности columnNumber = 3 data = [float(l.split(',')[columnNumber]) for l in open('log.csv', 'r').readlines()] mean = sum(data) / len(data) print(mean) //0.013902 для ошибки Это верный подход?
  10. SegNet

    Спасибо! Думаете есть смысл обучать более 40к итераций?
  11. SegNet

    Товарищи! Есть кто живой?) Кто-нибудь может мне подсказать по поводу кривых обучения?
  12. SegNet

    Понятно. Хочу еще спросить - официальный туториал segnet говорит, что после обучения сети, необходимо проделать следующее: python /Segnet/Scripts/compute_bn_statistics.py /SegNet/Models/segnet_train.prototxt /SegNet/Models/Training/segnet_iter_10000.caffemodel /Segnet/Models/Inference/ # compute BN statistics for SegNet python /SegNet/Scripts/test_segmentation_camvid.py --model /SegNet/Models/segnet_inference.prototxt --weights /SegNet/Models/Inference/test_weights.caffemodel --iter 233 # Test SegNet После этих команд выводятся изображения из тестовой выборки и результаты сегментации. А собственно можно просто взять обученную *.caffemodel и сегментировать любое изображение, после чего сохранить его в указанной директории? Все таки удалось запустить SegNet на одной m2090 А вообще это нормально, что у меня обучение происходит вот так? Уже после 3000 итерации точность довольно неплохая, ошибка тоже небольшая. И еще - подскажите, из-за чего вот эти всплески ошибок происходят? На итерациях 5, 10, 15 тыс. Они ведь получились эквивалентны графику accuracy на тех же итерациях. Это из-за каких-то уникальных особенностей в обучающей выборке - неточности, выбросы и т.д ? Как от них избавиться? Или это нормально?
  13. SegNet

    День добрый! А что еще можно попробовать для обучения сетки на сегментацию? Сейчас у меня имеется в распоряжении 4 Tesla m2090 (но это только 5 gb на каждой карточке). Tesla m40 больше не доступна, и врядли в обозримом будущем удастся получить к ней доступ. Как я понимаю на m2090 я не запущу SegNet. Пробывал указать все 4 карты при тренировке ( -gpu 0,1,2,3 ) не понимает. Может на амазоне есть инстансы с карточками по 10 gb и выше памяти? Я что-то не понял тамошних порядков с техническими характеритиками кластеров.
  14. SegNet

    Цвета разметки брал отсюда http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html. По сути ребята модель тренировали на данном датасете, если я ничего не путаю. Зачем изобретать велосипед
  15. SegNet

    А каким-нибудь образом можно получить кривую зависимостей loss и accuracy имея только обученную модель, но не имея лога? Сейчас переучить не получиться - кластер с м40-вой только на 2 дня погонять давали. В общем обучение можно считать проваленным: При конвертации размеченных цветами аннотированных изображений в {0,1}, в алгоритм закралась ошибка. Какая-то часть данных была размечена как 1- объект 0-фон, а другая чать как 0-объект, 1-фон. Этим объясняется странное поведение при тренировке: две итерации могли идти с точностью в 0.95, а следующие за ней десять итераций, как 0.20, и так до 40000 итерации. Бедняга, все не могла понять, что же от нее хотят
  16. SegNet

    У меня действительно всего 2 класса, ptototxt я не редактировал. Когда запустил обучение поздно обнаружил, что неверно указал лог, и обучение не фиксировалось в логе. По этому я просматриваю не log а подключаясь к кластеру через screen чтобы посмотреть что там творится. Из-за того, что не отредактировал prototxt все обучение на смарку?
  17. SegNet

    После 10к итераций результат не улучшился, значит ли это, что обучение можно останавливать? Я понимаю так, что меня должны интересовать следующие строки: rain net output #0: accuracy = 0.987271 Train net output #2: per_class_accuracy = 0.967589 Train net output #6: per_class_accuracy = 0.987386 Iteration 40580, loss = 0.0586965 И если показатели хорошие, то останавливать обучение?
  18. SegNet

    Спасибо! Именно это помогло! Кому нужно - в репозитории имеется около 3к идеально размеченных автоматом данных (больший объем пока не делал) А что с настройками обучения? Оставить все по дефолту? 40к итераций хватит? если у меня будет 10-30к изображений для тренировки? Как выявить наилучший результат при тренировке? https://github.com/Maxfashko/CamVid
  19. SegNet

    Приветствую! Расскажу немного о своих трудностях, с которыми я столкнулся при обучении данной сетки: На Tesla m40 пример, приведенный в туториале обучается очень здорово и шустро - все ок! Когда же пытаемся всунуть сетке свои размеченные изображения - F0606 19:20:16.349822 2152 math_functions.cu:123] Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR Уперся в стену с созданием файлов "png" аннотации-масок. Как я понимаю обычное RGB изображение "png" нам необходимо перекодировать в градации серого + какой-то режим типо HSV. Предварительно его раскрасив необходимыми цветами: 64 128 64 Animal 192 0 128 Archway 0 128 192 Bicyclist 0 128 64 Bridge 128 0 0 Building 64 0 128 Car 64 0 192 CartLuggagePram 192 128 64 Child 192 192 128 Column_Pole 64 64 128 Fence 128 0 192 LaneMkgsDriv 192 0 64 LaneMkgsNonDriv 128 128 64 Misc_Text 192 0 192 MotorcycleScooter 128 64 64 OtherMoving 64 192 128 ParkingBlock ... 0 0 0 Void Но как бы не пытался я это сделать в Photoshop, у меня не выходит. Сеть не хочет это кушать. Единственное решение, которое может создавать файлы масок-аннотаций - https://github.com/kyamagu/js-segment-annotator После этой тулзы сеть съедает файлы "png" и обучается. Но проблема в том, что мне не нужно размечать данные вручную. У меня уже имеются "вырезанные" файлы. Мне остается только наложить "вырезанные" поверх "исходных" jpg и залить цветами. Но как конвертировать в цвета, которые сеть будет воспринимать и обучаться? RGB разных цветов - отказ Градации серого 25% - отказ Индексированные цвета (3 цвета) - отказ Еще нашел вот такой скрипт, который вроде как должен решить мою проблему, но сеть тоже не ест файлы, которые выходят после скрипта. (Более того, сеть даже не ест файлы аннотации из "родного" датасета CamVid, если ее прогнать через данный скрипт) Как мне это победить? gray.py
  20. SegNet

    mrgloom, да, из-за появления зубчатости. То есть как я понимаю, если я не имею под рукой штук 5 tesla k40 я не продвинусь ни на шаг в своей проблеме?
  21. SegNet

    Снова здравствуйте. Насколько сложно изменить структуру той же segnet для того чтобы у меня изображение на выходе (а может и на входе при обучении) было не 360*480 пикселей, а к примеру 1000*1500. Так как с изображением 360*480 невозможно работать, хочу увеличить размерность выходного изображения. Простой ресайз ясное дело никакой пользы не принесет. Как при этом мне необходимо действовать? И нужно ли менять структуру сетки?
  22. SegNet

    На CPU получилось запустить на обучение segnet_basic_train. На macbook i7 / vmware Ubuntu на 20 итераций тратится около 10 минут. На osx собрать segnet caffe не получилось (вылезла куча ошибок). Так же на Ubuntu не получается запустить пример python /home/myuser/Downloads/SegNet/SegNet-Tutorial/Scripts/compute_bn_statistics.py /home/myuser/Downloads/SegNet/SegNet-Tutorial/Models/segnet_basic_train.prototxt /home/myuser/Downloads/SegNet/SegNet-Tutorial/Models/Training/segnet_basic_camvid.caffemodel /home/myuser/Downloads/SegNet/Models/Inference/ Выводит ошибку F0225 23:41:36.745960 11302 syncedmem.cpp:51] Check failed: error == cudaSuccess (8 vs. 23) Есть у кого мысли в чем может быть причина?
  23. Добрый вечер. Нужен совет в каком направлении мне искать информацию. Имеется набор изображений (~50к) в формате png и jpg. На изображениях запечатлены люди в разных фото-позах, за человеком белый фон. На изображениях разные люди (высокие, маленькие, по пояс, портрет, мужчины, женщины). Изображения в формате png отделены от фона, на jpg соответсвенно фон имеется. Возможно ли каким-либо алгоритмом научить будущую систему выделять границы объекта (в нашем случае человека) на рандомном не из выборки изображении с фоном. Своеобразная сегментация. Возможно ли такую систему объединить с имеющимся алгоритмом сегментации, например grabcut ?
  24. Друзья, а как мне создать выборку и разметить ее для обучения? Я должен взять png изображения и сделать из них jpeg изображения предварительно раскрасив их в 2 цвета (фон и объект). А затем перевести все это дело в вектор и подать на вход нейросети?
  25. В общем и целом это возможно, почему нет? Как появиться время обязательно расшарю образы! По сервису - результат неплохой - в некоторых тестах хуже, в некоторых лучше того, чем сейчас пользуюсь. Из поставки opencv перепилил под себя grabcut для автоматической, пакетной сегментации фотографий. Прямоугольник объекта задаю в настройках условно - примерно 10-15% от краев изображения. Результат неплохой, учитывая участие человека в процессе на уровне "нажал кнопку - смотришь на результат". Bes, в обучении я ноль. Только один раз учил каскад для обнаружения лиц adaBoost`ом. С чего начать, чтобы натренировать данную систему? Возможно ли добиться лучших результатов с моим большим кол-вом изображений, чем это сделали ребята из лаборатории?
×