使用 TensorFlow 进行图像分割的深度学习

本文详细介绍了如何使用 TensorFlow 进行图像分割,包括数据集描述、预处理、模型构建(采用 U-Net 架构)和训练过程。通过数据增强提升模型性能,最终实现对59类服装项目的分割。项目展示了图像分割在对象识别、医学成像和自动驾驶等领域的应用。
摘要由CSDN通过智能技术生成

介绍

图像分割是计算机视觉中的一项任务,涉及将特定图像划分为多个片段,其中每个片段代表图像中的对象或区域。这项任务对于对象检测、图像识别和自动驾驶等应用非常重要。

TensorFlow 是一个开源框架,用于构建和训练机器学习模型,在我们的例子中是图像分割模型。Tensorflow 提供执行图像分割任务所需的工具和预训练模型。

图像分割有一些现实世界的用例。他们包括:

  1. 对象识别和跟踪:图像分割用于实时跟踪和识别人、车辆和动物等对象。这主要用于安全系统、监视和自主机器人。

  2. 医学成像:图像分割用于查看和分割身体中的结构,例如器官、肿瘤和血管。这些数据用于诊断、治疗和研究。

  3. 自动驾驶:检测和分类道路上的行人和车辆等对象,以避免发生事故和碰撞

学习目标

  • 该项目的目标是训练一个可以为 59 个类别创建分割蒙版的模型。第一类代表个人的背景,而其余 58 类代表服装项目,例如衬衫、头发、裤子、皮肤、鞋子、眼镜等。

  • 除此之外,是从图像中可视化模型创建的蒙版,并将它们与正确的蒙版进行比较,以评估模型的准确性。

  • 此外,这旨在让用户了解图像分割过程以及如何实现它。

目录

  1. 术语

  2. 学习目标

  3. 数据集描述

  4. 导入必要的库和依赖

  5. 数据集准备

  6. 可视化数据集样本

  7. 数据预处理

  8. 将数据拆分为训练和验证

  9. 数据扩充

  10. 定义和构建模型

  11. 编译和训练模型

  12. 性能曲线

  13. 结论

术语

  • 深度学习: 是机器学习的一个子集,它使用具有三层或更多层的神经网络来模拟人脑从数据中学习的行为。

  • 图像分割: 将图像划分为片段或区域的过程,每个片段或区域代表一个单独的对象或图像的一部分。

  • Mask:图像的一部分,与图像的其余部分隔离开来。

  • 数据增强: 一种通过对现有数据应用转换来人为增加数据集大小的方法。

  • 全卷积神经网络(FCNN)是一种只执行卷积(和子采样或上采样)操作的神经网络。该网络包括三种主要类型的层:卷积层、池化层和全连接层。

  • UNet 架构: 一种 U 形编码器-解码器网络架构,包括四个编码器块和四个使用桥连接的解码器块。

  • DenseNet121: 架构由四个密集块和三个过渡层组成。每个密集块都有不同数量的层,每个层都有两个卷积来执行卷积操作。

  • Upstack: 也称为上采样或转置卷积层。它们用于网络的解码器部分,以提高特征图的空间分辨率。

  • Downstack:也称为最大池化层。它们用于网络的编码器部分,以降低特征图的空间分辨率。

  • Skip Connections: 用于连接相应的encoder和decoder层。

数据集描述

该数据集由 1000 张图像和 1000 个相应的PNG 格式语义分割蒙版组成。每个图像的大小为 825 像素 x 550 像素。

分割蒙版属于 59 个类,第一类是个人背景,其余 58 个类属于服装项目,例如衬衫、头发、裤子、皮肤、鞋子、眼镜等。

这个数据集在 Kaggle 上可用:https://www.kaggle.com/datasets/rajkumarl/people-clothing-segmentation

导入必要的库和依赖

导入执行此项目中的任务所需的库。

import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import matplotlib as mpl
from tqdm import tqdm
from sklearn.model_selection import train_test_split

数据集准备

我们将首先创建两个单独的列表来收集图像和蒙版数据集的路径,然后我们将使用 os.walk() 函数遍历所有文件。最后,我们将打印出两个列表的长度。

# a list to collect paths of 1000 images
image_path = []
for root, dirs, files in os.walk('/content/png_images'):
    # iterate over 1000 images
    for file in files:
        # create path
        path = os.path.join(root,file)
        # add path to list
        image_path.append(path)
len(image_path)


# a list to collect paths of 1000 masks
mask_path = []
for root, dirs, files in os.walk('/content/png_masks'):
    #iterate over 1000 masks
    for file in files:
        # obtain the path
        path = os.path.join(root,file)
        # add path to the list
        mask_path.append(path)
len(mask_path)

这将分别打印出 1000 张图像和 1000 个蒙版的长度。

在整理数据集以获得正确的图像蒙版对之后,我们将解码图像和蒙版以将它们存储在单独的列表中。为此,我们将使用 Tensorflow 函数将每个 PNG 文件读入内存。然后将它们解码为张量并附加到两个单独的列表:蒙版和图像。

# create a list to store images
images = []
# iterate over 1000 image paths
for path in tqdm(image_path):
    # read file
    file = tf.io.read_file(path)
    # decode png file into a tensor
    image = tf.image.decode_png(file, channels=3, dtype=tf.uint8)
    # append to the list
    images.appe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值