优化前情形
"敏捷开拓,快速迭代",彷佛这种思维从多年前就埋在了脑筋里 (借口)。以是前文算是个初版 demo,并且在环境中运行只是用 cmd 来完成,没有利用专门 Python 的 IDE。也很有可能是这个缘故原由,在实行代码里,只假如关于获取当前目录的地方都不起效果,这是一点另一点便是上面重点要办理的,提升人脸更换的处理速率,这里要用到多线程。
编码
1. 人脸更换部分
用法就不多讲了,Py 干系的文档有讲,以下只是代码片段,可以用这个更换前面文章代码里的 face_replace 函数。经由测试,相同的张数的图片 (这里只有 403 张),处理韶光比前者缩短了半小时。
def face_replace(user_path=""): import threading from pathlib import Path import cv2 from modelscope.outputs import OutputKeys from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import os os.environ['KMP_DUPLICATE_LIB_OK'] = 'True' max_workers = 2 semaphore = threading.Semaphore(max_workers) def my_function(img_path): with semaphore: print(f"{img_path} 开始") image_face_fusion = pipeline(Tasks.image_face_fusion, model='damo/cv_unet-image-face-fusion_damo') template_path = img_path filename = os.path.splitext(os.path.basename(img_path))[0] result = image_face_fusion(dict(template=template_path, user=user_path)) cv2.imwrite(f'video_imgout/{filename}.jpg', result[OutputKeys.OUTPUT_IMG]) print(f"{filename}.png ok") threads = [] BASE_PATH = os.path.dirname(__file__) for dirpath, dirnames, filenames in os.walk(BASE_PATH + "/video_img"): for filename in filenames: print(filename) if filename.endswith('.jpg'): file_path = Path(os.path.join(dirpath, filename)) t = threading.Thread(target=my_function, args=(str(file_path),)).start() threads.append(t)
由于也有一些没有打仗过 python 的小伙伴留言,这里就再先容一下 IDE 的运行,也为理解决在 cmd 中运行涌现获取当前路径问题。前面也有文章先容关于 Python 虚拟环境的创建,这里就跳过了,直接演示在 IDE 中配置虚拟环境和运行代码。
1. 查看当前环境下的环境列表。
2. 打开 IDE 创建项目后进入。
3. 选择 Project,选择已经创建好的虚拟环境。
4. 查看当前项目是否在该环境下
5. 末了就可以直接用于代码了。