Lab 6 - 深度学习:Unet

实验课上所使用的课件同步在学在浙大发布。

本次实验内容为课程作业,计算成绩。本次实验课内容分为两部分:

  1. 第一周:搭建 Unet网络
  2. 第二周:基于 MNIST 数据集训练扩散模型
本文档包含第一周的实验内容。你需要将实验报告和两次实验课的代码按照要求的结构打包并上传至学在浙大,压缩包名称为Lab6-学号-姓名.zip/7z。请不要提交模型文件和数据集。

folder

本次作业提交截止时间:2025年4月15日 23:59:59,逾期将要扣分。

配置深度学习环境

本实验推荐使用 Linux / WSL 作为平台。

Python 基础

Python是一种高级的解释型编程语言。与 C++ 这种编译型语言相比, 解释型语言没有单独的编译器,而是通过解释器直接执行。而Python 代码在转换成字节码后,由Python虚拟机(PVM)解释执行。

Python非常适合灵活快速的开发,但它的运行速度通常比编译型语言慢。

Python的基础用法在课件中有介绍。

Anaconda虚拟环境

Download Now | Anaconda 下载安装脚本。在 linux 中,使用 wget 命令下载 wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

下载完成后,运行安装脚本 bash Anaconda3-2024.10-1-Linux-x86_64.sh。按照提示完成安装,初始化可以选 yes,然后重启终端。

在终端中使用 conda 命令创建名为 torch_env 的虚拟环境 conda create –n torch_env python=3.10。其中-n 指定环境名,python指定环境的python版本。本实验在 python 3.10 下验证可运行。

在终端中使用 conda 命令 conda activate torch_env 激活环境。使用 which python 查看 python 位置,通常在你的环境下。 比如:/root/miniconda3/envs/torch_env/bin/python。然后就可以使用 pip installconda install 安装包。

Pytorch框架

PyTorch是目前主流的深度学习框架,其核心是基于张量(Tensor)的 计算系统。它的底层实现主要基于C++和CUDA,同时提供友好的 Python接口。PyTorch提供了丰富的生态系统,包括计算机视觉 (torchvision)和音频处理(torchaudio)等领域的专用工具包。

本实验要同时安装 torch 和 torchvision,即pip install torch=2.6.0pip install torchvision=0.21.

如果你在项目中有使用到其他的包,可以维护一个requirements.txt文件,然后使用pip install -r requirements.txt安装所有的包。

Pytorch的基础用法在课件中有介绍,在神经网络中,核心思路是在__init__中定义operators,在forward中使用operators进行计算。

Pytorch的常见神经网络层和激活包括:

  1. torch.nn.Linear
  2. torch.nn.Conv2d
  3. torch.nn.MaxPool2d
  4. torch.nn.Dropout
  5. torch.nn.BatchNorm2d
  6. torch.nn.ReLU
  7. torch.nn.Sigmoid

对于复杂的使用,可以查询:Pytorch的官方文档

搭建Unet网络

U-net 是一个经典的语 义分割全卷积网络,最初应用于医疗图像的分割任务,其结构如下图所示。

Unet

观察可见 U-Net 具有一个对称结构,左边是一个典型的卷积神经网络,右边是一个对称的上采样网络。

任务介绍

本实验使用 Unet完成汽车图像划分的任务。该任务输入为一张 彩色rgb图像,输出为一个掩码矩阵,表示图片上每个像素是否属于汽车(0-1)。这个问题可以处理成逐像素的二分类问题。 本实验提供已在训练集上训练好的模型 model.pth

U-Net网络结构

在 U-Net 原论文中,左侧向下的结构被称为 Contracting Path,由通道数不断增加的卷积层和池化层组成。右侧向上的结构被称 为 Expanding Path,由通道数不断减少的卷积层和上采样层 (反卷积层)组成。而在中间部分,Expanding Path 中的每次上采样层都会将 Contracting Path 中对应的特征图与自身的特征图进行拼接,以保证 Expanding Path 中的 每一层都能够利用Contracting Path 中的信息。

本实验提供一个 Unet 的基础代码 unet.py,你需要完成代码中所有标记为 TODO的部分,包括:

  1. 补全 __init__:根据下图完成 down_conv,mid_conv,up_conv,final_conv 的补全。注意输出通道为 1。
  2. 实现 CropAndConcat:通过 center_croptorch.cat 实现特征图拼接功能。
  3. 实现 forward:基于 CropAndConcat 完成forward补全。
Unet_Implement

加载与推理

实验提供一个简单的 try.py 来检测模型加载是否成功。 在终端通过参数 –model 指定模型文件,例如:

python try.py --model model.pth

加载成功后,应得到 Model loaded 的期望输出。

在加载模型基础上,你需要自行实现一个 infer.py,对单张汽车图片 test.jpg 的mask进行推断。主要步骤包括:

  1. 读入单张图片。
  2. 图片预处理,实验提供了一个非常朴素的预处理函数
  3. 单张图片[C,H,W]变为模型的输入输出[B, C, H, W] 的格式。
  4. 用sigmoid 处理输出分数并寻找合适阈值转换为0-1mask。

这个文件应能够满足在终端通过参数指定模型文件、输入图片、输出图片和阈值,具体要求如下:

python infer.py --model model.pth --input test.jpg --output output.jpg --threshold 0.5

你可能需要对输出做一些额外的画图处理,最终结构应如下:

result

在这里重新列出所有提供的模板代码:

这些代码和测试图片被打包在 code.zip 中。