0
点赞
收藏
分享

微信扫一扫

Intel One API黑客松比赛 ———Unet尝试图像分割

感谢Intel提供这一次机会,我能够很幸运的参与进来,并且提高自己的编程技术。


在这次比赛的题目是:

预期解决方案::
1. 使用
英特尔® AI 分析工具套件中的适当组件开发一个深度学习模型,用于准确、快速检测并对道路上的对象进行分割。:
2. 使用包括挑战赛指定的真实场景(如各种天气条件、光线条件和道路环境)的数据集测试模型。:
3. 尝试进行模型优化,以实现低延迟,以支持自动驾驶车辆进行实时对象检测。:
4. 鼓励参赛团队使用英特尔CPU或英特尔GPU完成项目。


下面我介绍一下我的工作内容。

一. 模型介绍

Unet是一种用于图像分割的卷积神经网络,它在医学图像分割领域得到了广泛的应用。


Unet的网络结构由对称的编码器和解码器组成,其中编码器通过卷积和池化操作逐渐降低特征图的分辨率,提取图像的高层次特征;解码器则通过上采样和卷积操作逐渐恢复特征图的分辨率,并将编码器提取的特征与解码器的输出进行拼接,从而生成最终的分割结果。Unet还引入了跳跃连接(skip connection)机制,使得解码器能够直接利用编码器中的低层次特征,从而提高分割效果。


以下是使用Pytorch实现Unet的示例代码:

import torch

import torch.nn as nn


class DoubleConv(nn.Module):

    def __init__(self, in_channels, out_channels):

        super().__init__()

        self.conv = nn.Sequential(

            nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),

            nn.BatchNorm2d(out_channels),

            nn.ReLU(inplace=True),

            nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1),

            nn.BatchNorm2d(out_channels),

            nn.ReLU(inplace=True)

        )


    def forward(self, x):

        return self.conv(x)


class Unet(nn.Module):

    def __init__(self, in_channels=3, out_channels=1, features=[64, 128, 256, 512]):

        super().__init__()

        self.ups = nn.ModuleList()

        self.downs = nn.ModuleList()

        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)


        # 编码器

        for feature in features:

            self.downs.append(DoubleConv(in_channels, feature))

            in_channels = feature

        # 解码器

        for feature in reversed(features):

            self.ups.append(nn.ConvTranspose2d(feature*2, feature, kernel_size=2, stride=2))

            self.ups.append(DoubleConv(feature*2, feature))


        self.bottleneck = DoubleConv(features[-1], features[-1]*2)

        self.final_conv = nn.Conv2d(features[0], out_channels, kernel_size=1)


    def forward(self, x):

        skip_connections = []

        for down in self.downs:

            x = down(x)

            skip_connections.append(x)

            x = self.pool(x)


        x = self.bottleneck(x)

        skip_connections = skip_connections[::-1]


        for idx in range(0, len(self.ups), 2):

            x = self.ups[idx](x)

            skip_connection = skip_connections[idx//2]

            if x.shape != skip_connection.shape:

                x = nn.functional.interpolate(x, size=skip_connection.shape[2:], mode='bilinear', align_corners=True)

            concat_skip = torch.cat((skip_connection, x), dim=1)

            x = self.ups[idx+1](concat_skip)


        return self.final_conv(x)


二. 数据集介绍

Cityscapes数据集是一个用于场景理解的开放式数据集,其中包含来自德国50个城市的精细注释图像。该数据集包含大量的高分辨率图像,以及像汽车、行人、建筑物等多种对象。


三. 我的创新之处。

引入跳跃连接机制:Unet引入了跳跃连接(skip connection)机制,使得解码器能够直接利用编码器中的低层次特征,从而提高分割效果。

使用更多的数据增强方法:在cityscapes数据集上进行图像分割任务时,Unet使用了更多的数据增强方法,如随机水平翻转、随机缩放、随机裁剪等,从而提高了模型的泛化能力。

使用更多的特征通道数:Unet在cityscapes数据集上使用了更多的特征通道数,从而增加了模型的表达能力。

使用更深的网络结构:Unet在cityscapes数据集上使用了更深的网络结构,从而增加了模型的容量和表达能力。

在模型训练方面,使用了数据增强技术,如随机裁剪、旋转和翻转等。同时,采用了交叉熵损失函数和随机梯度下降优化器进行模型训练。


模型分割效果良好,在正常光照条件下测试如下:

Intel One API黑客松比赛 ———Unet尝试图像分割_2d


四.英特尔架构使用。

我在本次比赛中,第一次学会使用了Intel的ai 套件结构分析,对于模型的训练加速起到了很大的帮助。


总的来说,Unet是一种高效准确的图像分割模型,它在Cityscapes数据集上表现出色。再一次感谢Intel主办方提供的这一次机会,我学到了很多,我也学会了很多。


举报

相关推荐

0 条评论