У меня возникают проблемы с передачей пунктирных аргументов в cmd.exe для выполнения скрипта (Python).
Код, который работает (без пунктирных аргументов):
ProcessStartInfo psi = new()
{
FileName = "cmd.exe",
Arguments = $"/c \"rembg i {inputPath} {outputPath}\"",
RedirectStandardError = true,
RedirectStandardOutput = true,
};
Process proc = Process.Start(psi);
string output = proc.StandardOutput.ReadToEnd();
string error = proc.StandardError.ReadToEnd();
await proc.WaitForExitAsync();
Код, который не работает (с пунктирными аргументами):
ProcessStartInfo psi = new()
{
FileName = "cmd.exe",
Arguments = $"/c \"rembg i -a -ae 15 {inputPath} {outputPath}\"",
RedirectStandardError = true,
RedirectStandardOutput = true,
};
Process proc = Process.Start(psi);
string output = proc.StandardOutput.ReadToEnd();
string error = proc.StandardError.ReadToEnd();
await proc.WaitForExitAsync();
Интересно, что оба случая дают правильные результаты при прямом запуске в оболочке cmd:
rembg i INPUT_PATH OUTPUT_PATH
Или:
rembg i -a -ae 15 INPUT_PATH OUTPUT_PATH
Даже при запуске непосредственно как процесс cmd в оболочке cmd он работает, например:
cmd /c "rembg i -a -ae 15 INPUT_PATH OUTPUT_PATH"
Если это не что-то очень очевидное, что я упускаю, похоже, проблема заключается в передаче пунктирных параметров сценарию, который обычно работает напрямую из оболочки cmd и при запуске нового процесса cmd из оболочки.
РЕДАКТИРОВАТЬ:
Это ошибка, полученная в StandardError, происходящая от rembg:
Traceback (most recent call last):
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\Scripts\rembg.exe\__main__.py", line 7, in <module>
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1128, in __call__
return self.main(*args, **kwargs)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1053, in main
rv = self.invoke(ctx)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1659, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 1395, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\click\core.py", line 754, in invoke
return __callback(*args, **kwargs)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\cli.py", line 87, in i
output.write(remove(input.read(), session=new_session(model), **kwargs))
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\bg.py", line 116, in remove
cutout = alpha_matting_cutout(
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\rembg\bg.py", line 52, in alpha_matting_cutout
alpha = estimate_alpha_cf(img_normalized, trimap_normalized)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\alpha\estimate_alpha_cf.py", line 53, in estimate_alpha_cf
L = cf_laplacian(image, **laplacian_kwargs, is_known=is_known)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\laplacian\cf_laplacian.py", line 168, in cf_laplacian
_cf_laplacian(image, epsilon, radius, values, indices, indptr, is_known)
File "C:\Users\sven.mijic\AppData\Local\Programs\Python\Python39\lib\site-packages\pymatting\laplacian\cf_laplacian.py", line 8, in _cf_laplacian
assert d == 3
AssertionError
Решение проблемы
С некоторыми дополнительными испытаниями я обнаружил, как это работает.
Таким образом, rembgскрипт запускается как часть кода C# после того, как изображение было предварительно обработано SixLabors.ImageSharp.
Однако, когда я сохранил изображение как тип PNG (используя Image.SaveAsPngAsync()), дополнительные аргументы тире rembgсценария, которые представляют альфа-матирование, не будут работать. Как только я сохранил изображение в формате JPEG ( Image.SaveAsJpegAsync()), альфа-матирование прошло. В противном случае, без аргументов альфа-матирования, rembgсценарий будет правильно работать для формата PNG, поэтому я не подозревал, что проблема в самом формате изображения.
Было бы полезно, если бы кто-то еще мог дать дополнительную ясность относительно того, почему это работает. Я предполагаю, что это связано с характером различных форматов изображений и их обработкой. В противном случае, я надеюсь, что это само по себе может помочь кому-то еще с той же проблемой.
Комментариев нет:
Отправить комментарий