января 30, 2019

darktable 2.4 > Специальные темы > Применение darktable-chart > Создание входного изображения для darktable-chart

ПРЕД.

10.3. Применение darktable-chart       


10.3.6. Создание входного изображения для darktable-chart

Для начала вам нужна подходящая фотография вашей цветовой мишени в формате RAW+JPEG. Способ получения этой фотографии выходит за рамки настоящего руководства, но в двух словах вам нужно сделать снимок в солнечный день в полдень, когда источник света (солнце) светит под углом к карте. Вам нужно избегать бликов на изображении. Образец нейтрального белого цвета в серой рампе (G00) должен заканчиваться значением L, указанным в описании вашей карты. Часто это L=92, и вам, возможно, потребуется переэкспонировать снимок примерно на 1/3 EV. В идеале вы сделаете несколько снимков с разными экспозициями, чтобы впоследствии выбрать правильный в darktable. Убедитесь, что мишень заполняет большую часть кадра. Возьмите объектив с "нормальным" фокусным расстоянием (например, эквивалент 50 мм) и немного отдалитесь от мишени, чтобы избежать виньетирования.

Затем откройте raw-файл в darktable и отключите большинство модулей, особенно модуль "Базовая кривая". Выберите стандартную матрицу ввода в модуле "ICC профиль ввода" и отключите "Обрезка цветового охвата". Выберите "Камера" в модуле "Баланс белого" (см. раздел 3.4.1.4, "Базовая кривая", раздел 3.4.3.11, "ICC профиль ввода" и раздел 3.4.1.10, "Баланс белого").

Существует особая ситуация, если ваша камера автоматически применяет некоторые корректировки линз, а именно коррекцию виньетирования, к результирующему файлу JPEG. В этом случае вам необходимо активировать модуль "Оптические искажения" в darktable, чтобы обработка raw соответствовала JPEG в этом отношении (см. раздел 3.4.4.8 "Оптические искажения").

Для сохранения изображения перейдите в модуль "Экспорт снимков" в darktable (см. раздел 2.3.12 "Экспорт снимков").

Вы должны выбрать "Lab" в качестве цветового профиля экспорта. Это цветовое пространство по умолчанию не отображается в поле со списком. Сначала вам нужно включить его, установив параметр allow_lab_output в значение TRUE в $HOME/.config/darktable/darktablerc (%homepath%\AppData\Local\darktable\darktablerc для ОС Windows). Кроме этого, вы можете запустить darktable командой:

darktable --conf allow_lab_output=true

Затем выберите "PFM (float)" в качестве выходного формата и нажмите "Экспорт", чтобы сгенерировать исходный файл изображения.

Аналогичным образом создайте соответствующее целевое (референсное) изображение из JPEG. Также на этот раз вам нужно отключить все модули и экспортировать с помощью цветового профиля экспорта "Lab" в формате "PFM (float)".

     

ПРЕД.

10.3. Применение darktable-chart

10.3.5. Процесс

Если все необходимые настройки в "source image" и "reference values" готовы, вы можете перейти на вкладку "process".

Сначала вам нужно указать, darktable-chart какие из образцов представляют серый рамп. На скриншоте, отображаемом выше, серая рампа расположена в нижней части контрольной диаграммы цвета, обозначенной как "GS00 ... GS23".

Ввод "number of final patches" определяет, сколько редактируемых цветовых образцов будет содержать результирующий стиль в модуле "Таблица поиска цветов" (более подробно см. раздел 3.4.3.6, "Таблица поиска цветов").

Нажимая кнопку "process", вы запускаете расчет.

Качество результата с точки зрения средней дельта E и максимальной дельта E отображается под кнопкой. Эти данные показывают, насколько близок результирующий стиль, применяемый к исходному изображению, соответствует результирующим значениям - чем меньше значение, тем лучше.

Когда вы довольны результатом, вы можете нажать "export" и сохранить созданный стиль.

Вы должны указать название стиля и сделать его описание, под которыми стиль будет затем отображаться в darktable. Darktable-chart сохраняет стиль как файл формата .dtstyle, который можно импортировать в darktable (см. раздел 2.3.8, "Стили обработки") и использовать совместно с другими.

Кнопка "export raw data as csv" позволяет сохранять извлеченные raw-данные в виде файла CSV для целей отладки или использования позднее. Darktable-chart предлагает параметр командной строки для создания стиля с нужным количеством окончательных образцов из поставляемого CSV-файла (см. раздел 1.1.4, "Бинарный файл darktable-chart").

января 28, 2019

darktable 2.4 > Специальные темы > Применение darktable-chart > Целевые значения (Reference values)

ПРЕД.

10.3. Применение darktable-chart

10.3.4. Целевые значения ( Reference values)

Вкладка "reference values" определяет целевые значения, к которым исходное изображение должно быть преобразовано в результате применения стиля. Вы можете либо указать опорные значения в виде замеренных данных вашей цветовой мишени (режим "cie/it8 file"), либо предоставить фотографическое изображение (режим "color chart image") таким же образом, как описано выше. Это второе изображение также должно быть представлено в формате Lab Portable Float Map. Нет необходимости снова предоставлять файл шаблона мишени, так как darktable-chart использует тот же самый, что и в во вкладке "source image". Вам нужно снова выровнять сетку шаблона и изображение и, возможно, настроить, ползунок "size".

В типичном случае использования - второе изображения будет основано на файле JPEG, создаваемом в камере. Таким образом, вы можете создать стиль для имитации обработки внутри камеры в darktable.

В нижнем текстовом выходном кадре вы видите значения цветов, извлеченные из доступных данных для каждого отдельного цветового образца. В первом столбце указывается имя образца, второй и третий столбцы соответствуют значениям цвета исходного изображения в формате RGB и Lab. Четвертый столбец содержит значение Lab, поступающее из целевого изображения (или из файла шаблона мишени, если целевое изображение не было дано). Наконец, пятый и шестой столбцы показывают, насколько сильно исходные и целевые значения отклоняются с точки зрения значений дельта Е.

января 26, 2019

darktable 2.4 > Специальные темы > Применение darktable-chart > Исходное изображение (Source image)

ПРЕД.

10.3. Применение darktable-chart

10.3.3. Исходное изображение (Source image)

Во вкладке "source image" вы устанавливаете исходное изображение, которое требует двух компонентов. Первый компонент - это входной файл в формате Lab Portable Float Map (расширение .pfm). Входной файл представляет немодифицированные данные, так как их видит камера. Подробная информация о съемке цветовой мишени и создании файла формата .pfm описана ниже. Второй компонент - это файл шаблона мишени, который содержит формальное описание шаблона цветовой мишени (расширение .cht). Файлы шаблонов мишеней обычно идут с вашей цветовой мишенью или могут быть загружены из Интернета.

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

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














Прямоугольная рамка отображается для каждого образца и определяет область, из которой darktable-chart фактически будет брать необходимые входные данные. Может потребоваться изменить размер рамок так, чтобы область выборки была достаточно большой, но не перекрывалась с соседними образцами. Используйте ползунок "Size" в верхней правой части графического интерфейса. Более высокие значения приводят к меньшим размерам.

января 24, 2019


ПРЕД.

10.3. Применение darktable-chart

10.3.2. Применение

Инструмент состоит из трех вкладок в верхней части и текстового фрейма вывода текста в нижней части.

















Первая вкладка используется для определения исходного изображения, вторая вкладка определяет целевое (референсное) изображение, а третья вкладка содержит элементы управления для генерации полученного darktable стиля.

января 22, 2019

darktable 2.4 > Специальные темы > Применение darktable-chart

ПРЕД.

Глава 10. Специальные темы

10.3. Применение darktable-chart

10.3.1. Обзор

Darktable-chart представляет инструмент для извлечения яркости и значения цвета из изображений, сделанных по цветовым мишеням, таким как IT8.7/1. Его основная цель - сравнить исходное изображение (как правило, raw-изображение) с целевым изображением (как правило, с изображением JPEG, созданным в камере) и создать стиль darktable, который способен преобразовывать значения яркости и цвета исходного изображения, так чтобы создать целевое изображение. В создаваемом стиле используются модули "Базовая кривая", "ICC профиль ввода" и "Таблица поиска цветов" (см. раздел 3.4.1.4, "Базовая кривая", раздел 3.4.3.11, "ICC профиль ввода" и раздел 3.4.3.6 "Таблица поиска цветов").

Некоторые камеры имеют возможности имитации различных типов плёнок по вашему выбору. С помощью darktable-chart и базовых модулей вы можете теперь создавать стили, которые повторяют эти имитации плёнок в darktable.

darktable 2.4 > Специальные темы > Darktable и OpenCL > Использование OpenCL в нескольких устройствах - ручные настройки

ПРЕД.

10.2. Darktable и OpenCL

10.2.10. OpenCL всё ещё не работает у меня!

Как уже говорилось ранее, системы OpenCL поставляются с огромным разнообразием настроек: различные производители графических процессоров, различные модели графических процессоров, различные объёмы графической памяти, различные драйвера, различные дистрибутивы и т.д. Многие из потенциальных проблем могут возникать только с очень специфической комбинацией этих факторов.

Поскольку разработчики darktable имеют доступ только к небольшой части этих вариаций, пожалуйста, поймите, что мы, возможно, не сможем решить вашу конкретную проблему. Мы мало что можем сделать, если у нас нет возможности воспроизвести проблему.

Если ничего больше не помогает, лучшим вариантом может быть запуск darktable командой:

