首页 > 其他分享 >图像扩展模型!站在巨人的肩膀上

图像扩展模型!站在巨人的肩膀上

时间:2023-11-20 16:07:08浏览次数:31  
标签:巨人 target self 图像 肩膀 os 模型 dir

一.模型介绍

图像扩展是突破了模型界限,极大地促进了计算机视觉基础模型的发展。

图像扩展是一个提示型模型,其在1100万张图像上训练了超过10亿个掩码,实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻,因为 图像扩展已经学会了物体是什么的一般概念,甚至是未知的物体、不熟悉的场景(如水下、细胞显微镜)和模糊的情况」,并展示了作为 CV 基本模型的巨大潜力。

图像扩展模型概览

2023年4月6号,Meta AI公开了Segment Anything Model(图像扩展),使用了有史以来最大的分割数据集Segment Anything 1-Billion mask dataset(SA-1B),其内包含了1100万张图像,总计超过10亿张掩码图,模型在训练时被设计为交互性的可提示模型,因此可以通过零样本学习转移到新的图像分布和任务中。在其中他们提出一个用于图像分割的基础模型,名为图像扩展。该模型被发现在NLP和CV领域中表现出较强的性能,研究人员试图建立一个类似的模型来统一整个图像分割任务。

图像扩展架构主要包含三个部分:图像编码器;提示编码器;以及掩码解码器。

Meta AI提出一个大规模多样化的图像分割数据集:SA-1B(包含1100万张图片以及10亿个Mask图)

在这项工作中,图像扩展的目标是建立一个图像分割的基础模型(Foundation Models)。其目标是在给定任何分割提示下返回一个有效的分割掩码,并在一个大规模且支持强大泛化能力的数据集上对其进行预训练,然后用提示工程解决一系列新的数据分布上的下游分割问题。

项目关键的三部分包括组件:任务、模型、数据。

任务:在NLP和CV中,基础模型是一个很有前途的发展,受到启发,研究者提出了提示分割任务,其目标是在给定任何分割提示下返回一个有效的分割掩码。


二.模型架构

图像扩展模型!站在巨人的肩膀上_数据集

三.我的工作

1. 准备数据集:为了微调图像扩展模型,我需要准备一个包含标注数据的数据集。


2. def __init__(self, root, split='train', mode='fine', target_type='semantic', transform=None):

        self.root = os.path.expanduser(root)

        self.mode = 'gtFine'

        self.target_type = target_type

        self.images_dir = os.path.join(self.root, 'leftImg8bit', split)


        self.targets_dir = os.path.join(self.root, self.mode, split)

        self.transform = transform


        self.split = split

        self.images = []

        self.targets = []


        if split not in ['train', 'test', 'val']:

            raise ValueError('Invalid split for mode! Please use split="train", split="test"'

                             ' or split="val"')


        if not os.path.isdir(self.images_dir) or not os.path.isdir(self.targets_dir):

            raise RuntimeError('Dataset not found or incomplete. Please make sure all required folders for the'

                               ' specified "split" and "mode" are inside the "root" directory')


        for city in os.listdir(self.images_dir):

            img_dir = os.path.join(self.images_dir, city)

            target_dir = os.path.join(self.targets_dir, city)


            for file_name in os.listdir(img_dir):

                self.images.append(os.path.join(img_dir, file_name))

                target_name = '{}_{}'.format(file_name.split('_leftImg8bit')[0],

                                             self._get_target_suffix(self.mode, self.target_type))

                self.targets.append(os.path.join(target_dir, target_name))


    @classmethod

    def encode_target(cls, target):

        return cls.id_to_train_id[np.array(target)]


    @classmethod

    def decode_target(cls, target):

        target[target == 255] = 19

        #target = target.astype('uint8') + 1

        return cls.train_id_to_color[target]


    def __getitem__(self, index):

        """

        Args:

            index (int): Index

        Returns:

            tuple: (image, target) where target is a tuple of all target types if target_type is a list with more

            than one item. Otherwise target is a json object if target_type="polygon", else the image segmentation.

        """

        image = Image.open(self.images[index]).convert('RGB')

        target = Image.open(self.targets[index])

        if self.transform:

            image, target = self.transform(image, target)

        target = self.encode_target(target)

        return image, target


    def __len__(self):

        return len(self.images)


    def _load_json(self, path):

        with open(path, 'r') as file:

            data = json.load(file)

        return data


    def _get_target_suffix(self, mode, target_type):

        if target_type == 'instance':

            return '{}_instanceIds.png'.format(mode)

        elif target_type == 'semantic':

            return '{}_labelIds.png'.format(mode)

        elif target_type == 'color':

            return '{}_color.png'.format(mode)

        elif target_type == 'polygon':

            return '{}_polygons.json'.format(mode)

        elif target_type == 'depth':

            return '{}_disparity.png'.format(mode)




2. 加载预训练模型:需要加载已经预训练好的图像扩展模型。



3. 冻结层:为了防止在微调过程中破坏预训练模型的权重,我需要冻结一些层。这些层的权重将不会被更新。


4. 添加自定义层:我添加了自定义层来适应自动驾驶分割的任务。这些层可以是全连接层、卷积层、池化层等。


