机器学习实战4:基于马尔科夫随机场的图像分割(附Python代码)

news2025/3/12 10:35:58

目录

  • 0 写在前面
  • 1 图像分割问题
  • 2 图像像素邻域
  • 3 观测场与标记场
  • 4 马尔科夫随机场建模
  • 5 Python实现
    • 5.1 计算能量函数
    • 5.2 退火优化
    • 5.3 效果展示

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


在机器学习强基计划6-2:详细推导马尔科夫随机场(MRF)及其应用(附例题)中我们系统地介绍了引入马尔科夫随机场的动机及其基本概念,但由于公式繁多,很难理解这个模型如何应与实际相结合,本文结合一个计算机视觉领域的经典问题——图像分割讲解马尔科夫随机场的应用,加深对概率图模型的理解。为了便于说明,先引入计算机视觉中的部分概念。

1 图像分割问题

在图像处理与计算机视觉领域,图像分割(image segmentation)是在像素级别将一个完整图像划分为若干具有特定语义区域(region)对象(object)的过程。每个分割区域是一系列拥有相似特征——例如颜色、强度、纹理等的像素集合,因此图像分割也可视为以图像属性为特征空间,为全体像素赋予标签的分类问题

图像分割是高级图像处理的基础技术,它将原始冗余而繁杂的图像,转化为一种更具意义且简单紧凑的组织形式。在智能安防、卫星遥感、医学影像处理、生物特征识别等领域,图像分割通过提供精简且可靠的图像特征信息,有效地提高后续从而利于后续图像分析、理解等技术的计算效率,具有重要意义。

在这里插入图片描述

2 图像像素邻域

在图像分割中,通常默认图像中某像素点 p ( i , j ) p\left( i,j \right) p(i,j)只受相邻像素的影响,较远处的像素对该像素没有作用,或者说其作用已被包含在相邻像素内

例如当前像素语义是天空,那么近邻像素也很可能表示天空。

形式化地,像素 p p p的邻域定义为

δ d ( p ) = { q ∈ R ∣ d i s t ( p , q ) ⩽ d , d ∈ N + , q ≠ p } \delta _d\left( p \right) =\left\{ q\in R|\mathrm{dist}\left( p,q \right) \leqslant \sqrt{d}, d\in \mathbb{N} ^+, q\ne p \right\} δd(p)={qRdist(p,q)d ,dN+,q=p}

其中 d i s t ( ⋅ , ⋅ ) \mathrm{dist}\left( \cdot ,\cdot \right) dist(,)表示两个像素间的欧式距离, d d d表示的是邻域的阶次,阶次越高像素包含的邻点越多,且满足当阶次 t > d t>d t>d δ d ( p ) ⊂ δ t ( p ) \delta _d\left( p \right) \subset \delta _t\left( p \right) δd(p)δt(p)

在这里插入图片描述
这种邻域特性类似于马尔科夫链的无后效性,参考机器学习强基计划6-1:图文详细总结马尔科夫链及其性质(附例题分析)。由于图像是二维数据,因此用经典的无向图模型——马尔科夫随机场代替一维的马尔科夫链进行建模。马尔科夫随机场中的全局马尔科夫性、局部马尔科夫性和成对马尔科夫性,恰好表征了像素只受邻域影响的假设偏好

3 观测场与标记场

进行图像分割时,需要定义两个随机场:

  • 观测场 Y Y Y:指肉眼可见的图像实际像素场
  • 标记场 X X X:每个可观测像素都赋予一个标记,这些标记组成标记场。这两个随机场一一对应
    在这里插入图片描述

形式化地,设观测场

Y = { y ∣ y ∈ R } Y=\left\{ y|y\in R \right\} Y={yyR}

其中 y y y是图像每个像素的真实取值。标记场

X = { x p ∣ p ∈ R , x p ∈ R } X=\left\{ x_p|p\in R, x_p\in \mathcal{R} \right\} X={xppR,xpR}

其中 x p x_p xp表示像素 p p p被赋予的分割区域,总共有 ∣ R ∣ \left| \mathcal{R} \right| R种可能的分割情形。

图像分割的目标是在已有观测图像的情况下,让标记场的概率最大,根据极大后验估计可得

X = a r g max ⁡ X P ( X ∣ Y ) = a r g max ⁡ X P ( X ) P ( Y ∣ X ) = a r g max ⁡ X ( ln ⁡ P ( X ) + ln ⁡ P ( Y ∣ X ) ) \begin{aligned}X&=\mathrm{arg}\max _XP\left( X|Y \right) \\&=\mathrm{arg}\max _XP\left( X \right) P\left( Y|X \right) \\&=\mathrm{arg}\max _X\left( \ln P\left( X \right) +\ln P\left( Y|X \right) \right)\end{aligned} X=argXmaxP(XY)=argXmaxP(X)P(YX)=argXmax(lnP(X)+lnP(YX))