darktable --disable-opencl

В конце концов, нет ничего особого, в том, что darktable работает на графическом процессоре. Не позволяйте OpenCL препятствовать вам; код darktable хорошо оптимизирован для высокой производительности на центральных процессорах!

января 21, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Использование OpenCL в нескольких устройствах - ручные настройки

ПРЕД.

10.2. Darktable и OpenCL

10.2.9. Использование OpenCL в нескольких устройствах – ручные настройки

В большинстве типичных систем использование устройств OpenCL может быть оптимизировано с помощью настройки профилей управления "Профиль планировщика OpenCL". Однако если ваша система оснащена различными графическими процессорами, вы можете установить относительный приоритет устройств вручную. Для этого необходимо выбрать профиль планировщика "По умолчанию" и выполнить настройки параметра конфигурации “opencl_device_priority”.

Важно понимать, как darktable использует устройства OpenCL. Каждая последовательность обработки изображения (от преобразования ввода в конечный результат согласно истории изменений) - выполняется в так называемом пиксельном конвейере. В darktable есть четыре разных типа пиксельных конвейера. Один тип отвечает за обработку изображения в центральной области приложения (или полноразмерного просмотра) в режиме "Обработка", другой пиксельный конвейер обрабатывает изображение предварительного просмотра (панель "Навигация"), расположенного вверху слева в режиме "Обработка". Каждый из этих двух пиксельных конвейеров может быть запущен параллельно. Кроме того, может быть несколько параллельных пиксельных конвейеров, выполняющих экспорт файлов, и может быть несколько параллельных пиксельных конвейеров, создающих миниатюры. Если доступно устройство OpenCL, darktable динамически выделяет его одному конкретному пиксельному конвейеру для одного запуска и освобождает его впоследствии.

Очерёдность на обработку во многом зависит от типа пиксельного конвейера. Изображения предварительного просмотра и создание миниатюр имеют низкое разрешение и могут быть обработаны быстро; изображение из центральной области более требовательное к разрешению и качеству, не говоря уже о пиксельном конвейере, выполняющем экспорт файла.

Параметр конфигурации "opencl_device_priority" содержит строку со следующей структурой:

a,b,c.../k,l,m.../o,p,q.../x,y,z...

Каждая буква представляет собой одно конкретное устройство OpenCL. В строке параметров есть четыре поля, разделенные косой чертой, которые представляют один тип пиксельного конвейера. "a, b, c .." определяют устройства, которым разрешено обрабатывать пиксельный конвейер изображения из центральной области. Аналогично, устройства "k, l, m ..." могут обрабатывать пиксельный конвейер изображений предварительного просмотра, устройства "o, p, q ..." пиксельный конвейер экспортируемых изображений и, наконец, устройства "x, y, z .." пиксельный конвейер создания миниатюр. Пустое поле означает, что ни одно устройство OpenCL не может обслуживать этот тип пиксельного конвейера.

Darktable имеет внутреннюю систему нумерации, где первое доступное устройство OpenCL получит номер "0". Все дальнейшие устройства нумеруются последовательно. Этот номер вместе с именем устройства отображается при запуске darktable с помощью команды "darktable -d opencl". Вы можете указать устройство либо по номеру, либо по имени (верхний/нижний регистр и пробелы не имеют значения). Если у вас несколько устройств - все с одинаковым именем, вам нужно использовать номера устройств, чтобы их отличить.

Указатель устройства может иметь префикс с восклицательным знаком "!", в этом случае устройство будет исключено из обработки этого пиксельного конвейера. Вы также можете указать звездочку "*" в качестве подстановочного символа, заменяя указание на все устройства, которые не были указаны явно ранее в этой группе.

Порядок последовательности в пределах группы имеет значение. Darktable будет читать список слева направо, и всякий раз, когда он пытается выделить устройство OpenCL пиксельному конвейеру, он будет сканировать устройства в этом порядке, беря первое свободное устройство, которое найдёт.

Если пиксельный конвейер должен быть запущен, а все графические процессоры в соответствующей группе заняты, то darktable по умолчанию автоматически обработает изображение на CPU. Вы можете принудительно обрабатывать на GPU, предварив список разрешенных устройств знаком плюс "+". Darktable не будет использовать центральный процессор и приостановит обработку до тех пор, пока не будет доступно следующее устройство OpenCL.

Значение параметра darktable по умолчанию для "opencl_device_priority":

