当前位置: 首页 > news >正文

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址:https://arxiv.org/abs/1412.7062

代码地址:GitHub - TheLegendAli/DeepLab-Context

1.是什么?

DeepLab V1是一种基于VGG模型的语义分割模型,它使用了空洞卷积和全连接条件随机(CRF)来提高分割的准确性。其总体架构包括一个卷积神经网络和一个CRF后处理模块。在卷积神经网络中,使用了空洞卷积来扩大感受野,从而提高了分割的准确性。在CRF后处理模块中,使用了全连接CRF来进一步优化分割结果。

以下是DeepLab V1模型的主要特点和:

  • 使用了VGG模型作为卷积神经网络的基础模型。
  • 使用了空洞卷积来扩大感受野,从而提高了分割的准确性。
  • 使用了全连接CRF来进一步优化分割结果。

2.为什么?

在论文的引言部分(INTRODUCTION)首先抛出了两个问题(针对语义分割任务): 

信号下采样导致分辨率降低:
在DCNN中重复最大池化和下采样带来的分辨率下降问题,分辨率的下降会丢失细节。max-pooling会降低特征图的分辨率,而利用反卷积等上采样方法会增加时空复杂度,也比较粗糙,因此利用空洞卷积来扩大感受野,相当于下采样-卷积-上采样的过程被一次空洞卷积所取代。空洞卷积可以扩展感受野,获取更多的上下文信息。
作者说主要是采用Maxpooling导致的,为了解决这个问题作者引入了'atrous'(with holes) algorithm(空洞卷积 / 膨胀卷积 / 扩张卷积)

空间“不敏感” 问题。
以获取图像中物体为核心的决策,必然需要空间不变性/不敏感。换句话说,对于同一张图片进行空间变换(如平移、旋转),其图片分类结果是不变的。但对于图像分割等,对于一张图片进行空间变换后,其结果是改变的。
作者说分类器自身的问题(分类器本来就具备一定空间不变性),我个人认为其实还是Maxpooling导致的。为了解决这个问题作者采用了fully-connected CRF(Conditional Random Field)方法。

Q:为什么说“CNNs 的不变性特性可能导致在特征提取过程中丢失一些空间信息”?
A:这主要是由于以下几个原因:

池化操作:CNN 中常用的池化层(如最大池化或平均池化)会减小特征图的空间尺寸,以减少计算量并增强空间不变性。然而,这种下采样的操作也导致了部分空间信息的丢失。当特征图被缩减时,原始图像中细微的空间结构和位置信息可能被模糊化或忽略,因此在一定程度上丢失了细粒度的空间信息。

卷积核尺寸:在卷积操作中,使用的卷积核尺寸通常较小,只关注局部感受野内的特征。这意味着较大的空间结构可能在特征提取过程中被忽略。虽然通过堆叠多个卷积层可以逐渐扩大感受野,但仍然存在一定程度的局部性。

权值共享:虽然权值共享增强了模型的平移不变性,但这也导致了一些空间信息的丢失。由于卷积核在整个图像上是共享的,网络学习到的特征对于不同位置的相同特征可能具有相同的响应,但对于不同特征的位置信息的差异性较小。

 解决方案
为了克服这些技术障碍,在像素级标注任务中,可以采取一些策略,如:

避免过度的信号下采样:可以适当减少池化层的使用,或者使用更少的步长来进行池化,以保留更多的空间信息。

结合上采样技术:可以使用转置卷积或其他上采样技术来恢复特征图的空间分辨率,从而更好地处理像素级标注任务。

结合多尺度特征:可以在网络中引入多尺度的特征表示,以捕获不同尺度的信息,并提高对不同大小目标的感知能力。

使用适当的损失函数:对于像素级标注任务,可以使用适当的损失函数,如交叉熵损失或Dice损失,来优化网络并鼓励更准确的像素级标注结果。

3.怎么样?

3.1 模型示意图

深度卷积神经网络(具有完全卷积层)生成的粗糙分数图通过双线性插值进行上采样。然后,应用全连接CRF来优化分割结果。最佳观看方式为彩色显示。 

3.2 LargeFOV

