Обучая в классе модель нейронной сети для оптического распознавания символов, я был поражен тем, как мы можем спроектировать систему для обработки данных, которая будет функционировать подобно человеческому мозгу. Это первое знакомство с машинным обучением (ML) пробудило во мне интерес к этой области. Мне было любопытно узнать, как модели машинного обучения можно применять к реальным проблемам, и я решил поискать стажировку, которая позволит мне получить практический опыт в этой области.

Меня зовут Вэнь Хуэй, я учусь на третьем курсе бакалавриата, изучаю электротехнику и вычислительную технику (ECE) в Университете Карнеги-Меллон в США.

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

После моего первого опыта работы с нейронной сетью в классе я продолжил помогать в проекте глубокого обучения Computer Vision (CV) в Институте робототехники моего университета. Знакомство с различными продвинутыми алгоритмами еще больше разожгло мой интерес к искусственному интеллекту (ИИ), что побудило меня пройти курс CV, предлагаемый в школе. В ходе курса я приобрел практический опыт работы с традиционными методами обработки изображений, такими как обнаружение краев, прежде чем перейти к нейронным сетям. Интерпретация изображений с использованием алгоритмов показалась мне особенно интересной, и я решил специализироваться в области искусственного интеллекта и машинного обучения.

Поскольку мне было интересно получить практический опыт работы с реальными данными и изучить комплексный процесс разработки программного обеспечения для приложений машинного обучения и развертывания в облаке, я решил пройти стажировку в Центре анализа и наблюдения (S&S) экспертизы (CoE) в HTX. Моя трехмесячная стажировка с мая по август 2023 года в S&S оказалась обогащающим и интеллектуально стимулирующим опытом, который сформировал мое понимание машинного обучения.

Проект по распознаванию марок и моделей транспортных средств (VMMR)

Моим основным проектом в S&S была разработка и тестирование моделей искусственного интеллекта для классификации марок/моделей тяжелых транспортных средств по изображениям. Целью проекта была разработка индивидуального классификатора тяжелых транспортных средств, который мог бы использовать команда хозяев. Вот как я подошёл к реализации проекта:

1. Обработка и подготовка данных

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

Чтобы извлечь номерные знаки транспортных средств, я использовал модель обнаружения объектов YOLO с открытым исходным кодом (You Only Look Once), чтобы извлечь из сцены обрезанные изображения, содержащие только транспортные средства. Они были переданы через Amazon Rekognition, облачный сервис CV Application Programming Interface (API) от Amazon Web Services (AWS), для извлечения текста, обнаруженного на номерных знаках. Необработанные изображения и соответствующий им обнаруженный текст были затем сверены с основным списком номерных знаков транспортных средств (см. диаграмму ниже).

Конвейер обработки данных был автоматизирован с использованием библиотеки анализа данных Python (Pandas) для сопоставления необработанных изображений с маркой/моделью транспортного средства с использованием номерного знака (показано ниже). Это упрощает подготовку данных для текущего и будущего обучения модели.

# Extract cropped images using YOLO
from ultralytics import YOLO
model = YOLO("yolov8m.pt") 
 results = model(source)

# Extract detected text using Amazon Rekognition
import boto3
client = boto3.client('rekognition')
with open(photo, 'rb') as image:
response = client.detect_text(Image={'Bytes': image.read()})
textDetections = response['TextDetections']

# Data processing using Pandas
import pandas as pd
df_image_classes = pd.merge(df_vehicle_number_classes, df_image_detected_text, on = ['Vehicle Number'], how = 'left')
df_image_classes = df_image_classes.drop_duplicates(subset='Vehicle Number')

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

2. Обучение модели

После завершения подготовки данных я экспериментировал с несколькими предварительно обученными моделями классификации изображений, такими как ResNet50, VGG16, InceptionV3 и EfficientNetB7, чтобы обучить модель. С помощью платформы TensorFlow я использовал трансферное обучение для обучения этих моделей набору данных полнокадровых изображений для классов транспортных средств. Эти предварительно обученные модели могут усвоить ключевые функции и повысить эффективность моего процесса обучения без необходимости использования большого набора данных. В рамках процесса обучения я доработал модель, настроив гиперпараметры, такие как скорость обучения и количество эпох, чтобы минимизировать потери при обучении. После этого я исследовал различные метрики оценки моделей классификации и написал сценарий для оценки модели на основе точности, производительности и вычислительных ресурсов.

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

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

