Добро пожаловать в вторую из серии статей, посвященных тому, как использовать Data Science в качестве предлога для раздражения неприятного родственника!

Резюме

Эта статья является частью серии:

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

Предварительная обработка изображений

Чтобы решить, через какие преобразования должно пройти изображение, необходимо понимать, какой формат потребуется следующему компоненту (классификатору цифр). В нашем случае, поскольку мы планируем использовать классификатор изображений на основе набора данных MNIST¹, форматом является изображение 28 x 28 в оттенках серого, содержащее только одну цифру.

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

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

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

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

На этом этапе разделение изображения на 81 ячейку тривиально. Миссия выполнена [почти]!

Укради то, что можешь

Важное замечание о тайм-менеджменте: большая часть приведенного выше кода была написана не мной, а взята из различных источников, либо из комментариев stackoverflow, либо из одного из квадриллионов «Решите судоку с помощью глубокого обучения!» уроки здесь, на Medium или где-то еще. Черт, я даже не полностью понимаю его части, я просто играл с ним, пока не поверил, что он работает, а не поджарить мой компьютер в процессе.

Одна вещь, которую я понял после 36 лет на этой планете и бесчисленных эпизодов Доктора Кто, - это то, что время - это ресурс, и чаще всего его не хватает. Так что позвольте мне быть максимально точным:

Не изобретайте гребаное колесо заново.

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

Последний штрих

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

Глядя на вас, буквально любой классификатор, обученный на MNIST ¹.

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

Все, ребята

На этом пока все. Вы можете найти записную книжку jupyter, которую я использовал в этом репозитории, однако суть выше охватывает все существенные (и интересные части).

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

[1] В конечном итоге мы будем использовать что-то немного, но пока я планировал это, это казалось логичным выбором, поэтому пока я буду называть это так.

[2] Я начал пробовать сложные вещи, а потом просто сократил примерно по 10% с каждой стороны. Работает как шарм.