经过上采样得到 224 × 224 × n u m   c l a s s e s 224 \times 224 \times \mathrm{num \ classes}224×224×num classes 的特征图并非模型最终输出结果,还要经过一个 Softmax 层后才是模型最终的输出结果。Softmax 层的作用是将每个像素的类别预测转换为对应类别的概率。它会对每个像素的 num_classes 个类别预测进行归一化,使得每个预测值都落在 0 到 1 之间,并且所有类别的预测概率之和为 1。这样,对于每个像素点,我们可以得到每个类别的概率,从而确定该像素属于哪个类别的概率最大。最终的输出结果通常是经过 Softmax 处理后的特征图,其中每个像素点都包含了 num_classes 个类别的概率信息。

LargeFOV 本质上就是使用了膨胀卷积。

通过分析发现虽然 Backbone 是 VGG-16 但所使用 Maxpool 略有不同,VGG 论文中是 kernel=2,stride=2,但在 DeepLab v1 中是 kernel=3,stride=2,padding=1。接着就是最后两个 Maxpool 层的 stride 全部设置成了 1(这样下采样的倍率就从原来的 32 变成了 8)。最后三个 3 × 3  的卷积层采用了膨胀卷积,膨胀系数 r = 2 

然后关于将全连接层卷积化过程中,对于第一个全连接层(FC1)在 FCN 网络中是直接转换成卷积核大小为 7 × 7 ,卷积核个数为 4096 40964096 的卷积层(普通卷积),但在 DeepLab v1 中作者说是对参数进行了下采样最终得到的是卷积核大小 3 × 3 ,卷积核个数为 1024 10241024 的卷积层(膨胀卷积),对于第二个全连接层(FC2)卷积核个数也由 4096 40964096 采样成 1024 10241024(普通卷积)。

将 FC1 卷积化后,还设置了膨胀系数(膨胀卷积),论文 3.1 中说的是 r = 4 但在 Experimental Evaluation 中 Large of View 章节里设置的是 r = 12 对应 LargeFOV。对于 FC2 卷积化后就是卷积核 1 × 1 ,卷积核个数为 1024  的普通卷积层。接着再通过一个卷积核 1 × 1 ,卷积核个数为 num_classes(包含背景)的普通卷积层。最后通过 8 倍上采样还原回原图大小。

3.3 CRF

