В своих проектах активно использую сверточные сети на базе фреймворка Caffe. Но они все работают либо в изолированных средах, а обмен данными идет через СУБД, либо через достаточно сложные http-сервисы.
Поэтому, пару недель назад тренируясь с питоном и caffe задумался как можно попроще запускать нейросеть на caffe для веб-сервиса на node.js
Кому интересно — внутри коротко как это реализовал и ссылка на пример.
Для наглядности взял колоризатор черно-белых фото. Данная система написана на питоне и имеет входной тестовый скрипт colorize.py.
Задача сводится к тому, чтобы по запросу запустить процесс с питоном, colorize.py и аргументами, затем вернуть результаты. Для таких задач в node.js есть модуль child_process. В документации написано, что метод spawn() асинхронно запускает процесс с заданной командой, а это как раз то, что надо .
В нашем случае команда:
python ./colorize.py -img_in PATH_TO_MY_BW.PNG -img_out PATH_TO_MY_COLOR.PNG
Код для child_process получается такой:
const spawn = require('child_process').spawn; const arg = ['colorize.py', '-img_in', 'PATH_TO_MY_BW.PNG', '-img_out', 'PATH_TO_MY_BW.PNG']; const py = spawn('python', arg); py.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); py.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); py.on('close', (code) => { console.log(`child process exited with code ${code}`); });
Для обработки запросов использовал Express. Фронтенд — Angular. Весь исходный код можно посмотреть здесь. Конкретно сам обработчик находится здесь
Может быть, я сам такой "зеленый", но данная задача была не совсем тривиальной для меня. Надеюсь кому-то данный пост сэкономит хоть какое-то время.
ссылка на оригинал статьи https://habrahabr.ru/post/326864/
Добавить комментарий