Комп'ютерний зір та гуманітаристика: Вступ до глибокого навчання для класифікації зображень (1)
Частина перша
Автори: Даніель ван Стрін, Каспар Білен, Мелвін Веверс, Томас Смітс і Кетрін МакДонаф Перекладач: Дмитро Батько Оригінал уроку: https://programminghistorian.org/en/lessons/computer-vision-deep-learning-pt1
Це перший урок із двох, присвячених методам комп'ютерного зору, заснованих на глибокому навчанні, для досліджень у сфері гуманітарних наук. Використовуючи набір даних з історичних газетних оголошень та бібліотеку fastai, урок демонструє процес навчання моделі комп'ютерного зору для виконання класифікації зображень.
Вступ
Хоча більшість істориків погодиться з тим, що (сучасна) репрезентація формується за допомогою мультимодальних медіа – тобто медіа, таких як газета, телебачення чи інтернет, які поєднують у собі кілька форм сприйняття, – у галузях цифрової гуманітаристики та цифрової історії все ще домінують текстові медіа та широке розмаїття методів, доступних для їхнього аналізу. Сучасних істориків часто звинувачують у нехтуванні не текстовими формами репрезентації, а цифрові гуманітарії, зокрема, присвятили себе дослідженню текстових джерел. Багато хто використовує Оптичне розпізнавання символів (OCR – Optical Character Recognition) – технологію, яка робить оцифрований текст машинозчитуваним, а також методи, що випливають зі сфери Обробки природної мови (NLP – Natural Language Processing), для аналізу змісту і контексту слів у великих документах. Поєднання цих двох аспектів сформувало головну методологічну інновацію в галузі цифрової історії: можливість "віддаленого зчитування" великих корпусів тексту і виявлення масштабних закономірностей.
За останні десять років сфера комп'ютерного зору, яка спрямована на досягнення високого рівня розуміння зображень за допомогою обчислювальних методів, зазнала стрімких інновацій. Наприклад, моделі комп'ютерного зору можуть з високою точністю виявляти та розпізнавати людей, тварин і тисячі інших об'єктів на зображеннях. Цей технологічний прорив дає змогу зробити для розпізнавання зображень те саме, що комбінація методів OCR/NLP зробила для текстів. Простіше кажучи, комп'ютерний зір відкриває для масштабного аналізу частину цифрового архіву, яка досі залишалася майже недослідженою: мільйони зображень в оцифрованих книгах, газетах, журналах, та історичних документах. Таким чином, історики тепер зможуть дослідити "візуальний аспект цифрового прогресу в історичних дослідженнях".
У цьому уроці наведено приклади того, як методи комп'ютерного зору можуть бути застосовані для аналізу великих історичних візуальних масивів даних новими способами, а також як можна навчати власні моделі комп'ютерного зору. Окрім визначення змісту зображень та класифікації їх за категоріями – двох завдань, які зосереджені на візуальних особливостях, – методи комп'ютерного зору також можуть бути використані для побудови графіків, які описують стилістичну (не)схожість між зображеннями.
Однак, слід зазначити, що методи комп'ютерного зору ставлять перед істориками низку теоретичних і методологічних проблем. По-перше, будь-яке застосування методів комп'ютерного зору до історичних даних має починатися з ретельно сформульованого історичного питання і, як наслідок, включати обговорення масштабу. Якщо коротко: чому важливо відповісти на це питання і чому для цього потрібні методи комп'ютерного зору?
По-друге, враховуючи дискусії у сфері справедливості машинного навчання (ML – Machine learning), які спрямовані на розв'язання питання його упередженості, історики повинні усвідомлювати той факт, що методи комп'ютерного зору проливають світло на певні частини візуальних даних, але можуть не помічати, неправильно ідентифікувати, неправильно класифікувати або навіть затушовувати інші частини. Як історики, ми здавна усвідомлювали, що дивимося на минуле з нашого часу, і тому будь-яке застосування методів комп'ютерного зору повинно включати обговорення можливої "історичної упередженості". Оскільки (більшість) моделей комп'ютерного зору навчаються на сучасних даних, ми ризикуємо накласти упередженість цих даних, характерну для певного часу, на історичні дані. Попри те, що повне дослідження питання упередженості виходить за рамки цього уроку, про нього слід пам'ятати.
Цілі уроку
Цей урок, що складається з двох частин, має на меті:
Ознайомити з методами комп'ютерного зору на основі глибокого навчання для гуманітарних досліджень. Глибоке навчання – це розділ машинного навчання (про нього ми поговоримо більш детально у наступних уроках).
Надати опис етапів підготовки моделі глибокого навчання.
Обговорити певні міркування щодо використання глибокого навчання/комп'ютерного зору в гуманітарних дослідженнях.
Допомогти вирішити, чи може глибоке навчання бути корисним інструментом для вас.
Цей урок, що складається з двох частин, не має на меті:
Відтворити інші більш загальні введення в глибоке навчання, хоча вони охоплюють деякі з тих самих матеріалів.
Розкрити кожну деталь глибокого навчання та комп'ютерного зору, які є великими темами. Тут неможливо охопити все.
Рекомендовані попередні навички
Знання Python або іншої мови програмування буде важливим для виконання цих уроків. Зокрема, було б корисно розуміти, як використовувати змінні, індексацію та мати певні навички використання методів із зовнішніх бібліотек.
Ми очікуємо, що ви вже знайомі з Jupyter Notebooks, тобто знаєте, як запускати код, що міститься у записнику. Якщо ви не знайомі із записниками, ви можете скористатися уроком "Знайомство з Jupyter Notebooks", який буде корисним посібником у поєднанні з цими уроками.
У цьому посібнику використовуються зовнішні бібліотеки Python, але попередні знання не є обов'язковими, оскільки кроки, пов'язані з використанням цих бібліотек, будуть пояснюватися в міру їх використання.
Налаштування уроку
Пропонуємо пройти цей урок у два етапи:
Спочатку прочитайте матеріали на цій сторінці, щоб ознайомитися з ключовими поняттями та загальним робочим процесом навчання моделі комп'ютерного зору.
Далі ми рекомендуємо вам запустити код цього уроку через відповідний Jupyter Notebook у Google Colab, який добре підходить для дослідницького методу, якого ми будемо дотримуватися.
У цій частині уроку, ми будемо використовувати підхід до комп'ютерного зору, заснований на глибокому навчанні. Процес налаштування середовища для глибокого навчання став простішим, але все ще може бути складним. Ми намагалися максимально спростити цей процес і рекомендуємо досить швидкий шлях до запуску коду з уроку.
Запуск записника
Ви можете запустити код уроку різними способами, але ми наполегливо рекомендуємо вам скористатися інструкціями з налаштування хмарного середовища, а не робити це локально. Це пов'язано з кількома причинами:
Процес налаштування глибокого навчання в хмарному середовищі може бути набагато простішим, ніж спроба налаштувати його локально. Багато ноутбуків і персональних комп'ютерів не мають такого типу обладнання, а процес встановлення необхідних програмних драйверів може зайняти багато часу.
Код у цьому уроці працюватиме набагато швидше, якщо доступний певний тип графічного процесора (GPU). Це дозволить застосувати інтерактивний підхід до роботи з моделями та результатами.
Графічні процесори є більш енергоефективними для деяких завдань порівняно з центральними процесорами (CPU), в тому числі для завдань, з якими ми будемо працювати в цих уроках.
Google Colab
Google Colab – це безплатний хмарний сервіс, який підтримує Jupyter Notebooks (записники) і надає безплатний доступ до обчислювальних ресурсів, включаючи графічні процесори.
Щоб запустити код уроку в Google Colab, вам потрібно:
Створити обліковий запис Google, якщо у вас його ще немає, або увійти у свій наявний. Це необхідно для збереження та запуску записників в Google Colab.
Після того, як записник був відкритий в Google Colab, ви можете зберегти його копію на власному Google Диску. Це можна зробити, вибравши “Файл” > “Зберегти копію на Диску”.
Щоб використовувати графічний процесор, перейдіть до “Середовище виконання” > “Змінити тип середовища виконання”, потім у списку Апаратне прискорення виберіть параметр GPU (наприклад, T4 GPU) і натисніть кнопку “Зберегти”. Це увімкне прискорення графічного процесора для вашого записника. Colab час від часу змінює доступність типів графічних процесорів.

