深度学习入门:基于cv_unet_image-colorization的Python实战项目
深度学习入门基于cv_unet_image-colorization的Python实战项目你是不是觉得深度学习听起来很高深光是那些复杂的数学公式和框架名字就让人望而却步别担心今天我们就用一个特别有意思的项目带你从零开始亲手体验一把深度学习的魅力。我们要做的是让黑白照片“活”起来给它们自动上色。听起来是不是很酷这个项目叫cv_unet_image-colorization它用到的技术并不复杂但效果却非常直观。通过完成这个项目你不仅能得到一个好玩的小工具更重要的是你能完整地走一遍深度学习的标准流程从搭建环境、准备数据到训练模型、验证效果。整个过程我们都会用Python来实现。即使你之前没怎么接触过深度学习跟着这篇教程一步步来也能顺利搞定。我们尽量避开那些晦涩的理论把重点放在“怎么做”上让你在动手的过程中自然而然地理解那些核心概念。好了话不多说让我们卷起袖子开始吧。1. 第一步把你的“工作台”搭起来做任何项目之前准备工作总是最重要的。对于深度学习来说一个独立、干净、版本匹配的Python环境能帮你避开99%的奇怪报错。我们推荐使用Anaconda来管理环境它就像是一个功能强大的“软件包管理器”特别适合数据科学和机器学习。1.1 安装Anaconda如果你还没安装Anaconda先去它的官网下载对应你电脑系统Windows、macOS或Linux的安装包。安装过程很简单基本就是一路“下一步”。安装完成后打开你的命令行工具Windows上是Anaconda Prompt或CMDmacOS/Linux上是终端。1.2 创建专属的虚拟环境安装好Anaconda后我们为这个上色项目创建一个独立的环境。这样做的好处是这个环境里安装的所有库都不会影响到你电脑上其他的Python项目非常干净。打开命令行输入以下命令来创建一个名为image_colorization的新环境并指定使用Python 3.8版本这是一个比较稳定且兼容性好的版本conda create -n image_colorization python3.8创建完成后激活这个环境conda activate image_colorization你会看到命令行提示符前面变成了(image_colorization)这就表示你已经在这个虚拟环境里了之后所有的操作都只在这个“小房间”里生效。1.3 安装核心“武器库”PyTorchPyTorch是目前最流行的深度学习框架之一它以灵活和易用著称。我们的图像上色项目就是基于它构建的。安装PyTorch需要去它的官网根据你的电脑配置有没有独立显卡、是什么操作系统生成对应的安装命令。对于绝大多数刚开始学习的朋友如果你的电脑没有NVIDIA的独立显卡GPU那么安装CPU版本就足够了训练速度会慢一些但完全能跑起来。假设你没有GPU在激活的image_colorization环境中运行官网为你生成的命令它可能长这样pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu这个命令会安装PyTorch的核心库torch以及处理图像常用的torchvision。1.4 安装其他必要的工具除了PyTorch我们还需要一些辅助的库来处理图像、下载数据等。在同一个环境中继续安装pip install opencv-python matplotlib numpy pillow requests tqdmopencv-python一个强大的计算机视觉库用来读写和处理图片。matplotlib画图库用来显示我们的图片和训练过程。numpyPython科学计算的基础处理数组和矩阵。pillow另一个常用的图像处理库。requests用来从网上下载数据。tqdm一个能显示漂亮进度条的小工具让你在等待时知道进度。好了至此我们的“工作台”就搭建完毕了。接下来我们去把项目的“图纸”和“原材料”准备好。2. 获取项目代码与数据任何深度学习项目都离不开两样东西模型代码和数据。我们先来处理代码。2.1 下载项目代码cv_unet_image-colorization的代码通常托管在代码仓库里。我们可以直接用git命令把它克隆到本地。如果你没有安装git也可以去仓库页面直接下载ZIP压缩包并解压。在命令行里找一个你喜欢的目录然后运行git clone https://github.com/richzhang/colorization.git cd colorization注意上面这个仓库地址是示例。实际上你可能需要根据具体的项目来源进行调整。一个更简单直接的方法是在GitHub上搜索 “cv_unet_image-colorization” 或 “image colorization pytorch”能找到很多类似的开源项目。选择其中一个star数较多、文档清晰的下载其代码即可。本教程的核心流程是通用的。进入项目目录后你会看到一些Python脚本文件比如colorize.py,train.py和一些文件夹。这就是我们项目的全部源代码。2.2 准备训练数据模型需要学习就得有教材。对于图像上色任务我们的“教材”就是大量的彩色图片。模型的任务是学会从一张图片的灰度信息中推测出它原本的颜色。一个常用的公开数据集是ImageNet但它非常大。为了快速入门我们可以先用一个小规模的数据集或者从网上下载一些风景、人物、动物的图片集。这里为了教程的简洁我们假设你已经有了一个包含很多.jpg彩色图片的文件夹路径是./data/train/。数据的预处理通常包括这几步读取彩色图片。将其转换为灰度图这作为我们模型的输入。保留彩色图这作为模型学习的目标标签。我们可以写一个小脚本来看看数据长什么样并做简单的检查import cv2 import os import matplotlib.pyplot as plt # 假设你的数据放在这个文件夹 data_dir ./data/train/ image_files [f for f in os.listdir(data_dir) if f.endswith(.jpg)] print(f找到了 {len(image_files)} 张训练图片。) # 随机看一张 if image_files: sample_path os.path.join(data_dir, image_files[0]) color_img cv2.imread(sample_path) color_img cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB) # OpenCV默认是BGR转成RGB gray_img cv2.cvtColor(color_img, cv2.COLOR_RGB2GRAY) # 显示图片 fig, axes plt.subplots(1, 2, figsize(10, 5)) axes[0].imshow(gray_img, cmapgray) axes[0].set_title(灰度输入) axes[0].axis(off) axes[1].imshow(color_img) axes[1].set_title(彩色目标) axes[1].axis(off) plt.show()运行这段代码如果能看到一张图片的灰度版本和彩色版本并排显示说明数据读取没问题。3. 核心概念我们的模型在学什么在开始写代码训练之前花两分钟理解一下我们要做的事情会让整个过程清晰很多。我们使用的模型结构通常叫U-Net。你可以把它想象成一个非常聪明的“图片翻译官”。它的工作流程简化后是这样的输入模型接收一张灰度图片只有明暗信息没有颜色。分析模型内部有很多层它们像一道道工序逐步提取图片的特征比如哪里是边缘哪里是天空哪里是皮肤。这个过程叫“编码”。合成提取了足够多的特征后模型开始反向工作根据这些特征“猜测”每个像素点最可能是什么颜色并一点点把颜色信息填回去生成一张彩色图片。这个过程叫“解码”。输出一张恢复了颜色的彩色图片。模型怎么知道自己猜得对不对呢这就需要我们事先准备好“标准答案”——原始彩色图片。在训练时模型每猜一次我们就把它生成的彩色图片和真正的彩色图片对比一下计算它们之间的差距这个差距叫“损失”。然后模型会根据这个差距自动调整内部数以百万计的小参数让自己下次猜得更准。这个过程重复成千上万次模型就越来越“聪明”了。这就是深度学习训练的核心思想通过数据自动学习规律。4. 动手训练你的第一个上色模型理解了原理我们来看具体的训练代码。一个典型的训练脚本train.py会包含以下几个关键部分4.1 数据加载我们需要写一个“数据搬运工”DataLoader它负责在训练时一批批地把图片数据读出来送给模型。import torch from torch.utils.data import Dataset, DataLoader import cv2 import os class ColorizationDataset(Dataset): 自定义数据集类用于加载和处理图片对灰度图彩色图 def __init__(self, data_dir, transformNone): self.data_dir data_dir self.image_files [f for f in os.listdir(data_dir) if f.endswith((.jpg, .png))] self.transform transform def __len__(self): return len(self.image_files) def __getitem__(self, idx): img_name self.image_files[idx] img_path os.path.join(self.data_dir, img_name) # 读取彩色图片 color_image cv2.imread(img_path) color_image cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB) # 转换为灰度图作为输入 gray_image cv2.cvtColor(color_image, cv2.COLOR_RGB2GRAY) # 将灰度图从单通道“复制”成三通道以匹配模型输入格式这只是常见做法之一 gray_image_3ch cv2.cvtColor(gray_image, cv2.COLOR_GRAY2RGB) # 简单归一化将像素值从0-255缩放到0-1之间 gray_tensor torch.from_numpy(gray_image_3ch.transpose(2,0,1)).float() / 255.0 color_tensor torch.from_numpy(color_image.transpose(2,0,1)).float() / 255.0 return gray_tensor, color_tensor # 使用示例 train_dataset ColorizationDataset(data_dir./data/train/) train_loader DataLoader(train_dataset, batch_size4, shuffleTrue, num_workers2) print(f数据加载器准备完毕共有 {len(train_dataset)} 张图片每批加载 {train_loader.batch_size} 张。)4.2 定义模型结构这里我们简化地定义一个非常基础的卷积网络来示意实际项目中你可以直接使用项目代码里定义好的U-Net模型。import torch.nn as nn class SimpleColorizationNet(nn.Module): 一个极简的示例模型实际项目请使用更复杂的U-Net def __init__(self): super(SimpleColorizationNet, self).__init__() # 编码部分逐步下采样提取特征 self.encoder nn.Sequential( nn.Conv2d(3, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.ReLU(), nn.MaxPool2d(2), ) # 解码部分逐步上采样恢复尺寸并输出颜色 self.decoder nn.Sequential( nn.ConvTranspose2d(128, 64, kernel_size2, stride2), nn.ReLU(), nn.Conv2d(64, 3, kernel_size3, padding1), nn.Sigmoid() # 用Sigmoid将输出限制在0-1对应归一化后的颜色值 ) def forward(self, x): x self.encoder(x) x self.decoder(x) return x # 初始化模型 model SimpleColorizationNet() print(model)4.3 组装训练循环这是训练的核心部分我们把数据、模型、评判标准损失函数和优化器串起来。import torch.optim as optim from tqdm import tqdm # 用于显示进度条 # 定义损失函数和优化器 criterion nn.MSELoss() # 使用均方误差比较生成图片和目标图片每个像素的差距 optimizer optim.Adam(model.parameters(), lr0.001) # Adam是一个常用的优化器 # 训练参数 num_epochs 10 # 遍历整个数据集的次数 device torch.device(cuda if torch.cuda.is_available() else cpu) print(f使用设备: {device}) model.to(device) # 训练循环 for epoch in range(num_epochs): model.train() # 将模型设置为训练模式 running_loss 0.0 # 使用tqdm包装数据加载器获得进度条 loop tqdm(train_loader, descfEpoch [{epoch1}/{num_epochs}]) for gray_imgs, color_imgs in loop: # 将数据移动到设备GPU或CPU gray_imgs, color_imgs gray_imgs.to(device), color_imgs.to(device) # 前向传播模型根据灰度图预测彩色图 outputs model(gray_imgs) # 计算损失预测图与真实图的差距 loss criterion(outputs, color_imgs) # 反向传播与优化 optimizer.zero_grad() # 清空上一次的梯度 loss.backward() # 计算梯度 optimizer.step() # 根据梯度更新模型参数 running_loss loss.item() # 更新进度条显示当前平均损失 loop.set_postfix(lossloss.item()) epoch_loss running_loss / len(train_loader) print(fEpoch [{epoch1}/{num_epochs}], 平均损失: {epoch_loss:.4f}) print(训练完成)运行这段代码你会看到进度条滚动损失值loss通常会随着训练进行而逐渐下降。这说明模型正在学习5. 看看效果用训练好的模型给图片上色训练完成后我们保存模型然后用它来给一些新的黑白图片上色看看效果。5.1 保存与加载模型# 保存模型 torch.save(model.state_dict(), colorization_model.pth) print(模型已保存为 colorization_model.pth) # 在另一个脚本或需要的时候加载模型 loaded_model SimpleColorizationNet() loaded_model.load_state_dict(torch.load(colorization_model.pth, map_locationdevice)) loaded_model.to(device) loaded_model.eval() # 设置为评估模式这会关闭Dropout等只在训练时用的层5.2 进行单张图片推理写一个函数输入一张灰度图输出上色后的结果。def colorize_image(model, gray_img_path, device): 给单张灰度图片上色 # 1. 读取并预处理输入图片 color_img cv2.imread(gray_img_path) color_img cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB) # 注意这里我们依然读取彩色图然后转灰度来模拟输入 gray_img cv2.cvtColor(color_img, cv2.COLOR_RGB2GRAY) gray_img_3ch cv2.cvtColor(gray_img, cv2.COLOR_GRAY2RGB) input_tensor torch.from_numpy(gray_img_3ch.transpose(2,0,1)).float().unsqueeze(0) / 255.0 input_tensor input_tensor.to(device) # 2. 模型推理 with torch.no_grad(): # 推理时不计算梯度节省内存和计算 output_tensor model(input_tensor) # 3. 后处理将输出转换回图片格式 output_img output_tensor.squeeze(0).cpu().numpy().transpose(1,2,0) output_img (output_img * 255).clip(0, 255).astype(uint8) # 4. 为了对比我们也准备灰度输入和真实彩色图 gray_display gray_img true_color_display color_img return gray_display, output_img, true_color_display # 使用示例 test_img_path ./data/test/your_test_image.jpg # 替换成你的测试图片路径 gray_img, colorized_img, true_color_img colorize_image(loaded_model, test_img_path, device) # 显示结果 fig, axes plt.subplots(1, 3, figsize(15, 5)) axes[0].imshow(gray_img, cmapgray) axes[0].set_title(输入灰度图) axes[0].axis(off) axes[1].imshow(colorized_img) axes[1].set_title(模型上色结果) axes[1].axis(off) axes[2].imshow(true_color_img) axes[2].set_title(真实彩色图参考) axes[2].axis(off) plt.show()6. 总结跟着走完这一趟你应该已经完成了自己的第一个深度学习实战项目。我们从一个空白的Python环境开始搭建了工具链理解了图像上色任务的基本思想编写了数据加载、模型定义、训练循环和推理验证的完整代码。这个过程里最重要的不是代码本身而是你亲身体验了深度学习的标准工作流。你可能会发现第一次训练的效果不一定完美颜色可能有些奇怪或者细节不够好。这完全正常深度学习模型的表现很大程度上依赖于数据的质量、模型结构的复杂度和训练时间的长短。如果你想进一步提升效果可以尝试寻找更大更高质量的数据集、使用更强大的预训练模型比如在ImageNet上预训练过的U-Net、调整训练参数学习率、训练轮数、或者尝试不同的损失函数。每一个调整都是一次新的实验和探索。深度学习的入门就像学骑自行车最开始需要有人扶着但一旦你找到了平衡感就能自己探索更远的路。希望这个给黑白照片上色的项目能成为你找到“平衡感”的第一步。动手去改代码去试不同的图片遇到错误就去搜索解决这才是学习技术最有效的方式。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2485044.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!