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

mrgloom

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

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

  • Посещение

  • Days Won

    142

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

  1. https://github.com/lzx1413/labelImgPlus В итоге заработало под windows на anaconda python 2, но не работает сохранение. https://github.com/wkentaro/labelme И это заработало, но при сохранении зачем то сохраняется изображение прямо в json как бинарная строка (но это довольно легко убрать) и еще нет загрузки сразу нескольких изображений как в labelImg и нет выбора из списка лейблов, а надо каждый раз руками прописывать. Еще попробовал https://github.com/cvhciKIT/sloth Но полигоны там нельзя перемещать и изменять, только удалять.
  2. https://lear.inrialpes.fr/people/klaeser/software_image_annotation Погонял prebiuild binaries для винды Не читает .jpg. Большие изображения загружает, но когда добавляешь маску лагает. Ну и там разметка кисточкой, а хотелось бы полигонами.
  3. Кстати говоря https://www.kaggle.com/c/denoising-dirty-documents
  4. Возможно ли решить задачу локализации для N объектов (т.е. на каждом фото у нас всегда по N объектов), как задачу регрессии (т.е. если мы хотим предсказывать bbox, то регрессия на N*4 чисел)? Для 1 объекта эта задача решается. А для N объектов я попробовал в лоб и вроде как не работает Правда немного другая формулировка задачи: на изображении может быть от 1 до N кругов и надо предсказать центр и радиус каждого круга. https://github.com/mrgloom/position-and-radius-estimation-example Я думаю не работает потому что объекты как бы получаются не ordered и в этом вся проблема.
  5. Так то да, это работает как раз потому что предсказывается сдвиг и пр. вокруг клетки, которая имеет фиксированную позицию. Но тогда непонятно например как работало тут - Multi-digit Number Recognition from Street View Imagery using Deep Convolutional Neural Networks https://static.googleusercontent.com/media/research.google.com/ru//pubs/archive/42241.pdf т.е. положение цифр меняется (на картинках цифры например лесенкой могут быть), т.е. грубо говоря сеть как то должна научится читать слева направо (т.е. чтобы вывести строку как ответ сеть должна уметь выдать буквы в правильном порядке).
  6. Это всего лишь пример и сложности нет если решать алгоритмами computer vision, а хочется решить через CNN.
  7. Если про то что на картинке это style transfer.
  8. finetuning

    Я файнтюнил без замораживания слоев просто с learning rate меньше в 10 раз и норм, но возможно это не самое оптимально решение и зависит от кол-ва данных. Судя по табличке finetuned acc всегда больше получалась https://github.com/mrgloom/kaggle-dogs-vs-cats-solution
  9. http://www.robots.ox.ac.uk/~vgg/data/scenetext/
  10. т.е. affine transform правильный не совпадает только по масштабу? В итоге что на вход идёт? И проверяете вы как наложилось через что? через Google Earth? У GDAL есть бинарники gdal-bin и еще python-gdal хотя там помоему другой функционал или частично пересечкающийся, на С/C++ наверно API пошире.
  11. А точно, он же только для трейна, а аутпут в деплое это выход с сигмоид. Тогда да. Напишите про опыт с TensoRT.
  12. А что такое TX* ? Tegra? Ну так python layer придётся переписать на C++/Cuda он же вроде только для train годится.
  13. Ну так а если использовать python layer, то почему caffe? Softmax по идее можно взвесить. https://github.com/alexgkendall/SegNet-Tutorial/blob/master/Example_Models/train_segnet_sun.prototxt#L1608 Но может у них опять же кастомный layer для этого.
  14. Раньше в .prototxt нельзя было указывать 'engine' это что то новое, а просто caffe собирается с CUDNN, т.е. это указывается в makefile. Видимо теперь можно собрать с CUDNN, но свитчить engine не перекомпилируя? По дефолту вроде сейфово стоит то что надо https://stackoverflow.com/a/43306411/1179925 По идее и без BN должно работать, на график сходимости интересно посмотреть с и без.
  15. Можно загружать веса и там и там, а вот добавлять потом слои уже сложнее и скорее всего это делается тупо копированием весов из одной модели (из менее короткой в более длинную) в другую. Но изначально я предлагал именно доучить ту же самую модель (с загруженными весами от предыдущего запуска, которые уже что то дают похожее на правду) с меньшим learning rate.
  16. Имеется ввиду ту модель которую вы уже обучили и которая что то уже выводит. Я говорю с BN там был баг. Выложу в эту репу потом модель resnet'ов которые работают, там как раз были проблемы с BN насколько я помню. https://github.com/mrgloom/kaggle-dogs-vs-cats-solution
  17. а ODM может работать с фотками без gps? или в каком формате ему надо эту инфу подкладывать? Как тест гоняю https://github.com/OpenDroneMap/odm_data_bellus и там в exif должны быть gps данные Пока у меня всё заканчивается на Building objmodel: Saving model... done. Whole texturing procedure took: 27.507s �[94m[INFO] Running ODM Texturing Cell - Finished�[0m �[94m[INFO] Running ODM Georeferencing Cell�[0m �[92m[DEBUG] None�[0m �[93m[WARNING] No coordinates file. Generating coordinates file: /code/odm_georeferencing/coords.txt�[0m �[93m[WARNING] Could not generate coordinates file. Ignore if there is a GCP file. Error: Error in OdmExtractUtm: Image is missing GPS Latitude data For more detailed information, see log file. �[0m �[93m[WARNING] Georeferencing failed. Make sure your photos have geotags in the EXIF or you have provided a GCP file. �[0m �[93m[WARNING] Found a valid georeferenced model in: /code/odm_georeferencing/odm_georeferenced_model.ply�[0m �[94m[INFO] Running ODM Georeferencing Cell - Finished�[0m �[94m[INFO] Running ODM DEM Cell�[0m �[92m[DEBUG] running l2d_classify --help > /dev/null�[0m �[94m[INFO] Create DSM: False�[0m �[94m[INFO] Create DTM: False�[0m �[94m[INFO] DEM input file /code/odm_georeferencing/odm_georeferenced_model.las found: False�[0m �[93m[WARNING] DEM will not be generated�[0m �[94m[INFO] Running ODM DEM Cell - Finished�[0m �[94m[INFO] Running ODM Orthophoto Cell�[0m �[92m[DEBUG] running /code/build/bin/odm_orthophoto -inputFile /code/odm_texturing/odm_textured_model.obj -logFile /code/odm_orthophoto/odm_orthophoto_log.txt -outputFile /code/odm_orthophoto/odm_orthophoto.png -resolution 20.0 -outputCornerFile /code/odm_orthophoto/odm_orthophoto_corners.txt�[0m Error in OdmOrthoPhoto: Argument '-logFile' has a bad value. Traceback (most recent call last): File "/code/run.py", line 46, in <module> plasm.execute(niter=1) File "/code/scripts/odm_orthophoto.py", line 74, in process '-outputCornerFile {corners}'.format(**kwargs)) File "/code/opendm/system.py", line 34, in run raise Exception("Child returned {}".format(retcode)) Exception: Child returned 1
  18. Можно попробовать learning rate поменьше имея уже предобученную модель. dice loss можно сделать через custom python layer https://github.com/NVIDIA/DIGITS/tree/master/examples/python-layer Я кстати не знаю как выбор loss'а будет влиять на форму\качество предсказанной маски это вопрос интересный. Еще в dice loss есть некий smooth parameter, по идее это же может быть просто что типа eps=1e-3, чтобы не было деления на 0 или это как то влияет на предсказание границ? Тут 1.0 https://github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.py#L23
  19. lr_mult: 0 типо фризит лайер т.е. сеть не учится. Вроде как можно вообще это убрать, т.е. будет по дефолту. Например https://github.com/mrgloom/kaggle-dogs-vs-cats-solution/blob/master/finetuning/VGG16/original.prototxt Картинка про batch accumulation значит что (в зависимости от памяти доступной на GPU) можно получить effective batch size=10 как 2*5 или 5*2 или 10*1.
  20. Нормализовать инпут надо обязательно как zero mean unit vairance, говорят что можно batchnorm запихнуть сразу после инпута. По картинкам видно что активации нет на следующих слоях, попробуйте learning rate уменьшить или batch size увеличить, еще в caffe + DIGITS можно делать batch accumulation если по памяти не влезает.
  21. Тут вот кстати пишут что можно CTC loss использовать, а можно seq2seq как еще 1 вариант (но вроде это хуже). https://www.researchgate.net/publication/311672974_Offline_Handwriting_Recognition_Using_LSTM_Recurrent_Neural_Networks https://www.researchgate.net/profile/Matthia_Sabatelli/publication/311672945_Offline_Handwriting_Recognition_Using_LSTM_Recurrent_Neural_Networks/links/5853a89708ae0c0f3222c94b/Offline-Handwriting-Recognition-Using-LSTM-Recurrent-Neural-Networks.pdf
  22. import cv2 import numpy as np import pandas as pd import keras from keras.models import Sequential, Model from keras.layers import Dense, Dropout, Activation, Flatten, GlobalAveragePooling2D from keras.layers import Conv2D, MaxPooling2D from keras.layers import Input from keras.optimizers import SGD, RMSprop from keras.callbacks import ModelCheckpoint, EarlyStopping import sys #Two head - one for number and one for digit with constant positions #params list_a= ['0','1','2','3','4','5','6','7','8','9'] list_b= ['A','B','C'] dx= 20 dy= 50 font_scale= 1 batch_size= 32 epochs= 20 patience = 10 model_name= 'model.h5' input_dim= (80,120,3) def generate_random_plate_number(): img= np.zeros(input_dim, np.uint8) rand_indx_b= np.random.randint(len(list_b)) letter_str1= list_b[rand_indx_b] #print('letter_str',letter_str) # cv2.putText(img, letter_str1, (0,dy), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255,255,255), thickness=2) rand_indx_a= np.random.randint(len(list_a)) number_str1= list_a[rand_indx_a] #print('number_str',number_str) # cv2.putText(img, number_str1, (2*dx,dy), cv2.FONT_HERSHEY_SIMPLEX, font_scale, (255,255,255), thickness=2) y1= np.zeros((len(list_b)), np.int32) y2= np.zeros((len(list_a)), np.int32) y1[list_b.index(letter_str1)]= 1 y2[list_a.index(number_str1)]= 1 #print('y1', y1) # #print('y2', y2) # return img,y1,y2 def batch_generator(batch_size): while True: image_list = [] y1_list = [] y2_list = [] for i in range(batch_size): img,y1,y2= generate_random_plate_number() image_list.append(img) y1_list.append(y1) y2_list.append(y2) image_arr = np.array(image_list, dtype=np.float32) y1_arr = np.array(y1_list, dtype=np.int32) y2_arr = np.array(y2_list, dtype=np.int32) #print('image_arr.shape', image_arr.shape) # #print('y1_arr.shape', y1_arr.shape) # #print('y2_arr.shape', y2_arr.shape) # yield(image_arr, {'output1': y1_arr, 'output2': y2_arr} ) def get_model(): network_input = Input(shape=input_dim) conv1= Conv2D(32, (3, 3), padding='same')(network_input) pool1= MaxPooling2D(pool_size=(2, 2))(conv1) act1= Activation('relu')(pool1) conv2= Conv2D(32, (3, 3), padding='same')(act1) pool2= MaxPooling2D(pool_size=(2, 2))(conv2) act2= Activation('relu')(pool2) conv3= Conv2D(64, (3, 3), padding='same')(act2) pool3= MaxPooling2D(pool_size=(2, 2))(conv3) act3= Activation('relu')(pool3) conv4= Conv2D(64, (3, 3), padding='same')(act3) pool4= MaxPooling2D(pool_size=(2, 2))(conv4) act4= Activation('relu')(pool4) tail= GlobalAveragePooling2D()(act4) #global_pool= GlobalAveragePooling2D()(act4) #tail= Dense(128)(global_pool) #add heads head1= Dense(len(list_b))(tail) softmax1= Activation('softmax', name='output1')(head1) head2= Dense(len(list_a))(tail) softmax2= Activation('softmax', name='output2')(head2) model = Model(input = network_input, output = [softmax1,softmax2]) model.compile(optimizer = RMSprop(1e-3), loss = {'output1': 'categorical_crossentropy', 'output2': 'categorical_crossentropy'}) #print(model.summary()) # #sys.exit() # return model def train(): model= get_model() callbacks = [ EarlyStopping(monitor='val_loss', patience=patience, verbose=0), ModelCheckpoint('model_temp.h5', monitor='val_loss', save_best_only=True, verbose=0), ] history = model.fit_generator( generator=batch_generator(batch_size), nb_epoch=epochs, samples_per_epoch=1*batch_size, validation_data=batch_generator(batch_size), nb_val_samples=1*batch_size, verbose=2, callbacks=callbacks) model.save_weights(model_name) pd.DataFrame(history.history).to_csv('train_history.csv', index=False) Задача (не реальная) на картинке (80,120,3) в константных местах стоят(разные) цифра и буква, соответственно создаем общее 'тело' и 2 'головы'(для буквы и цифры), но чего то так не учится. Есть какие то соображения или типа задача weakly supervised и её сложно\невозможно в такой постановке решить?
  23. num_output: 32 У вас 32 класса? А так в DIGITS же можно смотреть активации для всех блобов, по крайней мере для классификации. И вы загрузку данных как в каком примере используете? https://github.com/NVIDIA/DIGITS/tree/master/examples/binary-segmentation https://github.com/NVIDIA/DIGITS/tree/master/examples/medical-imaging https://github.com/NVIDIA/DIGITS/tree/master/examples/semantic-segmentation
  24. Тишина всмысле не обучается? В DIGITS там какой то баг был с BatchNorm, всмысле nvidia-caffe ветка, так что лучше использовать caffe-master. Еще загрузку данных бы неплохо проверить, вы от какого примера отталкивались? А где у вас Upsampling layer или вы сейчас с уменьшенными масками учите?
×