*/!0,*/*/*

Любому обнаруженному устройству OpenCL разрешено обрабатывать изображение из центральной области. Первому устройству OpenCL (0) не разрешено обрабатывать пиксельный конвейер предварительного просмотра. Как следствие, если в системе существует только один графический процессор, предварительный просмотр пиксельного конвейера всегда обрабатывается на центральном процессоре, сохраняя ваш единственный GPU исключительно для более требовательного к ресурсам изображения из центральной области. Это разумная настройка для большинства систем. Для экспорта и миниатюр ограничений нет.

По умолчанию это хороший выбор, если у вас есть только одно устройство. Если же у вас несколько устройств, то это будет разумной отправной точкой. Однако, поскольку ваши устройства могут иметь совершенно разные вычислительные мощности, то имеет смысл обдумать это и оптимизировать ваш список приоритетов.

Вот пример. Предположим, у нас есть система с двумя устройствами: быстрый Radeon HD7950 и более старый и медленный GeForce GTS450. Darktable (запущенный командой "darktable -d opencl") будет сообщать о следующих устройствах:

[opencl_init] successfully initialized.
[opencl_init] here are the internal numbers and names of
OpenCL devices available to darktable:
[opencl_init] 0 "GeForce GTS 450"
[opencl_init] 1 "Tahiti"
[opencl_init] FINALLY: opencl is AVAILABLE on this system.

Таким образом, GeForce GTS 450 определяется как первое устройство; Radeon HD7950 ("Tahiti") как второе. Этот порядок обычно не изменяется, если не изменена конфигурация оборудования или драйвера. Но лучше использовать имена устройств, которые не могут измениться, а не номера.

Поскольку GTS450 работает медленнее, чем HD7950, оптимизированный параметр opencl_device_priority может выглядеть так:

!GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*

GTS450 явно исключается из обработки пиксельного конвейера центральной области; для обработки зарезервированы "все" другие устройства (например, HD7950/Tahiti). Для пиксельного конвейера предварительного просмотра значения противоположные. Здесь Tahiti исключается, так что только GTS450 будет разрешено выполнять эту работу.

Для экспорта файлов и создания миниатюр мы хотим использовать все доступные устройства. Тем не менее, darktable должен сначала определить, свободно ли устройство Tahiti, потому что оно быстрее. Если это не так, проверяются все остальные устройства - на самом деле только GTS450.

января 19, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Профиль планировщика OpenCL

ПРЕД.

10.2. Darktable и OpenCL

10.2.8. Профиль планировщика OpenCL

Darktable может использовать центральный процессор и один или несколько графических процессоров с OpenCL. В зависимости от производительности устройств пользователи могут выбирать профиль планировщика (управления) для оптимизации производительности. Это делается с помощью параметра настроек "Профиль планировщика OpenCL" в диалоговом окне "Основные" (раздел 8.2, "Основные настройки"), который предлагает следующие варианты:

"По умолчанию"

Если найден графический процессор с поддержкой OpenCL, то darktable использует его для обработки изображения, расположенного в центральной области, в то время как в окне предварительного просмотра (см. раздел 3.3.1, "Навигация") обработка осуществляется параллельно центральным процессором. Это предпочтительная настройка для систем с достаточно быстрым центральным процессором и умеренно быстрым графическим процессором. Точное распределение устройств по различным типам пиксельных конвейеров можно уточнить с помощью параметра "opencl_device_priority" (см. ниже).

"Очень быстрый GPU"

С этим профилем планировщика darktable последовательно обрабатывает изображение из центральной области и в окне предварительного просмотра на графическом процессоре. Это предпочтительный параметр для систем с графическим процессором, который сильно превосходит CPU.

"Несколько GPU" Этот параметр касается систем с несколькими графическими процессорами, производительность которых существенно не отличается. Всякий раз, когда запускается обработка, darktable использует любой текущий простаивающий графический процессор, но не центральный процессор. Пользователи систем с различающими по производительности графическими процессорами нуждаются в более эффективном управлении приоритетом. Им лучше выбрать значение "По умолчанию" и настроить свою систему с помощью "opencl_device_priority", параметр конфигурации (см. ниже).

При первом запуске или после любого обнаруженного изменения конфигурации графического процессора системы darktable пытается определить наиболее подходящий профиль планировщика. Вы можете изменить его в любое время в диалоговом окне настроек приложения ( раздел 8.2, "Основные настройки") с немедленным вступлением в силу.

января 18, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Оптимизация производительности OpenCL

ПРЕД.

10.2. Darktable и OpenCL

10.2.7. Оптимизация производительности OpenCL

В $HOME/.config/darktable/darktablerc (%homepath%\AppData\Local\darktable\darktablerc для ОС Windows) есть некоторые параметры конфигурации, которые помогают настроить производительность OpenCL системы. Производительность в этом контексте в основном означает латентность darktable во время интерактивной работы, то есть, сколько времени требуется для обработки пиксельного конвейера. Для комфортного рабочего процесса важно поддерживать низкую латентность.

Чтобы получить информацию для настройки, запустите darktable из терминала с помощью команды:

darktable -d opencl -d perf

После каждой обработки пиксельного конвейера, вызванного изменением параметров модуля, масштабированием, панорамированием и т.д., вы получите общее время и время, затрачиваемое каждым из ядер OpenCL. Наиболее надежным значением является общее время, затраченное на пиксельный конвейер. Обратите внимание, что время для каждого отдельного модуля ненадежно при асинхронном запуске OpenCL пиксельного конвейера (см. ниже opencl_async_pixelpipe).

Чтобы обеспечить быструю обработку пиксельного конвейера с помощью OpenCL, важно максимально занять GPU. Любые прерывания или остановки потока данных будут увеличивать общее время обработки. Это особенно важно для небольших буферов изображений, которые необходимо обрабатывать во время интерактивной работы. Их можно быстро обработать быстрым графическим процессором. Однако даже кратковременные остановки пиксельного конвейера могут легко стать узким местом.

С другой стороны, производительность darktable во время экспорта файлов более или менее зависит от скорости выполнения алгоритмов и мощности вашего GPU. Краткосрочные остановки не окажут заметного влияния на общее время экспорта.

Darktable поставляется с настройками по умолчанию, которые должны обеспечивать достойную производительность GPU для большинства систем. Однако если вы хотите немного самостоятельно поиграться и попытаться оптимизировать работу, то описание соответствующих параметров конфигурации может вам помочь.

opencl_async_pixelpipe
Этот логический флаг определяет, как часто мы блокируем пиксельный конвейер OpenCL и получаем статус успеха/неудачи всех ядер, которые были запущены. Для оптимальной латентности установите значение в TRUE, в этом случае darktable запускает пиксельный конвейер асинхронно и пытается использовать как можно меньше прерываний. Если у вас возникают ошибки в OpenCL, такие как ошибки ядер, задайте значение параметру FALSE. После этого darktable будет прерываться после каждого модуля, таким образом, вам будет легче изолировать проблему. Есть информация о проблемах с некоторыми старыми картами ATI/AMD, такими как HD57xx, которые могут создавать искаженный вывод, если для этого параметра установлено значение TRUE. Если у вас есть сомнения, оставьте его по умолчанию в значении FALSE.

opencl_number_event_handles
Обработчики событий (дескрипторы) используются, чтобы мы могли отслеживать успех/неудачу ядер и информацию для настройки, даже если пиксельный конвейер запускается асинхронно. Количество обработчиков событий - это ограниченный ресурс вашего драйвера OpenCL. Конечно, мы можем их пересоздавать, но есть ограниченное количество обработчиков, которое мы можем использовать одновременно. К сожалению, нет способа узнать, каковы ограничения ресурсов; поэтому мы можем только гадать. Значение по умолчанию 25 является довольно консервативным. Вы можете попробовать и более высокие значения, такие как 100, возможно, они дадут лучшую производительность OpenCL. Если у вашего драйвера закончились свободные дескрипторы, то вы получите сбой ядра OpenCL с кодом ошибки "-5 (CL_OUT_OF_RESOURCES)" или даже сбой, или зависания системы; в этом случае снова уменьшите значение. Значение 0 будет блокировать darktable от использования любых обработчиков событий. Это отключит корректное отслеживание darktable успеха/неудач ядер OpenCL, но сэкономит некоторые ресурсы драйверу. Следствием этого является то, что любые сбои, скорее всего, приведут к искажению вывода без уведомления от darktable; рекомендуется только в том случае, если вы точно знаете, что ваша система работает устойчиво. Вы также можете установить этот параметр равным -1, что означает, что darktable не принимает никаких ограничений в количестве обработчиков событий; не рекомендуется.

opencl_synch_cache
Если этот параметр установлен в значение TRUE, то он заставит darktable получать буферы изображений вашего GPU после выполнения каждого модуля и сохранять их в кэше пиксельного конвейера. Это очень ресурсоемкая операция. Она имеет смысл, только если у вас очень медленный графический процессор. В этом случае darktable может фактически сэкономить некоторое время, когда параметры модуля изменились, так как он может вернуться к некоторому кэшированному промежуточному состоянию и обработать только часть пиксельного конвейера. В большинстве случаев этот параметр должен быть установлен в FALSE (по умолчанию).

opencl_micro_nap
В идеальном случае вы используете GPU на 100% при обработке пиксельного конвейера. Это хорошо. С другой стороны, ваш GPU также необходим для регулярного обновления графического интерфейса. Может случиться так, что для этой задачи не останется достаточно ресурсов. Следствием будет порывистая реакция вашего графического интерфейса на панорамирование, масштабирование и перемещение ползунков. Darktable может добавить небольшие "простои" в обработку пиксельного конвейера, чтобы GPU немного перевёл дух и отработал команды, связанные с графическим интерфейсом. Параметр opencl_micro_nap контролирует длительность этих "простоев" в микросекундах. Вам нужно поэкспериментировать, чтобы найти оптимальное значение для вашей системы. Значения 0, 100, 500 и 1000 являются хорошими отправными точками, чтобы попробовать. По умолчанию 1000.

opencl_use_pinned_memory
Во время тайлинга (разбиения изображения на фрагменты) необходимо передавать огромные объёмы памяти между хостом и устройством. На некоторых устройствах (а именно AMD) прямая передача из/в произвольной(ую) области памяти хоста может дать значительное снижение производительности. Это особенно заметно при экспорте больших изображений. Установка этого параметра конфигурации в TRUE сообщает darktable о необходимости использовать специальный промежуточный буфер для передачи данных между хостом и устройством. На некоторых устройствах это может ускорить экспорт больших файлов в 2-3 раза. У устройств и драйверов NVIDIA, по-видимому, есть более эффективная технология передачи данных даже для произвольных областей памяти. Поскольку они не могут показать прирост производительности и даже могут вызывать искаженный вывод, то opencl_use_pinned_memory в этом случае следует оставить в значении по умолчанию FALSE.

января 17, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Настройка OpenCL для устройств AMD/ATI

ПРЕД.

10.2. Darktable и OpenCL

10.2.6. Настройка OpenCL для устройств AMD/ATI

В то время как устройства NVIDIA и большинство современных устройств AMD/ATI будут чаще всего работать из коробки, для более старых графических карт AMD/ATI (старше, чем HD7xxx) это не всегда верно. Начиная с того факта, что эти устройства предоставляют darktable только часть графической памяти. Для устройства с память в 1ГБ это обычно составляет 512МБ, при данном значении darktable в стандартной конфигурации откажется работать, поскольку для его задач данного объёма не достаточно. Как результат, устройство не будет использоваться.

В Интернете вы можете найти подсказку, которая укажет, что в этом случае необходимо установить значение переменной среды GPU_MAX_HEAP_SIZE на 100. В самом деле, это приведет к тому, что драйвер AMD/ATI сообщит darktable о наличии всей установленной памяти. Однако есть проблема. На многих (большинстве?) видеокартах это приведет к тому, что буферы будут выделены в оперативной памяти, а не на видеокарте! В этом случае все обращения к памяти должны будут проходить через медленную шину PCIe. Это будет стоить вам уменьшения производительности в 10 или более раз и сделает OpenCL бесполезным для вас, особенно при экспорте файлов.

Существует другая переменная среды, которая меняет поведение драйвера, GPU_MAX_ALLOC_PERCENT. Вы можете установить её значение в 100, чтобы обеспечить возможность распределения памяти в 1ГБ на вашей карте AMD/ATI. Проблема заключается в том, что и это рано или поздно приводит к сбою в работе darktable.

Мы рекомендуем оставить эти настройки нетронутыми. Часто на вашей карте будет распознано 512МБ памяти с максимальным размером выделения 128МБ. Есть три параметра конфигурации, которые вы можете задать в файле $HOME/.config/darktable/darktablerc (%homepath%\\AppData\\Local\\darktable\\darktablerc для ОС Windows), чтобы все было в порядке. Подробности ниже:

opencl_memory_requirement
Установите значение этого параметра на 500, чтобы darktable принял объём вашей графической памяти в 512 МБ как достаточный.

opencl_memory_headroom
Этот параметр определяет, сколько графической памяти (из сообщенного видеокартой) darktable должен оставить для использования драйвером и дисплеем. Что касается устройств AMD/ATI, то мы знаем, что видеокарта сообщила нам только о половине видеопамяти (другая половина останется для драйвера и дисплея), тем самым мы можем отдать всю эту память darktable, а значит, будет безопасным установить его на ноль. Таким образом, все 512 МБ могут использоваться darktable.

opencl_avoid_atomics
Атомарные операции в OpenCL - особый способ синхронизации данных. Они используются только в многоядерных графических процессорах. К сожалению, некоторые (большинство?) устройств AMD/ATI чрезвычайно медленны в обработке атомарных операций. Некоторые модули лучше обрабатывать на центральном процессоре, а не передавать ультра-медленный кодовый конвейер GPU. Установите этот параметр в значение TRUE, если вы испытываете медленную обработку таких модулей, как "Тени и света", "Преобразование в ч/б", "Локальный контраст" или "Глобальное отображение тонов", или если система периодически подвисает.

Эти рекомендации не относятся к более ранним сериям Radeon HD7xxx с архитектурой GCN. Помимо того, что они очень быстрые с точки зрения графических процессоров, они обычно работают из коробки. Вы можете только попробовать изменить некоторые параметры для оптимизации производительности, описанные в следующем разделе.

января 16, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Возможные проблемы и решения

ПРЕД.

10.2. Darktable и OpenCL

10.2.5. Возможные проблемы и решения

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

Могут быть разные причины, по которым OpenCL может выйти из строя на этапе инициализации. Это зависит от требований к оборудованию и наличия определенных драйверов и библиотек. Кроме того, все это должно соответствовать модели и номеру ревизии. Если что-то не подходит, например, ваш графический драйвер (загруженный как модуль ядра) не соответствует версии вашего libOpenCL.so, поддержка OpenCL, вероятно, будет недоступна.

В этом случае лучше всего запускать darktable с консоли с помощью команды

darktable -d opencl

Это создаст дополнительный отладочный вывод с информацией об инициализации и использовании OpenCL. Сначала посмотрите, есть ли строка, начинающаяся с "[opencl_init] FINALLY ..." Из этого можно узнать, доступна ли поддержка OpenCL для вас или нет. Если инициализация завершилась неудачно, просмотрите приведенные выше сообщения, которые читаются как "could not be detected" или "could not be created". Проверьте, нет ли информации, где не прошла инициализация.

Вот несколько примеров, которые наблюдались в прошлом:
  • Darktable может сказать вам, что графическая карта с поддержкой OpenCL не обнаружена или что доступная память на вашем графическом процессоре слишком мала, и устройство не инициализируется. В этом случае вам может потребоваться купить новую карту, если вам действительно нужна поддержка OpenCL.
  • Darktable обнаруживает libOpenCL.so, но потом сообщает, что он не может получить платформу. В этом случае драйверы NVIDIA часто выдают код ошибки -1001. Это происходит потому, что libOpenCL.so является только библиотекой-ссылкой. Для реальной работы необходимо загрузить дополнительные библиотеки, специфичные для поставщика устройства и драйвера. По какой-то причине это не удалось. В системе есть файловая структура /etc/OpenCL, которую libOpenCL.so проверяет, чтобы найти эти библиотеки. Проверьте, находите ли вы там что-нибудь сомнительное и попытаетесь исправить это. Часто необходимые библиотеки не могут быть найдены динамическим загрузчиком вашей системы. Предоставление полного имени пути может помочь вам.
  • Darktable также может сказать вам, что контекст не может быть создан. Это часто указывает несоответствие версии (загруженного) графического драйвера и libOpenCL. Проверьте, есть ли у вас оставшиеся модули ядра или графические библиотеки более старой установки и примите соответствующие действия. При сомнении проведите чистую переустановку своего графического драйвера. Иногда сразу после обновления драйвера загруженный драйвер ядра не совпадает с недавно установленными библиотеками: перезагрузите свою систему в этом случае.
  • В очень редких случаях работа darktable может завершится крахом непосредственно во время запуска. Это может произойти, если ваша установка OpenCL "сломана", или если драйвер/библиотека содержит серьезную ошибку. Если вы не можете исправить это, вы все равно можете использовать darktable с опцией "--disable-opencl", которая пропустит шаг инициализации OpenCL.
  • Darktable может не скомпилировать исходные файлы OpenCL во время выполнения. В этом случае вы получите ряд сообщений об ошибках, похожих на типичные ошибки компилятора. Это может указывать на несовместимость между вашей реализацией OpenCL и нашей интерпретацией стандарта. В этом случае посетите нас в IRC в #darktable на FreeNode или в списке рассылки разработчиков на darktable-dev@lists.darktable.org и сообщите о проблеме. Скорее всего, мы можем вам помочь.
Также существует несколько реализаций OpenCL на центральных процессорах. Они поставляются в качестве драйверов, предоставляемых INTEL или AMD. Мы заметили, что они не дают нам никакого увеличения скорости. Поэтому мы просто отбрасываем эти устройства по умолчанию. Такое поведение можно изменить, установив для параметра конфигурации opencl_use_cpu_devices значение TRUE.

января 14, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Настройки OpenCL в вашей системе

ПРЕД.

10.2. Darktable и OpenCL

10.2.4. Настройки OpenCL в вашей системе

Огромное разнообразие систем и заметные различия между поставщиками OpenCL и версиями драйверов не позволяют дать исчерпывающий обзор того, как настроить OpenCL. Мы можем привести только пример для драйвера NVIDIA версии 331.89 на Ubuntu 14.04. Мы надеемся, что это послужит вам отправной точкой и поможет решить возможные проблемы вашей конкретной установки.

Схема потока функций OpenCL выглядит следующим образом:

darktable -> libOpenCL.so -> libnvidia-opencl.so.1 -> kernel driver module(s) -> GPU

  • Darktable динамически загружает libOpenCL.so, системная библиотека должна быть доступна для динамического загрузчика системы (ld.so).
  • libOpenCL.so читает файл информации о поставщике (/etc/OpenCL/vendors/nvidia.icd), чтобы найти библиотеку, содержащую реализацию OpenCL для поставщика.
  • Реализаций OpenCL для поставщика является библиотека libnvidia-opencl.so.1 (которая в нашем случае является ссылкой на libnvidia-opencl.so.331.89).
  • libnvidia-opencl.so.1 налаживает взаимодействие с модулями ядра поставщика nvidia и с nvidia_uvm через файлы устройств /dev/nvidia0, /dev/nvidiactl и /dev/nvidia-uvm.

При запуске системы необходимо создать требуемые специальные файлы устройства (/dev/nvidia*). Если это не происходит в вашей системе по умолчанию, самый простой способ установить их и убедиться, что все модули загружены, установив пакет nvidia-modprobe. Вы можете получить его на сайте [http://packages.ubuntu.com/utopic/nvidia-modprobe]. (Прим. переводчика: данный путь настоящий момент времени не существует).

Учетная запись пользователя, которая хочет использовать OpenCL из darktable, должна иметь доступ на чтение и запись к специальным файлам устройства NVIDIA. В некоторых системах эти файлы допускают доступ по умолчанию для чтения и записи, что позволяет избежать установки разрешений, но может быть спорным с точки зрения безопасности системы. Другие системы предоставляют доступ только определённой группе пользователей, например, "video". В этом случае ваша учетная запись должна быть членом этой группы.

Подводя итог, пакеты, которые необходимо было установить в этом конкретном случае, были следующими:
  • nvidia-331 (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-331-dev (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-331-uvm (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-libopencl1-331 (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-modprobe (340.24-1)
  • nvidia-opencl-dev:amd64 (5.5.22-3ubuntu1)
  • nvidia-opencl-icd-331 (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-settings (340.24-0ubuntu1~xedgers14.04.1)
  • nvidia-settings-304 (340.24-0ubuntu1~xedgers14.04.1)
  • nvidia-libopencl1-331 (331.89-0ubuntu1~xedgers14.04.2)
  • nvidia-opencl-dev:amd64 (5.5.22-3ubuntu1)
  • nvidia-opencl-icd-331 (331.89-0ubuntu1~xedgers14.04.2)
  • opencl-headers (1.2-2013.10.23-1)

Список модулей ядра (связанных с NVIDIA), по сообщению команды lsmod:

NVIDIA
nvidia_uvm

Список специальных файлов (связанных с NVIDIA) устройств (ls -l /dev/nvidia*) должен выглядеть следующим образом:

crw-rw-rw- 1 root root 195, 0 Jul 28 21:13 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Jul 28 21:13 /dev/nvidiactl
crw-rw-rw- 1 root root 250, 0 Jul 28 21:13 /dev/nvidia-uvm

Помните, что номера версий (например, 250/0 для /dev/nvidia-uvm в этом примере) могут различаться в зависимости от вашей системы.

января 13, 2019

darktable 2.4 > Специальные темы > Darktable и OpenCL > Как активировать OpenCL в darktable

ПРЕД.

10.2. Darktable и OpenCL

10.2.3. Как активировать OpenCL в darktable

Использование OpenCL в darktable требует, чтобы ваш компьютер был оснащен подходящей графической картой и имел необходимые библиотеки. Современные графические карты от NVIDIA и AMD поставляются с полной поддержкой OpenCL. Компилятор OpenCL обычно поставляется как часть запатентованного графического драйвера; он используется как динамическая библиотека под названием "libOpenCL.so". Эта библиотека должна находиться в папке, где находится системный динамический компоновщик.

Когда запускается приложение darktable, оно сначала попытается найти и загрузить libOpenCL.so и при успешном выполнении проверяет, доступна ли графическая карта с поддержкой OpenCL. Для использования графического процессора требуется достаточное количество графической памяти (1ГБ+). Если всё хорошо, то darktable пытается настроить свою среду OpenCL: инициализирует контекст обработки, запускает вычислительный конвейер, файлы исходного кода OpenCL (расширение .cl) читаются и компилируются, а включенные подпрограммы (называемые ядрами OpenCL) должны быть уже подготовлены для модулей darktable. Если всё это сделано, то подготовка завершена.

По умолчанию поддержка OpenCL активируется в darktable, если все вышеуказанные шаги были успешными. Если вы хотите деактивировать её, вы можете сделать это в меню "Основные настройки" ( раздел 8.2, "Основные настройки"), сняв флажок с параметра "Включить поддержку OpenCL". Этот параметр конфигурации также указывает вам, была ли неудача инициализации OpenCL (в этом случае параметр неактивен).

Вы можете в любой момент отключить поддержку OpenCL; изменения вступят в силу немедленно. В зависимости от типа модулей, которые вы используете, вы заметите эффект как общее ускорение во время работы и во время экспорта. Большинство модулей в darktable могут использовать OpenCL, но не все модули требовательны к ресурсам, чтобы можно было заметить разницу. Для того чтобы почувствовать реальную разницу, возьмите модули, такие как "Тени и света", "Резкость", "Н/Ч фильтр", "В/Ч фильтр" или даже более экстремальный "Эквалайзер" и "Шумоподавление (профиль)".

Если вы заинтересованы в получении значений производительности, вы можете запустить darktable с параметрами командной строки "-d opencl -d perf". После каждого запуска пиксельного конвейера вы получите подробное распределение времени обработки для каждого модуля плюс еще более подробную характеристику производительности для всех используемых ядер OpenCL.

Помимо ускорения, вы не должны увидеть разницы в результатах между обработкой центральным процессором и графическим. Кроме ошибок округления, результаты должны быть идентичными. Если по каким-то причинам darktable не сможет должным образом завершить расчет на графическом процессоре, то, как правило, он заметит это и автоматически (и прозрачно) вернется к обработке на центральном процессоре.

января 12, 2019


ПРЕД.

10.2. Darktable  и OpenCL

10.2.2. Как работает OpenCL

Как вы можете себе представить, аппаратные архитектуры графических процессоров могут значительно различаться. Существуют разные производители, и даже разные поколения графических процессоров от одного производителя могут отличаться. В то же время производители графических процессоров обычно не раскрывают все аппаратные детали своих продуктов для общественности. Последствием этого является необходимость использования проприетарных драйверов под Linux, если вы хотите в полной мере использовать преимущества своей видеокарты.

К счастью, отраслевой консорциум, возглавляемый The Khronos Group, разработал открытый стандартизованный интерфейс под названием OpenCL. Он позволяет использовать ваш GPU в качестве числового устройства обработки. OpenCL предлагает C99-подобный язык программирования, в котором уделено большое внимание параллельным вычислениям. Приложению, которое хочет использовать OpenCL, будет нужен исходный код, поддерживающий спецификации OpenCL, который оно передаст во время выполнения аппаратно-зависимому компилятору OpenCL. Таким образом, приложение может использовать OpenCL на разных графических архитектурах (даже в одно и тоже время). Все аппаратные "секреты" скрыты в компиляторе и обычно не видны пользователю (или приложению). Скомпилированный код OpenCL загружается на ваш графический процессор и - с помощью определенных вызовов API - он готов производить вычисления для вас.

января 11, 2019


ПРЕД.

Глава 10. Специальные темы

10.2. Darktable и OpenCL

Для повышения производительности darktable может использовать процессор видеокарты (GPU), используя технологию OpenCL.

10.2.1. Предыстория

Обработка изображений с высоким разрешением - это сложная задача, требующая современного компьютера. Как с точки зрения требований к памяти, так и с точки зрения требований к мощности процессора, получение изображения наилучшего качества обычного объёма в 15, 20 или 25 мегапикселей может быстро привести к нехватке ресурсов компьютера.

Приложение darktable не является в этом исключением. Наше решение не рисковать качеством обработки, привело к тому, что все вычисления выполняются с числами с плавающей точкой в буфере 4х32бит. Это медленнее, чем "обычные" 8 или 16-битные целочисленные вычисления, но устраняет большинство проблем постеризации или потери информации.

Многое было оптимизировано, чтобы сделать darktable как можно быстрее. Если вы используете текущую версию darktable на современном компьютере, вы можете не заметить "медлительность". Тем не менее, есть условия и некоторые модули, в которых вы будете чувствовать (или слышать вой вашего процессорного вентилятора), как ваш "бедный" многоядерный процессор вынужден справляться с работой.

Именно здесь и появляется OpenCL. OpenCL позволяет нам использовать огромную мощь современных видеокарт. Требование компьютерных игр к отображению высокодетализированных 3D-миров в современных шутерах от первого лица способствовало развитию графических процессоров. Корпорации ATI, NVIDIA поставили огромную вычислительную мощность в свои GPU для удовлетворения этих требований. Результатом этого являются современные графические карты с высокопараллельными графическими процессорами для быстрого вычисления поверхностей и текстур с высокой частотой кадров.

Вы не геймер, и не пользуетесь этой мощностью? Тогда вы должны хотя бы использовать её в darktable! Для задач высокопараллельных вычислений с плавающей точкой современные графические процессоры намного быстрее, чем центральные процессоры. Это особенно верно, когда вы хотите сделать те же самые шаги обработки над миллионами элементов. Типичный случай: обработка изображений высокого разрешения.

января 10, 2019

darktable 2.4 > Специальные темы

ПРЕД.


Глава 10. Специальные темы

В этой главе затрагивается несколько технических тем, которые могут помочь вам запустить darktable на конкретном оборудовании или оптимизировать производительность. Много дополнительной технической справочной информации, советов и трюков описано в обширном разделе блога, который вы можете найти на домашней странице приложения [http://www.darktable.org].

10.1. Darktable и память

Требования к памяти у darktable высоки. Простой расчет сделает это понятным. Если у вас есть 20-мегапиксельное изображение, то darktable по соображениям точности в рамках работы приложения будет хранить каждый пиксель изображения как ячейку размером 4x32бит и использовать операции с плавающей точкой. Для каждого полного изображения такого размера потребуется около 300МБ памяти. Поскольку мы хотим обрабатывать изображение, нам понадобится, по крайней мере, два буфера для каждого модуля - один для ввода и один для вывода. Если у нас будет более сложный модуль, его алгоритм может дополнительно потребовать несколько промежуточных буферов того же размера. Без дальнейшей оптимизации, нам может потребоваться памяти между 600МБ и 3ГБ только для хранения и обработки данных изображения. Кроме того у нас есть программный код darktable, код и данные всех динамических системных библиотек, а также не забываем о дополнительных буферах, где darktable хранит промежуточные изображения для быстрого доступа во время работы (mip map cache). В общем, для работы darktable хотел бы видеть, как минимум 4ГБ, чтобы успешно запускаться

10.1.1. Объём системной памяти

Из того, что сказано ранее, очевидно, что вашему компьютеру нужна корректная настройка памяти для работы darktable. Мы рекомендуем вам иметь не менее 4ГБ физической оперативной памяти плюс 4-8ГБ в разделе (файле) подкачки. Последнее требуется, так как ваша система может временно разместить неиспользуемые данные на диск, чтобы освободить физическую память.

Теоретически вы можете запускать darktable с меньшим количеством физической оперативной памяти и сбалансировать недостающий объём памяти достаточным количеством в разделе (файле) подкачки. Тем не менее, вы должны быть готовы к тому, что ваша система может начать сильно "тормозить", поскольку она будет постоянно считывать или записывать страницы данных на жесткий диск и с него. Существуют положительные отзывы о том, что это неплохо работает у отдельных пользователей, но для других данный подход может стать чрезвычайно медленным и неприемлемым ...

10.1.2. Доступное адресное пространство

Помимо объёма системной памяти существует еще один ограничивающий фактор: доступное адресное пространство вашей аппаратной архитектуры. Сколько памяти может быть адресовано процессом зависит от количества выделяемых бит для адресов, предлагаемых вашим процессором. Для CPU с 32-разрядными адресными регистрами это 2^32 байта, что составляет в общей сложности 4ГБ. Это абсолютный верхний предел памяти, который может использоваться процессом, и это представляет собой сложную ситуацию для darktable, как мы видели выше.

Выход из сложившейся ситуации предоставляет технология тайлинга. Вместо обработки изображения одним большим фрагментом мы разбиваем его на более мелкие части (плитки или черепицу) для каждого этапа обработки (модуля). Для этого все равно требуется один полный буфер ввода и вывода, но промежуточные буферы могут быть достаточно маленькими, чтобы тем самым соответствовать аппаратным ограничениям.

Прим. переводчика: термин "тайлинг" в русском языке не относится к устоявшемуся термину, в различных источниках он может быть заменён терминами "плитка" или "черепица", иногда его оставляют без перевода "tiling".

10.1.3. Фрагментация памяти

К сожалению, это еще не всё. Существует эффект, называемый фрагментацией памяти, который возникает при работе программного обеспечения, которое требует масштабного управления памятью. Если такая программа выделяет 5 раз по 300 Мбайт за раз и снова освобождает ее, эта память обычно должна быть доступна для одного большого выделения на 1,5 ГБ после этого. Это, однако, часто бывает не так. Менеджер распределение памяти системы больше не может видеть эту область как один непрерывный блок в 1,5 ГБ, а только как ряд из областей по 300МБ. Если нет другой свободной области в 1,5ГБ, то распределение не произойдёт. Во время запуска программы данный механизм забирает все больше и больше блоков памяти в пользу блоков меньшего размера. В darktable 2.0 кэш миниатюр (mip map cache) выделяет несколько небольших блоков памяти для каждого миниатюры, поэтому эта проблема возрастает ещё больше. По этой причине, начиная с darktable 2.0, не рекомендуется использовать 32-разрядные системы.

10.1.4. Дополнительные ограничения

Как будто описанного ранее не было достаточно, но существуют дополнительные ограничения, которые могут ограничивать доступ к памяти. На некоторых старых материнских платах вам необходимо активировать опцию "memory remapping" в BIOS, чтобы включить всю физически установленную память. Кроме того, если вы используете 32-битную ОС, вам, вероятно, понадобится версия ядра, которая имеет технологию "Physical Address Extension" (PAE). Часто, но не всегда, это относится к дистрибутивам Linux. Многие дистрибутивы поставляют разные ядра, некоторые с поддержкой PAE, а некоторые без PAE и вам нужно выбрать правильный. Чтобы проверить правильность установки системы, используйте команду "free" в терминале и проверьте вывод. Если на выходе отображается меньше ОЗУ, чем вы установили, у вас есть проблема, требующая исправления; например, у вас установлено 4ГБ, но ваше ядро видит только 3ГБ или меньше. Чтобы получить дополнительную помощь, вам необходимо проконсультироваться с руководством по BIOS и информацией о вашем дистрибутиве Linux.

10.1.5. Настройка darktable на 32-битной системе

Как мы видели, 32-битные системы представляют собой сложную среду для darktable. Тем не менее, некоторые пользователи работают с darktable на них, если основные требования в отношении системной памяти и темы, упомянутые в разделах выше, рассматриваются надлежащим образом.

Для запуска приложения есть несколько параметров настройки. Если вы произведёте первичную установку приложения, то darktable определит тип вашей системы и установит консервативные значения по умолчанию. Однако если вы обновите darktable c более старой версии (например, с 0.9.3 и до 1.0), скорее всего, у вас будут неоптимальные настройки. Последствиями для darktable могут быть частые прерывания работы из-за сбоев в распределении памяти или, что наиболее типично, darktable будет неспособен должным образом импортировать новую съёмку. Как частый симптом вы будете видеть черепа вместо миниатюр для многих ваших фотографий.

Если это так, найдите минуту, чтобы оптимизировать настройки. Вы найдете их в разделе "Основные настройки" (раздел 8.2, "Основные настройки" ) в диалоговом окне настроек darktable. Вы также можете найти эти параметры в качестве переменных конфигурации в $HOME/.config/darktable/darktablerc (%homepath%\\AppData\\Local\\darktable\\darktablerc для ОС Windows) и редактировать их там.

Ниже приведено краткое описание соответствующих параметров и их настроек:

"Количество фоновых потоков"
Этот параметр определяет максимальное количество потоков, разрешенных выполняться параллельно при импорте съёмки или выполнении других фоновых операций. В 32-битных системах вы можете иметь только один поток. Поэтому вам нужно установить этот параметр в 1; значения выше приведут к краху.

"Максимальный объём памяти (в МБ) для мозаики"
Этот параметр сообщает darktable сколько памяти (в МБ) оно может выделить для хранения буферов изображений во время операций модуля. Если изображение не может быть обработано в этих пределах в одном фрагменте, то оно будет обрабатываться несколькими частями, одна часть за другой. Установите это значение в 500Мб в качестве отправной точки. Вы можете поэкспериментировать с параметром позже, возможно, вы немного его увеличите, чтобы уменьшить издержки на тайлинг.

"Минимальный объём буфера (в МБ) для мозаики"
Это второй параметр, контролирующий тайлинг. Он устанавливает нижний предел размера промежуточных буферов изображений в мегабайтах. Параметр необходим, чтобы избежать чрезмерного деления изображения на фрагменты в некоторых случаях (для некоторых модулей). Установите этот параметр в значение 8МБ. Вы можете, при необходимости, увеличить его до 16МБ позже.

"Память в мегабайтах для кэша миниатюр"
Определяет, сколько миниатюр может храниться в памяти одновременно. В качестве отправной точки установите примерно на 256МБ. Начиная с darktable 2.0, кэш выделяет несколько небольших буферов на каждую миниатюру, что вызывает значительную фрагментацию памяти. Как объяснялось ранее, это создает проблемы для 32-битных систем. По этой причине, начиная с darktable 2.0, не рекомендуется использовать 32-разрядные системы.

10.1.6. Darktable на 64-битных системах

Здесь особо сказать нечего. Конечно, для 64-битных систем требуется достаточное количество системной памяти, поэтому рекомендуем минимум 4ГБ плюс настройку раздела (файла) подкачки. С другой стороны, 64-разрядная архитектура не страдает от ограничений присущим 32-битным архитектурам, таким как небольшое адресное пространство и фрагментация.

Большинство современных 64-разрядных процессоров Intel или AMD будут иметь доступное адресное пространство в диапазоне до нескольких терабайт. Под словом "современные" в этом контексте понимает, все процессоры AMD и Intel, выпущенные с 2003 и 2004 года, соответственно, и предлагающие 64-разрядный режим. Дистрибутивы Linux 64-бит доступны уже много лет.

Все соответствующие дистрибутивы Linux дают вам возможность установить 32-разрядную или 64-разрядную версию без дополнительных затрат. Вы даже можете запускать старые 32-разрядные двоичные файлы в 64-разрядной Linux. Единственное, что вам нужно сделать: потратить некоторое время на миграцию. В конце концов, мы настоятельно рекомендуем перейти на 64-разрядную версию Linux. На самом деле нет причин не обновляться.

В 64-разрядной системе вы можете спокойно оставить параметры конфигурации, связанные с тайлингом, по умолчанию: "Максимальный объём памяти (в МБ) для мозаики" имеет значение 1500МБ и "Минимальный объём буфера (в МБ) для мозаики" установлено на 16МБ. Если вы переходите от 32-разрядной к 64-разрядной системе, вам нужно будет проверить эти параметры и вручную изменить их, если необходимо, в диалоге настроек darktable.

Как правило, нет необходимости ограничивать себя количеством фоновых потоков в 64-битной системе. В многопроцессорной системе число от двух до восьми потоков может значительно ускорить создание миниатюр против одного потока. Причина заключается не в том, чтобы максимально использовать все ядра процессора, darktable их и так использует в пиксельном конвейере параллельно, но в скрытии задержки операций ввода-вывода.

Одно исключение стоит упомянуть. Если вы используете darktable для обработки сшитых панорам, например TIFF, созданных Hugin, то эти изображения могут достигать значительных размеров. Каждый фоновый поток должен выделять достаточное количество памяти для буферов хранения одного полного изображения, плюс промежуточные результаты и вывод. Это может быстро привести к нехватке памяти даже в хорошо оборудованной 64-битной системе. В этом случае уменьшите количество фоновых потоков до одного.

января 08, 2019


ПРЕД.
Глава 9. Создание сценариев на Lua

9.2. API-интерфейс Lua

API-интерфейс darktable Lua описан в его собственном руководстве с подробным описанием всех структур данных и функций. Вы можете загрузить руководство API с веб-страницы darktable [http://www.darktable.org/resources/]..

января 03, 2019

darktable 2.4 > Создание сценариев на Lua

ПРЕД.


Глава 9. Создание сценариев на Lua

Для повышения функциональности darktable поставляется с универсальным интерфейсом для использования языка сценариев.

9.1. Использование Lua

Lua может использоваться для выполнения определённых действий, которые darktable будет выполнять всякий раз, когда запускается указанное событие. Один из примеров позволяет вызвать внешнее приложение во время экспорта файла, чтобы применить дополнительные шаги обработки за пределами darktable.

Darktable использует Lua [http://www.lua.org/], который является независимым проектом, основанным в 1993 году и предоставляющим мощный, быстрый, легкий, встраиваемый язык сценариев. Lua широко используется многими приложениями с открытым исходным кодом, в коммерческих программах и для программирования игр.

Darktable использует версию Lua 5.2. Описание принципов и синтаксиса Lua выходит за рамки этого руководства пользователя. Подробное введение см. в "Руководство Lua" [http://lua.org.ru/contents_ru.html] и [http://www.lua.org/manual/5.2/manual.html].

Прим. переводчика: В версиях darktable 2.4.4. и более новых используется версия Lua 5.3.

9.1.1. Основные принципы

При запуске darktable автоматически запускает два сценария Lua:
  • скрипт с названием luarc в $DARKTABLE/share/darktable
  • скрипт luarc в каталоге конфигурации пользователя
$DARKTABLE обозначает каталог установки darktable в системе.

Это единственный раз, когда darktable будет запускать сценарии Lua самостоятельно. Сценарий может зарегистрировать вызов выполнения некоторых действий при наступлении определённых событий в darktable. Этот механизм вызова является основным способом запуска сценариев lua.

9.1.2. Пример простого lua сценария

Начнем с простого примера. Выведем некоторое сообщение на консоль. Создадим файл luarc в каталоге конфигурации пользователя darktable (обычно "~/.config/darktable/" или "%homepath%\\AppData\\Local\\darktable\\" для ОС Windows.) и добавим следующую строку:
print(“Hello World!”)
Запустим darktable из консоли и увидим сообщение "Hello World!", напечатанное в консоли. Ничего особенного, но это только начало...

На данный момент в сценарии нет ничего особенного для darktable. Мы используем стандартную функцию print для вывода строки на консоль. Это хорошо, но мало, мы можем сделать больше и лучше. Чтобы получить доступ к API darktable, нам сначала нужно вызвать его командой require и сохранить возвращаемый объект в переменной. Как только это будет сделано, мы можем получить доступ к API darktable в качестве подполей возвращаемого объекта. Все это задокументировано в справочном руководстве по Lua API darktable (см. раздел 9.2, "Lua API").
local darktable = require “darktable”
darktable.print_error(“Hello World !”)
Запустим скрипт... и ничего не происходит. Функция darktable.print_error аналогична print, но будет выводить сообщение только в том случае, если мы включили вывод отладочных данных на терминал для подсистемы lua (запуск darktable с параметрами -d lua в командной строке). Это рекомендуемый способ вывода отладочных данных darktable сценария lua.

9.1.3. Вывод списка изображений с цветовой меткой

Первый пример представил нам начальные основы lua и позволил проверить, что все работает правильно. Давайте сделаем что-нибудь более сложное. Например, попробуем вывести на консоль список изображений, которые отмечены красной цветовой меткой. Но прежде всего, узнаем, как представлено изображение в darktable?
local darktable = require “darktable”
local debug = require “darktable.debug”
print(darktable.debug.dump(darktable.database[1]))
Выполнение приведенного выше кода выведет на экран много информации. Мы посмотрим на неё через мгновение, но сначала давайте рассмотрим сам код.

Во-первых, мы получаем доступ к API darktable и, во-вторых, доступ к необязательным разделам API со вспомогательными функциями darktable.debug, которые будут помогать нам отлаживать сценарии lua.

darktable.database представляет собой таблицу, предоставленную API, которая содержит все изображения из базы данных. Каждая запись в базе данных является объектом изображения. Объекты изображения - это сложные объекты, которые позволяют нам манипулировать нашим изображением различными способами (все это описано в разделе руководства по API -types_dt_lua_image_t). Чтобы вывести информацию об изображениях, мы используем функцию darktable.debug.dump, которая предоставляет рекурсивный доступ к содержимому передаваемого параметра. Поскольку изображения являются сложными объектами, которые косвенно ссылаются на другие сложные объекты, результирующий результат огромен. Ниже приведен сокращённый пример одного такого объекта изображения:
toplevel (userdata,dt_lua_image_t) : /images/100.JPG
                                      publisher (string) : “”
                                      path (string) : “/images”
                                      move (function)
   exif_aperture (number) : 2.7999999523163
                                     rights (string) : “”
                                     make_group_leader (function)
                                     exif_crop (number) : 0
                                     duplicate_index (number) : 0
                                     is_raw (boolean) : false
                                     exif_iso (number) : 200
                                     is_ldr (boolean) : true
                                     rating (number) : 1
                                     description (string) : “”
                                     red (boolean) : false
                                     get_tags (function)
                                     duplicate (function)
                                     creator (string) : “”
                                     latitude (nil)
                                     blue (boolean) : false
   exif_datetime_taken (string) : “2014:04:27 14:10:27”
                                     exif_maker (string) : “Panasonic”
                                     drop_cache (function)
                                     title (string) : “”
                                     reset (function)
                                     create_style (function)
                                     apply_style (function)
   film (userdata,dt_lua_film_t) : /images
      1 (userdata,dt_lua_image_t): .toplevel [......]
   exif_exposure (number) : 0.0062500000931323
                                     exif_lens (string) : “”
   detach_tag (function): toplevel.film.2.detach_tag
                                     exif_focal_length (number) : 4.5
   get_group_members (function): toplevel.film.2.get_group_members
                                     id (number) : 1
   group_with (function): toplevel.film.2.group_with
   delete (function): toplevel.film.2.delete
                                     purple (boolean) : false
                                     is_hdr (boolean) : false
                                     exif_model (string) : “DMC-FZ200”
                                     green (boolean) : false
                                     yellow (boolean) : false
                                     longitude (nil)
                                     filename (string) : “100.JPG”
                                     width (number) : 945
   attach_tag (function): toplevel.film.2.attach_tag
                                     exif_focus_distance (number) : 0
                                     height (number) : 648
                                     local_copy (boolean) : false
                                     copy (function): toplevel.film.2.copy
   group_leader (userdata,dt_lua_image_t): .toplevel
Как мы видим, объект изображения имеет большое количество полей, которые предоставляют всю информацию о нём. Нас интересует поле "red" (красная цветовая метка). Это поле является логическим, и документация сообщает нам, что оно может быть выбрано. Теперь нам просто нужно найти все изображения с этим полем и распечатать их.
darktable = require “darktable”
   for _,v in ipairs(darktable.database) do
      if v.red then
print(tostring(v))
   end
end
Этот код должен быть достаточно прост для понимания на данный момент, но он содержит несколько интересных аспектов относительно lua, которые стоит выделить:
  • ipairs является стандартной функцией lua, которая будет перебирать все числовые индексы таблицы. Мы используем её здесь, потому что darktable.database имеет нечисловые индексы, которые являются функциями управления самой базой данных (например, добавление или удаление изображений).
  • Перебор таблицы возвращает 2 значения: ключ и объект изображения. В lua принято использовать переменную с именем "_" для хранения значений, которые нам не нужны в дальнейшем.
  • Обратите внимание, что мы используем стандартную функцию lua, tostring, а не специфическую для darktable darktable.debug.dump. Стандартная функция вернет имя для объекта, тогда как функция отладки будет печатать содержимое. Использование функция debug будет излишним. Это отличный инструмент отладки, но его нельзя использовать ни для чего другого.

9.1.4. Добавление простого вызова сценария комбинацией клавиш

До сих пор все наши скрипты выполнялись во время запуска приложения. Это ограниченное использование и не позволяет нам реагировать на реальные действия пользователя. Чтобы сделать более сложные вещи, нам нужно зарегистрировать функцию, которая будет вызываться при определённом событии. Наиболее распространенным событием для реагирования является сочетание клавиш.
darktable = require “darktable”
local function hello_shortcut(event, shortcut)
darktable.print(“Hello, I just received '”..event..
“' with parameter '”..shortcut..”'”)
end
darktable.register_event(“shortcut”,hello_shortcut,
“A shortcut that print its parameters”)
Теперь запустим darktable, перейдём в "Параметры darktable" => "Клавиатурные комбинации" => "Lua" => "A shortcut that print its parameters", назначим клавиатурную комбинацию и воспользуемся ею. На экране должно появиться сообщение.

Давайте детально рассмотрим код. Сначала мы определяем функцию с двумя параметрами. Эти параметры являются строками. Первый параметр - это тип события, которое запускает скрипт (в нашем случае это будет "shortcut"), а второй параметр – текстовое описание этого события ("A shortcut that print its parameters"). Сама функция вызывает darktable.print для вывода сообщения в всплывающем окне.

Как только эта функция определена, мы регистрируем её для быстрого вызова. Для этого мы вызываем функцию darktable.register_event, которая является общей для всех типов событий. Мы указываем ей, что регистрируем событие на комбинацию клавиш, затем мы указываем функцию, которую должны вызвать, и предоставляем строку для описания комбинации клавиш в окне параметров.

Попробуем сделать комбинацию клавиш немного более интерактивной. Сценарий будет просматривать изображение, которое пользователь в настоящее время выбрал или над которым находится курсор мыши, и повышать его рейтинг.
darktable = require “darktable”
darktable.register_event(“shortcut”,function(event,shortcut)
   local images = darktable.gui.action_images
    for _,v in pairs(images) do
      v.rating = v.rating + 1
   end
  end,”Increase the rating of an image”)
На этом этапе большая часть кода должна быть понятной. Всего несколько замечаний:
  • Вместо того чтобы отдельно объявлять функцию и ссылаться на нее, мы объявляем ее непосредственно в вызове darktable.register_event, этот способ эквивалентен ранее рассмотренному, но немного более компактен и сложнее для восприятия.
  • image.rating - это поле объекта изображения, которое содержит рейтинг (от 0 до 5 звезд, -1 означает отклонение изображения).
  • darktable.gui.action_images представляет собой таблицу, содержащую все изображения, представляющие интерес (входят в текущую коллекцию). Darktable будет воздействовать на выбранные изображения, если выбрано какое-либо изображение, или на изображение под курсором мыши, если изображений не выбрано. Эта функция позволяет легко следовать логике пользовательского интерфейса darktable в lua.

Если вы выберете изображение и несколько раз нажмете назначенную комбинацию клавиш, то всё будет работать правильно, но когда вы достигнете пяти звезд, darktable начнет выводить на консоль следующую ошибку:
                                      LUA ERROR : rating too high : 6
                                      stack traceback:
                                      [C]: in ?
                                      [C]: in function '__newindex'
./configdir/luarc:10: in function <./configdir/luarc:7>
                                         LUA ERROR : rating too high : 6
Таким образом сценарии на Lua сообщают нам об ошибках. Мы попытались установить рейтинг 6 для изображения, но рейтинг может достигать всего 5. Было бы правильно добавить проверку на правильность устанавливаемого рейтинга, но давайте рассмотрим сложный способ и отследим ошибку.
darktable.register_event(“shortcut”,function(event,shortcut)
   local images = darktable.gui.action_images
   for _,v in pairs(images) do
      result,message = pcall(function()
         v.rating = v.rating + 1
         end)
      if not result then
         darktable.print_error(“could not increase rating of image” ..
            tostring(v).. “:” ..message)
      end
   end
end,”Increase the rating of an image”)
Функция pcall улавливает любое исключение сгенерированное выполнением своего первого аргумента. Если нет исключения, то будет возвращено значение true плюс любой результат, возвращаемый функцией; если есть исключение, то будет возвращено false и сообщение об ошибке исключения. Далее мы просто проверяем эти результаты и выводим их на консоль...

9.1.5. Экспорт изображений с использованием Lua

Мы научились использовать lua для адаптации darktable к нашему конкретному рабочему процессу, давайте посмотрим, как использовать lua для несложного экспорта изображений. Darktable может экспортировать изображения в несколько интернет-сервисов, но всегда есть другие сервисы, которые ещё не поддерживаются. Если вы можете загрузить изображение в сервис через командную строку, вы можете использовать lua для её интеграции в пользовательский интерфейс darktable.

В следующем примере мы будем использовать lua для экспорта через scp (прим. переводчика: утилита удалённого копирования файлов, использующая в качестве транспорта ssh). Новое хранилище появится в пользовательском интерфейсе darktable и позволит экспортировать изображения в удаленное хранилище с помощью протокола ssh.
darktable = require "darktable"

darktable.preferences.register("scp_export","export_path",
   "string","target SCP path",
   "Complete path to copy to. Can include user and hostname","")

darktable.register_storage("scp_export","Export via scp",
   function( storage, image, format, filename,
        number, total, high_quality, extra_data)
      if coroutine.yield("RUN_COMMAND","scp "..filename.." "..
         darktable.preferences.read("scp_export",
            "export_path","string")) then
         darktable.print_error("scp failed for "..tostring(image))
      end
end)
Функция darktable.preferences.register добавляет новый параметр в меню "Параметры darktable" во вкладку "Параметры Lua". Параметры scp_export и export_path позволяют нам однозначно определить необходимые настройки. Эти поля используются повторно, когда мы читаем значение параметра. Параметр string сообщает Lua , что параметр является строкой. Он также может быть целым числом, именем файла или любым из типов, подробно описанных в руководстве по API, относящемся к types_lua_pref_type. Далее указывается текст параметра, отображаемый в меню "Параметры darktable", всплывающая подсказка при наведении мыши на поле ввода значения и значение по умолчанию.

Функция darktable.register_storage осуществляет вызов, который фактически регистрирует новое хранилище. Первый аргумент - это имя хранилища, второй - строка, которая будет отображаться в пользовательском интерфейсе, а последний - функция вызова для каждого экспортируемого изображения. Эта функция имеет множество параметров, но только параметр filename мы используем в этом примере. Он содержит имя временного файла, которое будет экспортировано darktable.

Этот код будет работать, но у него есть несколько ограничений. Это всего лишь простой пример:

  • Мы используем параметр для настройки целевого пути. Было бы лучше добавить элемент в пользовательский интерфейс модуля экспорта. Мы подробно расскажем, как это сделать в следующем разделе
  • Мы не проверяем возвращаемое значение scp. Команда может выполняться с ошибками, в частности, если пользователь неправильно установил параметр.
  • Этот сценарий не может считывать данные от пользователя. Доступ к удаленному хранилищу не должен использовать пароль. Пароль scp не может быть легко предоставлен, поэтому мы оставим сценарий таким каким он есть.
  • После выполнения сценария сообщения о выполнении не отображаются, только в левой нижней части приложения пользователю сообщается, что задание выполнено.
  • Мы используем функцию coroutine.yield для вызова внешней программы. Обычный os.execute блокирует другой код lua.

9.1.6. Создание элемента пользовательского интерфейса

Наш предыдущий пример был немного ограничен. В частности, использование параметра пути экспорта было не очень удобным. Мы можем сделать лучше, добавив элементы в пользовательский интерфейс диалогового окна экспорта.

Элементы пользовательского интерфейса создаются с помощью функции darktable_new_widget. Эта функция принимает вид виджета в качестве параметра и возвращает новый объект, соответствующий этому виджету. Затем можно установить для этого виджета различные поля, чтобы настроить его. Мы будем использовать этот объект в качестве параметра для различных функций, которые добавят его в пользовательский интерфейс darktable. Следующий простой пример добавляет "библиотеку" в режиме "Обзор" в виде простой надписи
local my_label = darktable.new_widget("label")
my_label.label = "Hello, world !"

dt.register_lib("test","test",false,{
   [dt.gui.views.lighttable] = {"DT_UI_CONTAINER_PANEL_LEFT_CENTER",20},
   },my_label)
Существует хороший синтаксический трюк, который упрощает чтение и запись кода элемента интерфейса пользователя. Вы можете вызвать эти объекты как функции с таблицей ключевых значений в качестве аргументов. Это демонстрирует следующий пример. Он создает виджет контейнера с двумя встроенными виджетами: надпись и поле ввода текста.
   local my_widget = darktable.new_widget("box"){
      darktable.new_widget("label"){ label = "here => " },
      darktable.new_widget("entry"){ tooltip = "please enter text
here" }
   }
Теперь, когда мы это знаем, давайте немного улучшим наш скрипт.
darktable = require "darktable"

local scp_path = darktable.new_widget("entry"){
   tooltip="Complete path to copy to. Can include user and hostname",
   text = "",
   reset_callback = function(self) self.text = "" end
}

darktable.register_storage("scp_export","Export via scp",
   function( storage, image, format, filename,
        number, total, high_quality, extra_data)
      if coroutine.yield("RUN_COMMAND","scp "..filename.." "..
         scp_path.text
      ) then
         darktable.print_error("scp failed for "..tostring(image))
      end
      end,
      nil, --finalize
     nil, --supported
     nil, --initialize
    darktable.new_widget("box") {
    orientation ="horizontal",
    darktable.new_widget("label"){label = "target SCP PATH "},
    scp_path,
})

9.1.7. Распространение сценариев

До сих пор наш сценарий lua был в расположен в файле luarc. Это хороший способ для разработки своего скрипта, но не очень практичный для его распространения. Для этого мы должны разместить его в отдельном файле (модуле lua). Например, в файле scp-storage.lua как в примере:
--[[
SCP STORAGE
a simple storage to export images via scp

AUTHOR
Jérémy Rosen (jeremy.rosen@enst-bretagne.fr)

INSTALLATION
* copy this file in $CONFIGDIR/lua/ where CONFIGDIR
is your darktable configuration directory
* add the following line in the file $CONFIGDIR/luarc
require "scp-storage"

USAGE
* select "Export via SCP" in the storage selection menu
* set the target directory
* export your images

LICENSE
GPLv2

]]
darktable = require "darktable"
darktable.configuration.check_version(...,{2,0,0})

local scp_path = darktable.new_widget("entry"){
   tooltip ="Complete path to copy to. Can include user and hostname",
   text = "",
   reset_callback = function(self) self.text = "" end
}

darktable.register_storage("scp_export","Export via scp",
   function( storage, image, format, filename,
        number, total, high_quality, extra_data)
      if coroutine.yield("RUN_COMMAND","scp "..filename.." "..
         scp_path.text
      ) then
         darktable.print_error("scp failed for "..tostring(image))
      end
      end,
      nil, --finalize
      nil, --supported
      nil, --initialize
      darktable.new_widget("box") {
      orientation ="horizontal",
      darktable.new_widget("label"){label = "target SCP PATH "},
      scp_path,
})
Darktable будет искать скрипты (следуя обычным правилам lua) в стандартных каталогах плюс в каталоге $CONFIGDIR/lua/?.lua. Поэтому наш скрипт можно вызвать, просто добавив require “scp-storage” в файл luarc. Несколько дополнительных заметок ...

  • Функция darktable.configuration.check_version проверяет совместимость. В параметр ... будет возвращено имя вашего скрипта, а параметр {2,0,0} будет версией API, с которой вы протестировали свой скрипт. Вы можете добавить несколько версий API, если вы разработает свой скрипт для нескольких версий darktable.
  • Обязательно объявите все свои функции как local, чтобы не загрязнять общее пространство имен.
  • Убедитесь, что вы не оставляете отладочные строки в своем коде, в частности darktable.print_error позволяет оставлять отладочные данные в конечном коде, не нарушая работу консоли.
  • Вы можете выбрать любую лицензию для своего скрипта, но скрипты, загруженные на веб-сайт darktable, должны соответствовать лицензии GPLv2.
  • После того, как вы заполнили все поля, проверили ваш код, вы можете загрузить его на нашу страницу сценариев [https://darktable.org/redmine/projects/darktable/wiki/LuaScripts] (прим. переводчика: в настоящий момент данный сайт предлагает искать скрипты по новому адресу [https://github.com/darktable-org/lua-scripts]).

9.1.8. Вызов Lua через DBus

Можно отправить команду lua в darktable через интерфейс DBus. Метод org.darktable.service.Remote.Lua принимает единственный строковый параметр, который интерпретируется как команда lua. Команда будет выполнена в текущем контексте lua и должна возвращать либо nil, либо строку. Результат будет возвращен в результат метода DBus.

Если вызов Lua приводит к ошибке, вызов метода DBus возвращает ошибку org.darktable.Error.LuaError с сообщением об ошибке lua в качестве сообщения, прикрепленного к ошибке DBus.

9.1.9. Использование darktable из сценариев lua

Предупреждение: эта возможность экспериментальная. Известно, что несколько элементов еще не работает в режиме использования darktable как библиотеки. Тщательное тестирование настоятельно рекомендуется.

Интерфейс lua позволяет использовать darktable из любого сценария lua. Загружая darktable в качестве библиотеки и предоставляя вам большую часть lua API (darktable используется без графического интерфейса, поэтому функции связанные с ним недоступны).

В качестве примера следующая программа будет распечатывать список всех изображений вашей библиотеки:
#!/usr/bin/env lua
package = require "package"
package.cpath=package.cpath..";./lib/darktable/lib?.so"

dt = require("darktable")(
"--library", "./library.db",
"--datadir", "./share/darktable",
"--moduledir", "./lib/darktable",
"--configdir", "./configdir",
"--cachedir","cachedir",
"--g-fatal-warnings")

require("darktable.debug")

for k,v in ipairs(dt.database) do
   print(tostring(v))
end
Обратите внимание на третью строку, указывающую на местоположение файла libdarktable.so.

Также обратите внимание, что вызов require возвращает функцию, которая может быть вызвана только один раз, и позволяет установить параметр командной строки darktable. В качестве файла библиотеки вы можете использовать :memory: в параметре –library, он будет особенно полезен здесь, если вы не хотите работать в своей библиотеке изображений.