Прототип разрабатывается как распределенная система: графический интерфейс с частичной обработкой графических данный (далее графики) и удаленное ядро, производящее основную и финальную обработку изображений.
Графический интерфейс – node based: Каждая операция производимая над изображением переставляется как узел (node), узлы связны между собой связями образуя дерево (ориентированный граф) решений. Данные идут от узла (node) Read (или ноды генерирующей процедурное изображение (constant color, gradient и т. п.)) к узлу Write поэтапно подвергаясь обработке в каждом узле. Узлы делятся на: Color correct, Image transform, Image read/write/view, Image create, Image filter, Image merge, Image channel editing. Узлы Read и ноды генерирующие процедурные изображения объявляются корневыми (root) узлами, с них начинается исполнение процесса.
Перед обработкой изображение разбивается на части (tiles). Каждая часть попадает в отдельный поток конвейерной обработки (в соответствии с загруженным сценарием). На выходе отдельные части собираются в результирующее изображение. Каждая из частей может быть обработана как локально так и на удаленном сервере (облаке). Также возможна обработка всего изображения целиком.
Архитектура системы
Сценарий исполнения представлен в виде ориентированного графа, где каждый узел(нода) это объект с описанием процедур и свойств: node.procedure, node.properties. Перед выполнением ядро преобразует граф и ориентирует его для последовательного выполнения операций.
Пример:
read_01(file_name_01.jpg)->blur_01->size_01
read_02(file_name_02.jpg)->blur_02->size_02
выходы с узлов size_01 и size_02 идут в узел merge (plus) где происходит сложение обеих потоков с последующей записью (write) на диск. Ядро разворачивает граф и выполняет последовательно:
read_01->blur_01->size_01 || read_02->blur_02->size_02 ||
size_01,size_01-->> megre(plus)->write(file_name_out.jpg)
В узле (node) так же есть ссылка (кроме узлов root) на источник данных (предыдущий узел в графе).
Через ссылки все узлы связанны, образуя ориентированный граф:
read_01->size_01(link to read_01)->write_01(link to size_01)
Узел Merge имеет как минимум два входа: merge_01(link_a, link_b)
Реализованные функции: Read, Write, Blur, Sharpen, Color Correct, Size, Rotate, Composite, View.
Формат описания сценария: JSON
Для разработки ядра применяются: Python 2.7, Python Image Library, Numpy/Scipy
Библиотеки для визуализатора графов: NetworkX, matplotlib
Визуализация графа
Пример сценария: (test.json):
{
"node1":{
"name" : "read_01",
"type" : "read",
"file" : "in.jpg",
"id": 1
},
"node2":{
"name" : "blur_01",
"type" : "blur",
"link" : "read_01",
"size" : 10,
"id": 2
},
"node3":{
"name" : "write_01",
"type" : "write",
"link" : "blur_01",
"file" : "test.jpg",
"id": 3
}
}
Автор не ставит перед собой цели выпустить готовое программное обеспечение.
Это исследовательский проект. Just for fun.
Ссылка на репозиторий с проектом:
github.com/shrimo/node_image_tools
Эскизы GUI:
www.behance.net/gallery/Neural-composer/6203259
Подробное описание процедур и свойств узлов:
docs.google.com/document/d/1ehPRAwRzhlibXLq6l_6LlObTzN8K20E6Toa9820EmvY/pub
Автор: shrimo