为了求解这个优化目标,分别对 P ( X ) P(X) P(X) P ( Y ∣ X ) P(Y|X) P(YX)建模。

4 马尔科夫随机场建模

根据机器学习强基计划6-2:详细推导马尔科夫随机场(MRF)及其应用(附例题)的讲解,我们可以用马尔科夫随机场对联合分布 P ( X ) P(X) P(X)建模,列出

P ( X ) = 1 Z ∗ ∏ Q ∈ C ∗ ϕ Q ( D Q ) = 1 Z ∗ ∏ Q ∈ C ∗ e − ∑ u , v ∈ Q , u ≠ v β u v I ( x u ≠ x v ) P\left( X \right) =\frac{1}{Z^*}\prod_{Q\in \mathcal{C} ^*}{\phi _Q\left( \boldsymbol{D}_Q \right)}=\frac{1}{Z^*}\prod_{Q\in \mathcal{C} ^*}{e^{-\sum_{u,v\in Q,u\ne v}{\beta _{uv}\mathbb{I} \left( x_u\ne x_v \right)}}} P(X)=Z1QCϕQ(DQ)=Z1QCeu,vQ,u=vβuvI(xu=xv)

这里令能量函数

H Q ( D Q ) = ∑ u , v ∈ Q , u ≠ v β u v I ( x u ≠ x v ) H_Q\left( \boldsymbol{D}_Q \right) =\sum_{u,v\in Q,u\ne v}{\beta _{uv}\mathbb{I} \left( x_u\ne x_v \right)} HQ(DQ)=u,vQ,u=vβuvI(xu=xv)

称为Potts马尔科夫随机场,倾向于两个相邻像素取值相同,当相邻像素不等时,整体能量会上升,比如一个表示天空的蓝色像素,我们更倾向于和它属于同一类的像素都是蓝色的。

P ( Y ∣ X ) P(Y|X) P(YX)表示了像素与其标签的匹配程度,可用高斯分布建模

P ( Y ∣ X ) = ∏ y ∈ R P ( y ∣ x y ) = ∏ y ∈ R 1 2 π σ x y exp ⁡ [ − ( y − μ x y ) 2 2 σ x y 2 ] P\left( Y|X \right) =\prod_{y\in R}{P\left( y|x_y \right)}=\prod_{y\in R}{\frac{1}{\sqrt{2\pi}\sigma _{x_y}}\exp \left[ -\frac{\left( y-\mu _{x_y} \right) ^2}{2\sigma _{x_y}^{2}} \right]} P(YX)=yRP(yxy)=yR2π σxy1exp[2σxy2(yμxy)2]

这里的均值和方差通过图像数据集训练得到,所以这个高斯概率模型就代表了通常意义下某个类的像素分布情况。比如说我们选择一百张标记好的图像,把这些图像中代表天空的像素进行累加,然后求平均就是这里的均值;方差同理

综合 P ( X ) P(X) P(X) P ( Y ∣ X ) P(Y|X) P(YX),可以得到优化目标

X = a r g max ⁡ X P ( X ∣ Y ) = a r g max ⁡ X P ( X ) P ( Y ∣ X ) = a r g max ⁡ X ( ln ⁡ P ( X ) + ln ⁡ P ( Y ∣ X ) ) = a r g min ⁡ X [ ∑ Q ∈ C ∗ ∑ u , v ∈ Q , u ≠ v β u v I ( x u ≠ x v ) + ∑ y ∈ R ( 2 π σ x y + ( y − μ x y ) 2 2 σ x y 2 ) ] \begin{aligned}X&=\mathrm{arg}\max _XP\left( X|Y \right) \\&=\mathrm{arg}\max _XP\left( X \right) P\left( Y|X \right) \\&=\mathrm{arg}\max _X\left( \ln P\left( X \right) +\ln P\left( Y|X \right) \right) \\&=\mathrm{arg}\min _X\left[ \sum_{Q\in \mathcal{C} ^*}{\sum_{u,v\in Q,u\ne v}{\beta _{uv}\mathbb{I} \left( x_u\ne x_v \right)}}+\sum_{y\in R}{\left( \sqrt{2\pi}\sigma _{x_y}+\frac{\left( y-\mu _{x_y} \right) ^2}{2\sigma _{x_y}^{2}} \right)} \right]\end{aligned} X=argXmaxP(XY)=argXmaxP(X)P(YX)=argXmax(lnP(X)+lnP(YX))=argXmin QCu,vQ,u=vβuvI(xu=xv)+yR(2π σxy+2σxy2(yμxy)2)

用这个目标定义损失函数

