Мы создадим простой инструмент, который распознает рисунки и выводит имена текущего рисунка. Это приложение будет работать прямо в браузере без каких-либо установок. Мы будем использовать Google Colab для обучения модели и развернем ее в браузере с помощью TensorFlow.js.

Код и демонстрация

Найдите живую демонстрацию и код на GitHub. Также обязательно протестируйте ноутбук на Google Colab здесь.

Набор данных

Мы будем использовать CNN для распознавания рисунков разных типов. CNN будет обучаться на наборе данных Quick Draw. Набор данных содержит около 50 миллионов рисунков 345 классов.

Трубопровод

Мы бесплатно обучим модель на GPU в Google Colab с помощью Keras, а затем запустим ее в браузере напрямую с помощью TensorFlow.js (tfjs). Я создал туториал по TensorFlow.js. Обязательно прочтите его, прежде чем продолжить. Вот конвейер проекта

Тренируйтесь на Колабе

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

Импорт

мы будем использовать keras с бэкэндом tenorflow

Загрузите данные

Поскольку у нас ограниченная память, мы не будем тренироваться по всем классам. Мы будем использовать только 100 классов набора данных. Данные для каждого класса доступны в Google Cloud в виде множества массивов формы [N,784], где N - количество изображений для этого конкретного класса. Сначала мы загружаем набор данных

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

Предварительная обработка данных

Мы предварительно обрабатываем данные, чтобы подготовить их к обучению. Модель будет брать партии формы [N, 28, 28, 1] и выводить вероятности формы [N, 100].

Создать модель

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

Подгонка, проверка и тестирование

После этого мы обучаем модель для 5 эпох и 256 пакетов с 10% разбиением на валидацию.

Вот результаты обучения

А точность тестирования - 92.20% наивысшая 5 точность.

Подготовьте модель к веб-формату

Убедившись в точности модели, мы сохраняем ее, чтобы преобразовать.

устанавливаем пакет tfjs для конвертации

затем мы конвертируем модель

Это создаст несколько файлов весов и файл json, который содержит архитектуру модели.

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

наконец скачать модель

Вывод в браузере

В этом разделе мы покажем, как загрузить модель и сделать вывод. Предположу, что у нас есть холст размером 300 x 300. Я не буду вдаваться в подробности интерфейса и остановлюсь на части TensorFlow.js.

Загрузка модели

Чтобы использовать TensorFlow.js, сначала используйте следующий скрипт

Вам понадобится работающий сервер на вашем локальном компьютере для размещения файлов веса. Вы можете создать сервер apache или разместить страницу на GitHub, как я сделал в своем проекте.

После этого загрузите модель в браузер с помощью

Ключевое слово await ожидает загрузки модели браузером.

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

Нам нужно предварительно обработать данные, прежде чем делать прогноз. Сначала получите данные изображения с холста

getMinBox() будет объяснено позже. Переменная dpi используется для растягивания кадрирования холста в соответствии с плотностью пикселей экрана.

Берем текущие данные изображения холста, конвертируем в тензор, изменяем размер и нормализуем

Для предсказания мы используем model.predict, это вернет вероятности формы [N, 100]

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

Повышение точности

Помните, что наша модель принимает тензоры формы [N, 28, 28,1]. У нас есть холст для рисования размером 300 x 300, который может быть в два раза больше для рисунков, или пользователь может нарисовать небольшую фигуру. Лучше обрезать только ту рамку, которая содержит текущий рисунок. Для этого мы извлекаем минимальную ограничивающую рамку вокруг чертежа, найдя верхнюю левую и нижнюю правую точки.

Тестовые чертежи

Вот несколько рисунков впервые и высший процентный класс. Все рисунки я делал мышкой. Вы должны добиться большей точности, используя ручку…