5. 训练模型:通过反向传播算法,训练图像扩展模型。在训练过程中,可以调整学习率和批次大小等参数。


6. 评估模型:在训练完成后,评估图像扩展模型的性能。

def validate(opts, model, loader, device, metrics, ret_图像扩展ples_ids=None):

    """Do validation and return specified 图像扩展ples"""

    metrics.reset()

    ret_图像扩展ples = []

    if opts.save_val_results:

        if not os.path.exists('results'):

            os.mkdir('results')

        denorm = utils.Denormalize(mean=[0.485, 0.456, 0.406],

                                   std=[0.229, 0.224, 0.225])

        img_id = 0


    with torch.no_grad():

        for i, (images, labels) in tqdm(enumerate(loader)):


            images = images.to(device, dtype=torch.float32)

            labels = labels.to(device, dtype=torch.long)




7. 微调模型:如果模型性能不够好,我通过Intel的架构One API微调它。微调包括调整超参数、修改网络结构等操作。最后得到了较好的效果。


四.测试



一开始测试效果很糟糕,各个物体的边缘都不大清晰,怀疑是损失函数的问题,多次尝试不同损失函数之后,得到了最好的效果如下:

图像扩展模型!站在巨人的肩膀上_json_02

图像扩展模型!站在巨人的肩膀上_json_03


五.总结

在这次比赛中,我收获匪浅,不仅仅得到了比赛的相关经验和经历,还利用了最先进的Intel架构和相关的图像分割顶尖模型,能够让我学到更多并且走得更远!正如我标题所说,站在巨人的肩膀上!

标签:巨人,target,self,图像,肩膀,os,模型,dir
From: https://blog.51cto.com/u_13298188/8489332

相关文章

  • easyx的使用,图像插入(2.0)
    本文从B站学习,借鉴,一些贴图素材借鉴游戏网图;视频链接:图像输出_哔哩哔哩_bilibili  想使用图片,先用easyx提供的数据类型定义一个变量: 在对图片进行加载,差不多像是赋值,这个变量名相当于这个图片;使用loadimage();这里有个小点;图片的位置你要清楚放在哪里,因为加载图片的时候会......
  • 【Python】【OpenCV】【NumPy】图像和原始字节的转换
    学习完基础的图像算法,开始接触OpenCV学习:灰度图中,一个像素点上的灰度级需要一个字节(byte,2^8,8bit)进行存储,此时的灰度图是二维的。而当我们需要转换为彩色图时,即三维,便会产生颜色通道(Channel),这个时候,一个像素点上的灰度级便会需要三个字节来进行存储。可以借助笛卡尔坐标系来帮助......
  • MRI roi图像合并
    笔记来源:MRIroi的图像合并dpabi小工具_哔哩哔哩_bilibili1.如果几个图像的维度不一致,需要先进行reslice1)如何看图像的维度以软件MRIcron为例,window→information,如红框所示,如果几幅图像的维度不一致,则需要进行重采样,length[969672]是图像采集了72层,每一层的分辨率是96*9......
  • 【图像处理】空间域滤波算子
    Robert算子: Prewitt算子:  Sobel算子: Laplace算子: Canny算子: ......
  • 修改jpg图像的经纬度
    缺点是图片必须带有经纬度信息否者就会报错,仅限于在含有gps信息的jpg上修改图片。importpiexiffromPILimportImage #ReadImagefname='Wide.JPG'img=Image.open(fname)exif_dict=piexif.load(img.info['exif'])exif_dict['GPS'][piexif.GPSIFD.GPSLongitude......
  • 【C++】【图像处理】形态学处理(腐蚀、膨胀)算法解析(以.raw格式的图像为基础进行图像处
    1voiderosion(BYTE*image,intw,inth,BYTE*outImg)2{3intrept;4//腐蚀5memcpy(outImg,image,sizeof(BYTE)*w*h);//将读取的图像赋值给outImg,方便进行腐蚀操作67inti,j,m,n;8BYTEflag;9for(rept=0;rept......
  • 图像特征与提取
    ......
  • 相机靶面和图像传感器的理解与应用
    一、相机靶面(SensorSize)的基本概念相机靶面,即相机内部的图像传感器尺寸,是衡量相机性能的重要指标。靶面尺寸越大,通常意味着相机能够捕获更多的光线和细节,具有更好的低光表现和更浅的景深效果。靶面尺寸的大小直接影响着相机的图像质量和使用场景。二、特定靶面尺寸的理解:以2/3......
  • 图像二值化--阈值自动选取
     图像分割是图像处理这门学科中的基础难题,基于阈值的分割则又是图像分割的最基本的难题之一,其难点在于阈值的选取。事实证明,阈值的选择的恰当与否对分割的效果起着决定性的作用。由于阈值选取对图像分割的基础性,本文主要在【1】、【2】、【3】、【4】等的基础上,对一些当前流行的......
  • Delphi图像处理中ScanLine的使用
    一般我们在Delphi中进行图像处理时采用Pixels像素点赋值的方法,Delphi代码如下:varx,y:Integer;cColor:TColor;begin fory:=0toImage1.Height-1do   forx:=0toImage1.Width-1do     cColor:=Image1.Canvas.Pixels[i,j];end;但是这种方法有个缺点,处理速度很慢......