U ( X ) = ∑ Q ∈ C ∗ ∑ u , v ∈ Q , u ≠ v β u v I ( x u ≠ x v ) + ∑ y ∈ R ( 2 π σ x y + ( y − μ x y ) 2 2 σ x y 2 ) U\left( X \right) =\sum_{Q\in \mathcal{C} ^*}{\sum_{u,v\in Q,u\ne v}{\beta _{uv}\mathbb{I} \left( x_u\ne x_v \right)}}+\sum_{y\in R}{\left( \sqrt{2\pi}\sigma _{x_y}+\frac{\left( y-\mu _{x_y} \right) ^2}{2\sigma _{x_y}^{2}} \right)} U(X)=QCu,vQ,u=vβuvI(xu=xv)+yR(2π σxy+2σxy2(yμxy)2)

采用模拟退火等方法可以求得近似最优解。

5 Python实现

5.1 计算能量函数

能量函数的定义参加第四节的Potts马尔科夫随机场

def __calEnergy(self, label: int, index: tuple, img: np.ndarray, w: np.ndarray) -> float:
    # get image's shape
    channels = 0
    try:    rows, cols, channels = img.shape
    except: rows, cols = img.shape

    i, j = index
    energy = 0.0
    
    if channels:
        for c in range(channels):
            val = img[i][j][c]
            mean, var = self.class_info[label][c][1], self.class_info[label][c][2]
            energy += np.log(np.sqrt(2 * np.pi * var)) + ((val - mean)**2) / (2 * var)
    else:
        val = img[i][j]
        mean, var = self.class_info[label][0][1], self.class_info[label][0][2]
        energy += np.log(np.sqrt(2 * np.pi * var)) + ((val - mean)**2) / (2 * var)

    # clique energy(Potts model)
    neighbor = [[0, 1], [0, -1], [1, 0], [-1, 0]]
    for dx, dy in neighbor:
        if 0 <= i + dx < rows and 0 <= j + dy < cols:
            energy = energy + self.beta_ if label == w[i + dx][j + dy] else energy

    return energy 

5.2 退火优化

while (iteration < 500):
	# try new label
	x, y = random.randint(0, rows - 1), random.randint(0, cols - 1)
	labels = [i for i in range(len(self.class_info))]
	labels.remove(w[x][y])
	new_label = labels[random.randint(0, len(labels) - 1)]
	
	# delta energy between old label and new label
	delta = self.__calEnergy(new_label, (x, y), img, w) - self.__calEnergy(w[x][y], (x, y), img, w)
	if (delta <= 0):
	    w[i][j] = new_label
	    energy += delta
	else:
	    p = -delta / current_temp
	    if random.uniform(0, 1) < p:
	        w[i][j] = new_label
	        current_energy += delta
	current_temp *= 0.95
	iteration += 1

5.3 效果展示

在这里插入图片描述
本文完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

分享6个对象数组去重的方法

大家好&#xff0c;关于对象数组去重的业务场景&#xff0c;想必大家都遇到过类似的需求吧&#xff0c;针对这样的需求&#xff0c;你是怎么做的呢。下面我就先和大家讨论下基于对象的某个属性如何去重。方法一&#xff1a;使用 .filter() 和 .findIndex() 相结合的方法使用 fi…

基于AD Event日志监测AdminSDHolder

01、简介 AdminSDHolder是一个特殊的AD容器&#xff0c;通常作为某些特权组成员的对象的安全模板。Active Directory将采用AdminSDHolder对象的ACL并定期将其应用于所有受保护的AD账户和组&#xff0c;以防止意外和无意的修改并确保对这些对象的访问是安全的。如果攻击者能完全…

## Leetcode刷题Day24-------------------回溯算法

Leetcode刷题Day24-------------------回溯算法 1. 理论基础 题目链接/文章讲解&#xff1a;https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频讲解&#xff1a;https://www.bilibili.com/video/BV1cy4y167mM …

Linux文件目录与路径、内容查找命令及文件颜色知识总结

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务需求Shiro也都能胜任. 二.项目环境 MyBatis-Plus版本: 3.1.0 SpringBoot版本:2.1.5 JDK版本:1.8 Shiro版本:1.4…

ASUS X415安装系统找不到硬盘解决办法

同事让我帮忙安装系统&#xff0c;笔记本电脑型号是ASUS X415。原本以为是手到擒来的事情&#xff0c;结果我在上面还是消耗了不少时间。 现象 老毛桃PE 无法识别到硬盘。微PE可以识别到硬盘&#xff0c;但是系统安装以后&#xff0c;无法正常启动。启动出现蓝屏。或者无限等…

codewars闯关玩耍1

codewars闯关玩耍1 codewars网址&#xff1a;https://www.codewars.com/dashboard 大一时在知乎上看到的网站&#xff0c;然后 点击、收藏、吃灰 一键三连&#xff0c;最近翻收藏夹的时候突然又看见了决定进来玩玩&#xff0c;练练英语&#xff0c;巩固下python 以后此系列&a…

