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

Кроме того, после запуска модели обнаружения объектов в производство сложно отслеживать ее работоспособность. Чтобы поддерживать производительность, модель должна быть переобучена и обновлена ​​данными, которые она увидела во время производства. Однако хранение и маркировка всех данных приведет к слишком большим накладным расходам. Обычной практикой является случайный отбор образцов для маркировки и повторного обучения модели. Это не решает реальной проблемы, поскольку вы упускаете ценные данные, которые могут повлиять на производительность модели.

Активное обучение: сокращение затрат на маркировку

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

Бывают ситуации, когда немаркированных данных много, а разметка вручную обходится дорого. В таком сценарии алгоритмы обучения могут активно запрашивать у пользователя / учителя ярлыки. Этот тип итеративного обучения с учителем называется активным обучением. Поскольку учащийся выбирает примеры, количество примеров для изучения концепции часто может быть намного меньше, чем количество, требуемое при обычном обучении с учителем. При таком подходе существует риск того, что алгоритм будет перегружен малоинформативными примерами. [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 мы постоянно пытаемся улучшить наши методы для создания современных решений. Как компания-разработчик программного обеспечения, мы можем предоставить стабильные и полностью разработанные решения. Не стесняйтесь обращаться к нам за дополнительной информацией.