/PatternRecognitionLabs

Лабораторные работы по курсу "Распознавание образов"

Primary LanguagePythonThe UnlicenseUnlicense

Лабораторные работы по "Распознавание образов"

Какие лабовы готовы:

  • 1 - Классификация изображения с использование Keras
  • 2 - Трансфертное обучение
  • 3 - Повышение точности сверточной нейронной сети
  • 4 - Производительность при распознавании образов с помощью TensorFlow
  • 5 - Облачные API для распознавания образов

🕒 Подготовка к запуску лабов

  1. Установить Python версии 3.10 или выше (возможно будет работать и на Python 3.9), если не установлено
    1. Проверить установку можно командой в терминале python --version
    2. Однако, если вы устанавливали Python без автоматического добавления в системные переменные, вам необходимо найти путь к исполняемому файлу. На Windows это обычно C:\Users\Ваше имя пользователя\AppData\Local\Programs\Python\PythonВЕРСИЯ\python.exe. Если это так, в шаге 4 (ТОЛЬКО В ШАГЕ 4), вместо python вам необходимо использовать "C:\Users\Ваше имя пользователя\AppData\Local\Programs\Python\PythonВЕРСИЯ\python.exe"
      1. А чтобы проверить версию:
      "C:\Users\Ваше имя пользователя\AppData\Local\Programs\Python\PythonВЕРСИЯ\python.exe" --version
  2. Скопируйте репозиторий с лабами вручную или используя команду git clone https://github.com/F33RNI/PatternRecognitionLabs
  3. Откройте терминал и войдите в эту папку используя команду cd "путь\к папке PatternRecognitionLabs"
  4. Создайте виртуальную среду используя команду python -m venv venv
  5. Активируйте виртуальную среду. На Windows, для этого пропишите в терминале venv\Scripts\activate.bat. На Linux source venv/bin/activate
    1. Если виртуальная среда создана и запущена верно, в терминале перед текущей рабочей директорией появится (venv)
  6. Установите все пакеты для лабов, используя команду pip install -r requirements.txt
  7. Пропишите pip list. Вы должны увидеть много установленных пакетов, включая tensorflow, numpy, keras, Pillow и другие
  8. Готово!

🏗️ Запуск лабов и создание отчётов

В качестве отчётов вам необходимо будет записать видео (поэтому в этом репозитории нет примеров отчётов). Ниже представлены инструкции по запуску лабов

Работа 1. Классификация изображения с использование Keras

  1. Перейдите в директорию LR1 используя команду cd LR1, находясь в основной папке PatternRecognitionLabs с активированной виртуальной средой (см. секцию 🕒 Подготовка к запуску лабов)
  2. В файле main.py поменяйте IMAGE_PATH на путь к любой картинке которую хотите распознать
  3. Запустите скрипт используя команду python main.py. Выход должен выглядеть примерно так:
1/1 [==============================] - 2s 2s/step
('n03944341', 'pinwheel', 1.0)
('n03476684', 'hair_slide', 3.3065376e-08)
('n03271574', 'electric_fan', 6.2919483e-09)
  1. Если всё верно, начните запись видео, изменяйте IMAGE_PATH на разные пути к разным картинкам, запускайте скрипт и показывайте результат
  2. Готово

Работа 2. Трансфертное обучение

  1. Если для скачивания этого репозитория вы использовали git, то для того, чтобы подгрузить новые файлы для этой лабораторной выполните команду git pull
  2. Активируйте виртуальную среду и установите недостающие пакеты pip install -r requirements.txt
  3. Перейдите в директорию LR2 используя команду cd LR2
  4. В файле main.py поменяйте IMAGE_PATH на путь к фотке кошбки / шобаки которую хочите классифицировать
    1. Рекомендую использовать примеры из датасета kagglecatsanddogs_5340. Например: kagglecatsanddogs_5340/PetImages/Cat/0.jpg
    2. (в датасете, с целью экономии места, занимаемого репозиторием, было оставлено только по 20 картинок)
  5. Запустите скрипт используя команду python main.py. Выход должен выглядеть примерно так
Predicted Label: cat
Probabilities: tensor([[0.9989, 0.0011]], grad_fn=<SoftmaxBackward0>)
  1. Если всё верно, начните запись видео, изменяйте IMAGE_PATH на разные пути к разным картинкам, запускайте скрипт и показывайте результат
  2. Для большего масштаба, советую на видео показать структуру датасета и сказать что взят он был от сюда https://www.microsoft.com/en-us/download/details.aspx?id=54765. Модель же была взята предобученная. А если что, структура типичной модели cats vs dogs выглядеть может так (это тоже можно показать на видео):
model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='same', input_shape=(3, ROWS, COLS)))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Convolution2D(32, 3, 3, border_mode='same', activation=activation))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Convolution2D(64, 3, 3, border_mode='same', activation=activation))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(128, 3, 3, border_mode='same'))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Convolution2D(128, 3, 3, border_mode='same', activation=activation))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Convolution2D(256, 3, 3, border_mode='same'))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Convolution2D(256, 3, 3, border_mode='same', activation=activation))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(256,init='he_uniform'))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Dropout(0.2))

