96SEO 2026-02-19 17:47 12
segmentation是图像处理和机器视觉技术中关于图像理解的重要一环AI领域中一个重要分支常被应用于人脸识别、物体检测、医学影像、卫星图像分析、自动驾驶感知等领域。

要识别出整张图片的每个部分就意味着要精确到像素点所以语义分割实际上是对图像中每一个像素点进行分类确定每个点的类别如属于背景、人、汽车、马等从而进行区域划分。
与普通的分类任务只输出某个类别不同语义分割任务输出与输入大小相同的图像输出图像的每个像素对应了输入图像每个像素的类别。
语义在图像领域指的是图像的内容对图片意思的理解下图是一些语义分割的实例
Segmentation[1]一文中提出的用于图像语义分割的一种框架。
2.增大数据尺寸的反卷积(deconv)层。
能够输出精细的结果。
3.结合不同深度层结果的跳级(skip)结构。
同时确保鲁棒性和精确性。
FCN主要用于图像分割领域是一种端到端的分割方法是深度学习应用在图像语义分割的开山之作。
通过进行像素级的预测直接得出与原图大小相等的label
map。
因FCN丢弃全连接层替换为全卷积层网络所有层均为卷积层故称为全卷积网络。
使用VGG-16作为FCN的backbone。
VGG-16的输入为224*224的RGB图像输出为1000个预测值。
VGG-16只能接受固定大小的输入丢弃了空间坐标产生非空间输出。
VGG-16中共有三个全连接层全连接层也可视为带有覆盖整个区域的卷积。
将全连接层转换为卷积层能使网络输出由一维非空间输出变为二维矩阵利用输出能生成输入图片映射的heatmap。
64使用64个size是3*3stride步长为1padding填充为1的卷积核。
池化最大池化使用size是2*2stride步长为2padding填充为0进行池化。
第6层和第7层分别是一个长度为4096的一维向量第8层是长度为1000的一维向量分别对应1000个类别的概率。
FCN将这3层表示为卷积层卷积核的大小(通道数宽高)分别为4096,7,7、4096,1,1、1000,1,1。
所有的层都是卷积层故称为全卷积网络。
在卷积过程的卷积操作和池化操作会使得特征图的尺寸变小为得到原图的大小的稠密图像预测需要对得到的特征图进行上采样操作。
使用双线性插值的参数来初始化上采样逆卷积的参数后通过反向传播来学习非线性上采样。
在网络中执行上采样以通过像素损失的反向传播进行端到端的学习。
利用上采样技巧对最后一层的特征图进行上采样得到原图大小的分割是步长为32像素的预测称之为FCN-32s。
由于最后一层的特征图太小损失过多细节采用skips结构将更具有全局信息的最后一层预测和更浅层的预测结合使预测结果获取更多的局部细节。
将底层stride
32的预测FCN-32s进行2倍的上采样得到原尺寸的图像并与从pool4层stride
16进行的预测融合起来相加这一部分的网络被称为FCN-16s。
随后将这一部分的预测再进行一次2倍的上采样并与从pool3层得到的预测融合起来这一部分的网络被称为FCN-8s。
2012数据集中图像的分辨率大多不一致无法放在一个tensor中故输入前需做标准化处理。
https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/dataset_fcn8s.tardownload(url,
#图像的均值用于图像标准化。
通常是一个列表或数组包含每个通道的均值值。
image_std,#图像的标准差也用于图像标准化。
通常是一个列表或数组包含每个通道的标准差值。
data_file,#数据文件的路径。
这个参数默认是一个空字符串表示可能的默认值或未提供文件路径。
batch_size32,#批处理大小表示一次训练中使用的样本数量。
32是一个常见的默认值。
crop_size512,#裁剪大小表示图像在训练或测试时裁剪的尺寸。
512通常用于高分辨率图像。
max_scale2.0,#最大缩放比例用于数据增强通过随机缩放图像来增加模型的鲁棒性。
min_scale0.5,#最小缩放比例同样用于数据增强。
ignore_label255,#忽略标签通常用于语义分割任务表示某些像素点不参与训练的标签值。
num_classes21,#类别数量表示数据集中不同类别的数量。
21个类别可能用于某个特定的数据集比如Pascal
VOC。
num_readers2,#读取器数量表示用于读取数据文件的并行读取器数量可以加快数据加载速度。
num_parallel_calls4):#并行调用数量用于数据预处理的并行调用次数可以加快数据预处理过程。
self.data_file
num_readersself.num_parallel_calls
dtypenp.uint8)将原始字节数据转换为NumPy数组以便OpenCV可以处理。
#
cv2.IMREAD_COLOR)使用OpenCV解码这个NumPy数组并将其转换为一个图像矩阵以便后续的图像处理操作。
image_out
cv2.imdecode(np.frombuffer(image,
cv2.imdecode(np.frombuffer(label,
cv2.IMREAD_GRAYSCALE)#生成一个在self.min_scale和self.max_scale之间的随机浮点数。
sc
np.random.uniform(self.min_scale,
高并使用(nterpolationcv2.INTER_CUBIC)双三次插值方法进行插值。
image_out
interpolationcv2.INTER_CUBIC)label_out
interpolationcv2.INTER_NEAREST)image_out
cv2.copyMakeBorder这是OpenCV中的一个函数用于为图像添加边框。
image_out这是要添加边框的输入图像矩阵。
#
valueself.ignore_label)offset_h
get_dataset(self):ds.config.set_numa_enable(True)dataset
num_parallel_workersself.num_readers)transforms_list
dataset.map(operationstransforms_list,
label],num_parallel_workersself.num_parallel_calls)dataset
dataset.shuffle(buffer_sizeself.batch_size
dataset/dataset_fcn8s/mindname.mindrecord#
SegDataset(image_meanIMAGE_MEAN,image_stdIMAGE_STD,data_fileDATA_FILE,batch_sizetrain_batch_size,crop_sizecrop_size,max_scalemax_scale,min_scalemin_scale,ignore_labelignore_label,num_classesnum_classes,num_readers2,num_parallel_calls4)dataset
next(dataset.create_dict_iterator())show_images
show_data[data].asnumpy()show_images
将图片转换HWC格式后进行展示plt.imshow(show_images[0].transpose(1,
0))plt.axis(off)plt.subplots_adjust(wspace0.05,
输入图像image经过pool1池化后尺寸变为原始尺寸的1/2。
经过pool2池化尺寸变为原始尺寸的1/4。
接着经过pool3、pool4、pool5池化大小分别变为原始尺寸的1/8、1/16、1/32。
经过conv6-7卷积输出的尺寸依然是原图的1/32。
FCN-32s是最后使用反卷积使得输出图像大小与输入图像相同。
FCN-16s是将conv7的输出进行反卷积使其尺寸扩大两倍至原图的1/16并将其与pool4输出的特征图进行融合后通过反卷积扩大到原始尺寸。
FCN-8s是将conv7的输出进行反卷积扩大4倍将pool4输出的特征图反卷积扩大2倍并将pool3输出特征图拿出三者融合后通反卷积扩大到原始尺寸。
n_class):super().__init__()self.n_class
nn.SequentialCell(nn.Conv2d(in_channels3,
weight_initxavier_uniform),nn.BatchNorm2d(64),nn.ReLU(),nn.Conv2d(in_channels64,
weight_initxavier_uniform),nn.BatchNorm2d(64),nn.ReLU())self.pool1
nn.SequentialCell(nn.Conv2d(in_channels64,
weight_initxavier_uniform),nn.BatchNorm2d(128),nn.ReLU(),nn.Conv2d(in_channels128,
weight_initxavier_uniform),nn.BatchNorm2d(128),nn.ReLU())self.pool2
nn.SequentialCell(nn.Conv2d(in_channels128,
weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(in_channels256,
weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(in_channels256,
weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU())self.pool3
nn.SequentialCell(nn.Conv2d(in_channels256,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU())self.pool4
nn.SequentialCell(nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU())self.pool5
nn.SequentialCell(nn.Conv2d(in_channels512,
weight_initxavier_uniform),nn.BatchNorm2d(4096),nn.ReLU(),)self.conv7
nn.SequentialCell(nn.Conv2d(in_channels4096,
weight_initxavier_uniform),nn.BatchNorm2d(4096),nn.ReLU(),)self.score_fr
out_channelsself.n_class,kernel_size1,
weight_initxavier_uniform)self.upscore2
nn.Conv2dTranspose(in_channelsself.n_class,
out_channelsself.n_class,kernel_size4,
weight_initxavier_uniform)self.score_pool4
out_channelsself.n_class,kernel_size1,
weight_initxavier_uniform)self.upscore_pool4
nn.Conv2dTranspose(in_channelsself.n_class,
out_channelsself.n_class,kernel_size4,
weight_initxavier_uniform)self.score_pool3
out_channelsself.n_class,kernel_size1,
weight_initxavier_uniform)self.upscore8
nn.Conv2dTranspose(in_channelsself.n_class,
out_channelsself.n_class,kernel_size16,
导入VGG-6部分预训练权重使用下面代码导入VGG-16预训练模型的部分预训练权重。
https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/fcn8s_vgg16_pretrain.ckpt
fcn8s_vgg16_pretrain.ckptparam_vgg
load_checkpoint(ckpt_vgg16)load_param_into_net(net,
语义分割是对图像中每个像素点进行分类仍是分类问题故损失函数选择交叉熵损失函数来计算FCN网络输出与mask之间的交叉熵损失。
这里我们使用的是mindspore.nn.CrossEntropyLoss()作为损失函数。
这一部分主要对训练出来的模型效果进行评估为了便于解释假设如下共有
均像素精度)是PA的一种简单提升计算每个类内被正确分类像素数的比例之后求所有类的平均。
均交并比)为语义分割的标准度量。
其计算两个集合的交集和并集之在语义分割的问题中这两个集合为真实值ground
频权交井比)为MloU的一种提升这种方法根据每个类出现的频率为其设置权重。
PixelAccuracy(train.Metric):def
初始化方法设置类别数并调用父类的初始化方法super(PixelAccuracy,
将混淆矩阵重置为全零矩阵self.confusion_matrix
inputs[0].asnumpy().argmax(axis1)#
np.diag(self.confusion_matrix).sum()
self.confusion_matrix.sum()return
PixelAccuracyClass(train.Metric):def
num_class21):super(PixelAccuracyClass,
minlengthself.num_class**2)confusion_matrix
inputs[0].asnumpy().argmax(axis1)y
clear(self):self.confusion_matrix
self.confusion_matrix.sum(axis1)mean_pixel_accuracy
np.nanmean(mean_pixel_accuracy)return
MeanIntersectionOverUnion(train.Metric):def
num_class21):super(MeanIntersectionOverUnion,
minlengthself.num_class**2)confusion_matrix
inputs[0].asnumpy().argmax(axis1)y
clear(self):self.confusion_matrix
-np.diag(self.confusion_matrix))mean_iou
FrequencyWeightedIntersectionOverUnion(train.Metric):def
num_class21):super(FrequencyWeightedIntersectionOverUnion,
minlengthself.num_class**2)confusion_matrix
inputs[0].asnumpy().argmax(axis1)y
clear(self):self.confusion_matrix
np.sum(self.confusion_matrix)iu
-np.diag(self.confusion_matrix))frequency_weighted_iou
导入VGG-16预训练参数后实例化损失函数、优化器使用Model接口编译网络训练FCN-8s网络。
mindspore.set_context(modemindspore.PYNATIVE_MODE,
device_targetdevice_target)train_batch_size
mindspore.nn.cosine_decay_lr(min_lr,
nn.CrossEntropyLoss(ignore_index255)
nn.Momentum(paramsnet.trainable_params(),
ms.amp.DynamicLossScaleManager(scale_factor,
loss_scale_managerloss_scale_manager,
FrequencyWeightedIntersectionOverUnion()})
FrequencyWeightedIntersectionOverUnion()})#
TimeMonitor(data_sizeiters_per_epoch)
CheckpointConfig(save_checkpoint_steps10,keep_checkpoint_maxkeep_checkpoint_max)
ModelCheckpoint(prefixFCN8s,directory./ckpt,configconfig_ckpt)
callbacks.append(ckpt_callback)
FCN网络在训练的过程中需要大量的训练数据和训练轮数这里只提供了小数据单个epoch的训练来演示loss收敛的过程下文中使用已训练好的权重文件进行模型评估和推理效果的展示。
dataset/dataset_fcn8s/mindname.mindrecord#
https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/FCN8s.ckpt
FCN8s(n_classnum_classes)ckpt_file
loss_scale_managerloss_scale_manager,
FrequencyWeightedIntersectionOverUnion()})
FrequencyWeightedIntersectionOverUnion()})#
SegDataset(image_meanIMAGE_MEAN,image_stdIMAGE_STD,data_fileDATA_FILE,batch_sizetrain_batch_size,crop_sizecrop_size,max_scalemax_scale,min_scalemin_scale,ignore_labelignore_label,num_classesnum_classes,num_readers2,num_parallel_calls4)
next(dataset_eval.create_dict_iterator())
range(eval_batch_size):img_lst.append(show_images[i])mask_lst.append(mask_images[i])
net(show_data[data]).asnumpy().argmax(axis1)
range(eval_batch_size):plt.subplot(2,
1)plt.imshow(img_lst[i].transpose(1,
0))plt.axis(off)plt.subplots_adjust(wspace0.05,
5)plt.imshow(res[i])plt.axis(off)plt.subplots_adjust(wspace0.05,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback