Pull to refresh

Как нейросети улучшают онлайн-образование

Level of difficultyMedium
Reading time4 min
Views2.7K

В современном мире технологии неуклонно проникают во все сферы нашей жизни, и образование — не исключение. Одним из ярких примеров могут стать большие языковые модели. Так, заметим, что за последние несколько лет сформировался отдельный термин LLM4EDU. По данным Gan W. и соавторов [1] LLM4EDU уже сегодня могут активно использоваться в разных сферах образовательной деятельности:

Однако нейросети могут решать и другие проблемы в образовательной сфере. Так, наша команда столкнулась с необходимостью анализа качества онлайн-обучения.

Изучив возможности решения данной проблемы мы выявили, что на сегодняшний день общепринятыми методами оценки качества обучения в онлайн-среде являются:

  • прямое сравнение ответов учеников с желаемыми решениями (тесты, контрольные задания и т.д.);

  • оценка метрик качества обучения (процент возвратов, Completion Rate, Transformation Rate / Success Rate, статистика посещаемости).

Данные методы уже показали свою эффективность на практике, тем не менее, они не позволяют систематически информировать учителей, родителей и разработчиков онлайн-курсов об успехах и неудачах учащихся. Более того, учитывая большое количество проводимых уроков некоторые из данных подходов становятся невозможными.
Поэтому в последние годы активно внедряются автоматические системы анализа качества обучения, основанные на методах машинного обучения. По данному пути пошли и мы.

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

Несмотря на кажущуюся сложность задачи в современных реалиях собрать подобную систему не представляет большой сложности. Ниже соберем подобный проект в качестве доказательства ?

Анализ аудио

В аудио мы будем оценивать эмоциональный фон. Отметим, что аудио представляют собой особую сложность для анализа, так как в аудиозаписях часто имеются посторонние звуки, существуют языковые и индивидуальные особенности проявления эмоций.

Для выявления эмоций возьмем модель HuBERT fine-tuned on DUSHA dataset for speech emotion recognition in russian language. Данная языковая модель обучена на датасете Dusha, который на сегодня является самым большим открытым датасетом для распознавания эмоций в устной речи на русском языке.
Плюсом данной модели являются довольно высокие метрики качества:

  • accuracy = 0.86

  • balanced = 0.76

  • macro f1 score = 0.81 on test set

Заметим, что люди могут распознавать эмоции с точностью от 10 до 95% (в среднем около 65-70%).

Воспользуемся кодом из Hugging Face преобразовав его в функцию:

from transformers import HubertForSequenceClassification, Wav2Vec2FeatureExtractor
import torchaudio
import torch

feature_extractor = Wav2Vec2FeatureExtractor.from_pretrained("facebook/hubert-large-ls960-ft")
model_em = HubertForSequenceClassification.from_pretrained("xbgoose/hubert-speech-emotion-recognition-russian-dusha-finetuned")
num2emo = {0: 'нейтральная',
                      1: 'злость',
                      2: 'позитивная',
                      3: 'грусть',
                      4: 'другая'}

def recognize_emotion(chunk):
     """Данная функция распознает эмоции из чанков"""

    waveform, sample_rate = torchaudio.load(chunk, normalize=True)
    transform = torchaudio.transforms.Resample(sample_rate, 16000)
    waveform = transform(waveform)

    inputs = feature_extractor(
            waveform,
            sampling_rate=feature_extractor.sampling_rate,
            return_tensors="pt",
            padding=True,
            max_length=16000 * 10,
            truncation=True
        )

    logits = model_em(inputs['input_values'][0]).logits
    predictions = torch.argmax(logits, dim=-1)
    predicted_emotion = num2emotion[predictions.numpy()[0]]
    return predicted_emotion

Прежде чем анализировать эмоции необходимо убрать из файла тишину и разбить его на чанки по паузам в речи. Для этого воспользуемся библиотекой pydub.

# !pip3 install pydub
from pydub import AudioSegment
from pydub.silence import split_on_silence

def split_audio_into_chunks(filepath):
    """Данная функция разбивает аудио на чанки
        для дальнейшего выявления эмоций"""

    # открываем аудиофайл с pydub
    sound = AudioSegment.from_file(filepath)

    # разбиваем аудио по тишине (700ms и больше)
    chunks = split_on_silence(sound, min_silence_len=700, silence_thresh=sound.dBFS-14, keep_silence=700)

   # создадим список для добавления эмоций
    whole_emotions = []

    for i, audio_chunk in enumerate(chunks, start=1):
        # чтобы не сохранять чанки в виде аудиофайлов
        # преобразуем их в байты, которые подходят для анализа эмоций
        buffer = io.BytesIO()
        audio_chunk.export(buffer, format="wav")
        buffer.seek(0)
       # применим написанную нами функцию
        whole_emotions.append(recognize_emotion(buffer))
    return whole_emotions

В результате мы получаем список всех эмоций из аудиофайла в хронологическом порядке. Итак, с анализом аудио разобрались. Далее рассмотрим, какую полезную информацию мы можем извлечь из видео.

Анализ видео

При анализе видео мы можем определить расположение лица в кадре, направление взгляда, направление лица. Решение подобной задачи можно осуществить при помощи специальных библиотек, например, Pygaze. Всего несколько строк кода и мы можем провести детекцию лица/лиц, определить расстояние до камеры, углы взгляда, лица, факт взгляда в камеру:

#!pip3 install pygaze
from pygaze import PyGaze, PyGazeRenderer
import cv2
image = cv2.imread("jonas.jpg")
pg = PyGaze()
print(pg.predict(image))

Также по видео мы можем распознать эмоции. Среди наиболее популярных библиотек для решения этой задачи можно выделить FER и DeepFace.
В отличие от FER DeepFace предоставляет комплексный анализ изображения:

# !pip3 install deepFace
import cv2
import matplotlib.pyplot as plt
from deepface import DeepFace
img = '/content/joseph-gonzalez-iFgRcqHznqg-unsplash.jpg'
imageFace = cv2.imread(img)
plt.imshow(imageFace[:,:,::-1])
analyze = DeepFace.analyze(img)
print(analyze)

Фото взято с https://unsplash.com/

Остается лишь разделить видеозапись на фреймы и анализировать каждый по отдельности. С этим нам поможет библиотека imageio:

#!pip3 install imageio[pyav]
import imageio.v3 as iio
for i, frame in enumerate(iio.imiter(video_file_path, plugin="pyav")):
    face = DeepFace.analyze(img)
    print(face)
    gaze = pg.predict(image)
    print(gaze)

В дальнейшем эти данные необходимо собрать для анализа, что позволит:

  • определить тенденции в эмоциональном фоне ученика и учителя;

  • проанализировать вовлеченность учителя и ученика в процесс обучения.

Также выходные данные можно использовать для прогнозирования приверженность ученика обучению, модерации работы учителя, но об этом в следующих статьях :-)

В будущем, благодаря подобным технологиям, образование станет еще более качественным, безопасным и интегрированным с реальными потребностями и интересами учеников, обеспечивая не только академические знания, но и развитие ключевых навыков XXI века.

Tags:
Hubs:
Total votes 4: ↑4 and ↓0+4
Comments6

Articles