Главная страница

Курсова робота_СТАРАЯ. Зміст


Скачать 1.63 Mb.
НазваниеЗміст
Дата17.12.2020
Размер1.63 Mb.
Формат файлаdocx
Имя файлаКурсова робота_СТАРАЯ.docx
ТипЗадача
#161615
страница8 из 8
1   2   3   4   5   6   7   8

PyTorch



PyTorch являє собою бібліотеку для машинного навчання з відкритим кодом для Python, що використовується для створення таких додатків, як обробка природної мови, розпізнавання лиць, тощо. В основному розроблена вона дослідницькою групою із штучної інтелектуальної роботи Facebook, на основі якої побудовано програмне забезпечення Uber's "Pyro" для імовірнісного програмування.

PyTorch – це другий за популярністю каркас з відкритим кодом від Facebook, за короткий період (1 рік) він набрав більшої популярності за всі інші каркаси в сумі, окрім TensorFlow та Keras.

PyTorch – це середовище машинного навчання на мові Python з відкритим

вихідним кодом, що забезпечує тензорні обчислення з GPU-прискоренням. Використовується для вирішення різних задач: комп'ютерне бачення, обробка природної мови.

PyTorch – це пакет python, який надає дві основні функції:

  1. Тензорні обчислення (наприклад, numpy) з сильним прискоренням GPU

  2. Глибокі нейронні мережі, побудовані на потоковій системі Autodiff

Зазвичай PyTorch використовують як заміна numpy, щоб використати можливості графічного процесора; і платформу для машинного навчання, яка є дуже гнучкою.

PyTorch надає тензори (рисунок 2.11), які можуть жити як на центральному процесорі, так і на графічному процесорі, і прискорити обчислення з великою кількістю даних.



Рисунок 2.11 - Схематичне зображення тензору

PyTorch має унікальний спосіб створення нейронних мереж: використання та відтворення стрічки запису.

PyTorch використовує техніку, яка називається зворотньою

автодиференціацією, яка дозволяє змінювати те, як працює мережа без додаткових зусиль. Ця техніка не є унікальною для PyTorch, але це одна з найшвидших його реалізацій на сьогодні. PyTorch дозволяє отримати найкращу швидкість і гнучкість для досліджень. Граф обчислень будується динамічно під час проходження мережі

(рисунок 2.12).



Рисунок 2.12 – Граф обчислень, побудований PyTorch

Більшість бібліотек, таких як TensorFlow, Theano, Caffe та CNTK, мають статичний вигляд. Потрібно побудувати нейронну мережу і повторно використовувати ту саму структуру знову і знову. Зміна способу поведінки мережі означає, що треба починати з нуля.

Одні з переваг PyTorch:

  • Немає необхідності писати код обгортки для PyTorch;

  • Легко налагоджувати та розуміти код;

  • Має стільки типів шарів, як Torch (Unpool, CONV 1,2,3D, LSTM, Grus);

  • Має вбудовані фукнції втрат;

  • Може розглядатися як Numpy розширення для GPU;

Дозволяє створювати мережі, структура яких залежить від самого обчислення (корисно для навчання з підсиленням).

PyTorch – це не обгортка Python над C++. Він побудований так, щоб бути глибоко інтегрованим в Python. Він може бути використаний це природно, як numpy / scipy / scikit-learn і т. д. Є можливість написати нові шари для нейронної мережі в Python, використовуючи існуючі бібліотеки та використовувати такі пакети, як Cython та Numba.

PyTorch розроблений, щоб бути інтуїтивно зрозумілим, лінійним та легким у використанні. Він використовує імперативний підхід, що означає, що коли виконується рядок коду, то він запускається одразу. Немає асинхронного погляду на світ. Якщо використовувати налагоджувач або отримути повідомлення про помилки та стеки виконання, то розуміння їх є прямим. Стек вказує на те, де саме код був визначений.

PyTorch має мінімальні накладні витрати. Він інтегрує прискорювальні бібліотеки, такі як Intel MKL і NVIDIA (CuDNN, NCCL), щоб максимально збільшити швидкість. PyTorch є досить швидким - чи використовуєте ви малі чи великі нейронні мережі.

Використання пам'яті в PyTorch є надзвичайно ефективним у порівнянні з Torch або деякими альтернативами. Було створено спеціальні розподільники пам'яті для GPU, щоб переконатися, що глибокі моделі навчання максимально ефективні для пам'яті. Це дає змогу навчати більші глибинні моделі навчання, ніж раніше.

Написання нових модулів для нейронних мереж або взаємодія з PyTorch's Tensor API було розроблено так, щоб бути прямим та з мінімальним абстракціями.

Модель на PyTorch представлена на рисунку 2.13.


