Применение нейронных сетей для распознавания изображений | Глубокие нейронные сети на Python

Поделиться
HTML-код
  • Опубликовано: 29 ноя 2024

Комментарии • 88

  • @AndersonSilva-dg4mg
    @AndersonSilva-dg4mg 7 лет назад +11

    Очень интересная тема и сложная, поэтому продолжайте писать уроки, спасибо

    • @AndreySozykin
      @AndreySozykin  7 лет назад +9

      Спасибо, рад, что нравится.
      Обязательно буду продолжать.

    • @gregoryfiodorov2733
      @gregoryfiodorov2733 7 лет назад +1

      Anderson Silva не очень сложно, т.к есть уже готовая либа

  • @s.n.9855
    @s.n.9855 7 лет назад +8

    Добрый день. Спасибо за отличные уроки по нейронным сетям!
    Если можно я задам пару вопросов. (я новичек в этом деле)
    1) Когда мы сохраняем, а затем восстанавливаем НС мы выполняем три действия. Сохранение структуру, сохраняем весы, и компилируем. Должны ли мы всегда при компиляции указывать одинаковые параметры, те которые были при обучении? Если это так важно почему нет механизма запоминать эти параметры в json структуре сети, ведь она получается бесполезна без них? Можно ли менять эти параметры, в каких случаях это делают?
    2) Можно ли ДОУЧИВАТЬ сеть, промежуточно сохраняя сеть? и нужно ли использовать одинаковые параметры компиляции?
    3) Можно ли сеть обучать "отдельными частями", а затем комбинировать эти кусочки? Существуют ли отдельные рекомендации методики по этому вопросу? К примеру я учу пару слоев узнавать треугольники, круги и затем этот фрагмент куда-то вставляю в большую сеть для более сложных задач, но запрещаю переучивать этот фрагмент. Или НС больше похожа на монолит который не допускает разбивки на части и переиспользования этих частей в большей сети? Можно ли фрагментировать уже обученную сеть?
    4) Было бы интересно в одном из видео поверхностно пробежаться по справке keras и указать что наиболее полезно для новичков в начале пути. Что важно в начале пути.. более чем уверен что там полно экзотических функций и методов которые могут запутать начинающего, а что главное не совсем ясно))
    Возможно вопросы глупые.. но все же :) Еще раз спасибо за канал!

    • @AndreySozykin
      @AndreySozykin  7 лет назад +4

      Задержался с ответом, надеюсь еще не поздно.
      1. При компиляции можно использовать другие параметры.
      2. Доучивать сеть можно, но для этого ее нужно сохранять по другому. Нужно использовать метод model.save(filepath), подробности по ссылке - keras.io/getting-started/faq/. При этом сохраняется не только архитектура и веса, но и оптимизатор и его состояние. К сожалению, я сам так никогда не делал и работающих примеров не видел.
      3. Да, сеть можно обучать отдельными частями. Сейчас это популярный подход - взять заранее обученную сеть, изменить в ней небольшой кусок по своей задаче и обучить на своих данных. Пример можно посмотреть по ссылке - blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html, в разделе 'Using the bottleneck features of a pre-trained network: 90% accuracy in a minute'.
      4. Самое главное я как раз стараюсь показать в видео. Но идея интересная, подумаю, можно ли сделать.

    • @s.n.9855
      @s.n.9855 7 лет назад +3

      Большое спасибо за ответы. Пункт 4) если сделаете урок, будет очень полезен тем кто в начале пути. Когда человек знает многое он легко ориентируется где копать, но с другой стороны когда это совсем новое ты можешь утонуть даже в документации. А тема очень специфична. Ваше руководство по офф. справке keras сделало бы точку входа в эту тему проще для тех кто делает первые шаги. Просто пробежаться и парами фраз сказать по каждому пункту что читать, что уже для профи. что важно что нет. Какие методы стандартны, какие экзотика и для особых спец задач. Дальше мы сами ;-)
      Ваши видео замечательные, но вот эта справка для меня монолитный поток информации, тяжело и очень объемно и сухо. Я просто любитель, для меня даже английский маленькая проблем. Если бы не Ваши видео я бы и не попробовал НС, все так доступно!

  • @antonvol
    @antonvol 6 лет назад +3

    Кто столкнулся с проблемой "AttributeError: module 'keras.utils.np_utils' has no attribute 'categorical probas_to_classes', замените строку :
    prediction = np_utils.categorical_probas_to_classes(prediction)
    на
    prediction = np.argmax(prediction, axis = 1)
    В новом керасе нет метода categorical_probas_to_classes

  • @sm0lyan
    @sm0lyan 7 лет назад +1

    Доброго времени суток!
    Можно ли все это использовать для 3д реконструкции?
    К примеру, есть два изображения детали с двух ракурсов. Нужно найти как-то ключевые точки их и сопоставить и соединить в 3д координаты. Как это можно сделать?

  • @НаташаСударикова-о9ц

    Андрей, здравствуйте, у Вас на cifar 10 он выдает просто, что это лошадь, а это самолет, а как написать так чтобы он еще показывал вероятность того, что это лошадь, а это самолет? например, 98% что это самолет

  • @ВячеславБелоусов-х9ц

    Здравствуйте!
    А, скажите, пожалуйста, в коллабе это работает?
    Потому что, на код
    prediction = np_utils.categorical_probas_to_classes(prediction)
    выходит ошибка:
    AttributeError: module 'keras.utils.np_utils' has no attribute 'categorical_probas_to_classes'

  • @kirilllas7247
    @kirilllas7247 5 месяцев назад

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

  • @maksimivanov8728
    @maksimivanov8728 7 лет назад +1

    Добрый день. Андрей хотелось бы спросить а как сгенерировать свой dataset(аналог cifar10) на основе своих изображений?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Планирую сделать такую лекцию в ближайшие 2-3 недели.

  • @TolimanB
    @TolimanB 7 лет назад +1

    Андрей, в лекции проводится распознавание одиночных объектов на картинках. А что если в файле будет несколько объектов класса MNIST (для простоты будем считать, что они не пересекаются) ?! Как тогда поступать, чтобы сеть их все нашла и распознала?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Это задача обнаружения объектов. Есть несколько подходов к решению. Самый простой - пробежаться по картинке прямоугольником и посмотреть, какие там есть отдельные цифры. Более сложны подход - использование Fully Convolutional Networks.

  • @UFO26
    @UFO26 7 лет назад +1

    привет, Андрей. Возможно ли распознать шрифты (отсканированная картинка -
    лист А4 с текстом) без использования нейросетей? Например по шаблонам эталонов, где идет построчное сравнение пикселей захваченного символа из картинки, разбитой на строки и эталона?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Да, можно без нейронных сетей. Например, методом главных компонент - vzaguskin.github.io/mnistpcaknn1_ru/.

  • @ВладиславГорожеєв
    @ВладиславГорожеєв 6 лет назад +1

    Доброго времени суток! Подскажите, как можно из своей кастомной библиотеки, сделанной по Вашему примеру, сделать классификацию изображений по категориям?Как перевести значение классов в категории? Спасибо.

    • @AndreySozykin
      @AndreySozykin  6 лет назад

      Нужно знать категорию для каждого номера класса и сделать список с названиями категорий в нужном порядке. Затем номер класса использовать как индекс в этом списке.

  • @zigizmund64
    @zigizmund64 7 лет назад +2

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

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Исходники программ - github.com/sozykin/dlpython_course
      Данные для MNIST - yann.lecun.com/exdb/mnist/

  • @Boris_Wagner
    @Boris_Wagner 5 лет назад

    Суперская тема! Спасибо! Продолжай!

  • @МихаилМоховиков-ь5у

    Добрый вечер.
    Спасибо за отличное изложение темы распознавания нейронных сетей.
    Я уже запускал распознавание изображений месяц назад и все работало.
    Сейчас пытаюсь повторить тоже самое, и в обоих бэкендах, что в theano, что в tensorflow ругается:
    "ImportError: Could not import PIL.Image. The use of `array_to_img` requires PIL."
    Не может картинку загрузить.
    Использую:
    -Keras 2.0.8;
    -Tensorflow 1.2.1;
    -Python 3.6;
    - Windows 8.1.
    Надстройки CUDA и cuDNN не использую.
    Результаты обучения сети есть. Сеть обучена.
    Я пробовал исправить эту ошибку путем установки пакета Pillow. Но даже после этого ошибка осталась.
    Я новичок в этом деле, может я что то делаю не так?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      +Михаил Моховиков, возможно, еще нужно установить scipy.

    • @МихаилМоховиков-ь5у
      @МихаилМоховиков-ь5у 7 лет назад

      С этой ошибкой разобрался обновив пакеты. Далее он высветил:
      ValueError Traceback (most recent call last)
      in ()
      26 loaded_model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
      27 #Запускаем распознавание объекта:
      ---> 28 prediction = loaded_model.predict(x)
      29
      30 #Для удобства вывода задаем список с названиями классов объектов
      C:\ProgramData\Anaconda3\lib\site-packages\keras\models.py in predict(self, x, batch_size, verbose)
      911 if not self.built:
      912 self.build()
      --> 913 return self.model.predict(x, batch_size=batch_size, verbose=verbose)
      914
      915 def predict_on_batch(self, x):
      C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in predict(self, x, batch_size, verbose, steps)
      1693 x = _standardize_input_data(x, self._feed_input_names,
      1694 self._feed_input_shapes,
      -> 1695 check_batch_axis=False)
      1696 if self.stateful:
      1697 if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:
      C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
      130 ' to have ' + str(len(shapes[i])) +
      131 ' dimensions, but got array with shape ' +
      --> 132 str(array.shape))
      133 for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])):
      134 if not j and not check_batch_axis:
      ValueError: Error when checking : expected conv2d_1_input to have 4 dimensions, but got array with shape (1, 1)
      Ошибка в prediction = loaded_model.predict(x).

    • @pashka-cherepashka
      @pashka-cherepashka 7 лет назад

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

  • @romanbogachev6147
    @romanbogachev6147 6 лет назад

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

  • @ruslanterlikbayev4978
    @ruslanterlikbayev4978 7 лет назад +1

    Очень круто, нет слов.

  • @dondublon1
    @dondublon1 7 лет назад +2

    Не получилось запустить распознавание. ValueError: Error when checking : expected dense_38_input to have 2 dimensions, but got array with shape (1, 28, 28, 1)
    Какую размерность у вас имеет массив х?

    • @Snowman8526
      @Snowman8526 7 лет назад +1

      у меня примерно такая же проблема ValueError: Error when checking : expected dense_1_input to have 2 dimensions, but got array with shape (1, 28, 28, 1) на loaded_model.predict(x)

    • @CTAPbIN
      @CTAPbIN 6 лет назад

      Решили эту проблему ?

    • @АртемСкачков-ч8л
      @АртемСкачков-ч8л 6 лет назад

      Кто-то решил эту проблему?

    • @yuriihalychanskyi8764
      @yuriihalychanskyi8764 6 лет назад

      @@АртемСкачков-ч8л Ты решил? Мне кажется, что надо не добавлять измерение и написать reshape(1,784). Но хз, или так распознавать будет верно

    • @АртемСкачков-ч8л
      @АртемСкачков-ч8л 6 лет назад

      @@yuriihalychanskyi8764 да решил, там другая функция. Завтра отпишусь

  • @736939
    @736939 6 лет назад +1

    На 1:18 model.add(Activation(...))) это не тоже самое, как если в предыдущем слое в параметр слоя добавить activation в виде параметра ?

  • @walkrunman
    @walkrunman 7 лет назад +1

    А как структуру сверточной сети подбирать? Почему там именно 2 сверточных слоев, 1 пуллинг?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

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

  • @АндрейИсаков-л5щ
    @АндрейИсаков-л5щ 7 лет назад +1

    А выложите пожалуйста на Гитхаб файлик где MNIST обучается? На видео его первую часть не видно поэтому воспроизвести эксперимент не получается:(

    • @AndreySozykin
      @AndreySozykin  7 лет назад +1

      Программу с обучением сверточной сети для MNIST выложил на github. Вот описание на сайте: www.asozykin.ru/deep_learning/2017/05/08/CNN-for-MNIST.html
      Также скоро выложу ноутбуки с распознаванием цифр и объектов из mnist.

    • @АндрейИсаков-л5щ
      @АндрейИсаков-л5щ 7 лет назад +1

      Круто! Спасибо!:)

  • @Rusikyan
    @Rusikyan 5 лет назад

    Добровольцы времени суток Андрей, можно ли обучить нейронную сеть используя 3д модели, а не картинки? И можно ли обучить нейронную сеть распознаваться только автомобили и удалять задний фон, благодарю за вашу работу.

    • @AndreySozykin
      @AndreySozykin  5 лет назад

      Обучить нейронную сеть распознавать только автомобили можно. Вот соревнования на Kaggle на эту тему - www.kaggle.com/c/carvana-image-masking-challenge. Удалять задний фон тоже можно, вот пример сервиса, который это делает - www.remove.bg.
      Обучить нейронную сеть на 3д моделях можно, но для этого нужно готовить обучающий набор данных. Я сам с такой задачей никогда не сталкивался.

  • @АртемСкачков-ч8л
    @АртемСкачков-ч8л 6 лет назад

    Здравствуйте, подскажите пожалуйста как избавиться от этой ошибки ValueError: Error when checking input: expected dense_input to have 2 dimensions, but got array with shape (1, 28, 28, 1)?

    • @СашаСобчук-ю9б
      @СашаСобчук-ю9б 4 года назад

      X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
      X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')

  • @ezowned5540
    @ezowned5540 6 лет назад

    Попробовал сделать со своими картинками. Если сохранять в пэинте с размерностью 28x28 (или 32x32), то сжимается относительно неплохо, распознаёт хорошо.
    Но если на вход подавать картинку большого размера, то класс image.load_img() работает довольно плохо, у тонких цифр может просто все пиксели затереть белым цветом, ибо сжимается как-то странно, как-будто не суммирует цвета для сжатия изображения, а просто отбрасывает часть пикселей.

  • @avanttechno
    @avanttechno 7 лет назад +1

    Вдохновившись Вашими уроками, воспроизвел обучение по cifar10 у себя на компьютере. Но с проверкой пока застопорился...
    prediction = np_utils.categorical_probas_to_classes(prediction)
    ...
    AttributeError: module 'keras.utils.np_utils' has no attribute 'categorical_probas_to_classes'
    Я так понимаю речь о каком-то методе не освещенном ни в видео, ни в имеющихся по ссылкам файлах?
    С уважением и благодарностью...

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Странно, у меня все работает. Вот примеры использования:
      - www.asozykin.ru/deep_learning/2017/02/23/How-to-use-nn-to-classify-images.html
      - www.kaggle.com/sozykin/digit-recognizer/mnist-simple-nn-keras
      Метод categorical_probas_to_classes преобразует данные из представлений по категориям в формате one hot encoding в метки класса.
      Какая версия Keras используется?

    • @АндрейИсаков-л5щ
      @АндрейИсаков-л5щ 7 лет назад

      joxi.ru/LmGywO1UqKlJAl

  • @dondublon1
    @dondublon1 7 лет назад +2

    Нет np_utils.categorical_probas_to_classes . Видимо, остался в старом keras-e.

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      +Leonid Rumatov, да, из второй версии keras эту функцию урбали. Можно использовать argmax из numpy.

  • @NGC-rr6vo
    @NGC-rr6vo 5 лет назад +1

    почему то свои цифры нарисованные в paint не хочет распознавать, есть идеи?

    • @AndreySozykin
      @AndreySozykin  5 лет назад +1

      Цифры в mnist расположены строго в центре изображения и нормализованы по контрастности.
      Еще проблема может быть с масштабированием. Когда сжимаете картинку до размера 28×28, линии, которые были слишком тонкие, пропадают.

    • @NGC-rr6vo
      @NGC-rr6vo 5 лет назад

      @@AndreySozykin хм, спасибо)
      картинки из мниста распознавало, даже просто по скриншотам из запроса в гугле

  • @CTAPbIN
    @CTAPbIN 6 лет назад

    Добрый день, где лежит конкретный пример с цифрами в гитхабе ? Я там такого не нашел

  • @salimbaygildin5246
    @salimbaygildin5246 5 лет назад

    Добрый день, у меня выдает такую ошибку когда хочу предсказать для своей картинки:Error when checking input: expected dense_31_input to have 2 dimensions, but got array with shape (1, 28, 28, 1).

    • @salimbaygildin5246
      @salimbaygildin5246 5 лет назад

      Я так понимаю тут дело в размерности, пытался делать shape(28,28), не помогло

    • @salimbaygildin5246
      @salimbaygildin5246 5 лет назад

      код такой же как и у вас

  • @АндрейИсаков-л5щ
    @АндрейИсаков-л5щ 7 лет назад +1

    C cifar10 -- очень круто! У меня только кошек, птиц и собак не распознаёт, остальное распознаёт.
    А как можно дообучить сетку, добавив свои картинки, например?

    • @AndreySozykin
      @AndreySozykin  7 лет назад +2

      +Андрей Исаков, можно взять уже обученную сеть, например, VGG16 из Keras Applications - keras.io/applications/#vgg16.
      Пример дообучения сети VGG16 - blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
      Планирую записать несколько видео на эту тему. Но получится не раньше начала лета.

    • @AndreySozykin
      @AndreySozykin  7 лет назад +2

      +Андрей Исаков, вот еще примеры с использованием предварительно обученных нейронных сетей - keras.io/applications/#usage-examples-for-image-classification-models

  • @olegkyzymenko2993
    @olegkyzymenko2993 5 лет назад +1

    Обязательно использовать такие маленькие изображения? На таких маленьких теряются детали которые могут быть ключевыми

    • @AndreySozykin
      @AndreySozykin  5 лет назад

      Нет, не обязательно. Сети Resnet или Inception работают с большими изображениями.

    • @olegkyzymenko2993
      @olegkyzymenko2993 5 лет назад +1

      @@AndreySozykin Еще вопрос. К примеру мы обучили нейронку распознавать цифры. И она с этим отлично справляется. Но если подавать цифры под наклоном или вообще перевернутые то нейронка в замешательстве. Это получается надо каждую цифру показывать в любой форме?

    • @AndreySozykin
      @AndreySozykin  5 лет назад

      Да, нужно так делать. В Keras для этой цели есть генераторы с расширением данных.

    • @olegkyzymenko2993
      @olegkyzymenko2993 5 лет назад

      @@AndreySozykin спасибо большое!

    • @olegkyzymenko2993
      @olegkyzymenko2993 5 лет назад

      @@AndreySozykin Сделал сверточную нейронку по одним из выших примеров. Распознает цифры только на черном фоне. Саму цифру можно писать любым цветом. Не подскажите решение?
      model = Sequential()
      model.add(Conv2D(32,(5,5),activation='relu',input_shape=(28,28,1)))
      model.add(Conv2D(64,(5,5),activation='relu'))
      model.add(MaxPooling2D(pool_size=(3,3)))
      model.add(Flatten())
      model.add(Dense(128,activation='relu'))
      model.add(Dropout(0.5))
      model.add(Dense(10,activation='softmax'))
      model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])

  • @dondublon1
    @dondublon1 7 лет назад

    Изображения с семёркой нет, поэтому нарисовал сам. Линию сделал толстую, 2 пикселя вместо одного. Распознал как восьмерку. Интересно, почему? Нарисовал обычной линией, 1px - распознал нормально.

  • @artem-627
    @artem-627 3 года назад

    Traceback (most recent call last):
    File "D:/Projects/Python/AI/venv/Include/Third/AI.py", line 17, in
    prediction = np_utils.categorical_probas_to_predict(prediction)
    AttributeError: module 'tensorflow.python.keras.utils.np_utils' has no attribute 'categorical_probas_to_predict'

  • @dondublon1
    @dondublon1 7 лет назад +1

    А откуда брать изображения? "2.png" и т. д.

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      +Leonid Rumatov, можно нарисовать в графическом редакторе или написать на бумаге и отсканировать.

  • @CTAPbIN
    @CTAPbIN 6 лет назад

    Ошибка - (ValueError: Error when checking : expected dense_1_input to have 2 dimensions, but got array with shape (1, 28, 28, 1)) в чем причина ?

    • @СашаСобчук-ю9б
      @СашаСобчук-ю9б 4 года назад

      попробуй так
      X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32')
      X_test = X_test.reshape(X_test.shape[0], 28, 28, 1).astype('float32')

    • @CTAPbIN
      @CTAPbIN 4 года назад

      @@СашаСобчук-ю9б Спасибо, лучше поздно чем никогда )))

  • @МихаилМоховиков-ь5у

    А как прикрутить cifar10?

    • @AndreySozykin
      @AndreySozykin  7 лет назад

      Там же рассказывается начиная с 4 минуты.
      Для обучения нейронной сети на CIFAR-10 используется такой код - github.com/sozykin/dlpython_course/blob/master/cifar10/cifar10.py

    • @МихаилМоховиков-ь5у
      @МихаилМоховиков-ь5у 7 лет назад

      Спасибо.

  • @panalike
    @panalike 6 лет назад +1

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

    • @AndreySozykin
      @AndreySozykin  6 лет назад +1

      Да, но нужно будет по нескольку тысяч фотографий каждого класса: нормальные и с гнильцой.

  • @Voha
    @Voha 7 лет назад +2

    Нейронная сеть она умная- подсмотрела имя файла просто))))

    • @AndreySozykin
      @AndreySozykin  7 лет назад +1

      Хороший вариант, но нет :)

  • @NGC-rr6vo
    @NGC-rr6vo 5 лет назад

    попробовал теперь с изображениями объектов, нарисованную лошадь распознает как автомобиль (точность обученной сети 76% где то)