unet详解_Unity3D 网络组件UNet详解

前段时间,研究了一下UNet,经过项目实践,大致整理了下遇到的问题。

UNet常见概念简介

Spawn:简单来说,把服务器上的GameObject,根据上面的NetworkIdentity组件找到对应监视连接,在监视连接里生成相应的GameObject.

Command:客户端调用,服务器执行,这样客户端调用的参数必需要UNet可以序列化,这样服务器在执行时才能把参数反序列化。需要注意,在客户端需要有权限的NetworkIdentity组件才能调用Command命令。

ClientRpc:服务端调用,客户端执行,同上,服务端的参数序列化到客户端执行,一般来说,服务端会找到上面的NetworkIdentity组件,确定那些客户端在监视这个NetworkIdentity,Rpc命令会发送给所有的监视客户端。

Server/ServerCallback:只在服务器端运行,Callback是Unity内部函数。

Client/ClientCallback:同上,只在客户端运行,Callback是Unity内部函数。

SyncVar:服务器的值能自动同步到客户端,保持客户端的值与服务器一样。客户端值改变并不会影响服务器的值。

上面的大部分特性都会转化成相应的MsgType,其中服务器调用,客户端执行对应MsgType有如Spawn,ClientRpc,SyncVar对应的MsgType分别为ObjectSpawn,Rpc,UpdateVars,这些都是NetworkServer调用,客户端得到相应消息,执行相应方法。客户端调用,服务器执行的MsgType有如Command,客户端发送,服务器检测到相应消息后执行。

UNet主要类介绍

NetworkIdentity组件介绍:网络物体最基本的组件,客户端与服务器确认是否是一个物体(netID),也用来表示各个状态,如是否是服务器,是否是客户端,是否有权限,是否是本地玩家等。一个简单例子,A是Host(又是服务器,又是客户端),B是一个Client,A与B分别有一个玩家PlayA与PlayB.在机器A上,playA与playB isServer为true,isClent为true,其中playA有权限,是本地玩家,B没权限,也不是本地玩家。在机器B上,playA与playB isServer为false,isClent为true,其中playB有权限,是本地玩家,A没权限,也不是本地玩家。A与B上的PlayA的netID相同,A与B上的PlayB的netID也相同,其中netID用来表示他们是同一网络物体在不同的机器上。

在下面用网络物体来表示带有NetworkIdentity组件的GameObject.

N

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNet是一种用于图像分割的卷积神经网络结构,由Ronneberger等人于2015年提出,主要用于医学图像处理中的分割任务。它的结构类似于自编码器,但是在编码器和解码器之间添加了跨层连接,使得网络可以更好地捕捉图像的上下文信息。下面我将为您详细介绍UNet的结构和Python实现。 ## UNet结构 UNet的结构如下图所示: ![unet_architecture](https://cdn.jsdelivr.net/gh/tsy19900929/blog-pic/pic/unet_architecture.png) 可以看到,UNet的结构包括编码器和解码器两部分。 编码器由多个卷积层和池化层组成,用于提取图像的特征信息。每个卷积层都包含一个卷积核和一个激活函数,用于学习特征映射。每个池化层则用于减小特征图的大小,同时增加特征的感受野,以便更好地捕捉图像的上下文信息。 解码器由多个反卷积层和跨层连接组成,用于将编码器学习到的特征信息转化为像素级别的预测结果。每个反卷积层用于将特征图的大小恢复到原始图像的大小,同时保留特征信息。跨层连接则将编码器中相应层的特征图与解码器中相应层的特征图进行连接,以便恢复更细节的信息。最后一层使用sigmoid激活函数将输出转化为0到1之间的概率值,表示每个像素属于前景或背景的概率。 ## Python实现 下面我们使用Python和Keras来实现一个简单的UNet模型。首先需要导入相关的库: ```python from keras.models import Model from keras.layers import Input, concatenate, Conv2D, MaxPooling2D, Conv2DTranspose from keras.optimizers import Adam ``` 接着我们定义编码器和解码器中使用的卷积和反卷积层: ```python def conv2d_block(inputs, filters, kernel_size=(3, 3), activation='relu', padding='same', kernel_initializer='he_normal'): conv = Conv2D(filters, kernel_size, activation=activation, padding=padding, kernel_initializer=kernel_initializer)(inputs) conv = Conv2D(filters, kernel_size, activation=activation, padding=padding, kernel_initializer=kernel_initializer)(conv) return conv def deconv2d_block(inputs, skip_features, filters, kernel_size=(3, 3), activation='relu', padding='same', kernel_initializer='he_normal'): deconv = Conv2DTranspose(filters, kernel_size, strides=(2, 2), padding=padding, kernel_initializer=kernel_initializer)(inputs) deconv = concatenate([deconv, skip_features]) deconv = conv2d_block(deconv, filters, kernel_size=kernel_size, activation=activation, padding=padding, kernel_initializer=kernel_initializer) return deconv ``` 然后我们定义UNet模型: ```python def unet(input_shape=(256, 256, 3), num_classes=1, activation='sigmoid', filters=64, kernel_size=(3, 3), pool_size=(2, 2), kernel_initializer='he_normal'): inputs = Input(input_shape) skip_features = [] # Encoder for filter_num in [filters * (2 ** i) for i in range(4)]: conv = conv2d_block(inputs, filter_num, kernel_size=kernel_size, activation=activation, padding='same', kernel_initializer=kernel_initializer) skip_features.append(conv) pool = MaxPooling2D(pool_size=pool_size)(conv) inputs = pool # Bottleneck bottleneck = conv2d_block(inputs, filters * 16, kernel_size=kernel_size, activation=activation, padding='same', kernel_initializer=kernel_initializer) # Decoder for i, filter_num in enumerate(reversed([filters * (2 ** i) for i in range(4)])): if i == 0: deconv = deconv2d_block(bottleneck, skip_features[-1], filter_num, kernel_size=kernel_size, activation=activation, padding='same', kernel_initializer=kernel_initializer) else: deconv = deconv2d_block(deconv, skip_features[-i-1], filter_num, kernel_size=kernel_size, activation=activation, padding='same', kernel_initializer=kernel_initializer) outputs = Conv2D(num_classes, (1, 1), activation=activation)(deconv) model = Model(inputs=[inputs], outputs=[outputs]) return model ``` 在这个模型中,我们首先定义了编码器和解码器中使用的卷积和反卷积层。然后我们定义了UNet模型,包括输入层、编码器、解码器和输出层。其中编码器和解码器使用了上面定义的卷积和反卷积层。 最后我们使用Adam优化器和二分类交叉熵损失函数来编译模型: ```python model = unet() model.compile(optimizer=Adam(lr=1e-4), loss='binary_crossentropy', metrics=['accuracy']) ``` 这样我们就完成了一个简单的UNet模型的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值