图像分割基本知识

计算机视觉和图像处理

  1. Tensorflow入门
  2. 深度神经网络
  3. 图像分类
  4. 目标检测
  5. 图像分割

    图像分割

    • 一、目标分割
      • 1.1 图像分割的定义
      • 1.2 任务类型
        • 1.2.1 任务描述
        • 1.2.2 任务类型
    • 二、语义分割
      • 2.1 FCN网络
        • 2.1.1网络结构
      • 2.2 Unet网络
    • 三、UNet案例
      • 3.1 数据集获取
        • 3.1.1 设置相关信息
        • 3.1.2 图像展示
        • 3.1.3 数据集生成器
      • 3.2 模型构建
        • 3.2.1 编码部分
        • 3.2.2 解码部分
        • 3.2.3 模型构建
      • 3.3 模型训练
        • 3.3.1 数据集划分
        • 3.3.2 数据获取
        • 3.3.3 模型编译
        • 3.3.4 模型训练
      • 3.4 模型预测

一、目标分割

  • 图像分类旨在判断该图像所属类别
  • 目标检测是在图像分类的基础上,进一步判断图像中的目标具体在图像的什么位置,通常是以外包矩阵的形式表示。
  • 图像分割是目标检测更进阶的任务,目标检测只需要框出每个目标的包围盒,语义分割需要进一步判断图像中哪些像素属于哪个目标。但是,语义分割不区分属于相同类别的不同实例。

1.1 图像分割的定义

在计算机视觉领域,图像分割指的是将数字图像细分为多个图像子区域(像素的集合)的过程,并且同一个子区域内的特征具有一定相似性,不同子区域的特征呈现较为明显的差异。

1.2 任务类型

1.2.1 任务描述

我们的目标是输入一个RGB彩色图片或者一个灰度图,然后输出一个包含各个像素类别标签的分割图。
在这里插入图片描述
预测目标可以采用one-hot编码,即为每一个可能的类创建一个输出通道。通过取每个像素点在各个通道的argmax可以得到最终的预测分割图。
在这里插入图片描述

1.2.2 任务类型

目前的图像分割任务主要有两类: 语义分割和实例分割
在这里插入图片描述

  • 语义分割就是把图像中每个像素赋予一个类别标签
    在这里插入图片描述
  • 实例分割,相对于语义分割来讲,不仅要区分不同类别的像素,还需要需要对同一类别的不同个体进行区分。如下图所示,不仅需要进行类别的划分,还要将各个个体划分出来:羊1,羊2,羊3,羊4,羊5等。
    在这里插入图片描述

二、语义分割

2.1 FCN网络

FCN用于图像语义分割,自从该网络提出后,就成为语义分割的基本框架,后续算法基本都是在该网络框架中改进而来。
简而言之,FCN和CNN的区别就是:CNN卷积层之后连接的是全连接层;FCN卷积层之后仍然连卷积层,输出的是与输入大小相同的特征图。

2.1.1网络结构

FCN是一个端到端,像素对像素的全卷积网络,用于进行图像的语义分割。整体的网络结构分为两个部分:全卷积部分和上采样部分。

  1. 全卷积部分
    全卷积部分使用经典的CNN网络(以AlexNet网络为例),并把最后的全连接层换成1x1卷积,用于特征提取。
  2. 上采用部分
    上采样部分将最终得到的特征图上采样得到原图像大小的语义分割结果。
    在这里采用的上卷积方法是反卷积,也叫转置卷积,反卷积是一种特殊的正向卷积,通俗的讲,就是输入补0+卷积。先按照一定的比例通过补0来扩大输入图像的尺寸,再进行正向卷积即可。

2.2 Unet网络

Unet网络是建立再FCNN网络基础上的。
在这里插入图片描述
整个网络由编码部分(左)和解码部分(右)组成,类似于一个大大的u字母,具体介绍如下:

1.编码部分是典型的卷积网络架构

