文章目录
- 问题背景及描述
- 问题推广
- 代码片段解释
- 片段一:
- 片段二:
- 片段三:批量调用的部分(在你的问题上推广使用)
- 片段四:被调用的文件(接受不同参数)
- 完整代码
- 文件一 main.py(批量处理的文件)
- 文件二(被调用的文件)
问题背景及描述
最近在看一篇关于神经风格迁移的论文,在复现论文代码时,源代码一共只有一个文本文件,如果希望对多张图片进行不同的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进行相应处理即可
...