model.add(Dense(256,init='he_uniform'))
model.add(BatchNormalization(axis=-1))
model.add(Activation(activation))
model.add(Dropout(0.2))

model.add(Dense(1,init='he_uniform'))
model.add(BatchNormalization(axis=-1))
model.add(Activation('sigmoid'))

model.compile(loss=objective, optimizer=optimizer, metrics=['accuracy'])
return model

Работа 3. Повышение точности сверточной нейронной сети

  1. Если для скачивания этого репозитория вы использовали git, то для того, чтобы подгрузить новые файлы для этой лабораторной выполните команду git pull
  2. Активируйте виртуальную среду и установите недостающие пакеты pip install -r requirements.txt
  3. Запустите сервер TensorBoard
    1. Откройте второй терминал, перейдите в директорию в директорию LR3 используя команду cd LR3
    2. Создайте папку tensorboard при помощи команды mkdir tensorboard
    3. Запустите сервер TensorBoard, используя команду tensorboard --logdir ./tensorboard --alsologtostderr
    4. Откройте TensorBoard в браузере перейдя по указанной в терминале ссылке (обычно http://localhost:6006/)
  4. В основном терминале перейдите в директорию LR3 используя команду cd LR3
  5. Скачайте датасет от сюда https://www.microsoft.com/en-us/download/details.aspx?id=54765 и распакуйте архив куда угодно
  6. Для более быстрого обучения, из папок Cats и Dogs можно удалить от половины до 2/3 изображений
  7. В файле main.py в DATASET_PATH укажите путь к папке PetImages внутри распакованного датасета
  8. Запустите скрипт используя команду python main.py и дождитесь начала обучения (дождитесь чтобы прошла 1 эпоха хотябы)
    1. Если у Вас установлена CUDA и вы хотите обучать, используя GPU, но возникла ошибка, попробуйте указать путь к CUDA таким образом:
    ╰─ which nvcc
    /opt/cuda/bin/nvcc
    
    XLA_FLAGS=--xla_gpu_cuda_data_dir="/opt/cuda/" python main.py
    1. Либо же, обучать используя только CPU:
    CUDA_VISIBLE_DEVICES="-1" python main.py
  9. Откройте TensorBoard и покажите на видео как происходит процесс обучения (как в терминале так и в TensorBoard)
  10. Прекратите выполнение обучения спустя какое то время, нажав CTRL+C
  11. Включите EARLY_STOPPING_ENABLED в main.py и запустите обучение заново. По идее, оно должно будет остановиться само спустя какое то время
  12. Ещё, можно изменять LEARNING_RATE. От этого тоже будет меняться скорость обучения. На видео показывайте графики функции потери и точности предсказаний
  13. В общем, изменяйте чо нить и показывайте на видео кучу графиков

Работа 4. Производительность при распознавании образов с помощью TensorFlow

В этой работе требовалось провести эксперименты с производительностью обучения нейронной сети, сосредоточив внимание на сравнении производительности между центральным процессором (CPU) и графическим процессором (GPU) (этот текст написан лабасёром)

Фактически, в лабе нужно будет сделать всё тоже самое что в третей, только для начала использовать процессор для обучения, а затем видеокарту и сравнить производительность, используя Tensorboard

  1. Установите CUDA (это самый сложный этап в этой лабе)
    1. На Linux, CUDA можно часто установить при помощи встроенного менеджера пакетов. Например, чтобы установить, используя pamac: pamac install cuda
    2. На Windows, установщик можно скачать от сюда: https://developer.nvidia.com/cuda-downloads?target_os=Windows
  2. Убедитесь, что у вас установлена CUDA: nvcc --version
    ╰─ nvcc --version                            
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2023 NVIDIA Corporation
    ...
  3. Если для скачивания этого репозитория вы использовали git, то для того, чтобы подгрузить новые файлы для этой лабораторной выполните команду git pull
  4. Активируйте виртуальную среду и установите недостающие пакеты pip install -r requirements.txt
  5. Запустите сервер TensorBoard
    1. Откройте второй терминал, перейдите в директорию в директорию LR4 используя команду cd LR4
    2. Создайте папку tensorboard при помощи команды mkdir tensorboard
    3. Запустите сервер TensorBoard, используя команду tensorboard --logdir ./tensorboard --alsologtostderr
    4. Откройте TensorBoard в браузере перейдя по указанной в терминале ссылке (обычно http://localhost:6006/)
  6. В основном терминале перейдите в директорию LR4 используя команду cd LR4
  7. Если не было скачано в 3 лабораторной, то скачайте датасет от сюда https://www.microsoft.com/en-us/download/details.aspx?id=54765 и распакуйте архив куда угодно
  8. Для более быстрого обучения, из папок Cats и Dogs можно удалить от половины до 2/3 изображений
  9. В файле main.py в DATASET_PATH укажите путь к папке PetImages внутри распакованного датасета
  10. Начните запись видео
  11. Запустите обучение, используя только процессор:
CUDA_VISIBLE_DEVICES="-1" python main.py
  1. Продемонстрируйте на видео процесс обучения (в консоли и в TensorBoard)
  2. Продемонстрируйте, что загруженность видеокарты 0 (через nvidia-smi или через диспетчер задач)
  3. Дождитесь окончания обучения, переодически показывая процесс на видео
  4. Запустите обучение, используя CUDA:
    python main.py

Если возникла ошибка о том что не найдена куда, попробуйте указать путь к CUDA таким образом: (инструкция ниже для Linux. На Windows путь к папке cuda будет другой)

╰─ which nvcc
/opt/cuda/bin/nvcc

XLA_FLAGS=--xla_gpu_cuda_data_dir="/opt/cuda/" python main.py
  1. Продемонстрируйте на видео процесс обучения (в консоли и в TensorBoard)
  2. Продемонстрируйте, что загруженность видеокарты высокая (через nvidia-smi или через диспетчер задач)
  3. Покажите что процесс обучения идёт быстрее (надеюс)
  4. Дождитесь окончания обучения
  5. Сравните графики обучения наа процессоре с графиками обучения на видеокарте (из TensorBoard)

Работа 5. Облачные API для распознавания образов

Тут нужно продемонстрировать существование и возможность использовать какого-нибудь API LLM, которая может принимать изображения на вход (Bard / Gemini). Проще всего продемонстрировать это на примере Gemini

  1. Убедитесь, что у вас есть доступ к Gemini. Для этого, перейдите по ссылке https://makersuite.google.com/app/prompts/new_freeform и создайте любой запрос, убедитесь что можете получить ответ. Возможно, для этого Вам придётся иметь IP США (использовать VPN / прокси)
    1. В качестве бесплатного прокси можно использовать https://free-proxy-list.net/
    2. Перейдите по ссылке и найдите прокси, чтобы в графе Country было United States, и в графе Https было yes. Скопируйте IP и порт
    3. Для браузеров на основе chromium можно использовать расширение Proxy SwitchyOmega. В настройках, при добавлении прокси в Protocol укажите HTTP, несмотря на то что это HTTPS прокси. Сохраните изменения, включите выбранный прокси и попробуйте с ним перейти на ссылку выше (и ниже)
  2. Перейдите по этой ссылке https://makersuite.google.com/app/apikey и сгенерируйте новый API ключ
  3. Если для скачивания этого репозитория вы использовали git, то для того, чтобы подгрузить новые файлы для этой лабораторной выполните команду git pull
  4. Активируйте виртуальную среду и установите недостающие пакеты pip install -r requirements.txt
  5. Перейдите в директорию LR5 используя команду cd LR5
  6. В файле main.py поменяйте API_KEY на ваш API ключ, созданный в пункте 2
  7. В файле main.py поменяйте PROXY на ваш прокси-сервер (см. пункт 1.1 - 1.2) в формате http://IP:порт или оставьте PROXY пустым (""), если вам не нужно использовать прокси
  8. Подготовьте пару любых изображений, которые будете распознавать. В файле main.py поменяйте IMAGE_PATH на путь к любому изображению
  9. Начните запись видео. СДЕЛАЙТЕ ТАК, ЧТОБЫ ВАШ ТОКЕН И ПРОКСИ НЕ ПОПАЛИ НА ВИДЕО, ЛИБО УДАЛИТЕ ТОКЕН СРАЗУ ЖЕ, ПОСЛЕ ЗАПИСИ
  10. Перейдите по ссылке https://ai.google.dev/ и расскажите что такое Gemini (загуглите что это). Пример, сгенерированный лабасёром:

> Расскажи пожалуйста на русском кратко о том что такое Gemini и как с его помощью можно распознавать изображения через API

> Gemini - это большая языковая модель от Google AI, которая может генерировать текст, переводить языки, писать различные виды творческого контента и отвечать на ваши вопросы в информационном формате. Gemini также может распознавать изображения и описывать их содержимое. Чтобы распознать изображение с помощью Gemini, вы можете использовать API Vertex AI. Для этого вам понадобится создать проект в Google Cloud Platform и включить API Vertex AI. Затем вы можете использовать SDK для языка программирования, с которым вы знакомы, чтобы отправить запрос API.

  1. Перейдите по ссылке https://cloud.google.com/vertex-ai/docs/generative-ai/learn/overview и расскажите о том что это официальная документация и где-то там есть даже примеры кода как использовать Gemini
  2. Запустите скрипт используя команду python main.py и дождитесь ответа от Gemini
  3. Покажите на видео ответ от Gemini (и переведите по необходимости)
  4. Поменяйте IMAGE_PATH на путь к другой картинке
  5. Запустите скрипт используя команду python main.py и дождитесь ответа от Gemini
  6. Покажите на видео ответ от Gemini (и переведите по необходимости)