编码部分的主要功能是提取输入图像的特征。通过一系列的卷积层和池化层(通常是最大池化层),编码部分逐渐减少特征图的尺寸,同时增加特征图的深度(即特征图的数量)。

  • 架构中含有一种重复结构,每次重复中有2个3x3卷积层、非线性ReLU层和一个2x2 max pooling层(stride为2)。
  • 每一次下采样后我们都把特征通道的数量加倍。

下采样(编码部分):减少数据点的数量或降低数据的分辨率,用于减少数据量、简化模型训练等

  1. 解码部分也使用了类似的模式:

解码部分的主要功能是恢复特征图的空间分辨率,最终生成与输入图像相同尺寸的分割结果。解码部分通过一系列的上采样操作(如转置卷积或上采样层)和卷积操作来逐步恢复特征图的尺寸。

  • 每一步都首先使用反卷积,每次使用反卷积都将特征通道数量减半,特征图大小加倍。
  • 反卷积过后,将反卷积的结果与编码部分中对应步骤的特征图拼接起来。
  • 编码部分中的特征图尺寸稍大,将其修建过后进行拼接。
  • 对拼接后的map再进行2次3x3的卷积。
  • 最后一层的卷积核大小为1x1,将64通道的特征图转化为特定类比数量的结果。

上采样(解码部分):增加数据点的数量或提高数据的分辨率,用于恢复细节、改善图像质量等。

三、UNet案例

Oxford-IIIT Pet Dataset宠物图像分割数据集,包含37种宠物类别,其中有12种猫的类别和25种狗的类别,每个类别大约有200张图片,所有图像都具有品种,头部ROI和像素级分割的标注,如下图所示:
在这里插入图片描述

import os
from IPython.display import Image,display
from tensorflow.keras.preprocessing.image import load_img
import PIL
from PIL import ImageOps

3.1 数据集获取

3.1.1 设置相关信息

# 图像位置
input_dir = 'segdata/images/'
# 图像路径
input_img_path = sorted([os.path.join(input_dir,fname) for fname in os.listdir(input_dir) if fname.endswith('jpg')])
input_img_path

在这里插入图片描述

# 标注信息
target_dir = 'segdata/annotations/trimaps/'
# 目标值
target_img_path = sorted([os.path.join(target_dir,fname) for fname in os.listdir(target_dir) if fname.endswith('png') and not fname.startswith('.')])
target_img_path

在这里插入图片描述

# 图像大小及类别信息
img_size = (160,160)
batch_size = 32
num_classes = 4

3.1.2 图像展示

display(Image(input_img_path[10]))

在这里插入图片描述

img = PIL.ImageOps.autocontrast(load_img(target_img_path[10]))
display(img)

在这里插入图片描述

3.1.3 数据集生成器

from tensorflow import keras
import numpy as np
# 数据集获取类
class OxfordPets(keras.utils.Sequence):# 初始化def __init__(self,batch_size,img_size,input_img_path,target_img_path):self.batch_size = batch_sizeself.img_size = img_sizeself.input_img_path = input_img_pathself.target_img_path = target_img_path# 迭代次数def __len__(self):return len(self.target_img_path)//self.batch_size # 或者batch数据def __getitem__(self,idx):# 当前批次对应的索引值i = idx * self.batch_size# 图像数据batch_input_img_path = self.input_img_path[i:i+self.batch_size]# 标签数据batch_target_img_path = self.target_img_path[i:i+self.batch_size]# 构建送入网络中图像数据x = np.zeros((self.batch_size,)+self.img_size+(3,),dtype='float32')for j,path in enumerate(batch_input_img_path):img = load_img(path,target_size=self.img_size)# 将PIL图像对象转换成Numpy数组x[j] = keras.preprocessing.image.img_to_array(img)y = np.zeros((self.target_size,) + self.img_size +(1,),dtype='uint8')for j,path in enumerate(batch_target_img_path):img = load_img(path,target_size=self.img_size,color_mode="grayscale")# 再数组的末尾增加一个维度y[j] = np.expand_dims(img,2)return x,y

3.2 模型构建

