Skip to content

Latest commit

 

History

History
88 lines (67 loc) · 13.3 KB

File metadata and controls

88 lines (67 loc) · 13.3 KB

Capture solver

Постановка задачи

Решаем задачу поиска целевого предмета среди множества изображений по предложенному образцу. Каждая капча - это группа изображений, среди которых необходимо выбрать правильный ответ, и картинка-подсказка, в которой зашифрован ответ. На каждом из вариантов ответа изображены 3D объекты, расположенные на конвейерах в два ряда. Количество объектов вариьруется от 4 до 8 штук. Правильным ответом является изображение, на котором стрелка указывает на объект на конвейере, совпадающий с объектом, изображенным на картинке-подсказке.

В примере ниже на подсказке (изображение в нижнем ряду) изображена подставка для яйца, поэтому нужно выбрать седьмое изображение (в верхнем ряду), где стрелка указывает на тот же объект. Объекты на конвейерах расположены в случайном порядке и случайной ориентации. image

Для поиска решения на входе имеем два набора.

Первый набор состоит из двух директорий: images_100 и labels_100. Всего в них находятся 100 капч с разметкой баундинг боксов для всех объектов (label=object) на изображении, включая стрелку (label=icon) и ответ (label=true_object). image

Второй набор также из аналогичных двух директорий: images_train и labels_train. В них находятся 3998 капч с разметкой баундинг бокса только для ответа (label=true_object). image

Разметка не имеет классификатора, т.е. все метки являются одинаковыми object без указания что это за предмет. Разметка в формате labelme.

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

Решение

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

Шаг 1.

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

Теперь у нас есть классифицированный датасет из ~10000 картинок 15 предметов.

Для выработки пути решения отметим ключевые моменты, каждый из которых будем использовать:

  1. Картинка-подсказка расположена на равномерно сером тоне и сама выполнена в градациях серого.
  2. Картинки в зоне поиска уже цветные и расположены на неравномерном случайно-градиентном сером фоне.
  3. Стрелки, указывающие на варианты ответов расположены в фиксированных позициях.
  4. Правильные ответы локализованы в ограниченной зоне около вертикали от стрелки.
  5. Общий размер полотна 1600 х 400.
  6. Область картинки-подсказки в левом нижнем углу размерами 130 х 200.

Шаг 2.

Пайплайн решения тогда будет выглядеть так:

  1. Соберем и обучим первую модель YOLOv8 для распознавания предмета в зоне картинки-подсказки. Возвращать будем класс с наибольшим confidience.
  2. Соберем и обучим вторую модель YOLOv8 для распознавания и классификации всех предметов на полотне. Возвращать будем классы и координаты центров bbox после детекции.
  3. Найдем минимум евклидова расстояния между координатами центров 8 стрелок и координатами классов совпадающих с подсказкой - это и будет центр искомого предмет.
  4. Проверим, чтобы найденная точка находилась внутри объекта true_objects из исходной json разметки - это будет успешное предсказание. Все остальные случаи - неуспешное предсказание.
  5. Определим итоговую точность решения как отношение успешных предсказаний как всем попыткам. Наша цель - не менее 95%.

Шаг 2.1

Сборка датасета для обучения первой модели.

  1. У нас есть вырезанные предметы. Для подсказки они нужны серыми - переведем их все в градации серого.
  2. Поскольку предметы вырезались по границам рамок из json файла, то координаты аннотаций очевидно у каждого предмета теперь будут по краям его изображения.
  3. Подготовим серую подложку 130 х 200 и поместим на ней в случайном месте предмет.
  4. Зная размер исходной картинки, размер подложки и величину смещения картинки на полотне, переопределяем координаты bbox в аннотациях.
  5. Сделаем сплитование 80/20 по каждому классу и получаем итоговый общий датасет.

1714395085738 1714395156772 1714395197521 1714395350535 1714395371719 1714395391593 1714395398994

Шаг 2.2

Сборка датасета для обучения второй модели.

  1. Создадим подложку 1600 х 400 и заполним ее для каждого вызова случайным перлинским шумом, имитирующим фон для зоны поиска.
  2. В предложенных наборах мы видим примерно по 40-50 предметов на каждом исследуемом изображении, которые занимают верхнюю его половину. Будем заполнять учебную подложку полностью, поэтому будет 80-100 случайных предметов, раскиданных с зазорами между собой по полотну.
  3. Аналогично прошлого шага фиксируем координаты bbox каждого предмета со своим классом в аннотациях.
  4. Сделаем сплитование 80/20 по каждому классу и получаем итоговый общий датасет.

canvas_3

Шаг 3.

Тестирование и проверка точности. image image image

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

  1. Неверно определен предмет в подсказке.
  2. Не обнаружен никакой предмет в подсказке (no detection).
  3. Неверно определен предмет в зоне поиска на месте истинного ответа.
  4. Неверно определены оба предмета.
  5. Неверно записаны координаты истинного ответа true_objects в json файле:
    • Координаты выходят за пределы зоны поиска - этот случай принудительно исключаю из рассмотрения и переходим к следующему входному изображению.
    • Координаты правого нижнего угла меньше координат левого верхнего угла - этот случай принудительно исключаю из рассмотрения и переходим к следующему входному изображению.
    • Расхождение графической метки с числовыми координатами, не попавшее в два предыдущих случая, выявить нельзя, поэтому принимаю такой случай как истинную ошибку.
  6. При детекции второй моделью bbox определен по правильному предмету, но не соответствует его реальным границам - возможен выход предсказанного центра за пределы целевого bbox из true_objects в json файле.

Итоги

Поскольку в процессе обучения не использовались предоставленные наборы данных в исходном виде, а были сформированы полностью свои датасеты, то для тестов допустимо использовать все исходные наборы images_100 + labels_100 (100 пар) и images_train + labels_train (3998 пар) в полном объеме.

image

Итоговые результаты выборочных тестов на 400 картинках: Total: 400, Correct: 370, Errors: 30 (hint not detected: 2), Accuracy: 92.50%