2. Домашнє завдання, етап №2 - linvieson/emotions-recognition GitHub Wiki
Emotions Recognition by Photo Project
Table of Contents
- Вимоги до системи (System requirements)
- Опис використаних даних
- Опис можливостей модулів, пакунків модулів, бібліотек, які будуть використовуватися для роботи з даними
- Поради щодо вибору структур даних для проєкту
Вимоги до системи (System requirements)
Функціональні вимоги (Functional requirements)
Система має аналізувати емоції користувача за його фотографіями у профілі в Інстаграмі та забезпечувати отримання порівняльної статистики між емоціями в Інстаграм профілі та середньостатистичними емоціями людини. Основні користувачі системи: Аналітик, Адміністратор.
-
Пошук та отримання результатів пошуку
1.1. Система дозволяє Аналітику здійснювати запит на отримання фото з Інстаграм профіля по нікнейму користувача. Пріоритет - високий.
1.2. Система дозволяє Аналітику отримати дані щодо останніх 18 постів, які застосовані у цих постах як обкладинка, в Інстаграмі користувача. Пріоритет - високий.
1.3. Система дозволяє Аналітику отримувати певний фото-контент, що буде виведено, спираючись на статистичні дані щодо профілю в Інстаграм, на який здійснювався запит. Пріоритет - високий.
-
Надання статистичних даних з аналізу емоцій користувача в Інстаграмі
2.1. Система дозволяє Аналітику отримати відсоткові дані про емоції (злість, презирливість, відраза, страх, щастя, нейтральність, сум, здивованість) на окремих фото користувача в Інстаграмі. Пріоритет - високий.
2.2. Система дозволяє Аналітику отримати порівняльну статистику між емоціями в Інстаграм профілі та середньостатистичними емоціями людини. Пріоритет - високий.
2.3 Система дозволяє Аналітику отримати візуалізовані статистичні дані у вигляді діаграм та графіків. Пріоритет - високий.
-
Візуалізація статистичних даних
3.1. Система дозволяє Аналітику переглянути виведені на екран діаграми емоційності профілю в Інстаграм. Пріоритет - високий.
3.2. Система дозволяє Аналітику переглянути виведені на екран графіки з кореляцією між емоціями на фото та середньостатистичними емоціями людини. Пріоритет - високий.
-
Забезпечення актуальності інформації
4.1. Система забезпечує доступ до контенту користувача в Інстаграм в реальному часі. Пріоритет - високий.
4.2. Система дозволяє Адміністратору модифікувати дані щодо середньостатистичних емоцій людини. Пріоритет - високий.
-
Збереження даних користувачем
5.1. Система дозволяє Аналітику зберегти отримані дані у файл формату csv. Пріоритет - середній.
5.2. Система дозволяє Аналітику зберегти діаграми, графіки та інші візуальні дані у файл формату pdf.
Нефункціональні вимоги (Nonfunctional requirements)
-
Вимоги до продуктивності
1.1. Система повинна опрацьовувати дані не довше, ніж 2 хвилини.
1.2. Система повинна виводити статистику не довше, ніж 30 секунд.
1.3. Доступ до користування системою має бути забезпечено 24 години на день 365 днів на рік.
-
Вимоги до безпеки
2.1. Тільки Адміністратор може модифіковувати дані та впливати на вихідні дані.
-
Вимоги до програмного забезпечення
3.1. Система повинна бути розроблена мовою Python, з використанням сторонніх бібліотек, розроблених під цю мову програмування.
3.2. Система повинна коректно працювати на всіх операційних системах (Windows, Linux, MacOS).
3.3. Система повинна коректно працювати у всіх веб-браузерах.
3.4. Система повинна бути масштабованою для розширення її можливостей.
3.5. Система повинна підтримувати періодичне оновлення даних Адміністратором.
-
Вимоги до політики зберігання та опрацювання даних
4.1. Система має доступ тільки до тих даних користувача в Інстаграм, які перебувають у відкритому доступі.
4.2. Система не зберігає пошукову історію Аналітика та не передає її іншим сервісам та третім особам.
4.3. Система використовує Microsoft azure API та Instagram API By Prasadbro й опрацьовує дані згідно з можливостями, наданими цими API.
Опис використаних даних
Microsoft azure API
Дані, отримані з аналізу фотографії з використаннямПри запиті до сервісу отримуємо список об’єктів классу DetectedFace. Кожен з них репрезентує одне обличчя, що було знайдено на фотографії. Кожен такий об’єкт має наступні атрибути:
- face_id - id визначеного обличчя;
- recognition_model - модель розпізнавання, яка використовувалась для його отримання;
- face_rectangle - прямокутник у якому знаходиться це обличчя
- face_landmarks - об’єкт, що містить як атрибути координати усіх рис обличчя (таких як очі, ніс, тощо)
- face_atributes - об’єкт, що містить як атрибути інші властивості обличчя, такі як борода, наявність окулярів, емоції, тощо.
Для нашого проекту важливий був саме атрибут face_atributes та його атрибут emotion. Під час такого виклику отримуємо словник ключі якого - емоції, а значення - їх частка на визначеному обличчі. У сумі всі значення дають одиницю, а визначаються з точністю до тисячної. Для визначення доступні наступні емоції:
- anger (злість);
- contempt (зневага);
- disgust (відраза);
- sadness (смуток);
- surprise (здивованість);
- fear (страх);
- happiness (щастя);
- neutral (нейтральність).
Instagram API
Дані, отримані з сторінки користувача в Instagram за допомогоюПри запиті отримуємо json наступної структури:
- body - містить увесь контент сторінки. Має наступну структуру
- more_available - визначає чи доступні данні для отримання
- items - масив постів, кожен з яких має наступні властивості, які можна використати у дослідженні:
- is_paid_partnership - визначає чи був цей пост платним партнерством;
- product_type - визначає тип поста (карусель чи одна фотографія/одне відео)
- caption_is_edited - булеве значення, яке показує чи був відредагований підпис поста
- has_more_comments - булеве значення, яке показує чи має пост більше коментарів ніж дозволяє отримати безкоштовна версія Instagram API
- user - містить інформацію про користувача у формі ключ-значення. Інформація включає: чи приватний обраний акаунт, повне ім’я користувача,
- посилання на аватарку профілю, чи є акаунт верифікований, тощо.
- location - містить інформацію про локацію, що позначена на фото. Включає в себе назву локації, адресу, місто та країну, координати
- like_count - кількість лайків на цьому пості
- original_height - оригінальна висота фотографії
- caption - інформація про підпис. Включає текст підпису, чи був він помічений як спам, коли був створений.
- original_width - оригінальна ширина
- image_versions2 - версії цієї фотографії для відображення на різних екранах. Цей атрибут містить список candidates який містить усі можливі розміри цієї картинки та посилання на них
- status - статус запиту
Для цього проекту нам необхідно отримати посилання на фотографії зі сторінки користувача, тому ми будемо використовувати запис post['image_versions2']['candidates'][0]['url'].
Опис можливостей модулів, пакунків модулів, бібліотек, які будуть використовуватися для роботи з даними
Django
Це - високорівневий веб-фреймворк, що дозволяє швидко створювати безпечні веб-застосунки і є одним із найпопулярніших для мови Pyhton.
Особливості:
- Якісна та актуальна документація
- Обширна спільнота користувачів
- Широкі можливості у виборі характеристик сайту
- Захист від більшості небезпек та можливих атак
- Зручність у використанні
- Відсутність прив’язки до конкретної платформи, тобто можна вільно запускати застосунок на Linux, Windows та Mac OS
Pandas
Швидка бібліотека для обробки даних, яка використовує об’єкти класів Dataframe та Series.
Series – структура, що схожа з одновимірним масивом (як список в Python), де для кожного елемента зі списку існує індекс або інша помітка. Елементи мають бути одного типу.
DataFrame – це таблична структура даних. Стовпцями в об'єкті DataFrame виступають об'єкти Series, рядки яких є їхніми безпосередніми елементами.
Особливості:
- Можливість сортувати дані в таблиці за їх стовпцями
- Можливість поєднувати та обробляти стовпці/рядки за необхідними критеріями
- Підтримка експорту даних у потрібному форматі, в тому числі csv
- Швидкий доступ до елементів таблиці
- Створення таблиць з об’єктами Series
- Зручна візуалізація в Matplotlib
- Підтримка необхідних для аналізу даних наступних математичних операцій: sum(), min(), max(), median(), count(), mean()
Matplotlib
Модуль застосовується для візуалізації даних і часто використовується для зображення статистики в наукових дослідженнях.
Пакет підтримує багато видів графіків та діаграм:
- Графіки (line plot)
- Діаграми розсіювання (scatter plot)
- Стовпчасті діаграми (bar chart) і гістограми (histogram)
- Секторні діаграми (pie chart)
- Діаграми «Стовбур-листя» (stem plot)
- Контурні графіки (contour plot)
- Поля градієнтів (quiver)
- Спектральні діаграми (spectrogram)
Також можна вказувати осі координат, сітку, додавати підписи, пояснення та створювати динамічні графіки.
JSON
Модуль із стандартної бібліотеки Python, що дозволяє обробляти дані, отримані за допомогою API у форматі json.
Особливості:
- Перетворення отриманих даних у зручний формат (словник) за допомогою функції loads()
- Перетворення даних у формат json за допомогою функції dumps(), яка навряд знайде використання, проте все одно вартує згадування, бо є однією з основних функцій модулю
Requests
Бібліотека є стандартним інструментом для HTTP-запитів та невід’ємною частиною програми, яка працює з API. Дозволяє використовувати такі методи як GET, POST, PUT та інші базові запити у зручний спосіб.
OS
Бібліотека пропонує великий обсяг функцій для взаємодії з операційною системою, проте нас найбільше цікавить в ній модуль path. Даний модуль дозволяє нормалізувати шлях до певної директорії для всіх операційних систем, що допомагає уникнути помилок при виконанні програми.
Поради щодо вибору структур даних для проєкту
Очевидно, що в будь-якому проекті нам знадобляться найбільш базові структури даних, такі як:
int
таfloat
(для збереження чисел та роботи з ними)str
(для зберігання тексту та роботи з ним)bool
(для роботи з логікою програми).
Щодо збереження даних все дещо складніше, оскільки при роботі з ними нам неймовірно важливо, щоб вони були у приємному для нас вигляді, а їх використання було зрозумілим та зручним. Також, оскільки ресурси обчислювальних машин є обмеженими, а користувачу хотілося б, щоб програма працювала моментально, важливим фактором є швидкість роботи з даними та пам’ять, яку вони займають. Часто ці 2 пункти складно поєднати, оскільки вони обернено пропорційні: чим більш зручний інтерфейс, тим повільніше швидкість і навпаки. Програмісту необхідно ретельно думати під час обрання структур даних для того чи іншого проєкту, тому він змушений шукати золоту середину.
Структури даних в Python:
- Список (
list
) - структура даних, у якій зберігаються значення будь яких типів, з якими можна працювати, звертаючись до елементів за індексом, що часто дуже зручно. Причини вибору: можна зберігати будь-які дані; розмір динамічно змінюваний; впорядкованість. - Масиви (
array
) - структура даних, у якій зберігаються значення одного типу. Це якраз головна відмінність від пайтонівського списку, в якому можна зберігати дані різних типів. Причини для використання: дані одного типу, швидкість (доступ до даних за O(1)), впорядкованість - Кортеж (
tuple
) - це просто незмінюваний список. Хороше запитання - навіщо це використовувати? Це економить пам’ять та швидкодію + дозволяє хешувати дані(не змінюваний об’єкт) - Множина (
set
)- структура даних, що дозволяє зберігати колекції даних. Особливістю є те, що множина “не впорядкована” - ми не можемо стверджувати який порядок даних у ній. Завдяки хешуванню досягається дуже велика швидкість перевірки на входження. Причини вибрати: швидкодія, не важливий порядок елементів. Також в пайтоні ще є реалізаціїfrozenset
(immutable set) таmultiset
(може бути декілька однакових елементів). - Словник (
dict
) - структура даних, з елементами ”ключ” - ”значення”, де до другого елемента можна доступитись за допомогою ключа. Дана структура реалізована на принципі хешування, що і зумовлює її швидкодію. Ключ обов'язково незмінюваний елемент. Причини вибрати: доступ до елементів за O(1), у відповідність до певного ключа потрібно ставити певне значення. - Графи - це структура даних, реалізована наступним чином: множина V вершин та множина E ребер, й кожне ребро з E з’єднує дві вершини з V. Її варто використовувати, якщо задачу можна звести до міст з'єднаних дорогами.
- Дерево - це структура даних , що не є лінійною та складається з вузлів та ребер без циклів. Файлові системи утворені саме на цій структурі даних, тому якщо в нас виникне щось схоже на файлову систему - то для організації даних треба брати дерево.
- Стек - це лінійна колекція в якій доступ є тільки до останнього елемента – вершини стеку. Всі операції відбуваються з елементом на вершині стеку. Причини вибрати: впорядкованість, останній прийшов - перший пішов.
- Черга - це лінійна колекція в якій забезпечено доступ до останнього елемента та до першого елемента, але з цими елементами можна робити не всі операції (перший видаляти, а останній додавати). Причини вибрати: впорядкованість, перший прийшов - перший пішов. Також в пайтоні є реалізація черги з пріоритетом - найбільший елемент перший виходить.
- Файл - це структура даних, яка знаходиться на “повільній” пам’яті комп’ютера. ЇЇ слід використовувати для збереження інформації протягом тривалого часу, або для передачі інформації між різними комп’ютерами чи людьми.