import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.layers import Input,Conv2D,Conv2DTranspose
from tensorflow.keras.layers import MaxPooling2D,Cropping2D,Concatenate,ZeroPadding2D
from tensorflow.keras.layers import Lambda,Activation,BatchNormalization,Dropout
from tensorflow.keras.models import Model

3.2.1 编码部分

# 下采样:输出张量,卷积核个数
def downsampling_block(input_tensor,filters):# 输入层x = Conv2D(filters,kernel_size=(3,3),padding='same')(input_tensor)# BN层x = BatchNormalization()(x)# 激活层x = Activation('relu')(x)# 卷积x = Conv2D(filters,kernel_size=(3,3),padding='same')(x)# BN层x = BatchNormalization()(x)# 激活层x = Activation('relu')(x)# 返回return MaxPooling2D(pool_size=(2,2))(x),x

3.2.2 解码部分

# 上采样:输入张量,特征融合张量(编码部分产生的特征图),卷积核个数
def upsampling_block(input_tensor,skip_tensor,filters):# 反卷积x = Conv2DTranspose(filters,kernel_size=(3,3),strides=2,padding='same')(input_tensor)# 获取当前特征图的尺寸_,x_hight,x_width,_ = x.shape# 获取特征融合图的尺寸_,s_hight,s_width,_ = skip_tensor.shape# 获取特征图大小差异h_crop = x_hight - s_hightw_crop = x_width - s_width# 若特征图大小相同则不进行裁剪if h_crop == 0 and w_crop ==0:y = skip_tensorelse:cropping = ((h_crop//2,h_crop-h_crop//2),(w_crop//2,w_crop-w_crop//2))y = ZeroPadding2D(cropping=cropping)(skip_tensor)# 特征融合x = Concatenate()([x,y])# 卷积x = Conv2D(filters,kernel_size=(3,3),padding='same')(x)# BN层x = BatchNormalization()(x)# 激活层x = Activation('relu')(x)# 卷积x = Conv2D(filters,kernel_size=(3,3),padding='same')(x)# BN层x = BatchNormalization()(x)# 激活层x = Activation('relu')(x)return x 

3.2.3 模型构建

def unet(imagesize,classes,fetures=64,depth=3):# 定义输入inputs = keras.Input(shape=(img_size)+(3,))x = inputs# ⽤来存放进⾏特征融合的特征图skips=[]# 构建编码部分for i in range(depth):# 下采样x,x0 = downsampling_block(x,fetures)skips.append(x0)# 特征翻倍fetures *=2# 卷积x = Conv2D(fetures,kernel_size=(3,3),padding="same")(x)# BN层x = BatchNormalization()(x)# 激活层x = Activation("relu")(x)# 卷积x = Conv2D(fetures,kernel_size=(3,3),padding='same')(x)# BN层x = BatchNormalization()(x)# 激活层x = Activation("relu")(x)# 构建解码部分for i in reversed(range(depth)):# 深度增加,特征图通道减半fetures //= 2# 下采样x = upsampling_block(x,skips[i],fetures)# 卷积x = Conv2D(fetures,kernel_size=(1,1),padding="same")(x)# 激活outputs = Activation("softmax")(x)# 模型定义model = keras.Model(inputs,outputs)return model
model = unet(img_size,4)
model.summary()

在这里插入图片描述

3.3 模型训练

3.3.1 数据集划分

import random
# 验证集数量
val_sample = 500
# 将数据集打乱
random.Random(100).shuffle(input_img_path)
random.Random(100).shuffle(target_img_path)
# 训练集
train_input_img_path = input_img_path[:-val_sample]
train_target_img_path = target_img_path[:-val_sample]
# 验证集
test_input_img_path = input_img_path[-val_sample:]
test_target_img_path = target_img_path[-val_sample:]

3.3.2 数据获取

train_gen = OxfordPets(batch_size,img_size,train_input_img_path,train_target_img_path)
test_gen = OxfordPets(batch_size,img_size,test_input_img_path,test_target_img_path)

3.3.3 模型编译

model.compile(optimizer=tf.keras.optimizers.RMSprop(),loss=tf.keras.losses.sparse_categorical_crossentropy)