Изучив тренировочные кривые потерь и точности, я заметил признаки потенциального переобучения. Здесь модель хорошо себя зарекомендовала на обучающих данных, но плохо на проверочных данных. В этом случае признаком переобучения было то, что тренировочная кривая продолжала улучшаться, когда тестовая кривая достигла плато. Возможное объяснение может быть связано с ограниченным объемом данных, доступных для обучения модели, из-за короткого периода сбора данных. Чтобы смягчить это, я экспериментировал с методами увеличения данных, такими как регулировка яркости и контрастности — искусственно создавая образцы с использованием существующих данных, чтобы улучшить способность модели лучше обобщать. Однако это не сработало, поскольку увеличение не отражало точно изменения входных изображений. Как видно из образцов изображений ниже, исходное изображение (слева) имело одинаковый уровень яркости, но цвета дополненного изображения (справа) выглядели неестественно. Не имея никаких улучшений в результатах, я решил изучить возможность добавления слоя исключения в архитектуру модели, где веса определенных узлов игнорируются в процессе обучения. Цель состоит в том, чтобы уменьшить чрезмерную зависимость модели от определенных узлов для определения ее выходных данных, что привело к возможности переобучения. Этот метод дал положительные результаты и был интегрирован в окончательную конструкцию модели.

Чтобы еще больше улучшить производительность модели, я попробовал две другие альтернативные модели.

● Я использовал двухэтапную модель: модель детектора, за которой следовала модель классификации. Предварительно обученная модель детектора YOLO обнаруживает транспортное средство по полнокадровому изображению и передает обрезанное изображение в модель классификации, чтобы предсказать марку/модель транспортного средства. Это сделано для того, чтобы свести к минимуму количество ненужной информации о пикселях изображения из окружающего фона, передаваемой в модель. Этот целенаправленный подход к классификации оказался более успешным, увеличив оценку модели в Формуле-1 на 8%.

● Помимо двухэтапной модели, я также экспериментировал с обучением модели детектора YOLOV8 на классах транспортных средств. Детектор пометит автомобиль маркой/моделью, которой он соответствует. Это оказался наиболее успешный вариант из всех, с которыми я экспериментировал: он достиг улучшенного показателя F1 на 16% по сравнению с исходной моделью одноэтапной классификации на полнокадровых изображениях. (См. процесс ниже)

3. Развертывание модели и разработка программного обеспечения

Для развертывания модели я разработал интерфейс прикладного программирования (API) Flask REST и поместил его в контейнер с помощью Docker. Докеризация обеспечивает легкое развертывание в различных средах. Это серверное приложение, которое выполняет вывод изображения, когда API вызывается вместе с входным изображением. Чтобы протестировать приложение, я использовал учебник GitHub, разработанный моим коллегой для изучения концепций разработки через тестирование (TDD). В ходе этого процесса я узнал о модульном тестировании с помощью PyTest и Postman, обеспечивающем надежность и эффективность функций API.

Следующий этап проекта был для меня интересным, поскольку это было мое первое знакомство с использованием облачных платформ. Для начала я изучил конвейер развертывания облака, который мой руководитель построил на Amazon Web Services (AWS). Это помогло мне разобраться с основными сетевыми концепциями, такими как веб-запросы, API и маршрутизация интернет-протокола (IP). Обладая этими новыми знаниями, я начал экспериментировать с развертыванием экземпляра Amazon Elastic Compute Cloud (EC2), который представляет собой сервис виртуальных машин (ВМ) на AWS.

После этого я приступил к реализации архитектуры с нуля в Microsoft Azure (как показано ниже). Я начал с просмотра онлайн-руководств и чтения документации по сервисам Azure. Поскольку у меня не было предварительных знаний по этой теме, это было довольно сложно. Я был благодарен за полезные ресурсы, рекомендованные коллегами для моего обучения. В конце концов мне удалось создать в Azure приложение, которое подключается к базе данных CosmosDB. Затем образ Docker был развернут на виртуальной машине Azure вместе с рядом сетевых ресурсов, таких как балансировщик нагрузки и шлюз трансляции сетевых адресов (NAT). Весь процесс потребовал нескольких итераций метода проб и ошибок и частых разъяснений с моими коллегами. Со временем я стал лучше знаком с концепциями облачных вычислений и платформой Azure — чему я еще не учился в школе.

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

