在一个文件中对另一个python程序执行多次,并每次传入不同的参数

问题背景及描述

最近在看一篇关于神经风格迁移的论文,在复现论文代码时,源代码一共只有一个文本文件,如果希望对多张图片进行不同的StyleTransfer操作则比较困难,因为图片路径、大小,希望迁移的风格图(Style和Content)等都不一样。

与此同时,源代码的python文件编写地并不是很规范,函数片段之间有局部的代码片段,变量之间相互引用比较混乱,且没有编写main函数,导致无法通过函数调用方式对同一段程序进行多次执行。

为了解决这个问题,我进行了两步操作。
第1步-批量resize了图片的大小,这对模型训练、服务器接收数据都有好处(图片太大GPU可能会崩掉),这个在另一篇文章中也有所介绍。
第2步-解决了在基本不改变源码的情况下,直接对源码文件进行多次执行,避免了重复与命令行交互之类的手动操作。同时,做到了每次调用都可以按照自己的需要传入相应的参数,实现了对不同路径的图片都同样处理;用相似的思路,也可以实现对不同的Content图片,传入与之对应的Style图片与之对应并进行风格迁移。

问题推广

推广这个问题,用同样的方法,可以解决在一个python程序里多次调用另一个的python程序,并在每次提供不同参数的问题。

代码片段解释

片段一:


def read_directory(directory_name):
	#记得import os
    for filename in os.listdir(r"./" + directory_name):
        content_dirs.append(filename)
    return content_dirs

这个片段用于返回同一个文件夹下所有图片的名称。

片段二:

def main():
    Process_dir = 'content_pic'
    c_dirs = read_directory(Process_dir)
    for c_dir in c_dirs:
    #记得import cv2
        pro_dir = Process_dir+'/'+c_dir
        img_array = cv2.imread(pro_dir, cv2.IMREAD_COLOR)
        resize_img = cv2.resize(img_array, (512, 512), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite(resize_img_dir+c_dir, resize_img)
    return c_dirs

这个片段用于将’content_pic’文件夹下面所有的图片resize为(512,512)大小。处理完之后全部保存在resize_img_dir对应的文件夹下,图片名称不变。

片段三:批量调用的部分(在你的问题上推广使用)

if __name__ == "__main__":
    content_pic_lists = main()
    cnt = 0
    for content_pic_list in content_pic_lists:
        cr = resize_img_dir+content_pic_list
        print(cr)
        cnt = cnt + 1
        print("********************************正在处理第",cnt,"张图片********************************")
        os.system(r'python ./StyleTransfer.py %s' % cr)

核心代码就是下面这一段:

os.system(r'python ./StyleTransfer.py %s' % cr)

如果你想在你的程序里实现类似的功能,可以更改以下参数:

os.system(r'python ./文件名.py %s %s ...' %(x,y...))

1.文件名更改为你自己的文件名(记得路径要对应)
2.%s %s是传入的参数,%(x,y)与之对应,这种情况就是传入两个参数;
如果写成 os.system(r’python ./xxx.py %s’ % x )就是传入一个参数。

片段四:被调用的文件(接受不同参数)

import sys
content_pic_name = sys.argv[1]

如果你只传入了一个参数,那么这样写就会把这个参数传进变量中,如果传入两个参数,稍微更改即可:

import sys
x = sys.argv[1]#第一个参数
y = sys.argv[2]#第二个参数

完整代码

文件一 main.py(批量处理的文件)

import os
import cv2

content_dirs = []
resize_img_dir = 'resize_pic/'

def read_directory(directory_name):
    for filename in os.listdir(r"./" + directory_name):
        #content_dir = directory_name + '/' + filename
        #content_dirs.append(content_dir)
        content_dirs.append(filename)
    return content_dirs


def main():
    Process_dir = 'content_pic'
    c_dirs = read_directory(Process_dir)
    for c_dir in c_dirs:
        pro_dir = Process_dir+'/'+c_dir
        img_array = cv2.imread(pro_dir, cv2.IMREAD_COLOR)
        resize_img = cv2.resize(img_array, (512, 512), interpolation=cv2.INTER_CUBIC)
        cv2.imwrite(resize_img_dir+c_dir, resize_img)
    return c_dirs


if __name__ == "__main__":
    content_pic_lists = main()
    cnt = 0
    for content_pic_list in content_pic_lists:
        cr = resize_img_dir+content_pic_list
        print(cr)
        cnt = cnt + 1
        print("********************************正在处理第",cnt,"张图片********************************")
        os.system(r'python ./StyleTransfer.py %s' % cr)

文件二(被调用的文件)

import sys
x = sys.argv[1]
#y = sys.argv[2]
#之后对x,y进行相应处理即可
...
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值