Отфильтруйте нужные шрифты из тысяч шрифтов Google.
Примечание. Это первая статья из серии из двух частей, в которой я расскажу о загрузке шрифтов Google и очистке аннотаций JSON, прежде чем мы сможем фильтровать шрифты и генерировать изображения PNG. Ссылка на вторую часть внизу.
В первый раз, когда я попытался изучить машинное обучение несколько лет назад, я чувствовал себя несчастным. Мне было трудно устанавливать зависимости, не говоря уже о понимании каких-либо основных алгоритмов машинного обучения. Перенесемся в 2020 год, когда у меня будет больше времени дома, и я решил дать ML еще одну попытку. На этот раз было намного проще найти дружественные учебные ресурсы и инструменты. Благодаря Tensorflow/Keras, Kaggle, Youtube и им подобным я, наконец, смог достаточно понять основы, чтобы провести несколько собственных экспериментов.
Одна вещь, которую я действительно хотел попробовать и изучить, — это обучать модели генеративно-состязательной сети с помощью шрифтов. Сначала было весело работать с простыми рукописными цифрами MNIST, но я хотел создать или курировать свой собственный набор данных, чтобы продолжить эксперименты. Что может быть лучше, чем Google Fonts для поиска множества бесплатных шрифтов? Это даст мне больше контроля над набором данных и возможность создавать изображения с высоким разрешением (MNIST составляет всего 28x28 пикселей). Он также поставляется с полезными аннотациями для каждого семейства шрифтов. Здесь я хотел бы поделиться своим опытом, начиная с загрузки и управления тысячами шрифтов Google и создания изображений PNG для каждого глифа. Если у вас есть опыт, это может показаться слишком простым, но для таких, как я, кто только начинает свой путь в ML, я надеюсь, что мой пост будет немного полезен. Этот пост является документацией моего процесса обучения.
Загрузите шрифты Google и аннотации JSON
Если вы зайдете в репозиторий Google Fonts Github, они удобно предоставят zip-архив (нажмите, чтобы загрузить), который включает в себя все файлы шрифтов (TTF), но я заметил, что этот zip-архив не всегда актуален. Вместо этого мы можем просто клонировать весь репозиторий Github с вашего терминала. Это должно дать вам самый актуальный список шрифтов. Если вы не хотите использовать Терминал, найдите зеленую кнопку Код, чтобы загрузить репозиторий в виде ZIP-файла.
> git clone
https://github.com/google/fonts.git
Если вы просто хотите использовать весь архив для экспериментов, этого будет достаточно, но я буду использовать Google Fonts API, чтобы получить немного больше информации о каждом шрифте в списке. Перейдите по этой ссылке на Google Fonts Developer API. Вам нужно будет получить бесплатный КЛЮЧ API для загрузки файла JSON, который мы будем использовать в оставшейся части этого поста.
https://www.googleapis.com/webfonts/v1/webfonts?key=ВАШ-API-КЛЮЧ
Хотя мы не можем использовать JSON непосредственно в обучении модели (скажем, GAN), мы можем легко и быстро извлечь полезную информацию о тысячах шрифтов, например, какие веса, стили, подмножества поддерживаются в каждом семействе шрифтов.
Настройка ноутбука Jupyter
Я буду рассматривать этот пост как блокнот Jupyter, поэтому, если вы хотите продолжить, вы можете открыть новый блокнот в своей среде и запускать каждую ячейку кода одну за другой. Кстати, я запускаю Jupyter Lab в среде Conda на MacbookPro.
Давайте сначала импортируем основные модули, которые мы будем использовать:
Загрузить аннотации JSON
Давайте сначала посмотрим на данные JSON, загрузив их как pandas.DataFrame. В файле JSON всего 2 столбца: тип и элементы. Столбец kind не кажется таким полезным, но столбец items содержит гораздо больше информации. Проблема в том, что он вложен и имеет формат dict
. Мы можем просто использовать pd.json_normalize()
, чтобы сгладить столбец items.
Мы можем отобразить одно из семейств шрифтов, чтобы увидеть его вблизи.
data.loc[data.family == 'Encode Sans']
Очистка и кодирование данных
Я решил, что мне не понадобятся многие столбцы для моего обучения машинному обучению. Столбцы, которые я нахожу особенно интересными, это family
, variants
, subsets
и category
, так как они напрямую влияют на формы букв. Давайте просто выберем эти столбцы.
Я также удаляю все пробелы из строки family
, потому что так называются файлы шрифтов. Это немного упростит задачу, когда мы позже загрузим пути к файлам.
Возможно, вы уже заметили, что значения столбцов варианты и подмножества заключены в квадратные скобки, как списки Python. (например, [regular, 500, 600, 700, 800]
) Мы создадим новые столбцы для каждого значения и назначим 0 или 1 для каждого семейства шрифтов. Эта горячая кодировка упростит фильтрацию шрифтов с различными условиями. (т. е. фильтровать шрифты с обычными весами, которые поддерживают тайский набор символов.) Я испробовал несколько различных методов, и модуль Scikit-Learn дал мне нужный результат.
Теперь у нас есть отдельные столбцы для каждой переменной, а семейства шрифтов имеют значение 0 или 1 для каждого столбца в зависимости от того, поддерживают ли они каждую переменную. Столбцы варианты называются 100, 100italic, 200, 200italic, 300, 300italic и т. д., что вполне может работать, но я хотел сделать еще один шаг вперед, переименовав их. чтобы он соответствовал тому, как названы файлы шрифтов. (например, Barlow-BlackItalic.ttf вместо Barlow-900italic.ttf) Эту ручную маркировку определенно можно было бы улучшить, но у меня это все равно сработало.
Экспортировать как CSV-файл
Я думаю, что наш DataFrame выглядит довольно хорошо на данный момент. Давайте экспортируем как файл CSV. Числовые значения индекса, похоже, не имеют существенного значения для наших целей, поэтому я решил не включать их в файл.
df.to_csv('google-fonts-annotaion.csv', index=False)
Что дальше
В следующей части мы загрузим этот CSV-файл в другой блокнот, отфильтруем шрифты, а затем создадим набор изображений PNG.
Пожалуйста, дайте мне знать, если у вас есть какие-либо комментарии или предложения, и я увижу вас в следующем посте.