Рисунок 2.13 – Модель нейронної мережі на PyTorch
  1. ПРАКТИЧНЕ ЗАСТОСУВАННЯ PYTORCH



    1. Постановка задачі



Класифікаця зображень з веб-камери в режимі реального часу за допомогою OpenCV та бібліотеки машинного навчання для мови Python — PyTorch. Програмне рішення має відрізняти два предмети з відеопотоку веб-камери: обчислювальна платформа Arduino та антистресова іграшка спінер.

    1. Структура проекту



Для створення моделі розпізнавання певних зображень використовується класс torchvision.datasets.ImageFolder, який в парі з класом torch.utils.data.DataLoader дозволяє зі структурованого набору папок із зображеннями створити свій датасет.

Тобто є папки Test і Train в яких, розташовані папки з розпізнаваними класами класами «someduino» і «spinner». У навчальній вибірці для кожного класу представлено 128 зображень в тестовій - 28.

Структура данаого набору зображень буде виглядати наступним чином (рисунок 3.1):


Рисунок 3.1 – Структура набору зображень

    1. Навчання моделі



Імпортуються необхідні бібліотеки, далі вказується адреса датасету зображень:


Рисунок 3.2 – Адреса датасету

Далі код для трансформації зображення, в якому при необхідності зменшуються, обрізаються, робляться темнішими або яскравішими дані перш ніж згодувати їх моделі.

У даному випадку зменшується зображення до 32х32 пікселя і нормалізується.


Рисунок 3.3 – Код зменшення зображення
Далі йде функція, яка перетворює картинки в масив даних (тензорів) для подальшого навчання. Оскільки ми будемо використовувати її два рази, в якості вхідних параметрів використовується не тільки шлях до папки, а й схема перетворення.


Рисунок 3.4 – Створення тензорів
На виході функція повертає два датасета в форматі необхідному для даної моделі нейронної мережі, а також інформацію про класи картинок отриманих з назви папок, і розмір навчальної та тренувальної вибірок.


Рисунок 3.5 – Виведення інформація про датасет

Отже, є два класи: someduino та spinner, навчальна вибірка містить 256 зображень, контрольна - 56.

Далі створюються шари з різними розмірностями входу і виходу, а також функції, завдяки яким будуть проводитися перетворення.


Рисунок 3.6 – Створення нейронної мережі
У наступному фрагменті коду спочатку визначаються критерії оптимізації і завершення навчання. А потім починається навчання моделі протягом 11 епох.


Рисунок 3.7 – Навчання моделі
Чим більше епох, тим краще повинна навчитися (менше помилка передбачення), однак тим більше часу потрібно. Дана модель (швидше за все) через випадковий перемішування датасета буде кожен раз видавати різну помилку, але до 11 епохи вона все одно буде наближатися ближче до нуля.


Рисунок 3.8 – Помилки на різних епохах


Перевірка навченої моделі на контрольній виборці представлена нижче на рисунку 3.9.


Рисунок 3.9 – Перевірка моделі
Як видно точність мережі на 56 тестових зображеннях становить 94%.

Далі необхідно зберегти навчену модель у файл з розширенням «.onnx» для використання в OpenCV.


Рисунок 3.10 – Код збереження моделі

    1. Результат роботи моделі



Лістинг додатку для обробки вхідного відеопотоку з веб-камери наведено у додатку А.

У веб-камеру було продемонстровано зображення обчислювальної платформи Arduino з Інтернету через екран смартфона.


Рисунок 3.11 – Розпізнавання Arduino

Демонстрація спінера на веб-камеру.


Рисунок 3.12 – Розпізнавання спінера

ВИСНОВКИ




Під час написання магістерської дисертації були розглянуті найпопулярніші бібліотеки машинного навчання на прикладі розв’язку задачі розпізнавання. Детально розглянуто тему машинного навчання, задачу розпізнавання та нейронні мережі.

Проаналізовано вже існуючі критерії порівняння та результати цих порівнянь, в результаті чого було виявлено неповноту цих критеріїв оцінки. Головним доповненням до існуючих критеріїв була оцінка часу виконання базових операцій для нейронних мереж, оскільки результатів проведення за таким критерієм не було знайдено. Заміри для кожного з обраних фреймворків проводилися за загальними критеріями (як будується архітектура мережі, наявність попередньо натренованих моделей, наявність прикладів тощо) та часовими критеріями (час виконання базових операцій, час тренування нейронної мережі до заданої точності).

Зроблено висновок, що час тренування нейронної мережі залежить від часу виконання базових операцій.

Сформовано задачу та розроблено модель нейронної мережі на основі глибинного навчання та фреймворку PyTorch для класифікації зображень.