Інтерфейс записників Colab має бути вам знайомим, якщо ви раніше користувалися записниками Jupyter Notebooks. Щоб запустити комірку з кодом, натисніть кнопку відтворення зліва від комірки або, якщо комірку вибрано, натисніть комбінацію клавіш Shift + Enter або ⌘/Ctrl+Enter.
Не забудьте завершити сеанс виконання, коли закінчите роботу з записниками, щоб не витрачати виділений вам час. Це можна зробити, вибравши “Середовище Виконання” > “Керувати сеансами”, а потім натиснувши “Завершити” для активного сеансу.
У Google Colab є додаткова документація щодо використання ноутбуків, а також корисний розділ поширених запитань та відповідей щодо ефективного використання.
Локальне налаштування
Якщо ви не бажаєте використовувати інструкцію з налаштування хмарного середовища, ви можете скористатися іншими, де описано, як це зробити локально.
Короткий вступ до машинного навчання
Перш ніж перейти до першого практичного прикладу, було б корисно коротко розглянути, що мається на увазі під “машинним навчанням”. Машинне навчання має на меті дати можливість комп'ютерам “вчитися” на основі даних замість того, щоб бути явно запрограмованими на виконання певних дій. Наприклад, якщо ми хочемо відфільтрувати електронні листи зі спамом, ми можемо застосувати кілька різних підходів. Один з них полягає в тому, щоб прочитати приклади “спаму” і “не спаму” і побачити, чи можемо ми ідентифікувати ознаки його наявності в електронному листі. Наприклад, ми можемо скласти список ключових слів, які, на нашу думку, можуть вказувати на спам. Тоді ми можемо написати програму, яка робить щось подібне для кожного отриманого листа:
підрахувати кількість ключових слів в електронному листі:
Якщо кількість ключових слів >= 10:
Електронний лист = спам
На противагу цьому, підхід машинного навчання тренує алгоритм машинного навчання на розмічених прикладах електронних листів, які є “спамом” або “не спамом”. Цей алгоритм на повторюваних прикладах “вивчає” закономірності, які вказують на тип електронного листа. Це приклад “керованого навчання” (supervised learning) – процесу, в якому алгоритм працює з розміченими даними, і саме на ньому буде зосереджено увагу в цьому уроці. Існують різні підходи до управління процесом навчання, деякі з них ми розглянемо в цьому уроці. Інший тип машинного навчання, який не потребує розмічених прикладів, – це “некероване навчання” (unsupervised learning).
Машинне навчання має свої переваги та недоліки. Деякі переваги в нашому прикладі з електронною поштою включають відсутність необхідності вручну визначати, що вказує на те, чи є лист спамом, або ні. Це особливо корисно, коли ознаки можуть бути ледь помітними або їх важко виявити. Якщо характеристики спаму в майбутньому зміняться, вам не потрібно буде переписувати всю програму, а можна буде натренувати модель на нових прикладах. До недоліків можна віднести вимогу щодо розмічених прикладів, створення яких може зайняти багато часу. Одне з основних обмежень алгоритмів машинного навчання полягає в тому, що може бути важко зрозуміти, як вони прийняли рішення, тобто чому лист було позначено як спам або не спам. Наслідки цього варіюються залежно від того, яку “владу” алгоритму надано в системі. Наприклад, потенційний негативний вплив від алгоритму, який автоматично приймає рішення щодо кредитної заявки, ймовірно, набагато вищий, ніж від алгоритму, який дає некорисну рекомендацію щодо фільму зі стрімінгового сервісу.
Навчання моделі класифікації зображень
Тепер, коли ми маємо загальне уявлення про машинне навчання, перейдемо до нашого першого прикладу використання глибокого навчання для комп'ютерного зору. У цьому прикладі ми створимо класифікатор зображень, який відносить зображення до однієї з двох категорій на основі розмічених навчальних даних.
Дані: Класифікація зображень з історичних газет
У цьому уроці ми працюватимемо з набором даних, отриманих з “Newspaper Navigator”. Цей набір даних складається з витягнутих візуальних матеріалів з 16 358 041 оцифрованих сторінок історичних газет, взятих з колекції Бібліотеки Конгресу США “Chronicling America” (Хроніки Америки).
Модель комп'ютерного зору віднесла ці зображення до однієї з семи категорій, включаючи фотографії та рекламу.
Дані Newspaper Navigator були створені за допомогою моделі глибокого навчання з виявленням об'єктів. Ця модель була навчена на анотаціях сторінок “Chronicling America” часів Першої світової війни, включаючи ті, що зроблені волонтерами в рамках краудсорсингового проєкту Beyond Words.
Якщо ви хочете дізнатися більше про те, як було створено цей набір даних, ви можете прочитати статтю в журналі, що описує цю роботу, або переглянути репозиторій GitHub, який містить код і навчальні дані. Ми не будемо відтворювати цю модель. Натомість ми використаємо результати цієї моделі як відправну точку для створення даних, які ми використовуємо в цьому уроці. Оскільки отримана анотація є результатом роботи моделі машинного навчання, вона буде містити помилки; поки що ми допустимо, що дані, з якими ми працюємо, є недосконалими. Певний ступінь недосконалості та помилок часто є ціною, яку ми повинні заплатити, якщо хочемо працювати з даними “в повному обсязі”, використовуючи обчислювальні методи.
Класифікація газетних оголошень
Для нашого першого застосування глибокого навчання ми зосередимося на класифікації зображень, які були визначені як реклама (пам'ятайте, що ці дані ґрунтуються на результатах передбачення роботи моделі й можуть містити певні помилки). Зокрема, ми працюватимемо з вибіркою зображень у рекламі, що охоплює 1880-5 роки.
Визначення наявності ілюстрацій в рекламних оголошеннях
Якщо ви подивитеся на рекламні зображення, то побачите, що деякі з них містять лише текст, тоді як інші мають якусь ілюстрацію.
Оголошення з ілюстрацією:

Оголошення без ілюстрації:

Наш класифікатор буде навчений передбачати, до якої категорії належить рекламне зображення. Ми можемо використовувати його для автоматизації пошуку реклами з ілюстраціями для подальшого аналізу “вручну” . Крім того, ми можемо використовувати цей класифікатор безпосередньо для кількісної оцінки кількості рекламних оголошень, що містили ілюстрації в певному році, і з'ясувати, чи змінювалася ця кількість з часом, а також як на неї впливали інші фактори, такі як місце публікації. Призначення вашої моделі впливатиме на те, на яких мітках ви обиратимете її для навчання, а також на те, як ви оцінюватимете, чи достатньо добре працює модель. Ми розглянемо ці аспекти протягом цього уроку.
Вступ до бібліотеки fastai
fastai – це бібліотека Python для глибокого навчання, “яка надає практикам високорівневі засоби, що дозволяють швидко і легко отримувати найсучасніші результати в стандартних областях глибокого навчання, а дослідникам – низькорівневі компоненти, які можна поєднувати і комбінувати для створення нових підходів”. Бібліотека розроблена fast.ai (зверніть увагу на крапку!), дослідницькою організацією, яка прагне зробити глибоке навчання більш доступним. Окрім бібліотеки fastai, fast.ai також організовує безплатні курси та проводить дослідження.
Є кілька причин, чому fastai був обраний для цього посібника:
Він спрямований на те, щоб зробити глибоке навчання доступним, зокрема, через дизайн бібліотечного API.
Він полегшує використання методів, які не потребують великої кількості даних або обчислювальних ресурсів.
Багато найкращих методів реалізовані як “за замовчуванням”, що допомагає досягти хороших результатів.
Існують різні рівні, на яких ви можете взаємодіяти з бібліотекою, залежно від того, наскільки сильно вам потрібно змінити деталі нижчого рівня.
Бібліотека розроблена на основі PyTorch, що дозволяє відносно просто використовувати наявний код.
Хоча цей урок зосереджений на fastai, багато з показаних методів можна також застосовувати в інших фреймворках.
Створення класифікатора зображень за допомогою fastai
У наступному розділі буде описано кроки, пов'язані зі створенням та навчанням класифікаційної моделі для виявлення того, чи є оголошення лише текстовим, чи також містить ілюстрацію. Якщо коротко, то наші кроки будуть такими:
Завантажити дані (посилання)
Створити модель
Натренувати модель
Ці кроки будуть розглянуті досить швидко; не хвилюйтеся, якщо ви відчуваєте, що не все зрозуміли в цьому розділі. Ми повернемося до того, що відбувається, більш детально, коли ми перейдемо до розділу про робочий процес задачі комп'ютерного зору.
Перше, що ми зробимо, це імпортуємо необхідні модулі з бібліотеки fastai. У цьому випадку ми імпортуємо vision.all
, оскільки ми працюємо над задачею комп'ютерного зору.
from fastai.vision.all import *
Ми також імпортуємо Matplotlib, бібліотеку для створення візуалізацій на Python, та будемо використовувати інший стиль за допомогою методу style.use
.
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8')
Завантаження даних
Існує декілька способів завантаження даних за допомогою бібліотеки fastai. Дані реклами складаються з папки, яка містить файли зображень, і CSV-файлу, який містить стовпець із шляхами до зображень і відповідною міткою:
kyu_joplin_ver01_data_sn84037890_00175045338_1900060601_0108_007_6_97.jpg
text-only
Існує декілька способів завантаження цього типу даних за допомогою fastai
. У цьому прикладі ми використаємо ImageDataLoaders.from_csv
. Як випливає з назви, метод from_csv
завантажує дані з CSV-файлу. Для його використання нам потрібно вказати кілька параметрів для правильного завантаження даних:
Шлях до папки, де зберігаються зображення та файл CSV.
Колонки у CSV-файлі, які містять мітки.
Resize()
для зміни розміру всіх зображень до стандартного.
Ми створимо змінну ad_data
, яка буде використовуватися для зберігання параметрів завантаження цих даних:
ad_data = ImageDataLoaders.from_csv(
path="ads_data/", # кореневий шлях до csv-файлу та папки з зображенням
csv_fname="ads_upsampled.csv/", # назва нашого csv-файлу
folder="images/", # папка, де зберігаються наші зображення
fn_col="file", # колонка з назвою файлу в нашому csv
label_col="label", # колонка з міткою в нашому csv
item_tfms=Resize(224, ResizeMethod.Squish), # зменшення розміру зображень шляхом стиснення, щоб вони мали розмір 224х224 пікселів
seed=42, # встановлення фіксованого seed, щоб зробити результати більш відтворюваними
)
Важливо переконатися, що дані були завантажені правильно. Один із способів швидко перевірити це – використати метод show_batch()
для наших даних. Він покаже зображення і пов'язані з ними мітки для вибірки. Приклади, які ви отримаєте, будуть дещо відрізнятися від наведених тут.
ad_data.show_batch()

Це зручний спосіб перевірити, чи правильно завантажені ваші мітки й дані. Тут ви можете побачити, що мітки (text-only
– текстові; та illustration
– містить ілюстрації) були правильно пов'язані з тим, як ми хочемо класифікувати ці зображення.
Створення моделі
Тепер, коли fastai знає, як завантажити дані, наступним кроком буде створення моделі на їх основі. Для створення моделі, яка підходить для комп'ютерного зору, ми скористаємося функцією vision_learner
. Ця функція створить “Згорткову нейронну мережу”, тип моделі глибокого навчання, що часто використовується для застосування в задачах комп'ютерного зору. Щоб скористатися цією функцією, вам потрібно вказати як мінімум такі параметри:
Дані, які модель буде використовувати як тренувальні
Тип моделі, яку ви хочете використовувати
Цього вже достатньо для створення моделі комп'ютерного зору у fastai, але ви також можете передати деякі метрики для відстеження під час навчання. Це дозволить вам краще зрозуміти, наскільки добре ваша модель виконує завдання, для якого ви її тренуєте. У цьому прикладі ми будемо використовувати accuracy
(точність, співвідношення правильно передбачених випадків до загальної кількості випадків) як метрику.
Створімо цю модель і присвоїмо її новій змінній learn
:
learn = vision_learner(
ad_data, # дані, на яких буде тренуватися модель
resnet18, # тип моделі, який ми хочемо використовувати
metrics=accuracy, # метрики для відстеження
)
Навчання моделі
Хоча ми створили модель vision_learner
, насправді ми ще не навчали модель. Це робиться за допомогою методу fit
. Навчання – це процес, який дозволяє моделі комп'ютерного зору “навчитися” передбачати правильні мітки для даних. Існують різні способи навчання (fit) цієї моделі. Для початку ми скористаємося методом fine_tune
. У цьому прикладі єдине, що ми передамо методу fine tune – це кількість епох для тренування. Кожен прохід через весь набір даних є “епохою”. Кількість часу, яку модель витрачає на навчання, залежить від того, де ви запускаєте цей код, і від доступних ресурсів. Знову ж таки, ми розглянемо деталі всіх цих компонентів нижче.
learn.fine_tune(5)
0
0.971876
0.344096
0.860000
00:06
0
0.429913
0.394812
0.840000
00:05
1
0.271772
0.436350
0.853333
00:05
2
0.170500
0.261906
0.913333
00:05
3
0.125547
0.093313
0.946667
00:05
4
0.107586
0.044885
0.980000
00:05
Коли ви запускаєте цей метод, ви побачите індикатор прогресу, який показує, як довго модель тренується, і приблизний час, що залишився. Ви також побачите таблицю, яка відображає деяку іншу інформацію про модель, наприклад, метрику відстежуваної точності. Ви можете бачити, що в цьому прикладі ми отримали точність понад 90%. Коли ви запускаєте код самостійно, результат може дещо відрізнятися.
Результати
Хоча методи глибокого навчання зазвичай сприймаються як такі, що потребують великих обсягів даних і значних обчислювальних потужностей, наш приклад показує, що для багатьох застосувань достатньо менших наборів даних. У цьому прикладі ми могли б потенційно використовувати інші підходи; метою тут було не показати найкраще рішення з цим конкретним набором даних, а дати уявлення про те, що можливо з обмеженою кількістю розмічених прикладів.
Поглиблений посібник з комп'ютерного зору з використанням глибокого навчання
Тепер, коли у нас є загальне уявлення про процес, ми розглянемо більш детально, як він працює.
Процес керованого навчання моделей компʼютерного зору
У цьому розділі ми почнемо розглядати основні кроки, пов'язані з процесом створення моделі комп'ютерного зору на основі глибокого навчання. Цей процес включає низку етапів, лише деякі з яких стосуються безпосередньо навчання моделей. Узагальнена ілюстрація процесу керованого машинного навчання може виглядати наступним чином:

Ми бачимо, що існує досить багато кроків до і після етапу навчання моделі в робочому процесі. Перш ніж розпочинати навчання моделі, нам потрібні дані. У цьому уроці дані зображень вже були підготовлені, тому вам не потрібно було турбуватися про цей крок. Однак, коли ви перейдете до використання комп'ютерного зору для вирішення власних дослідницьких завдань, малоймовірно, що існуватиме набір даних для вашого конкретного випадку використання. В результаті, вам потрібно буде створити ці дані самостійно. Процес отримання доступу до даних буде відрізнятися залежно від типу зображень, з якими ви зацікавлені працювати, і від того, де вони зберігаються. Деякі колекції цифрової спадщини надають доступ до великих масивів даних зображень, тоді як інші здебільшого роблять зображення доступними лише через “переглядач”. Дедалі ширше впровадження стандарту IIIF також спрощує процес роботи із зображеннями, що зберігаються в різних установах.
Після того, як ви отримаєте набір зображень для роботи, наступним кроком (якщо ви використовуєте кероване навчання) буде створення міток для цих даних і навчання моделі. Цей процес буде більш детально розглянуто нижче. Після того, як модель буде навчена, ви отримаєте деякі результати передбачень. Ці результати “оцінюються” за допомогою низки потенційних метрик, деякі з яких ми розглянемо далі у другій частині цього уроку.
Після того, як модель досягла задовільного рівня, її результати можуть бути використані для цілого ряду “інтерпретаційних” дій. Після того, як ми отримали передбачення від моделі глибокого навчання, існують різні варіанти того, що з ними робити. Наші передбачення можуть безпосередньо впливати на прийняття автоматизованих рішень (наприклад, де відображати зображення у вебколекції), але більш ймовірно, що ці передбачення будуть прочитані людиною для подальшого аналізу. Це особливо актуально, якщо цільове використання полягає в дослідженні історичних явищ.
Навчання моделі
Якщо зосередитися на частині, пов'язаній з глибоким навчанням, як саме виглядає навчальний процес?

Загальний опис циклу тренування для керованого навчання: розпочніть з декількох зображень і міток, зробіть певну підготовку, щоб зробити вхідні дані придатними для моделі глибокого навчання, пропустіть дані через модель, зробіть передбачення для міток, обрахуйте значення функції втрат, оновіть ваги моделі, щоб наступного разу отримати кращі передбачення. Цей процес повторюється багато разів. Під час цього циклу навчання відстежуються метрики, які дозволяють людині, що навчає модель, оцінити, наскільки добре вона працює.
Очевидно, що це загальний огляд. Розгляньмо кожен крок у навчальному циклі по черзі. Хоча в наступному розділі ми покажемо ці етапи за допомогою коду, не хвилюйтеся, якщо не все буде зрозуміло з першого разу.
Вхідні дані
У початкові вхідні дані входять два елементи: зображення та мітки. Хоча глибоке навчання черпає натхнення з того, як працює людське пізнання, те, як комп’ютер "бачить" дуже відрізняється від людського. Всі моделі глибокого навчання використовують числа як вхідні дані. Оскільки зображення зберігаються на комп'ютері у вигляді матриці значень пікселів, цей процес є відносно простим для моделей комп'ютерного зору. Поряд із зображеннями ми маємо мітки, пов'язані з кожним зображенням. Знову ж таки, вони представлені у вигляді чисел всередині моделі.
Скільки даних потрібно?
Часто вважається, що для навчання ефективної моделі глибокого навчання потрібні величезні обсяги даних, однак це не завжди так. Ми припускаємо, що якщо ви намагаєтеся використати глибоке навчання для розв'язання проблеми, у вас є достатньо даних, щоб виправдати відмову від ручного підходу. Справжня проблема полягає в тому, скільки у вас є розмічених даних. Неможливо дати однозначну відповідь на питання “Скільки даних потрібно?”, оскільки кількість необхідних навчальних даних залежить від багатьох факторів. Існує кілька способів зменшити кількість необхідних навчальних даних, деякі з них ми розглянемо в цьому уроці. Найкращим підходом, ймовірно, буде створити початкові навчальні дані й подивитися, наскільки добре ваша модель працює на них. Це дасть вам уявлення про те, чи можливо розв'язувати проблему. Крім того, процес анотування ваших даних є цінним сам по собі. Для простої задачі класифікації можна спробувати визначити, чи варто розробляти модель, на прикладі кількох сотень розмічених прикладів (хоча для навчання надійної моделі вам часто знадобиться більше даних).
Підготовка міні-пакетів (бетчів)
Коли ми використовуємо глибоке навчання, зазвичай неможливо передати всі дані в модель за один раз. Замість цього дані розбиваються на пакети. При використанні графічного процесора дані завантажуються в пам'ять GPU по одному пакету за раз. Її розмір може впливати на процес навчання, але частіше за все він визначається обчислювальними ресурсами, які ви маєте у своєму розпорядженні.
Причина, чому ми використовуємо GPU для навчання нашої моделі, полягає в тому, що майже завжди навчання моделі на GPU буде швидшим, ніж на CPU, завдяки здатності GPU виконувати багато обчислень паралельно.
Перш ніж створити пакет і завантажити його на графічний процесор, зазвичай потрібно переконатися, що всі зображення мають однаковий розмір. Це дозволяє GPU ефективно виконувати операції. Після того, як пакет підготовлений, нам може знадобитися виконати деякі додаткові перетворення над зображеннями.
Створення моделі
Після того, як дані були підготовлені, щоб їх можна було завантажувати партіями, ми передаємо їх нашій моделі. Ми вже бачили її в першому прикладі з resnet18
. Архітектура моделі глибокого навчання визначає, як дані проходять через модель. У цьому уроці, ми зосередимося на конкретному типі глибокого навчання, який використовує “Згорткові нейронні мережі” (CNN).

Ця діаграма дає приблизний огляд різних компонентів моделі CNN. У цьому типі моделі зображення проходить через кілька шарів, перш ніж передбачити вихідну мітку для зображення (наприклад “текстові”, як показано на ілюстрації). Ваги шарів цієї моделі оновлюються під час навчання, щоб вони могли “вивчити” які особливості зображення передбачають певну мітку. Так, наприклад, CNN, яку ми тренували на рекламі, оновлює параметри, відомі як “ваги” для кожного шару, що потім створює представлення зображення, яке є корисним для передбачення того, чи є в рекламі ілюстрація, чи ні.
Tensorflow playground – корисний інструмент, який допомагає сформувати уявлення про те, як ці шари фіксують різні особливості вхідних даних, і як ці особливості, в свою чергу, можуть бути використані для класифікації у різний спосіб.
Основна властивість CNN та глибокого навчання полягає у здатності цих шарів кодувати дуже складні патерни в даних. Однак ефективне оновлення вагових коефіцієнтів часто може бути складним завданням.
Використання наявної моделі?
Роздумуючи над тим, як створити нашу модель, ми маємо різні варіанти того, що використовувати. Один з варіантів – використати вже наявну модель, яка вже була навчена на конкретному завданні. Наприклад, модель YOLO. Ця модель навчена передбачати обмежувальні рамки (bounding boxes) для низки різних типів об'єктів на зображенні. Хоча це може бути вдалою відправною точкою, такий підхід має низку обмежень при роботі з історичним матеріалом або для гуманітарних питань у більш широкому сенсі. По-перше, дані, на яких навчалися ці моделі, можуть сильно відрізнятися від даних, які ви використовуєте. Це може вплинути на роботу вашої моделі на ваших даних і призвести до упередженого ставлення до зображень у ваших даних, які схожі на навчальні дані. Інша проблема полягає в тому, що якщо ви використовуєте наявну модель без будь-яких змін, ви обмежені ідентифікацією міток, на яких навчалася оригінальна модель.
Хоча можна безпосередньо визначити модель CNN самостійно, визначивши шари, які ви хочете включити в архітектуру моделі, зазвичай з цього не варто починати. Часто найкраще відштовхуватися вже від наявної архітектури. Водночас розробка нових – це активна сфера досліджень, в якій моделі виявляються добре пристосованими для цілого ряду завдань і даних. Нерідко вони потім реалізуються у фреймворках машинного навчання. Наприклад, бібліотека Hugging Face Transformers реалізує багато найпопулярніших архітектур моделей.
Часто ми хочемо знайти баланс між розробкою з нуля та використанням наявних моделей. У цьому уроці, ми покажемо підхід, який використовує наявні архітектури, але дещо модифікує модель, щоб вона могла передбачати нові мітки. Потім цю модель навчають на нових даних, щоб вона краще відповідала завданням, які ми хочемо, щоб вона виконувала. Ця методика відома під назвою “передавальне навчання” і буде розглянута в розділі “Додаток” цього уроку.
Навчання
Після створення моделі та підготовки даних можна починати процес навчання. Розглянемо кроки навчального циклу:
Моделі передаються дані та мітки, по одному пакету за раз. Кожен раз, коли весь набір даних проходить через модель, називається “епохою”. Кількість епох, використаних для навчання моделі, є однією зі змінних, які вам потрібно буде контролювати.
Модель робить передбачення для цих міток на основі заданих вхідних даних, використовуючи набір внутрішніх ваг. У CNN моделях ваги містяться всередині її шарів.
Модель обчислює, наскільки помилковими є передбачення, порівнюючи їх з фактичними мітками. Для обчислення того, наскільки “помилковою” була модель у своїх передбаченнях, використовується “функція втрат”.
Модель змінює внутрішні параметри, щоб спробувати досягти кращого результату наступного разу. Функція втрат з попереднього кроку повертає “значення втрат”, яке часто називають просто “втратами”, і яке використовується моделлю для оновлення ваг.
“Темп навчання” використовується для визначення того, як сильно модель повинна оновлюватися на основі розрахованих втрат. Це ще одна з важливих змінних, якою можна маніпулювати в процесі навчання. У другій частині цього уроку ми розглянемо один з можливих способів визначення відповідної швидкості навчання для вашої моделі.
Валідація даних
Коли ми навчаємо модель глибокого навчання, ми зазвичай робимо це для того, щоб робити передбачення на нових незнайомих даних, які не містять міток. Наприклад, ми можемо використовувати наш класифікатор реклами для всіх зображень за певний період часу, щоб підрахувати, скільки кожного типу реклами (ілюстрованої чи ні) з'явилося в цьому наборі даних. Тому нам не потрібна модель, яка добре навчається класифікувати лише ті навчальні дані, які їй надаються. Тому ми майже завжди використовуємо певну форму “валідаційних даних”. Це дані, які використовуються для перевірки того, що ваги, які модель визначає на навчальних даних, також переносяться на нові. У циклі навчання валідаційні дані використовуються лише для “перевірки” передбачень моделі. Модель не використовує їх безпосередньо для оновлення ваг. Це допомагає уникнути “перенавчання” моделі.
“Перенавчання” означає, що модель стає дуже ефективною в передбаченні на навчальних даних, але ці передбачення не узагальнюються за їх межами. По суті, модель “запам'ятовує” навчальні дані замість того, щоб вивчати більш загальні особливості, щоб робити правильні передбачення на нових даних. Валідаційний набір запобігає цьому, дозволяючи побачити, наскільки добре працює модель на даних, на яких вона ще не навчалася. Іноді робиться додаткове розбиття даних, яке використовується для передбачення лише наприкінці навчання моделі. Це часто називають “тестовим” набором даних. Набір тестів використовується для перевірки працездатності моделі на змаганнях з наук про дані, наприклад, на Kaggle, а також для перевірки працездатності моделей, створених сторонніми особами. Це допомагає забезпечити надійність моделі в ситуаціях, коли дані для перевірки навмисно або випадково були використані для “гри” з ефективністю моделі.
Передавальне навчання
У нашому першому класифікаторі оголошень ми використовували метод fine_tune()
для навчання об'єкта learner
. Що це нам дало? Ви могли бачити, що індикатор прогресу складається з двох частин. Перша епоха – це навчання тільки останніх шарів моделі, після чого були навчені й нижні шари. Це один із способів, у який ми можемо здійснювати передавальне навчання у fastai. Важливість такого навчання вже обговорювалася в попередніх розділах. Пригадаємо, що при передавальному навчанні у новому завданні використовуються “ваги”, які модель раніше засвоїла при виконанні іншого. У випадку класифікації зображень це зазвичай означає, що модель навчалася на значно більшому наборі даних. Часто цим попереднім навчальним набором даних є ImageNet.
ImageNet – це велика база даних зображень, яка широко використовується в дослідженнях комп'ютерного зору. Наразі ImageNet містить “14,197,122” зображень з більш ніж 20,000 різних міток. Цей набір даних часто використовують як бенчмарк для дослідників комп'ютерного зору, щоб порівняти свої підходи. Етичні питання, пов'язані з розміченням і створенням ImageNet, досліджуються в статті Кроуфорда і Паґлена “Політика зображень у навчальних наборах для машинного навчання” (The Politics of Images in Machine Learning Training Sets, Crawford and Paglen).
Чому передавальне навчання часто є корисним?
Як ми вже бачили, передавальне навчання працює, якщо використовувати модель, навчену на одному завданні, для виконання нового. У нашому прикладі ми використали модель, навчену на ImageNet, для класифікації зображень оцифрованих газет ХІХ століття. Може здатися дивним, що в цьому випадку спрацьовує навчання з перенесенням, оскільки зображення, на яких ми навчаємо нашу модель, дуже відрізняються від зображень в ImageNet. Хоча в ImageNet є категорія для газет, вони здебільшого складаються із зображень газет у контексті повсякденного життя, а не із зображень, вирізаних зі сторінок газет. Тож чому використання моделі, навченої на ImageNet, все ще корисне для завдання, яке має інші мітки та зображення, ніж ті, що в ImageNet?
Коли ми розбирали схему моделі CNN, то побачили, що вона складається з різних шарів. Ці шари створюють репрезентації вхідного зображення, які вловлюють певні особливості зображення для передбачення мітки. Що це за особливості? Це можуть бути “базові” ознаки, наприклад, прості форми. Або це можуть бути більш складні візуальні ознаки, наприклад, риси обличчя. Були розроблені різні методи, які допомагають візуалізувати різні шари нейронної мережі. Ці методи виявили, що перші шари нейронної мережі мають тенденцію вивчати більш “базові” функції, наприклад, вони вчаться розпізнавати основні форми, такі як кола або лінії, в той час, як шари, розташовані далі в мережі, містять фільтри, які кодують більш складні візуальні ознаки, такі як очі. Оскільки багато з цих ознак фіксують візуальні властивості, корисні для багатьох завдань, початок роботи з моделлю, яка вже здатна їх виявляти на зображеннях, допоможе виявити ті, важливі для нового завдання, оскільки ці нові ознаки, швидше за все, будуть вже відомі моделі.
Коли модель створюється в бібліотеці fastai за допомогою методу vision_learner
, наявна архітектура використовується як “тіло” моделі. Більш глибокі шари, що додаються, називаються “головою” моделі. Тіло за замовчуванням використовує ваги (параметри), отримані під час навчання на ImageNet. “Голова” приймає вихідні дані тіла як вхідні перед тим, як перейти до останнього шару, який створюється відповідно до навчальних даних, які ви передаєте vision_learner
. Метод fine_tune
спочатку тренує лише головну частину моделі, тобто останні кілька шарів моделі, перш ніж “розморозити” нижні шари. Коли ці шари “розморожуються”, ваги моделі оновлюються за допомогою процесу, описаного вище в розділі “Навчання”. Ми також можемо активніше контролювати, наскільки сильно ми тренуємо різні шари моделі, що ми побачимо, коли пройдемо повний процес навчання моделі глибокого навчання.
Запропоновані експерименти
Важливо розуміти, що відбувається, коли ви вносите зміни в навчальний процес. Ми пропонуємо зробити нову копію записника уроку і подивитися, що станеться, якщо ви внесете зміни. Ось деякі з них:
Змініть розмір вхідних зображень, визначений у перетворенні елемента
Resize
вImageDataLoaders
.Змініть модель, що використовується в
vision_learner
, зresnet18
наresnet34
.Змініть “метрики”, визначені в
vision_learner
. Деякі з них, які включені до fastai, можна знайти в документації.Змініть кількість “епох”, що використовуються у методі
fine_tune
.
Якщо щось “зламалося”, не хвилюйтеся! Ви можете повернутися до оригінального записника, щоб відновити робочу версію коду. У наступній частині уроку ми більш детально розглянемо компоненти процесу глибокого навчання. Вивчення того, що відбувається, коли ви вносите зміни, буде важливою частиною розуміння того, як навчати модель комп'ютерного зору.
Обробка оголошень із газети “Діло”: приклад для українських даних
Хоча в цьому посібнику докладно розглядається робота з англомовними зображеннями, описані підходи є універсальними та легко адаптуються до українського контексту. Використовуючи ті самі бібліотеки і методи (наприклад, fastai та CNN), ви можете створювати моделі для аналізу й класифікації зображень, що містять українські елементи. Для цього достатньо замінити англомовний набір даних та мітки на українські відповідники.
Наприклад, якщо ви працюєте з історичними матеріалами – вирізками з газет, пов’язаними з українською культурою, мистецтвом чи історією – підготуйте набір даних за тією ж структурою, що у прикладі з уроку, та повторіть наведені кроки.
Скажімо, можна використати оголошення, які були надруковані у газеті "Діло", що виходила у 1880-1939 роках у Львові.
Приклади текстових оголошень


Приклади ілюстрованих оголошень


Частина перша. Висновки
На цьому уроці ми:
Дали загальний огляд різниці між підходами до розв'язання проблеми на основі правил та машинного навчання.
Показали базовий приклад використання fastai для створення класифікатора зображень з відносно невеликими витратами часу та навчальними даними.
Представили огляд етапів процесу глибокого навчання та визначили моменти в цьому процесі, на які гуманітаріям слід звернути особливу увагу.
Провели невеликий експеримент, щоб перевірити, чи корисне передавальне навчання для нашого класифікатора комп'ютерного зору.
У наступній частині уроку ми продовжимо розглядати ці теми й зануримося в них більш детально.
Додаток: Ненауковий експеримент з оцінки передавального навчання
Використання глибокого навчання в контексті роботи з даними спадщини не є широко дослідженим. Тому корисно “поекспериментувати” і перевірити, чи є певна методика ефективною. Наприклад, подивімося, чи виявиться передавальне навчання корисним при навчанні моделі для класифікації газетних оголошень ХІХ століття на дві категорії: ті, що містять зображення, і ті, що не містять зображень. Для цього ми створимо нового learner
з тими самими параметрами, що й раніше, але з прапорцем параметра pretrained
, встановленим на False
. Цей прапорець вказує fastai не використовувати передавальне навчання. Ми збережемо його у змінній learn_random_start
.
learn_random_start = vision_learner(ad_data, resnet18, metrics=accuracy, pretrained=False)
Тепер, коли ми створили нового learner
, ми використаємо той самий метод fine_tune
, що й раніше, і навчатимемо модель на тій самій кількості епох, що й минулого разу.
learn_random_start.fine_tune(5)
0
1.303890
0.879514
0.460000
00:04
0
0.845569
0.776279
0.526667
00:05
1
0.608474
0.792034
0.560000
00:05
2
0.418646
0.319108
0.853333
00:05
3
0.317584
0.233518
0.893333
00:05
4
0.250490
0.202580
0.906667
00:05
Найкращий показник точності, якого ми досягаємо при випадковій ініціалізації ваг, становить ~90%. Для порівняння, якщо ми повернемося до нашої початкової моделі, яка зберігається у змінній learn
, і скористаємося методом validate()
, то отримаємо метрики (у цьому випадку точність), розраховані на валідаційному наборі:
learn.validate()
(#2) [0.04488467052578926,0.9800000190734863]
Можна побачити, що між результатами роботи двох моделей є досить велика різниця. Ми залишили все без змін, окрім прапорця параметра pretrained
, який ми встановили у значення False
. Цей прапорець визначає, чи модель починає з ваг, отриманих під час навчання на ImageNet, чи з “випадкових” ваг. Це не є остаточним доказом того, що навчання з перенесенням працює, але воно пропонує розумне рішення, яке ми можемо використовувати за замовчуванням.
Про авторів
Даніель ван Стрін – цифровий куратор проєкту “Життя з машинами” у Британській бібліотеці в Лондоні. Каспар Білен – науковий співробітник з цифрової гуманітаристики у проєкті “Життя з машинами”. Мелвін Веверс – доцент кафедри цифрових методів на історичному факультеті Амстердамського університету. Томас Смітс – постдок у проєкті “Історія упереджень” в Антверпенському університеті. Кетрін МакДонаф – старший науковий співробітник проекту “Життя з машинами” та британський науковий співробітник проекту “Машини, що читають карти” в Інституті Алана Тюрінга.
Переклад українською: Дмитро Батько, студент Факультету прикладних наук Українського католицького університету.
Переклад рецензували: Ігор Крашений, к.т.н., викладач Українського католицького університету; Олесь Добосевич, в.о декана факультету прикладних наук Українського католицького університету.
Рекомендоване цитування: Даніель ван Стрін, Каспар Білен, Мелвін Веверс, Томас Смітс і Кетрін МакДонаф, “Комп'ютерний зір та гуманітаристика: Вступ до глибокого навчання для класифікації зображень (Частина 1)”, Programming Historian, переклав Дмитро Батько, Посібник з цифрової історії, 2025.
Last updated