cv_unet_image-colorization开源模型部署从Git克隆到服务上线全流程你是不是在网上看到过一些给黑白老照片上色的神奇效果觉得特别酷也想自己动手试试今天我就带你从零开始把一个开源的图像上色模型cv_unet_image-colorization从GitHub上“搬”下来一步步把它变成一个可以对外提供服务的Web应用。整个过程就像搭积木我会把每一步都拆解得清清楚楚即使你之前没怎么接触过Git或者Web服务跟着做也能搞定。1. 开始之前你需要准备什么在动手之前我们先看看需要哪些“工具”。放心要求不高。首先你需要一台电脑操作系统可以是Windows、macOS或者Linux。我建议使用Linux系统比如Ubuntu或者macOS因为很多开源项目在这两个系统上兼容性最好命令行操作也更方便。Windows用户完全没问题只是个别命令可能需要稍作调整。其次你需要安装几个基础的软件Git这是我们用来从GitHub下载代码的工具。如果你还没装去Git官网下载安装包一路“下一步”就行。Python 3.8 或更高版本这个模型是用Python写的所以Python环境是必须的。建议安装Python 3.8以上版本。一个代码编辑器比如VS Code、PyCharm或者Sublime Text用来查看和修改代码选你顺手的就行。最后确保你的网络环境可以正常访问GitHub。如果下载模型文件比较慢后面我也会提到一些小技巧。好了工具齐备我们正式开始。2. 第一步把代码从GitHub“搬”回家我们的第一步就是把项目代码从远程的GitHub仓库克隆到你的本地电脑上。这个过程叫做git clone。打开你的命令行工具Windows上是CMD或PowerShellmacOS/Linux上是Terminal找一个你打算存放这个项目的文件夹然后输入下面这行命令git clone https://github.com/richzhang/colorization.git敲下回车后你会看到命令行开始滚动一些信息最后显示“done”或者“克隆完成”。这就意味着一个名为colorization的文件夹已经出现在你当前的目录下了。这个文件夹里就包含了我们需要的所有源代码。这里有个小细节原项目名可能不完全是cv_unet_image-colorization但核心的彩色化模型代码都在这个colorization仓库里。我们以这个为准。进入这个文件夹看看里面有什么cd colorization ls # 在macOS/Linux上使用Windows上用 dir你应该能看到一些Python脚本文件.py、配置文件、说明文档README.md等等。README文件通常很重要它就像产品的说明书不过我们今天会一步步带你走不看说明书也能装好。3. 第二步搭建专属的Python工作环境为了避免我们安装的包和你电脑上其他项目的包“打架”最好创建一个独立的Python虚拟环境。这就像给你的这个项目单独安排一个干净的房间里面只放它需要的东西。我们使用Python自带的venv模块来创建。还是在colorization文件夹下执行# 创建一个名为 venv 的虚拟环境文件夹 python3 -m venv venv这条命令执行后当前目录下会多出一个叫venv的文件夹。接下来我们需要激活这个环境在macOS/Linux上source venv/bin/activate在Windows上.\venv\Scripts\activate激活成功后你的命令行提示符前面通常会显示(venv)这就表示你现在已经在这个虚拟环境里工作了。之后所有安装的Python包都会装在这个环境里不会影响系统其他地方。4. 第三步安装项目需要的“零件”每个项目都依赖一些第三方代码库就像拼模型需要胶水一样。这些依赖通常写在一个叫requirements.txt的文件里。我们来看看这个项目需要什么并安装它们。首先我们安装最核心的深度学习框架PyTorch。访问 PyTorch官网它会根据你的系统操作系统、包管理工具、CUDA版本生成一条最适合的安装命令。比如如果你用pip且不需要GPUCUDA命令可能长这样pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu注意安装PyTorch可能需要一点时间并且文件比较大。如果你有NVIDIA显卡并且想用GPU加速可以在官网选择对应的CUDA版本。对于上色这个任务CPU也能跑只是慢一点。安装好PyTorch后我们再安装项目需要的其他通用库。通常我们需要numpy,opencv-python,pillow等来处理图像。你可以一条命令安装pip install numpy opencv-python pillow scipy matplotlib有时候项目会提供完整的requirements.txt文件你可以直接用pip install -r requirements.txt来安装所有依赖。但如果没有按上面这样手动安装核心的几个也足够了。5. 第四步获取预训练好的模型“大脑”模型本身是一套算法逻辑而预训练模型则是开发者用海量数据“训练”好的、已经具备上色能力的参数文件。我们需要下载这个“大脑”。在这个colorization项目中模型文件通常不直接放在Git仓库里因为文件太大而是提供了下载脚本或链接。我们最常用的方法是直接运行项目提供的下载脚本。在项目根目录找找看有没有叫download_models.sh或download_model.py的文件。如果有.sh文件Linux/macOS脚本给它执行权限并运行chmod x download_models.sh ./download_models.sh如果有.py文件直接运行python download_model.py如果项目没有提供明确的脚本你通常可以在项目的README.md文件里找到模型文件的下载链接可能是Google Drive或Dropbox链接手动下载后按照说明放到指定的文件夹里比如./models/。这一步完成后你应该能在项目目录下看到一个models文件夹里面存放着.pth或.pt后缀的模型权重文件。这就是模型的核心。6. 第五步写一个简单的测试脚本看看它灵不灵在封装成Web服务之前我们先在本地测试一下模型是否能正常工作。创建一个新的Python脚本比如叫test_colorization.py。import torch import numpy as np import cv2 from PIL import Image import matplotlib.pyplot as plt import os import sys # 1. 加载模型这里需要根据项目实际代码调整导入方式 # 假设项目里有一个 colorizers 模块 sys.path.append(.) # 把当前目录加入Python路径 from colorizers import * # 初始化模型 colorizer_eccv16 eccv16(pretrainedTrue).eval() # 你也可以试试另一个模型colorizer_siggraph17 siggraph17(pretrainedTrue).eval() # 2. 准备一张黑白测试图片 # 你可以准备一张自己的黑白照片命名为 test.jpg 放在同一目录下 img_path test.jpg if not os.path.exists(img_path): # 如果没找到我们创建一个简单的灰度图作为示例 print(f未找到 {img_path}将创建一个示例灰度图。) # 创建一个简单的彩色图然后转灰度 sample_color_img np.ones((256, 256, 3), dtypenp.uint8) * 128 sample_color_img[50:100, 50:100, :] [255, 0, 0] # 画个红方块 cv2.imwrite(sample_color.jpg, sample_color_img) # 读取并转为灰度模拟黑白输入 img_bgr cv2.imread(sample_color.jpg) img_gray cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) cv2.imwrite(img_path, img_gray) input_img img_gray else: # 读取已有的黑白图片 input_img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 3. 预处理图片模型通常有固定的输入尺寸和格式要求 # 这里需要参考原项目的预处理函数我们写一个简单的示例 def preprocess_img(img, sz256): 将图片缩放并归一化模拟项目中的预处理流程 # 缩放 img cv2.resize(img, (sz, sz)) # 归一化到 [0, 1] img img.astype(np.float32) / 255.0 # 转换为Tensor并增加批次维度 [1, 1, H, W] img_tensor torch.from_numpy(img).unsqueeze(0).unsqueeze(0) return img_tensor input_tensor preprocess_img(input_img) # 4. 运行模型进行上色 with torch.no_grad(): # 不计算梯度加快推理速度 output_tensor colorizer_eccv16(input_tensor) # 5. 后处理将输出Tensor转回图片格式 output_np output_tensor.squeeze().cpu().numpy() # 去掉批次和通道维度 # 转换维度从 [C, H, W] 到 [H, W, C]并调整值范围 output_np np.transpose(output_np, (1, 2, 0)) output_np (output_np * 255).clip(0, 255).astype(np.uint8) # 6. 保存并显示结果 output_path colorized_output.jpg cv2.imwrite(output_path, cv2.cvtColor(output_np, cv2.COLOR_RGB2BGR)) print(f上色完成结果已保存至: {output_path}) # 用matplotlib展示一下可选 plt.figure(figsize(12, 6)) plt.subplot(1, 2, 1) plt.imshow(input_img, cmapgray) plt.title(Input (Grayscale)) plt.axis(off) plt.subplot(1, 2, 2) plt.imshow(cv2.cvtColor(output_np, cv2.COLOR_BGR2RGB)) plt.title(Output (Colorized)) plt.axis(off) plt.show()运行这个脚本python test_colorization.py如果一切顺利你会看到命令行输出“上色完成”并且在当前文件夹下生成一张名为colorized_output.jpg的彩色图片。同时一个对比窗口会弹出来左边是黑白输入右边是彩色输出。看到颜色出现的那一刻是不是很有成就感这说明我们的模型和环境都配置正确了。7. 第六步给它穿上“Web外衣”用FastAPI模型在本地能跑了但我们希望它能变成一个服务比如通过网页上传图片就能得到结果。这里我们用一个非常流行的Python Web框架——FastAPI它简单又高效。首先在虚拟环境中安装FastAPI和用于处理文件的库pip install fastapi uvicorn python-multipart然后我们在项目根目录创建一个新的文件app.py这就是我们Web服务的入口。from fastapi import FastAPI, File, UploadFile from fastapi.responses import FileResponse, JSONResponse import cv2 import numpy as np import torch from PIL import Image import io import sys import os from datetime import datetime # 同样引入我们的上色模型 sys.path.append(.) from colorizers import * app FastAPI(title图像自动上色服务, description基于cv_unet_image-colorization的在线黑白照片上色API) # 在服务启动时加载模型避免每次请求都重复加载 colorizer None app.on_event(startup) async def load_model(): global colorizer print(正在加载上色模型...) colorizer eccv16(pretrainedTrue).eval() # 使用eccv16模型 print(模型加载完毕) # 如果你有GPU可以把模型放到GPU上 # if torch.cuda.is_available(): # colorizer.cuda() def preprocess_for_model(img_gray: np.ndarray, target_size256): 预处理函数调整大小并转为模型需要的Tensor格式 # 调整大小 img_resized cv2.resize(img_gray, (target_size, target_size)) # 归一化 img_normalized img_resized.astype(np.float32) / 255.0 # 转为Tensor [1, 1, H, W] img_tensor torch.from_numpy(img_normalized).unsqueeze(0).unsqueeze(0) return img_tensor def postprocess_output(output_tensor): 后处理函数将模型输出转为RGB图片数组 output_np output_tensor.squeeze().cpu().numpy() # [C, H, W] output_np np.transpose(output_np, (1, 2, 0)) # [H, W, C] # 从Lab色彩空间转回RGB假设模型输出是Lab格式这里需要根据实际模型调整 # 注意原colorization项目输出可能是ab通道需要与L通道合并再转换。 # 此处为简化流程假设output_np直接是RGB格式。实际部署时请根据模型真实输出调整。 # 以下是一个更接近真实情况的处理示例如果模型只输出ab通道 # 我们需要将输入的L通道和模型输出的ab通道合并再转换到RGB。 # 由于代码较长这里先使用一个假设模型直接输出了RGB图像。 output_rgb (output_np * 255).clip(0, 255).astype(np.uint8) return output_rgb app.post(/colorize/) async def colorize_image(file: UploadFile File(...)): 核心API接口接收一张黑白图片返回上色后的图片。 if not colorizer: return JSONResponse(status_code503, content{message: 服务正在初始化请稍后重试。}) # 1. 读取上传的图片 contents await file.read() nparr np.frombuffer(contents, np.uint8) img_bgr cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img_bgr is None: return JSONResponse(status_code400, content{message: 无法解码图片文件请上传有效的图片格式如JPEG, PNG。}) # 2. 转换为灰度图作为模型输入 img_gray cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) # 3. 预处理 input_tensor preprocess_for_model(img_gray) # 4. 模型推理 with torch.no_grad(): # 如果有GPU将数据转移到GPU # if torch.cuda.is_available(): # input_tensor input_tensor.cuda() output_tensor colorizer(input_tensor) # 5. 后处理得到彩色图片 colorized_rgb postprocess_output(output_tensor) # 6. 保存结果到临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_filename fcolorized_{timestamp}.jpg output_path os.path.join(results, output_filename) # 确保results目录存在 os.makedirs(results, exist_okTrue) # 将RGB转为BGR供OpenCV保存 colorized_bgr cv2.cvtColor(colorized_rgb, cv2.COLOR_RGB2BGR) cv2.imwrite(output_path, colorized_bgr) # 7. 返回文件 return FileResponse(output_path, media_typeimage/jpeg, filenameoutput_filename) app.get(/) async def root(): 一个简单的根路径用于检查服务是否运行 return {message: 图像自动上色服务正在运行。请使用 POST /colorize/ 接口上传黑白图片。} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)这个app.py做了几件事创建了一个FastAPI应用。定义了一个启动事件在服务开始时加载模型这样每次请求就不用重复加载了速度更快。创建了一个核心接口/colorize/它接收用户上传的图片文件。在接口内部完成读取图片、转灰度、预处理、模型推理、后处理、保存结果这一系列操作。最后把生成好的彩色图片返回给用户。还写了一个简单的根路径/访问它能看到服务状态。现在在项目根目录下运行这个服务python app.py你会看到类似Uvicorn running on http://0.0.0.0:8000的输出。这意味着你的服务已经在本地8000端口跑起来了8. 第七步试试你的新服务服务跑起来了我们得试试它灵不灵光。最简单的方法是用浏览器访问http://127.0.0.1:8000你会看到一段JSON消息确认服务正常。要测试上色功能我们需要发一个POST请求。你可以使用任何你喜欢的工具比如Postman、curl命令或者写一个简单的Python测试脚本。这里我用一个Python脚本做例子你可以在另一个命令行窗口运行它# test_api.py import requests url http://127.0.0.1:8000/colorize/ # 替换成你自己的黑白图片路径 image_path your_black_white_photo.jpg with open(image_path, rb) as image_file: files {file: (image_path, image_file, image/jpeg)} response requests.post(url, filesfiles) if response.status_code 200: # 保存返回的图片 output_path api_colorized_output.jpg with open(output_path, wb) as f: f.write(response.content) print(f成功上色后的图片已保存为: {output_path}) else: print(f请求失败状态码: {response.status_code}) print(response.text)运行这个测试脚本如果一切正常你就能在当前目录下得到一张通过Web API生成的彩色图片了。到这一步你已经成功把一个GitHub上的开源项目变成了一个能对外提供服务的Web应用。9. 让服务更完善、更健壮基本的服务跑通了但一个真正能用的服务还需要考虑更多。这里给你几个马上就能用上的改进思路错误处理上面的代码已经有了基本的错误判断比如图片解码失败。你还可以增加更多比如检查文件大小、图片格式、模型加载失败等并给用户返回清晰的错误信息。结果缓存如果同一个用户短时间内多次上传同一张图片每次都重新计算有点浪费。可以引入缓存机制比如把处理过的图片临时存起来下次同样请求直接返回能极大提升响应速度。支持更多功能比如让用户可以指定输出图片的尺寸、选择不同的上色风格如果模型支持、或者批量上传图片处理。这些都可以通过增加API接口参数来实现。性能优化如果图片很大预处理时调整到一个固定尺寸如256x256可能损失细节。你可以尝试更智能的缩放策略或者让模型支持更高分辨率的输入如果它本身支持的话。日志记录在app.py里加几行日志代码记录谁在什么时候访问了服务、处理了哪张图片、花了多长时间。这对后期维护和排查问题非常有帮助。10. 回顾与展望走完这一趟我们从GitHub上一行命令克隆代码开始搭建环境、安装依赖、下载模型、本地测试最后用FastAPI给模型套上一个Web服务的壳子让它能通过网络被调用。整个过程涉及了版本控制、Python环境管理、深度学习模型部署和Web开发这几个工程师常打交道的基本技能。这个服务现在跑在你的本地电脑上只有你自己能访问。如果你想让朋友或者同事也能用上可以考虑把它部署到云服务器上比如阿里云、腾讯云或者海外的AWS、Google Cloud。部署时你可能还需要用到像Docker这样的容器化技术它能把你的代码、环境和所有依赖打包成一个“集装箱”在任何支持Docker的机器上都能一键运行避免“在我电脑上好好的”这种问题。另外这个项目用的模型是几年前的了。图像上色领域发展很快现在有更多效果更好、速度更快的模型。如果你感兴趣完全可以按照今天这个“克隆-部署-服务化”的流程去尝试部署其他更新的开源模型。核心思路都是一样的拿到代码和模型配好环境然后想办法把它用起来。希望这篇教程能帮你打开一扇门。动手做一遍比看十遍都管用。遇到问题别怕搜索错误信息、查阅项目文档、在社区提问这些都是学习的过程。祝你玩得开心获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
cv_unet_image-colorization开源模型部署:从Git克隆到服务上线全流程
cv_unet_image-colorization开源模型部署从Git克隆到服务上线全流程你是不是在网上看到过一些给黑白老照片上色的神奇效果觉得特别酷也想自己动手试试今天我就带你从零开始把一个开源的图像上色模型cv_unet_image-colorization从GitHub上“搬”下来一步步把它变成一个可以对外提供服务的Web应用。整个过程就像搭积木我会把每一步都拆解得清清楚楚即使你之前没怎么接触过Git或者Web服务跟着做也能搞定。1. 开始之前你需要准备什么在动手之前我们先看看需要哪些“工具”。放心要求不高。首先你需要一台电脑操作系统可以是Windows、macOS或者Linux。我建议使用Linux系统比如Ubuntu或者macOS因为很多开源项目在这两个系统上兼容性最好命令行操作也更方便。Windows用户完全没问题只是个别命令可能需要稍作调整。其次你需要安装几个基础的软件Git这是我们用来从GitHub下载代码的工具。如果你还没装去Git官网下载安装包一路“下一步”就行。Python 3.8 或更高版本这个模型是用Python写的所以Python环境是必须的。建议安装Python 3.8以上版本。一个代码编辑器比如VS Code、PyCharm或者Sublime Text用来查看和修改代码选你顺手的就行。最后确保你的网络环境可以正常访问GitHub。如果下载模型文件比较慢后面我也会提到一些小技巧。好了工具齐备我们正式开始。2. 第一步把代码从GitHub“搬”回家我们的第一步就是把项目代码从远程的GitHub仓库克隆到你的本地电脑上。这个过程叫做git clone。打开你的命令行工具Windows上是CMD或PowerShellmacOS/Linux上是Terminal找一个你打算存放这个项目的文件夹然后输入下面这行命令git clone https://github.com/richzhang/colorization.git敲下回车后你会看到命令行开始滚动一些信息最后显示“done”或者“克隆完成”。这就意味着一个名为colorization的文件夹已经出现在你当前的目录下了。这个文件夹里就包含了我们需要的所有源代码。这里有个小细节原项目名可能不完全是cv_unet_image-colorization但核心的彩色化模型代码都在这个colorization仓库里。我们以这个为准。进入这个文件夹看看里面有什么cd colorization ls # 在macOS/Linux上使用Windows上用 dir你应该能看到一些Python脚本文件.py、配置文件、说明文档README.md等等。README文件通常很重要它就像产品的说明书不过我们今天会一步步带你走不看说明书也能装好。3. 第二步搭建专属的Python工作环境为了避免我们安装的包和你电脑上其他项目的包“打架”最好创建一个独立的Python虚拟环境。这就像给你的这个项目单独安排一个干净的房间里面只放它需要的东西。我们使用Python自带的venv模块来创建。还是在colorization文件夹下执行# 创建一个名为 venv 的虚拟环境文件夹 python3 -m venv venv这条命令执行后当前目录下会多出一个叫venv的文件夹。接下来我们需要激活这个环境在macOS/Linux上source venv/bin/activate在Windows上.\venv\Scripts\activate激活成功后你的命令行提示符前面通常会显示(venv)这就表示你现在已经在这个虚拟环境里工作了。之后所有安装的Python包都会装在这个环境里不会影响系统其他地方。4. 第三步安装项目需要的“零件”每个项目都依赖一些第三方代码库就像拼模型需要胶水一样。这些依赖通常写在一个叫requirements.txt的文件里。我们来看看这个项目需要什么并安装它们。首先我们安装最核心的深度学习框架PyTorch。访问 PyTorch官网它会根据你的系统操作系统、包管理工具、CUDA版本生成一条最适合的安装命令。比如如果你用pip且不需要GPUCUDA命令可能长这样pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu注意安装PyTorch可能需要一点时间并且文件比较大。如果你有NVIDIA显卡并且想用GPU加速可以在官网选择对应的CUDA版本。对于上色这个任务CPU也能跑只是慢一点。安装好PyTorch后我们再安装项目需要的其他通用库。通常我们需要numpy,opencv-python,pillow等来处理图像。你可以一条命令安装pip install numpy opencv-python pillow scipy matplotlib有时候项目会提供完整的requirements.txt文件你可以直接用pip install -r requirements.txt来安装所有依赖。但如果没有按上面这样手动安装核心的几个也足够了。5. 第四步获取预训练好的模型“大脑”模型本身是一套算法逻辑而预训练模型则是开发者用海量数据“训练”好的、已经具备上色能力的参数文件。我们需要下载这个“大脑”。在这个colorization项目中模型文件通常不直接放在Git仓库里因为文件太大而是提供了下载脚本或链接。我们最常用的方法是直接运行项目提供的下载脚本。在项目根目录找找看有没有叫download_models.sh或download_model.py的文件。如果有.sh文件Linux/macOS脚本给它执行权限并运行chmod x download_models.sh ./download_models.sh如果有.py文件直接运行python download_model.py如果项目没有提供明确的脚本你通常可以在项目的README.md文件里找到模型文件的下载链接可能是Google Drive或Dropbox链接手动下载后按照说明放到指定的文件夹里比如./models/。这一步完成后你应该能在项目目录下看到一个models文件夹里面存放着.pth或.pt后缀的模型权重文件。这就是模型的核心。6. 第五步写一个简单的测试脚本看看它灵不灵在封装成Web服务之前我们先在本地测试一下模型是否能正常工作。创建一个新的Python脚本比如叫test_colorization.py。import torch import numpy as np import cv2 from PIL import Image import matplotlib.pyplot as plt import os import sys # 1. 加载模型这里需要根据项目实际代码调整导入方式 # 假设项目里有一个 colorizers 模块 sys.path.append(.) # 把当前目录加入Python路径 from colorizers import * # 初始化模型 colorizer_eccv16 eccv16(pretrainedTrue).eval() # 你也可以试试另一个模型colorizer_siggraph17 siggraph17(pretrainedTrue).eval() # 2. 准备一张黑白测试图片 # 你可以准备一张自己的黑白照片命名为 test.jpg 放在同一目录下 img_path test.jpg if not os.path.exists(img_path): # 如果没找到我们创建一个简单的灰度图作为示例 print(f未找到 {img_path}将创建一个示例灰度图。) # 创建一个简单的彩色图然后转灰度 sample_color_img np.ones((256, 256, 3), dtypenp.uint8) * 128 sample_color_img[50:100, 50:100, :] [255, 0, 0] # 画个红方块 cv2.imwrite(sample_color.jpg, sample_color_img) # 读取并转为灰度模拟黑白输入 img_bgr cv2.imread(sample_color.jpg) img_gray cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) cv2.imwrite(img_path, img_gray) input_img img_gray else: # 读取已有的黑白图片 input_img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 3. 预处理图片模型通常有固定的输入尺寸和格式要求 # 这里需要参考原项目的预处理函数我们写一个简单的示例 def preprocess_img(img, sz256): 将图片缩放并归一化模拟项目中的预处理流程 # 缩放 img cv2.resize(img, (sz, sz)) # 归一化到 [0, 1] img img.astype(np.float32) / 255.0 # 转换为Tensor并增加批次维度 [1, 1, H, W] img_tensor torch.from_numpy(img).unsqueeze(0).unsqueeze(0) return img_tensor input_tensor preprocess_img(input_img) # 4. 运行模型进行上色 with torch.no_grad(): # 不计算梯度加快推理速度 output_tensor colorizer_eccv16(input_tensor) # 5. 后处理将输出Tensor转回图片格式 output_np output_tensor.squeeze().cpu().numpy() # 去掉批次和通道维度 # 转换维度从 [C, H, W] 到 [H, W, C]并调整值范围 output_np np.transpose(output_np, (1, 2, 0)) output_np (output_np * 255).clip(0, 255).astype(np.uint8) # 6. 保存并显示结果 output_path colorized_output.jpg cv2.imwrite(output_path, cv2.cvtColor(output_np, cv2.COLOR_RGB2BGR)) print(f上色完成结果已保存至: {output_path}) # 用matplotlib展示一下可选 plt.figure(figsize(12, 6)) plt.subplot(1, 2, 1) plt.imshow(input_img, cmapgray) plt.title(Input (Grayscale)) plt.axis(off) plt.subplot(1, 2, 2) plt.imshow(cv2.cvtColor(output_np, cv2.COLOR_BGR2RGB)) plt.title(Output (Colorized)) plt.axis(off) plt.show()运行这个脚本python test_colorization.py如果一切顺利你会看到命令行输出“上色完成”并且在当前文件夹下生成一张名为colorized_output.jpg的彩色图片。同时一个对比窗口会弹出来左边是黑白输入右边是彩色输出。看到颜色出现的那一刻是不是很有成就感这说明我们的模型和环境都配置正确了。7. 第六步给它穿上“Web外衣”用FastAPI模型在本地能跑了但我们希望它能变成一个服务比如通过网页上传图片就能得到结果。这里我们用一个非常流行的Python Web框架——FastAPI它简单又高效。首先在虚拟环境中安装FastAPI和用于处理文件的库pip install fastapi uvicorn python-multipart然后我们在项目根目录创建一个新的文件app.py这就是我们Web服务的入口。from fastapi import FastAPI, File, UploadFile from fastapi.responses import FileResponse, JSONResponse import cv2 import numpy as np import torch from PIL import Image import io import sys import os from datetime import datetime # 同样引入我们的上色模型 sys.path.append(.) from colorizers import * app FastAPI(title图像自动上色服务, description基于cv_unet_image-colorization的在线黑白照片上色API) # 在服务启动时加载模型避免每次请求都重复加载 colorizer None app.on_event(startup) async def load_model(): global colorizer print(正在加载上色模型...) colorizer eccv16(pretrainedTrue).eval() # 使用eccv16模型 print(模型加载完毕) # 如果你有GPU可以把模型放到GPU上 # if torch.cuda.is_available(): # colorizer.cuda() def preprocess_for_model(img_gray: np.ndarray, target_size256): 预处理函数调整大小并转为模型需要的Tensor格式 # 调整大小 img_resized cv2.resize(img_gray, (target_size, target_size)) # 归一化 img_normalized img_resized.astype(np.float32) / 255.0 # 转为Tensor [1, 1, H, W] img_tensor torch.from_numpy(img_normalized).unsqueeze(0).unsqueeze(0) return img_tensor def postprocess_output(output_tensor): 后处理函数将模型输出转为RGB图片数组 output_np output_tensor.squeeze().cpu().numpy() # [C, H, W] output_np np.transpose(output_np, (1, 2, 0)) # [H, W, C] # 从Lab色彩空间转回RGB假设模型输出是Lab格式这里需要根据实际模型调整 # 注意原colorization项目输出可能是ab通道需要与L通道合并再转换。 # 此处为简化流程假设output_np直接是RGB格式。实际部署时请根据模型真实输出调整。 # 以下是一个更接近真实情况的处理示例如果模型只输出ab通道 # 我们需要将输入的L通道和模型输出的ab通道合并再转换到RGB。 # 由于代码较长这里先使用一个假设模型直接输出了RGB图像。 output_rgb (output_np * 255).clip(0, 255).astype(np.uint8) return output_rgb app.post(/colorize/) async def colorize_image(file: UploadFile File(...)): 核心API接口接收一张黑白图片返回上色后的图片。 if not colorizer: return JSONResponse(status_code503, content{message: 服务正在初始化请稍后重试。}) # 1. 读取上传的图片 contents await file.read() nparr np.frombuffer(contents, np.uint8) img_bgr cv2.imdecode(nparr, cv2.IMREAD_COLOR) if img_bgr is None: return JSONResponse(status_code400, content{message: 无法解码图片文件请上传有效的图片格式如JPEG, PNG。}) # 2. 转换为灰度图作为模型输入 img_gray cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) # 3. 预处理 input_tensor preprocess_for_model(img_gray) # 4. 模型推理 with torch.no_grad(): # 如果有GPU将数据转移到GPU # if torch.cuda.is_available(): # input_tensor input_tensor.cuda() output_tensor colorizer(input_tensor) # 5. 后处理得到彩色图片 colorized_rgb postprocess_output(output_tensor) # 6. 保存结果到临时文件 timestamp datetime.now().strftime(%Y%m%d_%H%M%S) output_filename fcolorized_{timestamp}.jpg output_path os.path.join(results, output_filename) # 确保results目录存在 os.makedirs(results, exist_okTrue) # 将RGB转为BGR供OpenCV保存 colorized_bgr cv2.cvtColor(colorized_rgb, cv2.COLOR_RGB2BGR) cv2.imwrite(output_path, colorized_bgr) # 7. 返回文件 return FileResponse(output_path, media_typeimage/jpeg, filenameoutput_filename) app.get(/) async def root(): 一个简单的根路径用于检查服务是否运行 return {message: 图像自动上色服务正在运行。请使用 POST /colorize/ 接口上传黑白图片。} if __name__ __main__: import uvicorn uvicorn.run(app, host0.0.0.0, port8000)这个app.py做了几件事创建了一个FastAPI应用。定义了一个启动事件在服务开始时加载模型这样每次请求就不用重复加载了速度更快。创建了一个核心接口/colorize/它接收用户上传的图片文件。在接口内部完成读取图片、转灰度、预处理、模型推理、后处理、保存结果这一系列操作。最后把生成好的彩色图片返回给用户。还写了一个简单的根路径/访问它能看到服务状态。现在在项目根目录下运行这个服务python app.py你会看到类似Uvicorn running on http://0.0.0.0:8000的输出。这意味着你的服务已经在本地8000端口跑起来了8. 第七步试试你的新服务服务跑起来了我们得试试它灵不灵光。最简单的方法是用浏览器访问http://127.0.0.1:8000你会看到一段JSON消息确认服务正常。要测试上色功能我们需要发一个POST请求。你可以使用任何你喜欢的工具比如Postman、curl命令或者写一个简单的Python测试脚本。这里我用一个Python脚本做例子你可以在另一个命令行窗口运行它# test_api.py import requests url http://127.0.0.1:8000/colorize/ # 替换成你自己的黑白图片路径 image_path your_black_white_photo.jpg with open(image_path, rb) as image_file: files {file: (image_path, image_file, image/jpeg)} response requests.post(url, filesfiles) if response.status_code 200: # 保存返回的图片 output_path api_colorized_output.jpg with open(output_path, wb) as f: f.write(response.content) print(f成功上色后的图片已保存为: {output_path}) else: print(f请求失败状态码: {response.status_code}) print(response.text)运行这个测试脚本如果一切正常你就能在当前目录下得到一张通过Web API生成的彩色图片了。到这一步你已经成功把一个GitHub上的开源项目变成了一个能对外提供服务的Web应用。9. 让服务更完善、更健壮基本的服务跑通了但一个真正能用的服务还需要考虑更多。这里给你几个马上就能用上的改进思路错误处理上面的代码已经有了基本的错误判断比如图片解码失败。你还可以增加更多比如检查文件大小、图片格式、模型加载失败等并给用户返回清晰的错误信息。结果缓存如果同一个用户短时间内多次上传同一张图片每次都重新计算有点浪费。可以引入缓存机制比如把处理过的图片临时存起来下次同样请求直接返回能极大提升响应速度。支持更多功能比如让用户可以指定输出图片的尺寸、选择不同的上色风格如果模型支持、或者批量上传图片处理。这些都可以通过增加API接口参数来实现。性能优化如果图片很大预处理时调整到一个固定尺寸如256x256可能损失细节。你可以尝试更智能的缩放策略或者让模型支持更高分辨率的输入如果它本身支持的话。日志记录在app.py里加几行日志代码记录谁在什么时候访问了服务、处理了哪张图片、花了多长时间。这对后期维护和排查问题非常有帮助。10. 回顾与展望走完这一趟我们从GitHub上一行命令克隆代码开始搭建环境、安装依赖、下载模型、本地测试最后用FastAPI给模型套上一个Web服务的壳子让它能通过网络被调用。整个过程涉及了版本控制、Python环境管理、深度学习模型部署和Web开发这几个工程师常打交道的基本技能。这个服务现在跑在你的本地电脑上只有你自己能访问。如果你想让朋友或者同事也能用上可以考虑把它部署到云服务器上比如阿里云、腾讯云或者海外的AWS、Google Cloud。部署时你可能还需要用到像Docker这样的容器化技术它能把你的代码、环境和所有依赖打包成一个“集装箱”在任何支持Docker的机器上都能一键运行避免“在我电脑上好好的”这种问题。另外这个项目用的模型是几年前的了。图像上色领域发展很快现在有更多效果更好、速度更快的模型。如果你感兴趣完全可以按照今天这个“克隆-部署-服务化”的流程去尝试部署其他更新的开源模型。核心思路都是一样的拿到代码和模型配好环境然后想办法把它用起来。希望这篇教程能帮你打开一扇门。动手做一遍比看十遍都管用。遇到问题别怕搜索错误信息、查阅项目文档、在社区提问这些都是学习的过程。祝你玩得开心获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。