javaweb10 JSP语法、JSTL、EL表达式、JSP标签、九大内置对象

文章目录一、JSP简介二、JSP原理三、JSP语法四、JSP指令五、九大内置对象六、EL表达式七、JSP标签八、JSTL标签一、JSP简介 JSP&#xff08;java sever pages&#xff09;&#xff1a;java服务器端页面&#xff0c;和servlet一样&#xff0c;用于动态web技术 写JSP就像在写HTM…

中国to B应用软件的突破之路

我曾经随手画过一个很简单的图&#xff1a;我就分为供需两端。&#xff08;1&#xff09;如何让生意越做越大&#xff1f;那就在需侧&#xff0c;增加尽量多的交互。有人理解在营销环节-客户关系触点经营&#xff0c;有人理解在销售环节-多渠道多业态销售&#xff08;如电话销售…

振弦采集模块配置工具VMTool生成寄存器值

振弦采集模块配置工具VMTool生成寄存器值 生成寄存器值 VMXXX 有很多按位使用的寄存器&#xff0c; 使用 VMTool 工具可进行方便的设置&#xff0c;当需要知道寄存器的实际值时&#xff0c;可通过以下两种方法获取。 &#xff08;保持【 自动读取】 复选框为非选中状态&#xf…

Unity 简易音乐播放系统

前言 众所周知, Unity自带音效播放没有回调,不能自动播放clip列表; 所以简单实现一个带自动播放功能的接口,用以实现音乐列表的逐个播放. 一. 功能分析 首先要求切换场景时音乐不停,只在需要时播放其次即传入音乐名和播放次数,即可将该音乐循环播放指定次数可以直接传入一个…

【OpenCV 例程 300篇】256. 特征检测之 CenSurE(StarDetector)算法

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】256. 特征检测之 CenSurE&#xff08;StarDetector&#xff09;算法 6.9.1 算法简介 中心环绕算法&#xff08;Center Surround Extremas, CenSurE&#xff09;是 Agrawal M 等于 2008年提出的关键…

K8S StatefulSet基本使用

K8S StatefulSet 清空K8S对象 为了避免之前学习的内容造成的影响&#xff0c;先手动把K8S集群中的所有对象清空&#xff0c;使用一个全新的环境来学习StatefulSet的基本使用。 查看对象 查看service对象 kubectl get services查看ReplicaSet对象 kubectl get rs查看Repli…

达梦数据库导入dmp文件

找到达梦数据库安装文件的bin目录按着Shift键&#xff0c;右键输入以下命令&#xff08;注意更改参数&#xff09;.\dimp DGYH(用户名)/DGYH(密码)127.0.0.1 FILEdmp所在文件夹路径\20230103.dmp fullY然后根据提示,写Y 或 N 回车即可注意&#xff1a;若导入成功&#xff0c;但…

Java9的新特性模块化(Module)

一、 模块化是什么&#xff1f; Java 9引入了模块化系统&#xff0c;称为"Java Platform Module System"&#xff08;JPMS&#xff09; 这个系统允许将Java程序分成模块&#xff0c;每个模块都有自己的规范&#xff0c;可以明确地声明它依赖于哪些其他模块&#xff…

小波分析在电力系统暂态信号处理中的应用

前面我们主要讲了小波分析在机械振动信号或者其他时间序列中的应用 基于小波包特征提取和随机森林的CWRU轴承数据集故障识别 - 哥廷根数学学派的文章 - 知乎 https://zhuanlan.zhihu.com/p/556172942 基于小波区间相关&#xff08;Interval-Dependent&#xff09;的信号降噪方…

nacos源码分析-心跳检测(服务端)

前言 前面我们讲了《nacos源码分析-服务注册(客户端)》 和 《nacos源码分析-服务注册(服务端)》&#xff0c;主要是讲的服务注册流程&#xff0c;本章节我们来讲服务心跳检测机制。 心跳续约客户端 其实我们在讲 nacos服务注册客户端的时候顺带就说了心跳&#xff0c;服务注…

iNav飞控AOCODARC-F7MINI固件编译

iNav飞控AOCODARC-F7MINI固件编译1. 编译目标&#xff08;AOCODARC-F7MINI&#xff09;2. 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 厂家目标板查询Step 5 目标固件编译Step 6 目标固件清理3. 参考资料iNav是一款非常出色的飞控航模开源软…

怎么恢复360删除的文件?360文件恢复,快速完成

日常生活和工作中&#xff0c;使用电脑总会保存着很多数据。其中有我们很多的文件&#xff0c;如果不小心删除了重要的文件&#xff0c;我们该怎么恢复呢&#xff1f; 很多人都喜欢在电脑上安装3 60安 全卫士&#xff0c;文件被误删&#xff0c;我们可以通过它来恢复数据。文件…