Skip to content

Latest commit

 

History

History
233 lines (187 loc) · 11.2 KB

homework1.md

File metadata and controls

233 lines (187 loc) · 11.2 KB

Домашнее задание №1

Задание

Необходимо создать и разметить собственный набор данных, состоящий из изображений. Набор содержит не менее 3 классов и не менее 100 экземпляров каждый. Изображения можно скачать из интернета или объединить несколько существующих датасетов. Создать web-приложение для классификации изображений полученного набора данных. Использовать аугментацию данных, регуляризацию, перенос обучения.

Контрольные вопросы

  1. Структура набора данных, аугментация данных.
  2. Перенос обучения, дообучение.
  3. Архитектура сверточной нейронной сети.

Часть 1. Сохранение модели, обученной в Google Colab

Загрузка изображений

  • Вариант 1. Требуется в одной из поисковых систем найти картинки по требуемым классам, затем скачать вручную в 3 разные папки.
  • Вариант 2. Требуется установить одно из расширений Chrome: Image downloader - Imageye или Image Downloader. После установки найти изображения в одной из поисковых систем, затем при помощи загруженного ранее расширения загрузить картинки. image

Шаг 1

В любой из поисковых систем выполнить поиск картинок на интересующую тему.

Шаг 2

Открыть ранее установленное расширение.

Шаг 3

Выбрать тип изображения JPG.

Шаг 4

Выбрать все картинки и скачать.

  • Вариант 3. Требуется установить библиотеку Python: yandex-images-download (GitHub). После установки библиотеки необходимо скачать ChromeDriver для Вашей версии Google Chrome и распаковать файл chromedriver.exe. В командной строке PyCharm ввести следующую команду: yandex-images-download Chrome --keywords "Торт, Ласточка, Кошка" --limit 100 (пример альтернативной команды: yandex-images-download Chrome --keywords "ласточка, орёл, торты" -o путь_для_скачивания -l количество фотографий -dp путь_к_chromedriver.exe).

Валидация изображения

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

Импортирование изображений в Google Colab

Шаг 1

Требуется перейти по ссылке на подготовленный проект и сохранить себе копию на Google диск.

Шаг 2

В файловой системе Colab-файла в папке "content" необходимо создать три папки, согласно классам тематики Ваших изображений (пример: "Торт, Ласточка, Кошка") и загрузить туда скаченные ранее изображения. image

Открываем файловую систему в Colab (автоматически откроется папка "content"). Нажимаем ПКМ в свободном пространстве и создаем папки по тематике классов.

Шаг 3

Изменить переменную класса под свою тематику.

Модернизация исходной модели в Colab

Требуется выполнить аугментацию, регуляризацию и перенос обучения и сохранить модель в формате ONNX.

Часть 2. Web-приложение классификации изображений

Установка IDE VS Code

Для выполнения лабораторной работы потребуется VS Code.

Создание web-приложения для классификации изображений полученного набора данных

Шаг 1

Пример создания проекта Django в VS Code можно просмотреть по данной ссылке.

Шаг 2

После создания проекта требуется создать в корне проекта папку media для последующего сохранения изображений и файлов формата ONNX. Внутри папки media необходимо создать папки "images" и "models".

image

Шаг 3

В файл setting.py требуется добавить пути к ранее созданной папке media. В самом конце необходимо добавить следующий блок кода:

import os

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'media')

Чтобы указать Django на то, где искать наши шаблоны проверьте файл settings.py. В нем в переменной TEMPLATES в поле DIRS должен быть указан путь к вашим шаблонам

TEMPLATES = [
    {
        # ...
        "DIRS": [BASE_DIR / "DZ1/templates"],
        # ...
    },
]

Шаг 4

Добавить Python файл views.py в ту же папку, где был файл setting.py.

image

from django.shortcuts import render
from django.core.files.storage import FileSystemStorage
import onnxruntime
import numpy as np
from PIL import Image

imageClassList = {'0': 'Торт', '1': 'Ласточка', '2': 'Кошка'}  #Сюда указать классы

def scoreImagePage(request):
    return render(request, 'scorepage.html')

def predictImage(request):
    fileObj = request.FILES['filePath']
    fs = FileSystemStorage()
    filePathName = fs.save('images/'+fileObj.name,fileObj)
    filePathName = fs.url(filePathName)
    modelName = request.POST.get('modelName')
    scorePrediction = predictImageData(modelName, '.'+filePathName)
    context = {'scorePrediction': scorePrediction}
    return render(request, 'scorepage.html', context)

def predictImageData(modelName, filePath):
    img = Image.open(filePath).convert("RGB")
    img = np.asarray(img.resize((32, 32), Image.ANTIALIAS))
    sess = onnxruntime.InferenceSession(r'C:\DZ1\media\models\cifar100.onnx') #<-Здесь требуется указать свой путь к модели
    outputOFModel = np.argmax(sess.run(None, {'input': np.asarray([img]).astype(np.float32)}))
    score = imageClassList[str(outputOFModel)]
    return score
Шаг 4.1

В файле views.py изменить классы по Вашей тематике и указать путь к модели ONNX.

imageClassList = {'0': 'Торт', '1': 'Ласточка', '2': 'Кошка'}  #Сюда указать классы
sess = onnxruntime.InferenceSession(r'C:\DZ1\media\models\cifar100.onnx') #<-Здесь требуется указать свой путь к модели

Шаг 5

В файле urls.py требуется заменить содержимое на следующий блок кода:

from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from django.conf import settings
from . import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.scoreImagePage, name='scoreImagePage'),
    path('predictImage', views.predictImage, name='predictImage'),
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Шаг 6

Установить следующие библиотеки: onnx, onnxruntime, numpy, pillow. Пример установки одной библиотеки:

image

Шаг 7

В папку templates добавить файл scorepage.html.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="windows-1251">
<title>Домашнее задание 1</title>
<style>
    /* Add some padding on document's body to prevent the content
    to go underneath the header and footer */
    body{        
        padding-top: 60px;
        padding-bottom: 40px;
    }
    .fixed-header, .fixed-footer{
        width: 100%;
        position: fixed;        
        background: #333;
        padding: 10px 0;
        color: #fff;
    }
    .fixed-header{
        top: 0;
    }
    .fixed-footer{
        bottom: 0;
    }
    .container{
        width: 80%;
        margin: 0 auto; /* Center the DIV horizontally */
    }
    nav a{
        color: #fff;
        text-decoration: none;
        padding: 7px 25px;
        display: inline-block;
    }
</style>
</head>
<body>
    <div class="fixed-header">
        <div class="container">

        </div>
    </div>
    <div class="container">
        <form action="predictImage" method="post" enctype="multipart/form-data">
            {% csrf_token %}

            <div class="col-md-4 col-sm-4">
                <label for="FilePath">Загрузить изображение:</label>
            </div> <input name="filePath" type="file"><br><br>
            <input type="submit" value="Submit" >
        </form>
    </div>    
    <div>
        <br>
        {% if scorePrediction %}
        <h3>The classification is : {{scorePrediction}}</h3>
        {% endif %}
       
    </div>
    <div class="fixed-footer">
        <div class="container"></div>        
    </div>
</body>
</html>

Шаг 8

Запустить проект, выполнив в терминале PyCharm следующую команду: "python3 manage.py runserver".

Шаг 9

Загрузить изображение и нажать на кнопку "submit".

image