一、需求描述
设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。
效果图

二、实现思路
总体思路:
- 用户通过Gradio界面上传黑白视频
- 视频被传递给
video_colorize
函数 - 函数使用ModelScope平台提供的UNet模型进行视频上色
- 处理后的视频路径被返回给Gradio界面
- Gradio界面显示上色后的视频
2.1 导入依赖库
import gradio as gr
import os
import torch
import tempfile
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
gradio
: 用于创建Web界面的库,可以快速构建机器学习模型的演示界面os
: Python标准库,用于处理文件和目录操作torch
: PyTorch深度学习框架tempfile
: Python标准库,用于处理临时文件和目录modelscope
: 阿里云开源的模型即服务框架,提供了大量预训练模型OutputKeys
: 定义了模型输出的标准键名pipeline
: 用于创建模型推理管道Tasks
: 定义了支持的任务类型
2.2 安全设置和临时目录配置
# 添加安全全局变量设置
torch.serialization.add_safe_globals([slice])
# 设置临时目录
temp_dir = "D:/condaLearning/temp"
os.makedirs(temp_dir, exist_ok=True)
tempfile.tempdir = temp_dir
torch.serialization.add_safe_globals
: 添加安全的全局变量,用于模型加载os.makedirs
: 创建临时目录exist_ok=True
表示如果目录已存在则不报错
tempfile.tempdir
: 设置临时文件的默认目录
2.3 视频上色video_colorize函数
def video_colorize(input_video):# 在临时目录中创建输出文件路径output_video_path = os.path.join(temp_dir, 'colored_video.mp4')# 创建视频上色管道colorizer = pipeline(Tasks.video_colorization, model='damo/cv_unet_video-colorization', device='cuda')# 进行视频上色result = colorizer(input_video)# 返回处理后的视频路径return result[OutputKeys.OUTPUT_VIDEO]
os.path.join
:该函数用于将多个路径组合成为输出文件的路径output_video_path,该路径为D:/condaLearning/temp/colored_video.mp4pipeline
: 创建模型推理管道Tasks.video_colorization
: 指定任务类型为视频上色model='damo/cv_unet_video-colorization'
: 使用ModelScope中的视频上色模型damo/cv_unet_video-colorizationdevice='cuda'
: 使用GPU进行推理
colorizer(input_video)
: 执行视频上色result[OutputKeys.OUTPUT_VIDEO]
: 获取处理后的视频路径
2.4 Gradio界面创建
# 创建Gradio界面
demo = gr.Interface(fn=video_colorize,inputs=gr.Video(label="上传黑白视频"),outputs=gr.Video(label="上色后的视频"),
)
gr.Interface
: 调用Gradio的Interface类,来创建Gradio界面fn=video_colorize
: 指定处理函数为video_colorizeinputs=gr.Video
: 使用视频上传组件,标签为"上传黑白视频"outputs=gr.Video
: 使用视频显示组件,标签为"上色后的视频"
2.5 启动应用
if __name__ == "__main__":demo.launch(share=False)
demo.launch
: 启动Gradio服务器share=False
: 不创建公共链接,只在本地运行
三、完整代码
import gradio as gr
import os
import torch
import tempfile
from modelscope.outputs import OutputKeys
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks# 添加安全全局变量设置
torch.serialization.add_safe_globals([slice])# 设置临时目录
temp_dir = "D:/condaLearning/temp"
os.makedirs(temp_dir, exist_ok=True)
tempfile.tempdir = temp_dir# 定义视频上色函数
def video_colorize(input_video):# 在临时目录中创建输出文件路径output_video_path = os.path.join(temp_dir, 'colored_video.mp4')# 创建视频上色管道colorizer = pipeline(Tasks.video_colorization, model='damo/cv_unet_video-colorization', device='cuda')# 进行视频上色result = colorizer(input_video)# 保存上色后的视频到临时目录# 直接返回结果中的视频路径,而不是尝试写入文件return result[OutputKeys.OUTPUT_VIDEO]# 创建Gradio界面
demo = gr.Interface(fn=video_colorize,inputs=gr.Video(label="上传黑白视频"),outputs=gr.Video(label="上色后的视频"),
)if __name__ == "__main__":demo.launch(share=False)
四、效果展示
运行成功后,生成URL:http://127.0.0.1:7860
浏览器打开生成的URL:http://127.0.0.1:7860
打开准备好的黑白视频
处理后的视频
五、问题与解决
问题一:ModuleNotFoundError: No module named ‘xxx’(下图为示例)
解决一:pip install xxx
#过程中遇到需要安装的依赖包
pip install gradio
pip install modelscope
pip install addict
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
pip install datasets==3.3.0
pip install simplejson
pip install sortedcontainers
pip install opencv-python
pip install ffmpeg
问题二:ImportError: cannot import name ‘get_metadata_patterns’ from ‘datasets.data_files’
解决二:pip install datasets==3.3.0
问题三:PermissionError: [Errno 13] Permission denied: ‘D:\XXX\temp\gradio\09d4c3363b495e6c51b91b4c04a11b213ff48ceb3f09a20b7b46a238dfaf17ca\luomajiari.mp4’
解决三:按照报错信息,将路径下的mp4缓存的文件删除