3.3.4 模型训练

model.fit(train_gen,epochs=8,validation_data=test_gen,steps_per_epoch=1,validation_steps=1)

在这里插入图片描述

3.4 模型预测

# predict = model.predict(test_gen)
predictions = []# 获取数据集的大小
steps = len(test_gen)# 分批进行预测
for i in range(steps):# 获取下一个批次的数据batch = next(iter(test_gen))# batch 是一个元组,第一个元素是输入数据,第二个元素是标签batch_inputs, batch_labels = batch# 使用输入数据进行预测batch_predictions = model.predict(batch_inputs)predictions.append(batch_predictions)# 合并所有的预测结果
final_predictions = np.concatenate(predictions, axis=0)

在这里插入图片描述

def display_mask(i):# 获取第i个样本预测结果mask = np.argmax(final_predictions[i],axis=-1)# 扩展维度mask =np.expand_dims(mask,axis=-1)# 将掩码转换为PIL Image对象img = keras.preprocessing.image.array_to_img(mask)# 增强图像对比度img = PIL.ImageOps.autocontrast(img)display(img)
display(Image(filename=test_input_img_path[5]))

在这里插入图片描述

img = PIL.ImageOps.autocontrast(load_img(test_target_img_path[5]))
display(img)

在这里插入图片描述

display_mask(5)

在这里插入图片描述
**这人工智能不学也罢,没有个好电脑根本跑不出来,只能降低epoch,降低batch_size,分批次去预测模型,勉强可以训练预测模型,但结果就有点不敬人意了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143716.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AI 教育-数学篇: 利用大模型进行自主错误分析和精细纠正

AI 教育-数学篇: 利用大模型进行自主错误分析和精细纠正 秒懂大纲提出背景解法拆解输入输出全流程全方位的创新分析翻译 论文: https://arxiv.org/pdf/2409.09403 秒懂大纲 ├── 1 AI驱动的虚拟教师系统(VATE)【主题】 │ ├── 背景与动机【问题描…

Rsync未授权访问漏洞复现及彻底修复

一、什么是 Rsync? Rsync 是一种广泛使用的文件传输工具,它允许系统管理员和用户通过局域网(LAN)或广域网(WAN)在计算机之间同步文件和目录。Rsync 支持通过本地或远程 shell 访问,也可以作为守…

二叉树OJ题——对称二叉树

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 对称二叉树 二、解题思路 三、解题代码

W25QXX系列Flash存储器模块驱动代码

目录 W25QXX简介 硬件电路 W25Q128框图 Flash操作注意事项 驱动代码 W25QXX.h W25QXX.c W25QXX简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景 存储介质:Nor Flash&#xff0…

C++速通LeetCode中等第4题-三数之和

解题思路&#xff1a;先排序&#xff0c;固定第一个数&#xff0c;用两个指针分别指向右侧剩余数列的两端&#xff0c;右侧向左移动直到两指针重合&#xff0c;看三数合有没有解&#xff0c;指针遇到相同数字跳过。 class Solution { public:vector<vector<int>> …

编译原理课程总结(正在更新中)

程序语言设计 编译的步骤&#xff1a;词法分析&#xff0c;语法分析&#xff0c;语义分析&#xff0c;目标代码生成&#xff0c;目标代码优化 1.词法分析&#xff1a;从字符串中识别一个个的单词 2.语法分析:从符号流中识别出语法单位 3.语义分析&#xff1a;对语法单位进行…

仪表放大器

仪表放大器AD623微小毫伏微伏电压放大器模块单端/差分单电源 屏蔽罩的添加&#xff1a; 仪表放大器常用于传感器信号的放大&#xff0c;例如应变计、压力传感器、温度传感器和生物电信号&#xff08;如心电图、脑电图等&#xff09;。这些传感器通常输出微弱的差分信号&#xf…

苹果删除的照片怎么找回?3个方法轻松找回