对于每个像素位置 i 具有隐变量 xi (这里隐变量就是像素的真实类别标签,如果预测结果有21类,则 i ∈ ( 1 , 2...21 ) ,还有对应的随机场观测值 yi (即像素点对应的颜色值)。以像素为节点,像素与像素间的关系作为边,构建了一个条件随机场(CRF)。通过观测变量 yi 来预测像素位置 i 对应的类别标签 xi。条件随机场示意图如下:


 

整个模型的能量函数

3.4 MSc(Multi-Scale)

作者将两层的 MLP(第一层:具有 128 个 卷积核且大小为 3 × 3 3\times 33×3 的卷积,第二层:具有 128 个卷积核且大小为 1 × 1 1\times 11×1 的卷积)分别附加到输入图像和前四个最大池化层的输出上,然后将它们的特征图与主网络的最后一层特征图进行连接。因此,送入 Softmax 层的聚合特征图将增加 5 × 128 = 640 5 \times 128 = 6405×128=640 个通道。
即 DeepLab v1 除了使用之前主分支上输出外,还融合了来自原图尺度以及前四个 Maxpool 层的输出,更详细的结构参考下图。


3.5 代码实现

VGG16

import torch
import torch.nn as nn
class VGG13(nn.Module):def __init__(self):super(VGG13, self).__init__()self.stage_1 = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(64),nn.ReLU(),nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(64),nn.ReLU(),nn.MaxPool2d(2,2),)self.stage_2 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(128),nn.ReLU(),nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(128),nn.ReLU(),nn.MaxPool2d(2,2),)self.stage_3 = nn.Sequential(nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(256, 256, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(256),nn.ReLU(),nn.MaxPool2d(2,2),)     self.stage_4 = nn.Sequential(nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1),nn.BatchNorm2d(512),nn.ReLU(),nn.MaxPool2d(2,stride=1, padding=1),)self.stage_5 = nn.Sequential(#空洞卷积nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=2, dilation=2),nn.BatchNorm2d(512),nn.ReLU(),nn.MaxPool2d(2, stride=1),) def forward(self, x):x = x.float()x1 = self.stage_1(x)x2 = self.stage_2(x1)x3 = self.stage_3(x2)x4 = self.stage_4(x3)x5 = self.stage_5(x4)return [x1, x2, x3, x4, x5]

DeepLabV1 

class DeepLabV1(nn.Module):def __init__(self, num_classes):super(DeepLabV1, self).__init__()#前13层是VGG16的前13层,分为5个stageself.num_classes = num_classesself.backbone = VGG13()self.stage_1 = nn.Sequential(#空洞卷积nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=4, dilation=4),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=1, stride=1, padding=0),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(512, 512, kernel_size=1, stride=1, padding=0),nn.BatchNorm2d(512),nn.ReLU(),)self.final = nn.Sequential(nn.Conv2d(512, self.num_classes, kernel_size=3, padding=1))def forward(self, x):#调用VGG16的前13层 VGG13x = self.backbone(x)[-1]x = self.stage_1(x)x = nn.functional.interpolate(input=x,scale_factor=8,mode='bilinear')x = self.final(x)return x

参考:

DeepLabV1网络简析

论文阅读 || 语义分割系列 —— deeplabv1 详解

[语义分割] DeepLab v
1网络(语义分割、信号下采样、空间上的不敏感性、LargeFOV、膨胀卷积、空洞卷积、MSc、Multi-Scale)

第五章:DeepLabV1——深度卷积神经网络和全连接条件随机场的语义图像分割 

语义分割系列-4 DeepLabV1-V3+(pytorch实现)

相关文章:

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址:https://arxiv.org/abs/1412.7062 代码地址:GitHub - TheLegendAli/DeepLab-Context 1.是什么? DeepLab V1是一种基于VGG模型的语义分割模型,它使用了空洞卷积和全连接条件随机(CRF)来提高分割…...

java设计模式学习之【建造者模式】

文章目录 引言建造者模式简介定义与用途实现方式: 使用场景优势与劣势建造者模式在spring中的应用CD(光盘)的模拟示例UML 订单系统的模拟示例UML 代码地址 引言 建造者模式在创建复杂对象时展现出其强大的能力,特别是当这些对象需…...

Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽【RabbitMQ实战 一】

Spring Boot中的RabbitMQ死信队列魔法:从异常到延迟,一网打尽 前言第一:基础整合实现第二:处理消息消费异常第三:实现延迟消息处理第四:优雅的消息重试机制第五:异步处理超时消息第六&#xff1…...

nrm : 镜像源工具npm镜像切换

nrm命令 安装nrm&#xff1a;npm i -g nrm 查看镜像源&#xff1a;nrm ls&#xff0c;带*号的为当前使用的源 添加新镜像&#xff1a;nrm add [镜像源名称] <源的URL路径> 切换镜像源&#xff1a;nrm use [镜像源名称] 删除一个镜像源&#xff1a;nrm del [镜像源名称] …...

Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能

notepad 相信大家从学习这一行就开始用了&#xff0c;它是开发者/互联网行业的上班族使用率最高的一款轻量级文本编辑器。但是它只能在Windows上进行使用&#xff0c;而且正常来说是收费的&#xff08;虽然用的是pj的&#xff09;。 对于想在MacOS、Linux上想使用&#xff0c;…...

iOS 17.2:可以修改消息提示音了

时隔2周之后&#xff0c;苹果今日为开发者预览版用户推送了iOS 17.2 Beta4测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为590M左右&#xff0c;内部版本号为&#xff08;…...

PTA 一维数组7-3出生年(本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话)

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…...

【3】基于多设计模式下的同步异步日志系统-设计模式

详细介绍设计模式 单例模式 ⼀个类只能创建⼀个对象&#xff0c;即单例模式&#xff0c;该设计模式可以保证系统中该类只有⼀个实例&#xff0c;并提供⼀个访问它的全局访问点&#xff0c;该实例被所有程序模块共享。⽐如在某个服务器程序中&#xff0c;该服务器的配置信息存放…...

Metasploit的使用和配置

预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…...

测试用例的设计思路

接到提测单后要做的事情&#xff1a; 测试准备阶段 确认提测单内包含的文件、URL地址可以访问确认需求 (迭代目标、用户故事、用户愿望、问题反馈等)确认回归测试范围、更新测试范围、新增测试范围编写测试点思维导图&#xff0c;过程中有问题及时进行沟通与迭代相关人员约一个…...

HCIP——交换综合实验

一、实验拓扑图 二、实验需求 1、PC1和PC3所在接口为access&#xff0c;属于vlan2&#xff1b;PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC6 2、PC5不能访问PC6 3、PC1/3与PC2/4/5/6/不在同一网段 4、所有PC通…...

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…...

linux 路由表的优先级

[rootlocalhost cc]# ip rule list 0: from all lookup local 32765: from 10.0.19.24 lookup 4096 32766: from all lookup main 32767: from all lookup default 现在有 4 条路由规则&#xff0c;优先级是怎样的&#xff0c;0 代表最低优先级还是最高优先级 在 Linux 的 IP …...

毕业项目分享

大家好&#xff0c;今天给大家分享112个有趣的Python实战项目&#xff0c;可以直接拿来实战练习&#xff0c;涵盖机器学习、爬虫、数据分析、数据可视化、大数据等内容&#xff0c;建议关注、收藏。 项目名称 主要技术 2023招聘数据分析可视化系统爬虫 7种薪资预测模型 Flas…...

Android启动系列之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…...

tex中的边框

文章目录 利用tcolorbox宏包给公式加框 利用tcolorbox宏包 tcolorbox可以创建一个盒子的环境&#xff0c;例如&#xff1a; \documentclass{article} \usepackage{tcolorbox} \begin{document}\begin{tcolorbox}[left1cm, right1cm, top0.5cm, bottom0.5cm,colbackblue!10!wh…...

面试题库之JAVA基础篇(三)

final 被final修饰的类不可以被继承。被final修改的方法不可以被重写。被final修改的方法&#xff0c;jvm会尝试内联&#xff0c;以提高运行效率。被final修改的变量不可变&#xff0c;如果修改的是引用&#xff0c;那么引用不可变&#xff0c;引用指向的对象内容可变。被fin…...

CTF-虚拟机-QEMU-前置知识-操作流程与源码阅读

文章目录 总览内存PCI设备PCI配置空间前64个字节对应源码Memorry空间的BARIO空间的BAR MMIOPMIOIspci访问PCI设备配置空间中的Memory空间和IO空间MMIOPMIO QQM&#xff08;qemu object model&#xff09;简洁概要将 TypeInfo 注册 TypeImpl&#xff1a;ObjectClass的初始化&…...

java成神秘籍第一卷

前言 适合还没有入行小白学习&#xff0c;有些朋友会跑来问我这行的一些问题&#xff0c;下面算是详细系统的整理了一下啦。 全当是学习 复盘 整理 记录了 java成神秘籍第一卷 前言一 前提1 要不要考公&#xff0c;考编&#xff0c;考研2 语言选择3 就业岗位4 目标5 考不考虑…...

golang实现文件上传(高并发+分块+断点续传+加密)

运行视频 // todo 根据前端传递文件加密 func (s *FileProcess) FileProcessEncryptionByFront(file multipart.File, h *multipart.FileHeader) interface{} { //根据字节直接处理文件 这个是前端传递的二进制流s.FileProcessInit() //文件初始化 设置原来文件…...

用HeidiSQL在MySQL中新建用户

用HeidiSQL登录到MySQL数据库&#xff0c;注意登录的时候要使用有权限的用户&#xff1a; 选择工具-》用户管理&#xff1a; 点击左上角的“添加”&#xff1a; 输入用户名、密码&#xff0c;并且分配权限&#xff1a; 点击右边的“添加对象”&#xff1a; 可以根据自己…...

【IPv6】IPv6协议

一、IPv6数据报格式 这是与v4报头的对比 1.8bit的版本保留了&#xff0c;v4版本就是4&#xff0c;v6就是6。 2.v6去除了v4的首部长度字段&#xff0c;因为v6的首部长是固定的40字节。 3.服务类型&#xff08;Type of Service, ToS&#xff09;和通信类型&#xff08;Traffi…...

无需服务器,无需魔法,拥有一个微信机器人就是这么简单

前情提要 还没看过的朋友可以看一下上一篇文章《拥有一个微信机器人总共需要几步&#xff1f;》在这篇文章里&#xff0c;我们提到&#xff0c;创建微信机器人需要一个大前提--你得有一台服务器。现在&#xff0c;不再需要了&#xff01;没错&#xff0c;上一篇提到的Serverles…...

1、命名空间、C++的复合类型、缺省参数

命名空间 1、命名空间的定义 使用namespace定义&#xff0c;使用作用域限定符::访问 #include <iostream> namespace ICBC{int money 0;void save( int m){money m;} } int main( void ){ICBC::save( 100); std::cout << "工行卡余额&#xff1a;"…...

colab notebook导出为PDF

目录 方法一&#xff1a;使用浏览器打印功能 方法二&#xff1a;使用nbconvert转换 方法三&#xff1a;在线转换 方法一&#xff1a;使用浏览器打印功能 一般快捷键是CTRLP 然后改变目标打印机为另存为PDF 这样就可以将notebook保存为PDF了 方法二&#xff1a;使用nbconver…...

【Python动漫系列】名侦探柯南(完整代码)

文章目录 名侦探柯南环境需求完整代码程序分析系列文章名侦探柯南 《名侦探柯南》是由青山刚昌创作的一部侦探漫画,于1994年开始连载,并被改编为动画、电影、游戏等多种形式。故事讲述了高中生侦探工藤新一在破案时被不良组织所毒害,身体缩小成了一个小学生,为了寻找解药并…...

【matlab】QR分解

QR分解 给定一个mn的矩阵A&#xff0c;其中m≥n&#xff0c;即矩阵A是高矩阵或者是方阵&#xff0c;QR分解将矩阵A分解为两个矩阵Q和R的乘积&#xff0c;其中矩阵Q是一个mn的各列正交的矩阵&#xff0c;即QTQI&#xff0c;矩阵R是一个nn的上三角矩阵&#xff0c;其对角线元素为…...

Liunx系统使用超详细(三)

本篇内容开始逐渐描述有关liunx的各种命令的使用方法&#xff01; 目录 一、目录和文件区别 1.1目录&#xff1a; 1.2文件&#xff1a; 1.3总结&#xff1a; 二、Linux命令的写法 三、linux命令清屏 四、pwd命令 五、ls命令 5.1 ls&#xff1a; 5.2 ls -l&#xff1a…...

Kubernetes学习笔记-Part.06 Docker安装

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第六章 Docker安装 在master、worker、harbor上均需…...

现在的00后,实在是太卷了......

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…...

什么自己做网站吗/代做关键词收录排名

1、JSP页面 <a href"javascript:void();" id"PicName" > 选择图片</a> <input type"file" id"fileToUpload" name"fileToUpload" ><!--需要设置name属性值&#xff0c;不然上传不了 --> <butto…...

东莞网站域名注册/seo和sem是什么意思啊

cocos2d-x引擎在内部实现了一个庞大的主循环&#xff0c;每帧之间更新界面&#xff0c;如果耗时的操作放到了主线程中&#xff0c;游戏的界面就会卡&#xff0c;这是不能容忍的&#xff0c;游戏最基本的条件就是流畅性&#xff0c;这就是为什么游戏开发选择C的原因。另外现在双…...

全屋设计的软件/广州seo做得比较好的公司

Java虚拟机运行时数据区 对象的创建 Java创建对象&#xff0c;在语言层面上使用new关键字。虚拟机遇到new关键字时&#xff0c;会检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有…...

廊坊模板网站建设/百度竞价推广出价技巧

本系统为牛旦教育IT课堂在微头条上发布的内容&#xff0c;为便于查阅&#xff0c;特辑录于此&#xff0c;都是常用SQL基本用法。前两篇连接&#xff1a;(一)&#xff1a;SQL点滴(查询篇)&#xff1a;数据库基础查询案例实战(二)&#xff1a;SQL点滴(排序篇)&#xff1a;数据常规…...

wordpress广告插件中文/怎么查百度收录

【题目描述】给定一个二叉树和其中的一个结点&#xff0c;请找出中序遍历顺序的下一个结点并且返回。注意&#xff0c;树中的结点不仅包含左右子结点&#xff0c;同时包含指向父结点的指针。 【解题思路1】暴力解法 //1.若给定的节点pNode的右子树不为空&#xff0c;则中序遍历…...

深圳建网站的专业公司/活动推广宣传方案

PHP 5 及以上版本建议使用以下方式连接 MySQL :MySQLi &#xff1a;MySQLi 只针对 MySQL 数据库&#xff0c;MySQLi 还提供了 API 接口。PDO (PHP Data Objects)&#xff1a;PDO 应用在 12 种不同数据库中。共同点&#xff1a;1. 两者都是面向对象2. 两者都支持预处理语句。 预…...