从零开始cv_unet_image-colorization模型Python API调用入门教程你是不是也遇到过一些老照片颜色已经褪去只剩下黑白或者想给一些素描、线稿上色却觉得手动操作太麻烦今天我们就来聊聊一个挺有意思的技术——用AI给黑白图片上色。具体来说就是学习如何通过Python代码调用一个名为cv_unet_image-colorization的模型API。这个模型就像一个藏在服务器里的“智能画师”你只需要把黑白图片传给它它就能帮你还原出色彩。听起来有点复杂别担心这篇教程就是写给Python新手看的。我们不讲那些深奥的模型原理就手把手教你怎么用几行简单的代码让这个“画师”为你工作。整个过程就像你平时用手机APP发个图片一样简单。1. 开始前的准备工作在写代码之前我们得先把“工具箱”准备好。这里不需要复杂的开发环境只要你电脑上装了Python就行。1.1 安装必要的Python库我们需要两个非常常用的库一个用来和网络API“对话”requests另一个用来处理图片Pillow。打开你的命令行Windows上是CMD或PowerShellMac/Linux上是终端输入下面两行命令pip install requests Pillow如果安装速度慢可以试试加上国内的镜像源比如pip install requests Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple安装成功后你可以简单验证一下。打开Python交互环境在命令行输入python回车然后输入import requests from PIL import Image print(“库导入成功”)如果没有报错就说明一切就绪。1.2 了解我们的“画师”能做什么在动手之前我们先明确一下这个模型API的基本工作方式。你可以把它想象成一个在远端的“照片修复店”你客户端准备好一张黑白照片JPG或PNG格式通过互联网HTTP请求寄给这家店。模型API服务器店里的“AI画师”收到照片后进行分析和上色处理。返回结果处理完成后店家会把上好色的新照片寄回给你。我们的代码就是完成“寄送”和“接收”这两个动作的说明书。通常这类API会有一个特定的网址URL并且要求我们以某种格式比如multipart/form-data把图片数据“打包”好再发送。2. 编写你的第一段上色代码理论说再多不如动手试一下。我们从一个最基础的例子开始假设你已经拿到了这个模型API的调用地址。2.1 构建一个简单的API请求假设API的地址是http://your-api-server/predict在实际使用时你需要替换成真实的部署地址。下面这段代码展示了最核心的调用过程import requests from PIL import Image import io # 1. 准备API地址和图片路径 api_url “http://your-api-server/predict” # 请替换为实际地址 image_path “./your_black_white_image.jpg” # 请替换为你的黑白图片路径 # 2. 打开并准备图片文件 with open(image_path, ‘rb’) as f: image_bytes f.read() # 3. 构建要发送的数据包 files {‘image’: (‘bw_image.jpg’, image_bytes, ‘image/jpeg’)} # 4. 发送POST请求到API try: response requests.post(api_url, filesfiles) response.raise_for_status() # 如果请求失败如404500这里会抛出异常 print(“请求成功”) except requests.exceptions.RequestException as e: print(f“请求出错{e}”) exit() # 5. 处理返回的结果 # 通常成功的响应状态码是200 if response.status_code 200: # 假设API直接返回了一张图片的二进制数据 colored_image_data response.content # 6. 保存上色后的图片 output_path “./colored_image.jpg” with open(output_path, ‘wb’) as f: f.write(colored_image_data) print(f“上色完成图片已保存至{output_path}”) # 也可以用PIL打开看看效果 img Image.open(io.BytesIO(colored_image_data)) img.show() else: print(f“API返回了错误状态码{response.status_code}”) print(f“错误信息{response.text}”)把上面代码里的api_url和image_path换成你自己的运行一下。如果一切顺利你就能在当前文件夹下得到一个名为colored_image.jpg的上色后图片了。2.2 理解代码的关键步骤我们来拆解一下上面代码里几个关键点files参数这是用requests库发送文件的标准方式。我们创建了一个字典键名‘image’需要根据API的具体要求来定有的API可能要求叫‘file’。值是一个三元组(文件名, 文件二进制数据, 文件类型)。response.raise_for_status()这是一个好习惯它能帮我们快速发现网络请求层面的问题比如地址错了、服务器没响应等。response.content当服务器返回的是图片、文件等二进制数据时我们用这个属性来获取。错误处理我们用try…except包裹了请求过程并用if判断了HTTP状态码。在实际使用中清晰的错误提示能帮你节省大量调试时间。3. 处理不同的输入与输出格式实际的API可能比我们上面的例子稍微复杂一点比如它可能要求额外的参数或者返回的不是直接的图片而是一个包含图片信息的JSON。别慌这都很容易处理。3.1 当API需要额外参数时有些模型API除了图片可能还需要你指定一些选项比如上色风格、输出图片尺寸等。这些参数通常通过data或params来传递。import requests api_url “http://your-api-server/predict” image_path “./bw_image.jpg” with open(image_path, ‘rb’) as f: image_bytes f.read() files {‘image’: (‘bw_image.jpg’, image_bytes, ‘image/jpeg’)} # 假设这个API允许我们设置输出图片的尺寸 payload { ‘size’: ‘512x512’, # 指定希望输出的图片大小 ‘style’: ‘vivid’ # 指定上色风格为‘鲜艳’ } response requests.post(api_url, filesfiles, datapayload) # … 后续处理与之前相同这里我们把额外的控制参数放在了data字典里和图片文件一起发送。具体需要哪些参数你需要查阅该模型API的官方文档或说明。3.2 当API返回JSON数据时更常见的情况是API返回一个JSON对象里面包含了状态、消息以及处理后的图片数据可能是经过Base64编码的字符串。这样设计更灵活可以传递更多信息。import requests import json import base64 from PIL import Image import io api_url “http://your-api-server/predict” image_path “./bw_image.jpg” with open(image_path, ‘rb’) as f: image_bytes f.read() files {‘image’: (‘bw_image.jpg’, image_bytes, ‘image/jpeg’)} response requests.post(api_url, filesfiles) if response.status_code 200: # 解析返回的JSON数据 result response.json() if result.get(‘status’) ‘success’: # 从JSON中获取经过Base64编码的图片字符串 image_b64 result.get(‘colored_image’) # 将Base64字符串解码为图片二进制数据 image_data base64.b64decode(image_b64) # 保存图片 output_path “./colored_from_json.jpg” with open(output_path, ‘wb’) as f: f.write(image_data) print(f“图片已保存{output_path}”) # 用PIL显示 img Image.open(io.BytesIO(image_data)) img.show() else: print(f“处理失败{result.get(‘message’)}”) else: print(f“请求失败{response.status_code}”)这段代码的关键在于response.json()方法它能直接将API返回的JSON字符串转换成Python的字典方便我们提取里面的信息。base64.b64decode()则用于解码图片数据。4. 试试更实用的例子批量处理与预览学会了单张图片的处理我们就可以玩点更实用的了。比如一次性给一个文件夹里的所有老照片上色。4.1 批量给多张图片上色下面的代码会遍历指定文件夹中的所有JPG图片依次调用API上色并保存到新文件夹。import requests import os from pathlib import Path api_url “http://your-api-server/predict” input_dir “./old_photos” # 存放黑白照片的文件夹 output_dir “./colored_photos” # 保存结果的文件夹 # 创建输出文件夹 Path(output_dir).mkdir(parentsTrue, exist_okTrue) # 支持的文件格式 supported_formats (‘.jpg’, ‘.jpeg’, ‘.png’, ‘.bmp’) # 遍历文件夹 for filename in os.listdir(input_dir): if filename.lower().endswith(supported_formats): image_path os.path.join(input_dir, filename) print(f“正在处理{filename}”) with open(image_path, ‘rb’) as f: files {‘image’: (filename, f.read(), ‘image/jpeg’)} try: response requests.post(api_url, filesfiles, timeout30) # 设置超时时间 response.raise_for_status() if response.status_code 200: # 生成输出文件名 name_without_ext os.path.splitext(filename)[0] output_path os.path.join(output_dir, f“{name_without_ext}_colored.jpg”) with open(output_path, ‘wb’) as out_f: out_f.write(response.content) print(f“ 已保存{output_path}”) else: print(f“ 处理失败状态码{response.status_code}”) except Exception as e: print(f“ 处理图片 {filename} 时出错{e}”) print(“批量处理完成”)4.2 在程序中直接预览对比效果我们也可以在用PIL显示图片时稍微加工一下把黑白原图和彩色结果并排放在一起对比这样效果更直观。from PIL import Image import matplotlib.pyplot as plt def compare_images(original_path, colored_path): 并排显示原图和上色后的图 original_img Image.open(original_path) colored_img Image.open(colored_path) # 创建一个新的画布宽度是两张图之和高度取两张图中最大的 total_width original_img.width colored_img.width max_height max(original_img.height, colored_img.height) comparison_img Image.new(‘RGB’, (total_width, max_height), (255, 255, 255)) # 将两张图粘贴到画布上 comparison_img.paste(original_img, (0, 0)) comparison_img.paste(colored_img, (original_img.width, 0)) # 使用matplotlib显示 plt.figure(figsize(10, 5)) plt.imshow(comparison_img) plt.axis(‘off’) # 不显示坐标轴 plt.title(“Left: Original BW | Right: AI Colorized”) plt.show() # 使用例子 compare_images(“./your_black_white_image.jpg”, “./colored_image.jpg”)这段代码用到了matplotlib来显示图片如果你还没安装可以运行pip install matplotlib。它能把两张图拼在一起左边是黑白原图右边是AI上色后的效果对比一目了然。5. 可能会遇到的问题与小技巧第一次尝试难免会遇到一些小麻烦。这里我总结几个常见的问题和解决办法。问题1requests报错SSLError或连接超时。可能原因网络问题或者自签名的API证书不被信任。试试这样在测试环境可以给requests.post()加上verifyFalse参数来跳过SSL证书验证注意生产环境不建议这样做。对于超时可以设置timeout参数比如timeout(10, 30)表示连接超时10秒读取超时30秒。问题2API返回错误比如400 Bad Request或422 Unprocessable Entity。可能原因你发送的数据格式不对。这是最常见的问题。检查这些URL地址确认完全正确没有多一个少一个字符。参数名files字典里的键如‘image’是否和API要求的一致data里的参数名对不对图片格式API是否支持你上传的图片格式如PNG尝试转换成JPG再上传。图片大小图片是否太大有些API有尺寸限制可能需要先用PIL调整一下大小。最好的办法打印出API返回的详细错误信息response.text里面通常会有具体的错误提示。问题3上色效果不理想颜色奇怪或溢出。这不是代码问题是模型效果问题。可以尝试提供更清晰、对比度更高的黑白图片。如果API支持调整上色风格参数。理解模型的局限性它可能对某些特定类型如风景、人像的图片上色效果更好。一个小技巧如何用PIL简单预处理图片如果担心图片太大或格式不对可以在发送前用PIL处理一下from PIL import Image import io def prepare_image(image_path, max_size1024): img Image.open(image_path) # 转换为RGB模式如果是RGBA或L模式 if img.mode ! ‘RGB’: img img.convert(‘RGB’) # 等比例缩放长边不超过max_size if max(img.size) max_size: ratio max_size / max(img.size) new_size tuple(int(dim * ratio) for dim in img.size) img img.resize(new_size, Image.Resampling.LANCZOS) # 保存到内存中的字节流 img_byte_arr io.BytesIO() img.save(img_byte_arr, format‘JPEG’, quality95) img_byte_arr img_byte_arr.getvalue() return img_byte_arr # 使用 image_bytes prepare_image(‘./large_image.png’) files {‘image’: (‘prepared.jpg’, image_bytes, ‘image/jpeg’)}6. 总结与下一步好了走到这里你已经成功掌握了用Python调用cv_unet_image-colorization这类图像上色模型API的基本方法。从安装库、发送第一张图片到处理不同的返回格式、批量操作核心就是理解如何用requests库与HTTP接口打交道以及如何用Pillow处理图片数据。整个过程其实并不神秘关键就是多试几次。遇到报错别着急仔细看看错误信息大部分问题都能在网上找到答案。你可以先从一张简单的、对比度高的风景或人像照片开始看到AI“画”出色彩的那一刻还是挺有成就感的。如果你想更进一步可以尝试把这个小功能集成到你的某个小项目里比如做一个简单的本地照片上色工具或者结合其他图像处理API玩出更多花样。技术的乐趣就在于动手尝试和组合创新。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。