ml5.js предоставляет высокоуровневый интерфейс для работы с различными предобученными моделями машинного обучения в браузере, включая SketchRNN — модель для генерации и дополнения рисунков на основе последовательностей штрихов. Работа с SketchRNN начинается с загрузки соответствующей модели и её использования для генерации рисунков или автодополнения существующих эскизов.
Для работы с SketchRNN необходимо подключить библиотеку ml5.js через
<script>:
<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>
После этого в коде JavaScript становится доступен объект
ml5, через который создаются и управляются модели.
Основной класс для работы — ml5.sketchRNN. Он принимает
два параметра: имя модели или URL к предобученной модели и функцию
обратного вызова, которая вызывается после загрузки.
let sketchRNN;
function setup() {
// Загрузка модели "cat"
sketchRNN = ml5.sketchRNN('cat', modelLoaded);
}
function modelLoaded() {
console.log('Модель загружена и готова к использованию');
}
Ключевой момент: загрузка модели асинхронна. Пока модель не загружена, попытки использовать её для генерации рисунков вызовут ошибку.
ml5.js предоставляет ряд предобученных моделей SketchRNN, ориентированных на разные категории рисунков:
cat — кошкиdog — собакиbird — птицыchair — стульяface — лицаcar — автомобилиКаждая модель оптимизирована для генерации определённого типа эскизов и имеет свой словарь штрихов.
SketchRNN оперирует последовательностями штрихов, а
не пикселями. Каждое движение пера описывается массивом
[Δx, Δy, penDown, penUp, penEnd]. После загрузки модели
можно создавать новый рисунок следующим образом:
let currentStroke = null;
function startDrawing() {
sketchRNN.reset(); // Сброс состояния модели
sketchRNN.generate((err, stroke) => {
currentStroke = stroke;
drawStroke(stroke);
});
}
function drawStroke(stroke) {
// stroke содержит dx, dy и состояния пера
line(stroke.dx, stroke.dy, stroke.dx, stroke.dy);
if (!stroke.penEnd) {
sketchRNN.generate(drawStroke);
}
}
Важное свойство: sketchRNN.reset()
очищает внутреннее состояние LSTM, что позволяет начинать генерацию с
чистого листа.
SketchRNN может дополнять существующие рисунки. Для этого
последовательность штрихов передаётся в метод generate как
входные данные.
let existingStrokes = [
{dx: 0, dy: 0, penDown: true, penUp: false, penEnd: false},
{dx: 10, dy: 5, penDown: true, penUp: false, penEnd: false},
];
sketchRNN.generate(existingStrokes, (err, newStroke) => {
drawStroke(newStroke);
});
Модель продолжает рисунок, подстраиваясь под стиль уже нанесённых штрихов.
Метод generate поддерживает параметр
temperature, который влияет на разнообразие создаваемых
штрихов:
temperature = 0.1 — очень предсказуемые штрихиtemperature = 0.5 — умеренная вариативностьtemperature = 1.0 — высокая случайностьsketchRNN.generate({temperature: 0.5}, (err, stroke) => {
drawStroke(stroke);
});
Чем выше температура, тем менее повторяющейся и более творческой становится генерация.
SketchRNN использует LSTM для генерации последовательностей, поэтому можно управлять и наблюдать за внутренними состояниями модели:
sketchRNN.state — текущие скрытые состояния сетиsketchRNN.reset() — сброс состоянияsketchRNN.generate() — генерация следующего штрихаЭти возможности позволяют создавать сложные интерактивные приложения с динамическим автодополнением рисунков.
Помимо предобученных моделей, ml5.js позволяет загружать собственные модели SketchRNN:
sketchRNN = ml5.sketchRNN('path/to/custom/model.json', modelLoaded);
Формат модели должен соответствовать стандарту SketchRNN (JSON с LSTM-параметрами и словарём штрихов). После загрузки пользовательская модель работает точно так же, как встроенные модели.
modelLoaded для предотвращения ошибок при попытке генерации
до окончания загрузки.temperature позволяют
создавать уникальные стили рисунков.Эта структура работы с SketchRNN в ml5.js обеспечивает гибкость и удобство как для генерации новых рисунков, так и для создания интерактивных художественных приложений в браузере.