马有失蹄&#xff0c;人有失策&#xff0c;几乎大多数的苹果用户都遇到过“在翻看相册的时候&#xff0c;不小心删除了相册里的照片”的问题。但解决这个困境的高效方法&#xff0c;却很少人知道。那么&#xff0c;解决删除的照片怎么找回问题的高效方法有哪些呢&#xff1f;小…

VirtualBox 克隆已有的虚拟机

【前提】已经存在一个CentOS 7 虚拟机 【需求】克隆出来一个虚拟机,用于本机 【操作】 1.右击已有的虚拟机 -> 选择克隆 2.给新虚拟机起个名称 以及 生成新的MAC地址 3.克隆 4.修改网络和主机名称 # 修改网络编辑以下2个文件 vi /etc/sysconfig/network-scripts/ifcfg-enp…

电源模块启动过冲测试项目该如何在ATECLOUD中搭建?

ATECLOUD智能化测试平台是纳米软件独立开发的电测平台&#xff0c;使用ATECLOUD可以很轻松的搭建各类电源模块、电源芯片以及射频组件的测试方案以及项目&#xff0c;不仅方便快速&#xff0c;而且准确高效。今天就为大家实例说明一下如何在ATECLOUD平台搭建一个简单的电源测试…

鸿蒙开发之ArkUI 界面篇 十二 背景属性

backgroundColor背景色(纯颜色&#xff0c;没法实现立体感之类高级效果)、 backgroundImage背景图(一般是设计师设计好的图)、 backgroundImageSize背景图尺寸(用于调整背景图的尺寸)、 backgroundImagePosition背景图位置(用于调整背景图的位置)。 背景图的添加是属性backgrou…

【与C++的邂逅】--- C++的IO流

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本篇博客我们来了解C中io流的相关知识。 &#x1f3e0; C语言输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 sc…

4.C++面向对象1(类的定义,实例化,三大特性-封装)

⭐本篇文章为C学习第4篇&#xff0c;主要了解类和对象基础 ⭐本人C代码的Gitte仓库&#xff1a;yzc的c学习: 小川c的学习记录 - Gitee.com 、 ⭐我们知道面向对象有三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;我们以类为基础进行…

linux hadoop-3.3.6 hbase-2.5.7

软件下载 hadoop https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz 可以直接下载到本地&#xff0c;也可以直接下载进虚拟机中 如果速度较慢&#xff0c;可以用&#xff1b;另一个 wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common…

模电模块(一)

这个看起来功能挺全的&#xff0c;就是小贵&#xff0c;有时间自己做一个&#xff1a; 首页-康威科技-淘宝网 (taobao.com) 画一个集成板&#xff0c;集合上述模块的功能。

kubernetes架构

kubernetes cluster由master和node组成&#xff0c;节点上运行着若干kubernetes服务Master节点&#xff1a; master是kubernetes cluster的大脑&#xff0c;运行着的Daemon服务包括kube-apiserver&#xff0c;kube-scheduler,kube-controller-manager&#xff0c;etcd和Pod网络…

VBS学习1 - 语法、内置函数、内置对象

文章目录 概述执行脚本语法转义字符文本弹框msgbx定义变量dim&#xff08;普通类型&#xff09;定义接收对象set字符拼接&用户自定义输入框inputbox以及输入判断ifelse数组&#xff08;参数表最大索引&#xff0c;非数组容量&#xff09;有容量无元素基于元素确定容量 循环…

tidb 集群搭建

官网的搭建文档&#xff1a;使用 TiUP 部署 TiDB 集群 | TiDB 文档中心 我本地使用三台 centos7.9 服务器搭建&#xff0c;要保证三台服务器之间是可以互相通信的&#xff1b; 搭建集群的命令在其中一台服务器上执行即可&#xff1b; 1、安装tiup&#xff1a; curl --proto …

【接口测试】Postman--变量与集合

一、变量 ​ 变量这个概念相信大家都不陌生&#xff0c;因此在这里我们不介绍了。主要说一下在Postman中有哪几类变量&#xff0c;主要包括以下四类&#xff1a; Global&#xff08;全局&#xff09; Environment&#xff08;环境&#xff09; Local&#xff08;本地&#xf…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…