ПЕРЕЛІК ПОСИЛАНЬ




  1. A. M. TURING I.—COMPUTING MACHINERY AND INTELLIGENCE/ А.М. Тюрінг // Mind. – 1950. – № 236. – С. 433-460.

  2. How Many Computers to Identify a Cat? [Електронний ресурс]. Режим доступу: http://www.nytimes.com/2012/06/26/technology/in-a-big-network-ofcomputers-evidence-of-machine-learning.html.

  3. Google DeepMind AI wins final Go match [Електронний ресурс]. Режим доступу: https://www.engadget.com/2016/03/14/thefinal-lee-sedol-vs-alphago-match-is-about-to-start/.

  4. Маккинли У. Python и анализ данных / пер. с англ. Слипкин А. А. Москва: ДМК Пресс, 2015. 482 с.

  5. Николенко С., Кадурин А., Архангельская Е. Глубокое обучение. СПб: Питер, 2018. 480 с.

  6. PyTorch [Електронний ресурс]. Режим доступу: https://pytorch.org/

  7. PyTorch - Вікіпедія [Електронний ресурс]. Режим доступу: https://uk.wikipedia.org/wiki/PyTorch

  8. TensorFlow vs Theano vs Torch vs Keras: Deep Learning Libraries [Електронний ресурс]. Режим доступу: https://www.guru99.com/deep-learning-libraries.html

  9. PYTHON LIBRARIES FOR MACHINE LEARNING [Електронний ресурс]. Режим доступу: https://light-it.net/blog/top-10-python-libraries-for-machine-learning/

  10. Ranking Popular Deep Learning Libraries for Data Science [Електронний ресурс]. Режим доступу: https://blog.thedataincubator.com/2017/10/ranking-popular-deep-learning-libraries-for-data-science/

  11. Туториал по PyTorch: от установки до готовой нейронной сети [Електронний ресурс]. Режим доступу: https://neurohive.io/ru/tutorial/glubokoe-obuchenie-s-pytorch/

  12. PyTorch — ваш новый фреймворк глубокого обучения [Електронний ресурс]. Режим доступу: https://anaconda.org/pytorch/pytorch 

  13. PyTorch — ваш новый фреймворк глубокого обучения [Електронний ресурс]. Режим доступу: https://habr.com/ru/post/334380/



Додаток А
РЕАЛІЗАЦІЯ РОБОТИ ДОДАТКУ




from imutils.video import VideoStream

from imutils.video import FPS

import numpy as np

import imutils

import time

import cv2

import os
path=os.path.join(os.path.abspath(os.curdir) , 'my_model.onnx')

args_confidence = 0.2
# initialize the list of class labels

CLASSES = ['spinner', 'someduino']
# load our serialized model from disk

print("[INFO] loading model...")

net = cv2.dnn.readNetFromONNX (path)
# initialize the video stream, allow the c

#cammera sensor to warmup,

# and initialize the FPS counter

print("[INFO] starting video stream...")

vs = VideoStream(src=0).start()

time.sleep(2.0)

fps = FPS().start()
frame = vs.read()

frame = imutils.resize(frame, width=400)
# loop over the frames from the video stream

while True:

# grab the frame from the threaded video stream and resize it

# to have a maximum width of 400 pixels

frame = vs.read()

frame = imutils.resize(frame, width=400)
# grab the frame dimensions and convert it to a blob

(h, w) = frame.shape[:2]

blob = cv2.dnn.blobFromImage(cv2.resize(frame, (32, 32)),scalefactor=1.0/32

, size=(32, 32), mean= (128,128,128), swapRB=True)

cv2.imshow("Cropped image", cv2.resize(frame, (32, 32)))
# pass the blob through the network and obtain the detections and

# predictions

net.setInput(blob)

detections = net.forward()

print(list(zip(CLASSES,detections[0])))

# loop over the detections

# extract the confidence (i.e., probability) associated with

# the prediction

confidence = abs(detections[0][0]-detections[0][1])

print("confidence = ", confidence)

# filter out weak detections by ensuring the `confidence` is

# greater than the minimum confidence

if (confidence > args_confidence) :

class_mark=np.argmax(detections)

cv2.putText(frame, CLASSES[class_mark], (30,30),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (242, 230, 220), 2)
# show the output frame

cv2.imshow("Web camera view", frame)

key = cv2.waitKey(1) & 0xFF
# if the `q` key was pressed, break from the loop

if key == ord("q"):

break
# update the FPS counter

fps.update()

# stop the timer and display FPS information

fps.stop()

# do a bit of cleanup

cv2.destroyAllWindows()

vs.stop()
1   2   3   4   5   6   7   8


написать администратору сайта