В контексте обучения с учителем сверточные нейронные сети доказали свою эффективность в приложениях компьютерного зрения, таких как обнаружение объектов. Эти алгоритмы, как правило, требуют большого количества помеченных данных, что само по себе является очень частым препятствием, поскольку требует много времени и очень дорого.
Кроме того, после запуска модели обнаружения объектов в производство сложно отслеживать ее работоспособность. Чтобы поддерживать производительность, модель должна быть переобучена и обновлена данными, которые она увидела во время производства. Однако хранение и маркировка всех данных приведет к слишком большим накладным расходам. Обычной практикой является случайный отбор образцов для маркировки и повторного обучения модели. Это не решает реальной проблемы, поскольку вы упускаете ценные данные, которые могут повлиять на производительность модели.
Активное обучение: сокращение затрат на маркировку
Это особый случай машинного обучения, который используется, когда разметка набора данных требует много времени и затрат, а также имеет ограниченную вычислительную мощность и объем хранилища. Используя активное обучение, мы можем достичь высокой производительности, сэкономив время на маркировку и выбор только ценных данных.
Бывают ситуации, когда немаркированных данных много, а разметка вручную обходится дорого. В таком сценарии алгоритмы обучения могут активно запрашивать у пользователя / учителя ярлыки. Этот тип итеративного обучения с учителем называется активным обучением. Поскольку учащийся выбирает примеры, количество примеров для изучения концепции часто может быть намного меньше, чем количество, требуемое при обычном обучении с учителем. При таком подходе существует риск того, что алгоритм будет перегружен малоинформативными примерами. [1]
Активное обучение в вашем проекте по обнаружению объектов
Конечно, обнаружение объектов - это ситуация, когда активное обучение полезно, но когда именно его следует использовать?
Перед производством:
Когда модель обнаружения объектов все еще находится на этапе обучения-тестирования, данные уже собираются.
1- Разделите набор данных: набор данных следует разделить на обучающий и проверочный наборы. Очень важно учитывать, что у вас должен быть достаточно большой набор валидации, и его нельзя менять. Это гарантирует, что вы можете отслеживать показатели производительности модели после каждого процесса обучения, так как вы постоянно обновляете обучающий набор.
2- Разделение обучающего набора: обучающий набор следует разделить на несколько подмножеств, которые затем будут многократно использоваться для повторного обучения модели.
3- Обозначьте подмножество. Первое обучающее подмножество следует пометить вручную, нарисовав ограничивающие рамки на объектах, которые необходимо обнаружить в будущем.
4- Обучите и оцените модель. Модель должна быть обучена на обучающем подмножестве. После этого оцените производительность модели на наборе для проверки и сохраните ее метрики производительности.
5- Создайте ярлыки. Если вы заметили, набор тестов не использовался. Это потому, что подмножества обучающего набора будут играть роль этого набора. Модель тестируется на следующем обучающем подмножестве, и метки сохраняются в файлах xml. Это позволяет нам редактировать метки.
Функция для создания и сохранения файлов xml вызывается после того, как модель сгенерирует ограничивающие прямоугольники и категории для каждого изображения в обучающем подмножестве:
def xml_writer(xml_directory, full_path_to_image, image_width, image_height, bounding_boxes, categories): file_xml = full_path_to_image.split(".", 1)[0].split("/")[-1] file_xml = file_xml + '.xml' file_xml = os.path.join(xml_directory, file_xml) file_name = full_path_to_image.split('/')[-1] folder_name = full_path_to_image.split('/')[-2] annotation = ET.Element('annotation') folder = ET.SubElement(annotation, 'folder') filename = ET.SubElement(annotation, 'filename') path = ET.SubElement(annotation, 'path') source = ET.SubElement(annotation, 'source') ############################################ database = ET.SubElement(source, 'database') ############################################ size = ET.SubElement(annotation, 'size') ############################################ width = ET.SubElement(size, 'width') height = ET.SubElement(size, 'height') depth = ET.SubElement(size, 'depth') ############################################ segmented = ET.SubElement(annotation, 'segmented') for i in range(len(bounding_boxes)): object = ET.SubElement(annotation, 'object') name = ET.SubElement(object, 'name') pose = ET.SubElement(object, 'pose') truncated = ET.SubElement(object, 'truncated') difficult = ET.SubElement(object, 'difficult') bndbox = ET.SubElement(object, 'bndbox') ################### xmin = ET.SubElement(bndbox, 'xmin') ymin = ET.SubElement(bndbox, 'ymin') xmax = ET.SubElement(bndbox, 'xmax') ymax = ET.SubElement(bndbox, 'ymax') ################### category = get_category_name(categories[i]) name.text = category pose.text = 'Unspecified' truncated.text = '0' difficult.text = '0' xmin.text = str(int(bounding_boxes[i, 0])) ymin.text = str(int(bounding_boxes[i, 1])) xmax.text = str(int(bounding_boxes[i, 2])) ymax.text = str(int(bounding_boxes[i, 3])) ############################################ folder.text = folder_name filename.text = file_name path.text = full_path_to_image database.text = 'Unknown' width.text = str(image_width) height.text = str(image_height) depth.text = '3' segmented.text = '0' # create a new XML file with the results mydata = ET.tostring(annotation).decode("utf-8") myfile = open(file_xml, "w") myfile.write(mydata)
6- Оцените и исправьте метки: А вот и работа человека, ответственного за оценку меток, созданных ранее обученной моделью. Надписи необходимо исправить, например изменить размер ограничивающей рамки, удалить ложные срабатывания и добавить ложноотрицательные.
7- Создайте новый обучающий набор. Эта тема все еще активно изучается. Один из подходов - объединить старые обучающие подмножества с новыми для обучения модели, это рекомендуется, когда у вас достаточно вычислительных ресурсов. Другой подход заключается в случайном выборе процента прошедших обучающих подмножеств, чтобы уменьшить размер общего обучающего подмножества, это рекомендуется, когда вычислительные ресурсы ограничены.
8- Повторите с шага 4: Повторяйте процесс с шага 4 до тех пор, пока все подмножества не будут отмечены, вы успешно тренировались и достигли необходимой производительности. Другие случаи включают остановку после того, как производительность не улучшится значительно выше определенного порога.
После производства:
После запуска модели в производство очень важно следить за ее работоспособностью. Поскольку на этом этапе в модель вводятся новые данные, вам необходимо постоянно обновлять модель. Однако проблема, с которой мы сталкиваемся, заключается в стратегии, необходимой для создания нового обучающего подмножества. Как упоминалось ранее, распространенным подходом является случайная выборка из данных, которые проходят через модель в рабочем режиме, и этого недостаточно. Лучший подход - позволить модели выбирать из данных на основе ее производительности на образцах. Две распространенные стратегии:
1- Выборка, основанная на достоверности модели при обнаружении любого объекта в образце изображения. Если достоверность ниже определенного порогового значения, образец проходит через модель, которая маркирует его и выдает xml для своих этикеток. Это сохраняется в новом обучающем подмножестве, оценивается ответственным лицом, а затем используется для обучения модели, чтобы обеспечить лучшую производительность при аналогичных будущих появлениях.
2- Выборка на основе недостаточной производительности модели для определенного класса. Во многих случаях исходный обучающий набор может вызвать недостаточную эффективность определенного количества классов. Причина может быть связана с дисбалансом классов набора данных. Другая причина связана с наличием двух или более классов, которые имеют много общего, что приводит к трудностям в способности модели различать образцы этих классов.
Предлагаемый метод выборки гарантирует, что в будущем при появлении любого из ранее упомянутых случаев образец будет проходить через модель, которая маркирует ее и создает файл xml для своих меток. Это сохраняется в новом обучающем подмножестве, оценивается ответственным лицом, а затем используется для обучения модели, чтобы обеспечить лучшую производительность при аналогичных будущих появлениях.
Заключение
Простая структура для использования активного обучения при обнаружении объектов была предложена, чтобы значительно сэкономить время и ресурсы на усилиях по маркировке для обучения модели обнаружения объектов. Кроме того, предложенная работа доказала свою эффективность в улучшении характеристик модели после стадии производства.
использованная литература
[1] https://en.wikipedia.org/wiki/Active_learning_(machine_learning)
[2] https://www.datacamp.com/community/tutorials/active-learning
[3] https://arxiv.org/abs/1908.02454
В IxorThink мы постоянно пытаемся улучшить наши методы для создания современных решений. Как компания-разработчик программного обеспечения, мы можем предоставить стабильные и полностью разработанные решения. Не стесняйтесь обращаться к нам за дополнительной информацией.