有哪些做红色旅游景点的网站网站模板上传教程视频教程
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:54
当前位置: 首页 > news >正文
有哪些做红色旅游景点的网站,网站模板上传教程视频教程,深圳正规装修公司,wordpress加腾讯云cdn文章目录 昇思MindSpore应用实践基于MindSpore的FCN图像语义分割1、FCN 图像分割简介2、构建 FCN 模型3、数据预处理4、模型训练自定义评价指标 Metrics 5、模型推理结果 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 基于MindSpo… 文章目录 昇思MindSpore应用实践基于MindSpore的FCN图像语义分割1、FCN 图像分割简介2、构建 FCN 模型3、数据预处理4、模型训练自定义评价指标 Metrics 5、模型推理结果 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 基于MindSpore的FCN图像语义分割 1、FCN 图像分割简介 全卷积网络Fully Convolutional NetworksFCN是UC Berkeley的Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation[1]一文中提出的用于图像语义分割的一种框架。 FCN是首个端到端end to end进行像素级pixel level预测分类即语义分割的工作原理的全卷积网络。 语义分割Semantic Segmentation的定义每个像素对应一个类标签。同一类会被定义成一个区域块不区分其中单个物体。 •任务将图像中的每个像素分配到预定义的类别中从而实现对图像的像素级别理解和分类。 •特点不区分不同物体的实例只关注像素所属的语义类别例如人、车、树等。 •应用自动驾驶、医学图像分析、视频分析等领域。 输入一张图片经过前向传播和反向传播训练学习网络中的参数可以实现端到端地输出语义分割的推理结果像一个黑盒一样无需额外预处理。 2、构建 FCN 模型 FCN主要用于图像分割领域是一种端到端的分割方法是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因FCN丢弃全连接层替换为全卷积层网络所有层均为卷积层故称为全卷积网络。 全卷积神经网络主要使用以下三种技术 卷积化Convolutional 使用VGG-16作为FCN的骨干网络backbone。VGG-16的输入为224*224的RGB图像输出为1000个预测值。 VGG-16只能接受固定大小的输入丢弃了空间坐标产生非空间输出。VGG-16中共有三个全连接层全连接层也可视为带有覆盖整个区域的卷积。将全连接层转换为卷积层能使网络输出由一维非空间输出变为二维矩阵利用输出能生成输入图片映射的heatmap。 上采样Upsample 在卷积过程的卷积操作和池化操作会使得特征图的尺寸变小为得到原图的大小的稠密图像预测需要对得到的特征图进行上采样操作。使用双线性插值的参数来初始化上采样逆卷积的参数后通过反向传播来学习非线性上采样。在网络中执行上采样以通过像素损失的反向传播进行端到端的学习。 跳跃结构Skip Layer 利用上采样技巧对最后一层的特征图进行上采样得到原图大小的分割是步长为32像素的预测称之为FCN-32s。 由于最后一层的特征图太小损失过多细节采用skips结构将更具有全局信息的最后一层预测和更浅层的预测结合使预测结果获取更多的局部细节。将底层stride 32的预测FCN-32s进行2倍的上采样得到原尺寸的图像并与从pool4层stride 16进行的预测融合起来相加这一部分的网络被称为FCN-16s。随后将这一部分的预测再进行一次2倍的上采样并与从pool3层得到的预测融合起来这一部分的网络被称为FCN-8s。 Skips结构将深层的全局信息与浅层的局部信息相结合。 FCN 网络特点 不含全连接层(fc)的全卷积(fully conv)网络可适应任意尺寸输入。增大数据尺寸的反卷积(deconv)层能够输出精细的结果。结合不同深度层结果的跳跃连接(skip)结构同时确保鲁棒性和精确性。 基于MindSpore的FCN网络构建代码如下 import mindspore.nn as nnclass FCN8s(nn.Cell):def init(self, n_class):super().init()self.n_class n_class# conv1输入通道数输入图像通道数输出通道数为64卷积核为3*3默认滑动步长为1self.conv1 nn.SequentialCell( nn.Conv2d(in_channels3, out_channels64,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(64),nn.ReLU(),nn.Conv2d(in_channels64, out_channels64,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(64),nn.ReLU())# pool1采用最大池化池化不改变通道数卷积核为2*2滑动步长为2self.pool1 nn.MaxPool2d(kernel_size2, stride2)# conv2输入通道数为64输出通道数128卷积核3*3self.conv2 nn.SequentialCell(nn.Conv2d(in_channels64, out_channels128,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(128),nn.ReLU(),nn.Conv2d(in_channels128, out_channels128,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(128),nn.ReLU())# pool2采用最大池化池化不改变通道数卷积核为2*2滑动步长为2self.pool2 nn.MaxPool2d(kernel_size2, stride2)# conv3输入通道数为128输出通道数256卷积核3*3self.conv3 nn.SequentialCell(nn.Conv2d(in_channels128, out_channels256,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(in_channels256, out_channels256,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(in_channels256, out_channels256,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(256),nn.ReLU())# pool3采用最大池化池化不改变通道数卷积核为2*2滑动步长为2self.pool3 nn.MaxPool2d(kernel_size2, stride2)# conv4输入通道数为256输出通道数512卷积核3*3self.conv4 nn.SequentialCell(nn.Conv2d(in_channels256, out_channels512,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512, out_channels512,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512, out_channels512,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU())# pool4采用最大池化池化不改变通道数卷积核为2*2滑动步长为2self.pool4 nn.MaxPool2d(kernel_size2, stride2)# conv5输入通道数为512输出通道数1024卷积核3*3self.conv5 nn.SequentialCell(nn.Conv2d(in_channels512, out_channels512,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512, out_channels512,kernel_size3, weight_initxavier_uniform),nn.BatchNorm2d(512),nn.ReLU(),nn.Conv2d(in_channels512, out_channels512,kernel_size3, weight_initxavier_uniform),# pool5采用最大池化池化不改变通道数卷积核为2*2滑动步长为2self.pool5 nn.MaxPool2d(kernel_size2, stride2)# conv6输入通道数为512输出通道数4096卷积核为7*7self.conv6 nn.SequentialCell(nn.Conv2d(in_channels512, out_channels4096,kernel_size7, weight_initxavier_uniform),nn.BatchNorm2d(4096),nn.ReLU(),)# conv7输入通道数为4096输出通道数4096卷积核为1*1像素级self.conv7 nn.SequentialCell(nn.Conv2d(in_channels4096, out_channels4096,kernel_size1, weight_initxavier_uniform),nn.BatchNorm2d(4096),nn.ReLU(),)# 将特征图从较高的通道数4096通常接在一个CNN网络末端的特征维度减少到分类的类别数self.n_classself.score_fr nn.Conv2d(in_channels4096, out_channelsself.n_class,kernel_size1, weight_initxavier_uniform)# 转置卷积层反卷积将特征图的尺寸从较小的尺寸增加到较大的尺寸用来将特征图的尺寸上采样两倍stride2# 将低分辨率的输出映射回较高分辨率为最终恢复到原始输入图像的尺寸做准备self.upscore2 nn.Conv2dTranspose(in_channelsself.n_class, out_channelsself.n_class,kernel_size4, stride2, weight_initxavier_uniform)# 将通道数为512的特征图转换为类别数维度的输出self.score_pool4 nn.Conv2d(in_channels512, out_channelsself.n_class,kernel_size1, weight_initxavier_uniform)# 转置卷积层用于将通过score_pool4层处理后的特征图再次上采样两倍self.upscore_pool4 nn.Conv2dTranspose(in_channelsself.n_class, out_channelsself.n_class,kernel_size4, stride2, weight_initxavier_uniform)# 将通道数为256的特征图转换为类别数维度的输出self.score_pool3 nn.Conv2d(in_channels256, out_channelsself.n_class,kernel_size1, weight_initxavier_uniform)# 最后一个转置卷积层使用16x16的卷积核和8倍上采样将特征图从较低分辨率放大到与原始输入图像相同的尺寸self.upscore8 nn.Conv2dTranspose(in_channelsself.n_class, out_channelsself.n_class,kernel_size16, stride8, weight_initxavier_uniform)def construct(self, x):x1 self.conv1(x)p1 self.pool1(x1)x2 self.conv2(p1)p2 self.pool2(x2)x3 self.conv3(p2)p3 self.pool3(x3)x4 self.conv4(p3)p4 self.pool4(x4)x5 self.conv5(p4)p5 self.pool5(x5)x6 self.conv6(p5)x7 self.conv7(x6)sf self.score_fr(x7)u2 self.upscore2(sf)s4 self.score_pool4(p4)f4 s4 u2u4 self.upscore_pool4(f4)s3 self.score_pool3(p3)f3 s3 u4out self.upscore8(f3)return out 3、数据预处理 由于PASCAL VOC 2012数据集中图像的分辨率大多不一致无法放在一个tensor中故输入前需做标准化处理。 将PASCAL VOC 2012数据集与SDB数据集进行混合 import numpy as np import cv2 import mindspore.dataset as dsclass SegDataset:def init(self,image_mean,image_std,data_file,batch_size32,crop_size512,max_scale2.0,min_scale0.5,ignore_label255,num_classes21,num_readers2,num_parallel_calls4):self.data_file data_fileself.batch_size batch_sizeself.crop_size crop_sizeself.image_mean np.array(image_mean, dtypenp.float32)self.image_std np.array(image_std, dtypenp.float32)self.max_scale max_scaleself.min_scale min_scaleself.ignore_label ignore_labelself.num_classes num_classesself.num_readers num_readersself.num_parallel_calls num_parallel_callsmax_scale min_scaledef preprocess_dataset(self, image, label):image_out cv2.imdecode(np.frombuffer(image, dtypenp.uint8), cv2.IMREAD_COLOR)label_out cv2.imdecode(np.frombuffer(label, dtypenp.uint8), cv2.IMREAD_GRAYSCALE)sc np.random.uniform(self.min_scale, self.max_scale)new_h, new_w int(sc * image_out.shape[0]), int(sc * image_out.shape[1])image_out cv2.resize(image_out, (new_w, new_h), interpolationcv2.INTER_CUBIC)label_out cv2.resize(label_out, (new_w, new_h), interpolationcv2.INTER_NEAREST)image_out (image_out - self.image_mean) / self.image_stdout_h, out_w max(new_h, self.crop_size), max(new_w, self.crop_size)pad_h, pad_w out_h - new_h, out_w - new_wif pad_h 0 or pad_w 0:image_out cv2.copyMakeBorder(image_out, 0, pad_h, 0, pad_w, cv2.BORDER_CONSTANT, value0)label_out cv2.copyMakeBorder(label_out, 0, pad_h, 0, pad_w, cv2.BORDER_CONSTANT, valueself.ignore_label)offset_h np.random.randint(0, out_h - self.crop_size 1)offset_w np.random.randint(0, out_w - self.crop_size 1)image_out image_out[offset_h: offset_h self.crop_size, offset_w: offset_w self.crop_size, :]label_out label_out[offset_h: offset_h self.crop_size, offset_w: offset_wself.crop_size]if np.random.uniform(0.0, 1.0) 0.5:image_out image_out[:, ::-1, :]label_out label_out[:, ::-1]image_out image_out.transpose((2, 0, 1))image_out image_out.copy()label_out label_out.copy()label_out label_out.astype(int32)return image_out, label_outdef get_dataset(self):ds.config.set_numa_enable(True)dataset ds.MindDataset(self.data_file, columns_list[data, label],shuffleTrue, num_parallel_workersself.num_readers)transforms_list self.preprocess_datasetdataset dataset.map(operationstransforms_list, input_columns[data, label],output_columns[data, label],num_parallel_workersself.num_parallel_calls)dataset dataset.shuffle(buffer_sizeself.batch_size * 10)dataset dataset.batch(self.batch_size, drop_remainderTrue)return dataset# 定义创建数据集的参数 IMAGE_MEAN [103.53, 116.28, 123.675] IMAGE_STD [57.375, 57.120, 58.395] DATA_FILE dataset/dataset_fcn8s/mindname.mindrecord# 定义模型训练参数 train_batch_size 4 crop_size 512 min_scale 0.5 max_scale 2.0 ignore_label 255 num_classes 21# 实例化Dataset dataset 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 dataset.get_dataset()import numpy as np import matplotlib.pyplot as pltplt.figure(figsize(16, 8))# 对训练集中的数据进行展示 for i in range(1, 9):plt.subplot(2, 4, i)show_data next(dataset.create_dict_iterator())show_images show_data[data].asnumpy()show_images np.clip(show_images, 0, 1)
将图片转换HWC格式后进行展示plt.imshow(show_images[0].transpose(1, 2, 0))plt.axis(off)plt.subplots_adjust(wspace0.05, hspace0)
plt.show()4、模型训练 import mindspore from mindspore import Tensor import mindspore.nn as nn from mindspore.train import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor, Modeldevice_target GPU mindspore.set_context(modemindspore.PYNATIVE_MODE, device_targetdevice_target)train_batch_size 4 num_classes 21
初始化模型结构
net FCN8s(n_class21)
导入vgg16预训练参数
load_vgg16()
计算学习率
min_lr 0.0005 base_lr 0.05 train_epochs 1 iters_per_epoch dataset.get_dataset_size() total_step iters_per_epoch * train_epochslr_scheduler mindspore.nn.cosine_decay_lr(min_lr,base_lr,total_step,iters_per_epoch,decay_epoch2) lr Tensor(lr_scheduler[-1])# 定义损失函数
语义分割是对图像中每个像素点进行分类仍是分类问题故损失函数选择交叉熵损失函数来计算FCN网络输出与mask之间的交叉熵损失
mindspore中使用mindspore.nn.CrossEntropyLoss()作为交叉熵损失函数。loss nn.CrossEntropyLoss(ignore_index255)
定义优化器
optimizer nn.Momentum(paramsnet.trainable_params(), learning_ratelr, momentum0.9, weight_decay0.0001)
定义loss_scale
scale_factor 4 scale_window 3000 loss_scale_manager ms.amp.DynamicLossScaleManager(scale_factor, scale_window)
初始化模型
if device_target Ascend:model Model(net, loss_fnloss, optimizeroptimizer, loss_scale_managerloss_scale_manager, metrics{pixel accuracy: PixelAccuracy(), mean pixel accuracy: PixelAccuracyClass(), mean IoU: MeanIntersectionOverUnion(), frequency weighted IoU: FrequencyWeightedIntersectionOverUnion()}) else:model Model(net, loss_fnloss, optimizeroptimizer, metrics{pixel accuracy: PixelAccuracy(), mean pixel accuracy: PixelAccuracyClass(), mean IoU: MeanIntersectionOverUnion(), frequency weighted IoU: FrequencyWeightedIntersectionOverUnion()})# 设置ckpt文件保存的参数 time_callback TimeMonitor(data_sizeiters_per_epoch) loss_callback LossMonitor() callbacks [time_callback, loss_callback] save_steps 330 keep_checkpoint_max 5 config_ckpt CheckpointConfig(save_checkpoint_steps10,keep_checkpoint_maxkeep_checkpoint_max) ckpt_callback ModelCheckpoint(prefixFCN8s,directory./ckpt,configconfig_ckpt) callbacks.append(ckpt_callback) model.train(train_epochs, dataset, callbackscallbacks)IMAGE_MEAN [103.53, 116.28, 123.675] IMAGE_STD [57.375, 57.120, 58.395] DATA_FILE dataset/dataset_fcn8s/mindname.mindrecord# 下载已训练好的权重文件 url https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/FCN8s.ckpt download(url, FCN8s.ckpt, replaceTrue) net FCN8s(n_classnum_classes)ckpt_file FCN8s.ckpt param_dict load_checkpoint(ckpt_file) load_param_into_net(net, param_dict)if device_target Ascend:model Model(net, loss_fnloss, optimizeroptimizer, loss_scale_managerloss_scale_manager, metrics{pixel accuracy: PixelAccuracy(), mean pixel accuracy: PixelAccuracyClass(), mean IoU: MeanIntersectionOverUnion(), frequency weighted IoU: FrequencyWeightedIntersectionOverUnion()}) else:model Model(net, loss_fnloss, optimizeroptimizer, metrics{pixel accuracy: PixelAccuracy(), mean pixel accuracy: PixelAccuracyClass(), mean IoU: MeanIntersectionOverUnion(), frequency weighted IoU: FrequencyWeightedIntersectionOverUnion()})# 实例化Dataset dataset 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_eval dataset.get_dataset() model.eval(dataset_eval)从训练过程可以看出基于VGG作为Backbone的FCN网路运算量是比较大的仅1个epoch还未训练出良好的收敛状态 由于FCN网络在训练的过程中需要大量的训练数据和训练轮数这里只提供了小数据单个epoch的训练来演示loss收敛的过程下文中使用已训练好的权重文件进行模型评估和推理效果的展示。 自定义评价指标 Metrics 这一部分主要对训练出来的模型效果进行评估为了便于解释假设如下共有 k 1 k1 k1 个类从 L 0 L_0 L0 到 L k Lk Lk, 其中包含一个空类或背景 p i j p{i j} pij 表示本属于 i i i类但被预测为 j j j类的像素数量。即, p i i p{i i} pii 表示真正的数量, 而 p i j p j i p{i j} p{j i} pijpji 则分别被解释为假正和假负, 尽管两者都是假正与假负之和。 Pixel Accuracy(PA, 像素精度)这是最简单的度量为标记正确的像素占总像素的比例。 P A ∑ i 0 k p i i ∑ i 0 k ∑ j 0 k p i j P A\frac{\sum{i0}^k p{i i}}{\sum{i0}^k \sum{j0}^k p{i j}} PA∑i0k∑j0kpij∑i0kpii Mean Pixel Accuracy(MPA, 均像素精度)是PA的一种简单提升计算每个类内被正确分类像素数的比例之后求所有类的平均。 M P A 1 k 1 ∑ i 0 k p i i ∑ j 0 k p i j M P A\frac{1}{k1} \sum{i0}^k \frac{p{i i}}{\sum{j0}^k p{i j}} MPAk11i0∑k∑j0kpijpii Mean Intersection over Union(MloU, 均交并比)为语义分割的标准度量。其计算两个集合的交集和并集之在语义分割的问题中这两个集合为真实值ground truth) 和预测值predicted segmentation。这个比例可以变形为正真数 (intersection) 比上真正、假负、假正并集之和。在每个类上计算loU之后平均。 M I o U 1 k 1 ∑ i 0 k p i i ∑ j 0 k p i j ∑ j 0 k p j i − p i i M I o U\frac{1}{k1} \sum{i0}^k \frac{p{i i}}{\sum{j0}^k p{i j}\sum{j0}^k p{j i}-p{i i}} MIoUk11i0∑k∑j0kpij∑j0kpji−piipii Frequency Weighted Intersection over Union(FWIoU, 频权交井比)为MloU的一种提升这种方法根据每个类出现的频率为其设置权重。 F W I o U 1 ∑ i 0 k ∑ j 0 k p i j ∑ i 0 k p i i ∑ j 0 k p i j ∑ j 0 k p j i − p i i F W I o U\frac{1}{\sum{i0}^k \sum{j0}^k p{i j}} \sum{i0}^k \frac{p{i i}}{\sum{j0}^k p{i j}\sum{j0}^k p{j i}-p_{i i}} FWIoU∑i0k∑j0kpij1i0∑k∑j0kpij∑j0kpji−piipii import numpy as np import mindspore as ms import mindspore.nn as nn import mindspore.train as trainclass PixelAccuracy(train.Metric):def init(self, num_class21):super(PixelAccuracy, self).init()self.num_class num_classdef _generate_matrix(self, gt_image, pre_image):mask (gt_image 0) (gt_image self.num_class)label self.num_class * gt_image[mask].astype(int) pre_image[mask]count np.bincount(label, minlengthself.num_class2)confusion_matrix count.reshape(self.num_class, self.num_class)return confusion_matrixdef clear(self):self.confusion_matrix np.zeros((self.num_class,) * 2)def update(self, *inputs):y_pred inputs[0].asnumpy().argmax(axis1)y inputs[1].asnumpy().reshape(4, 512, 512)self.confusion_matrix self._generate_matrix(y, y_pred)def eval(self):pixel_accuracy np.diag(self.confusion_matrix).sum() / self.confusion_matrix.sum()return pixel_accuracyclass PixelAccuracyClass(train.Metric):def init(self, num_class21):super(PixelAccuracyClass, self).init()self.num_class num_classdef _generate_matrix(self, gt_image, pre_image):mask (gt_image 0) (gt_image self.num_class)label self.num_class * gt_image[mask].astype(int) pre_image[mask]count np.bincount(label, minlengthself.num_class2)confusion_matrix count.reshape(self.num_class, self.num_class)return confusion_matrixdef update(self, *inputs):y_pred inputs[0].asnumpy().argmax(axis1)y inputs[1].asnumpy().reshape(4, 512, 512)self.confusion_matrix self._generate_matrix(y, y_pred)def clear(self):self.confusion_matrix np.zeros((self.num_class,) * 2)def eval(self):mean_pixel_accuracy np.diag(self.confusion_matrix) / self.confusion_matrix.sum(axis1)mean_pixel_accuracy np.nanmean(mean_pixel_accuracy)return mean_pixel_accuracyclass MeanIntersectionOverUnion(train.Metric):def init(self, num_class21):super(MeanIntersectionOverUnion, self).init()self.num_class num_classdef _generate_matrix(self, gt_image, pre_image):mask (gt_image 0) (gt_image self.num_class)label self.num_class * gt_image[mask].astype(int) pre_image[mask]count np.bincount(label, minlengthself.num_class2)confusion_matrix count.reshape(self.num_class, self.num_class)return confusion_matrixdef update(self, *inputs):y_pred inputs[0].asnumpy().argmax(axis1)y inputs[1].asnumpy().reshape(4, 512, 512)self.confusion_matrix self._generate_matrix(y, y_pred)def clear(self):self.confusion_matrix np.zeros((self.num_class,) * 2)def eval(self):mean_iou np.diag(self.confusion_matrix) / (np.sum(self.confusion_matrix, axis1) np.sum(self.confusion_matrix, axis0) -np.diag(self.confusion_matrix))mean_iou np.nanmean(mean_iou)return mean_iouclass FrequencyWeightedIntersectionOverUnion(train.Metric):def init(self, num_class21):super(FrequencyWeightedIntersectionOverUnion, self).init()self.num_class num_classdef _generate_matrix(self, gt_image, pre_image):mask (gt_image 0) (gt_image self.num_class)label self.num_class * gt_image[mask].astype(int) pre_image[mask]count np.bincount(label, minlengthself.num_class2)confusion_matrix count.reshape(self.num_class, self.num_class)return confusion_matrixdef update(self, *inputs):y_pred inputs[0].asnumpy().argmax(axis1)y inputs[1].asnumpy().reshape(4, 512, 512)self.confusion_matrix self._generate_matrix(y, y_pred)def clear(self):self.confusion_matrix np.zeros((self.num_class,) * 2)def eval(self):freq np.sum(self.confusion_matrix, axis1) / np.sum(self.confusion_matrix)iu np.diag(self.confusion_matrix) / (np.sum(self.confusion_matrix, axis1) np.sum(self.confusion_matrix, axis0) -np.diag(self.confusion_matrix))frequency_weighted_iou (freq[freq 0] * iu[freq 0]).sum()return frequency_weighted_iou5、模型推理结果 import cv2 import matplotlib.pyplot as pltnet FCN8s(n_classnum_classes)
设置超参
ckpt_file FCN8s.ckpt param_dict load_checkpoint(ckpt_file) load_param_into_net(net, param_dict) eval_batch_size 4 img_lst [] mask_lst [] res_lst []
推理效果展示(上方为输入图片下方为推理效果图片)
plt.figure(figsize(8, 5)) show_data next(dataset_eval.create_dict_iterator()) show_images show_data[data].asnumpy() # 原始图像 mask_images show_data[label].reshape([4, 512, 512]) # 语义分割的掩码图像 show_images np.clip(show_images, 0, 1) # 限制show_images数组中的像素值在归一化后的0和1之间 for i in range(eval_batch_size):img_lst.append(show_images[i])mask_lst.append(mask_images[i]) res net(show_data[data]).asnumpy().argmax(axis1) for i in range(eval_batch_size):plt.subplot(2, 4, i 1)plt.imshow(img_lst[i].transpose(1, 2, 0))plt.axis(off)plt.subplots_adjust(wspace0.05, hspace0.02)plt.subplot(2, 4, i 5)plt.imshow(res[i])plt.axis(off)plt.subplots_adjust(wspace0.05, hspace0.02) plt.show()在推理时训练好的FCN对输入图像进行前向传播图像经过FCN网络中的多层卷积、激活和池化后通过上采样层恢复到原始尺寸每个像素的输出通常经过 softmax 函数转换成为概率表明每个像素属于各个类别的概率。选择概率最高的类别作为该像素的类别标签每个像素对应一个类标签。同一类会被定义成一个区域块从而实现整个图像的语义分割。 因此FCN通过这种结构能够有效地在像素级别上对图像进行分类实现精确的语义分割。 Reference [1] Long, Jonathan, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for Semantic Segmentation.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015. [2] 昇思大模型平台 [3] 昇思官方文档-FCN图像语义分割 [4] 图像分割概述 - 语义分割、实例分割、全景分割、一键抠图FCN, U-Net,Mask R-CNN,UPSNet
相关文章
-
有哪些做国际贸易的网站网站后台ftp在哪
有哪些做国际贸易的网站网站后台ftp在哪
- 技术栈
- 2026年03月21日
-
有哪些做封面的网站如何做贴吧类网站多钱
有哪些做封面的网站如何做贴吧类网站多钱
- 技术栈
- 2026年03月21日
-
有哪些做ppt用图片的网站有哪些问题三五互联做网站吗
有哪些做ppt用图片的网站有哪些问题三五互联做网站吗
- 技术栈
- 2026年03月21日
-
有哪些做婚礼平面设计的网站有哪些阿里巴巴国际站可以做网站吗
有哪些做婚礼平面设计的网站有哪些阿里巴巴国际站可以做网站吗
- 技术栈
- 2026年03月21日
-
有哪些做家教网站修水新闻最新消息
有哪些做家教网站修水新闻最新消息
- 技术栈
- 2026年03月21日
-
有哪些做汽车变速箱的门户网站电子商务网站建设实验心得
有哪些做汽车变速箱的门户网站电子商务网站建设实验心得
- 技术栈
- 2026年03月21日
