Показать полную графическую версию : [решено] Распаралелить обработку изображений
Здравствуйте, мне нужна помощь в решении следующей задачи:
Надо периодически обрабатывать серии снимков накладывая на них серийный номер.
(на каждое изображение наносится номер начиная с единицы и так далее)
Выглядит очень упрощённо так:
for %%a in( *.png ) do (
set var=Счётчик+дата
magick %%a -клеим %var% .\output\%~nxa
Оказалось что обработка изображений задача весьма долгая.
На обработку ~400 картинок уходит ~30 минут.
(Там не просто текст приклеивается а хитрым образом обрабатывается для контраста.)
У машинки на которой выполняется эта задача четыре ядра и я подумал нет ли возможности
распаралелить задачу на четыре потока. Основная проблема что количество картинок всегда разное
и нужен серийный номер. Я батниках не совсем новичок но как решать подобную задачу не знаю.
Нужна помощь хотя бы на уровне алгоритма.
с помощью cmd получится разве что разделить на 4 части для действий какого-то инструмента разделяющего ядра и понятно что это наоборот - еще увеличит общее время выполнения задачи.
DJ Mogarych
04-01-2020, 22:37
Можно попробовать через ffmpeg с параметром -threads.
ateka, картинки какой общий объём занимают? Можете ли Вы их выложить (пока не выкладывайте, вопрос задан как теоретический)?
Кроме того, покажите полный код Вашего пакетного файла. Всё ж, полчаса на наложение текста на 400 изображений (если они не по полгигабайта), на мой взгляд, многовато.
P.S. И что значит «серийный номер»? В чём его отличие от просто порядкового номера?
Iska, я сначала тоже так думал но похоже в эту сторону копать бесполезно.
Картинки меньше 1М и дело именно в обработке. Приведу абстрактный пример:
https://i.imgur.com/beBebv7.png
Как видно текст отлично виден на любом фоне но его обработка занимает много ресурсов.
Код для примера взят с сайта ИМ.
:: https://www.imagemagick.org/Usage/annotating/
convert -size 100x14 xc:none -gravity center \
-stroke black -strokewidth 2 -annotate 0 'Faerie Dragon' \
-background none -shadow 100x3+0+0 +repage \
-stroke none -fill white -annotate 0 'Faerie Dragon' \
dragon.gif +swap -gravity south -geometry +0-3 \
-composite anno_fancy.jpg
Я ещё возможно спрошу на оффоруме но шансы невелики.
--------------------------------------------------------------------------------------------------
Я нагуглил следующее решение проблемы.
Есть такая утилита https://github.com/lordmulder/MParallel
Простая как бублик. Пример кода:
echo. >Build_01X1.txt
for %%a in (.\temp\*.png) do (
echo magick "%%a" -flip ".\output\%%~nxa" >>Build_01X1.txt
)
MParallel --input=Build_01X1.txt
Визуально видно что отрабатывает по четыре процесса.
Но прирост скорости даёт только вдвое. На машинке камень 2х2.
Видимо маджик умеет в гипертрединг.
Наверное вопрос можно считать решённым.
Но мне в принципе интересно каким образом распаралеливают задачи для батников.
Например я уверен что у уважаемого Мегаломана есть изящное решение.
Интересена не конкретика а алгоритм.
Приведу абстрактный пример: »
Не надо абстрактный. Нужен конкретный.
Я нагуглил следующее решение проблемы. »
Попробовать можете, но особого толку от этого не вижу.
Видимо маджик умеет в гипертрединг. »
Разумеется, не «hyperthreading», а «multithreading», это совершенно различные понятия. Выполните:
magick.exe -version
и посмотрите, есть ли OpenMP во Features.
А так:
ImageMagick uses a single thread to read an image but multiple threads for image processing algorithms such as resizing.
Но мне в принципе интересно каким образом распаралеливают задачи для батников. »
Да точно так же, как, полагаю, и сделано по ссылке (не смотрел): создали последовательность команд, берём оттуда количество команд по указанной длине очереди, запускаем каждую на исполнение, и начинаем ждать завершения. Как только очередная команда завершилась — запускаем на исполнение следующую. И так до исчерпания последовательности. В нынешних ОС, насколько я понимаю, даже нет особой необходимости принудительно задавать Affinity, поскольку они сами подбирают наиболее подходящее в текущий момент ядро для исполнения потока.
Попробовать можете, но особого толку от этого не вижу »
Толк в том что скорость обработки возросла вдвое.
посмотрите, есть ли OpenMP во Features »
Есть.
ImageMagick uses a single thread to read an image but multiple threads for image processing algorithms such as resizing. »
Похоже что это не так. Возможно подобный функционал включается отдельно.
создали последовательность команд... »
А как из одного батника запустить четыре задачи? Четыре раза start "" ?
Четыре раза start "" »
@echo off
if "%~1" neq "" (call %*& exit /b)
call :# :#1
call :# :#2
call :# :#3
call :# :#4
exit /b
:#
start "" cmd /c "%~f0 %*"
exit /b
:#1
title C1
start "" "process1"
exit /b
:#2
title C2
start "" "process2"
exit /b
:#3
title C3
start "" "process3"
exit /b
:#4
title C4
start "" "process4"
exit /b
Толк в том что скорость обработки возросла вдвое. »
Значит, в Вашем коде (который Вы так и не хотите привести), возможно, не всё так оптимально.
Похоже что это не так. »
magick.exe logo: -resize 2000% null:
https://i.imgur.com/7po7XkZ.png
А как из одного батника запустить четыре задачи? Четыре раза start "" ? »
Угу. Но пакетные файлы не слишком хорошо годятся для таких задач: сложно отслеживать завершение. Лучше пользуйте WSH/PoSH.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.