Проблемы

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

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

При этом я рад, что встретил и преодолел эти трудности, поскольку они дали мне мотивацию учиться и расти, что и было целью моей стажировки в HTX.

Рабочая среда и командная культура

Моя стажировка не была бы такой плодотворной без поддержки и наставничества, которые я получал от всех членов команды. Мне было легко попросить совета или помощи, когда я сталкивался с какими-либо проблемами в моем проекте. Мои коллеги находили время, чтобы объяснить концепции, которые были мне чужды, или помочь мне найти решение проблемы, над которой я застрял. Я никогда не чувствовал, что мне отказывают в возможности учиться только потому, что я был стажером. Открытая и благоприятная рабочая атмосфера сделала мою стажировку приятным опытом!

В команде существует система наставничества, которая поддерживала мое техническое развитие в качестве стажера. С моим руководителем проводились еженедельные встречи, чтобы обсудить мой прогресс и рассказать о любых препятствиях, с которыми я сталкивался. Кроме того, я также встречался с заместителем директора на ключевых контрольно-пропускных пунктах, чтобы узнать его мнение о направлении моего проекта. В целом, благоприятная и поддерживающая среда помогла мне развить технические навыки в области ML и CV.

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

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

Мои выводы

Эта стажировка дала мне более глубокое понимание процесса разработки машинного обучения. Мой предыдущий опыт был в основном связан с обучением моделей, а здесь, в S&S, я приобрел практический опыт, экспериментируя с подготовкой данных и модификациями архитектуры моделей. Для меня стало очевидным значение обработки данных для производительности модели. Я также улучшил свои навыки критического мышления в поисках решений для улучшения результатов оценки. Мое самое большое достижение — реализация облачной архитектуры для развертывания моделей. Работа над развертыванием облака Microsoft Azure дала мне более широкое представление о технологиях, связанных с приложениями машинного обучения. Это была освежающая возможность обучения, которой иначе у меня не было бы в классе.

Помимо технических навыков, я оттачивал свои навыки решения проблем, находчивость и адаптивность. Используя свой предыдущий опыт работы в проектах Python, я научился находить онлайн-ресурсы, соответствующие моей задаче. Например, концепции в рамках TensorFlow и решения для повышения производительности модели. Я осознал важность нестандартного мышления и подхода к проблеме с разных точек зрения в ML.

S&S предоставила мне возможности для роста не только технических знаний, но и участия в проектах HTX. Особенно приятно было работать над реальными проектами, которые улучшали бы работу домашней команды. Помимо работы над своим проектом, я также присутствовал на открытии инновационного центра HTX Hatch, который служит пространством для сотрудничества между HTX и стартапами. Это было приурочено к выставке TechXplore 5, на которой различные центры управления в рамках HTX продемонстрировали свои научно-технические возможности. Это мероприятие дало мне более полное представление об усилиях HTX по поддержке деятельности домашней команды.

Что дальше

Вдохновленный стажировкой в ​​HTX, я планирую продолжать специализироваться в области ML и CV посредством углубленной курсовой работы и внеклассных мероприятий. Знакомство с реальными проектами S&S оказало на меня положительное влияние, побудив меня задуматься о карьере в этой области.

Я настоятельно рекомендую пройти стажировку в HTX S&S студентам, желающим получить практический опыт в области искусственного интеллекта, резюме или разработки программного обеспечения.

Я надеюсь, что моя статья дала представление о жизни стажера в S&S и HTX. Если вам интересно узнать больше о моем опыте, смело обращайтесь ко мне!

[1] Точность измеряет долю правильных положительных прогнозов модели от общего числа положительных прогнозов, сделанных моделью, взвешенных для каждого класса.

[2] Напомним, что измеряется доля правильных положительных прогнозов модели от общего количества положительных образцов для этого класса, взвешенных для каждого класса.

[3] Оценка F1 рассчитывается на основе среднего гармонического значения оценок точности и полноты, которое представляет собой произведение точности и полноты, разделенное на их сумму.