Transformer for CV

news2024/12/23 19:49:09

文章目录

  • Transformer 的基础结构
    • NLP Structure
    • VIT
    • SWIN
    • DERT
  • Transformer 常用terms
    • 分块的batch-size自动计算
    • Batch norm
    • Layer norm
    • Multihead Self Attention
    • GELU/ELU/RELU
  • Transformer Vs CNN
  • 每个模型的详细笔记
    • Vit
      • 图片分割
      • 自己的思考
      • 计算过程
    • Segmenter
      • 运行 Train
      • Train 里的结构
    • DERT
      • DERT 步骤
      • segmentation数据
      • segmentaion 快速测试 webcam
      • DERT segmentaion 测试 webcam 结果
      • Detectron 2
      • DETECTRON 2 测试 webcam 结果
      • 个人思考

Transformer 的基础结构

NLP Structure

在这里插入图片描述

VIT

在这里插入图片描述

SWIN

在这里插入图片描述

DERT

在这里插入图片描述

Transformer 常用terms

https://www.pinecone.io/learn/batch-layer-normalization/

https://wandb.ai/wandb_fc/LayerNorm/reports/Layer-Normalization-in-Pytorch-With-Examples—VmlldzoxMjk5MTk1

https://towardsdatascience.com/different-normalization-layers-in-deep-learning-1a7214ff71d6

https://neuralthreads.medium.com/layer-normalization-and-how-to-compute-its-jacobian-for-backpropagation-55a549d5936f

分块的batch-size自动计算

目标:图片大小84*84,求有哪些分块数量可以用?
简化:求84所有的divisors, N=84
结果:84 的 divisors 有:[1, 84, 2, 42, 3, 28, 4, 21, 6, 14, 7,12]

for loop:–>
i = 1, j=84, [1, 84]
i = 2, j =42 [1, 84, 2, 42]
i = 3, j = 28 [1, 84, 2, 42, 3, 28]
i = 4, j = 21 [1, 84, 2, 42, 3, 28, 4, 21]
i = 5, j = 21 [1, 84, 2, 42, 3, 28, 4, 21]
i = 6, j = 14 [1, 84, 2, 42, 3, 28, 4, 21, 6, 14]
i = 7, j = 12 [1, 84, 2, 42, 3, 28, 4, 21, 6, 14, 7,12]
i = 8, j = 12
i = 9, j = 12
i = 10, j = 12
i = 11, j = 12
i = 12, j = 12 结束

程序大概逻辑:

从 i= 1,j = N 开始。 i + 1: 如果 N % ( i + 1 ) = = 0 N\%(i+1)==0 N%(i+1)==0 j = N j = N j=N;如果 N % ( i + 1 ) ! = 0 N\%(i+1)!=0 N%(i+1)!=0 j = j l a s t j = j_{last} j=jlast
结束condition:i == j
Time complexity ~= O ( N ) O(\sqrt {N}) O(N )~= O ( 84 ) O(\sqrt {84}) O(84 )

Batch norm

对sequence的data不好,因为sequence的长度不一,那么batch norm用的mean 和 std 就不能很好的将每个feature的分布准确算出。
在这里插入图片描述
在NLP类似Sequence的问题上,batch norm 只适用于长度一样的数据。不然Activate function没办法让gradient converge,有时还会有死掉的状况。

例如有数据:
随着像这样pattern的数据放进模型训练,上面算式里求平均数的 μ \mu μ会因为长度各种变化,导致得到的mean其实不能代表所有数据,让模型变得不准确。

feature0feature1feature2feature3feature4
AAAAA
ABACA
ACBDA
AC
BC
D

就算给他们padding了 0,会因为引入太多0,最后结果可能会死掉

feature0feature1feature2feature3feature4
AAAAA
ABACA
ACBDA
AC000
BC000
D0000

Transformer 也不适用batch norm,Batch由GPU操作,但是一般的GPU顶多2个Batch,按照上一个内容,计算出12,这样的Batch size,对GPU来说为难了。因此Transformer应该选用Layer Norm去让模型达到一个加快Converge的操作。

Layer norm

一般用于任何和RNN有关的网络结构。对Sequence data 友好。对大Batch size的Transformer友好。

就是平分一个layer上,各个hidden unit的值。

Multihead Self Attention

Q: Query 当作 一个 submmit button (选红色和绿色球)
K: Key 是训练过程中的字典,当作备选项 (各种颜色的球)
V: 用于训练过程中的更新
以上三个都是linear layer代替
在这里插入图片描述
训练时候,第一次,Decoder Input 的 Q,K使用 Encoder 输出的Q,K。 第n次,Decoder 的 Input用 n-1 次的Q,K, V
同时,从Encoder 输出的Q,K需要传到 Decoder, 更新 Decoder 这边第二个Multi-Head Attention的 Q,K。
在这里插入图片描述

Filtered image = Attention Filter(来自Transfomer Decoder的输出) * Original Image

GELU/ELU/RELU

使用了Gaussian Distribution. 数据计算用到了distribution的面积计算,即CFD。中间步骤有用到 Gauss Error Function.
以上是数学里的计算方式,但是在代码里,以上步骤不好操作,因此,目前的GELU是通过sigmoid 或者 Tahn 估计出来的。

Transformer Vs CNN

Transformer能够得到整张图上的cross information,但是CNN不行。因为CNN只是按照sliding Windows一步一步的滑动,没有让每步sliding Windows与走过的sliding Windows作相关性的计算。而Transformer因为有分块的设计,并且会计算每个分块与其它各个分块的相似度,使得模型有了cross information。

CNN 是 Transformer的一个子集

每个模型的详细笔记

Vit

图片分割

def img_to_patch(x, patch_size, flatten_channels=True):
    """
    Inputs:
        x - torch.Tensor representing the image of shape [B, C, H, W]
        patch_size - Number of pixels per dimension of the patches (integer)
        flatten_channels - If True, the patches will be returned in a flattened format
                           as a feature vector instead of a image grid.
    """
    B, C, H, W = x.shape
    x = x.reshape(B, C, H//patch_size, patch_size, W//patch_size, patch_size)
    x = x.permute(0, 2, 4, 1, 3, 5) # [B, H', W', C, p_H, p_W]
    x = x.flatten(1,2)              # [B, H'*W', C, p_H, p_W]
    if flatten_channels:
        x = x.flatten(2,4)          # [B, H'*W', C*p_H*p_W]
    return x

x 为输入的数据,例如有4 张 RGB的图片,每张图片都是32x32
那么x.shape = [4,3,32,32]
假设patch_size = 4, 那么这4张RGB会被分割成64份,因为:
份数结果 = o l d W patch size for W ∗ o l d H patch size for H \frac{old W}{\text{patch size for W}}*\frac{old H}{\text{patch size for H}} patch size for WoldWpatch size for HoldH
因此当W,H都有patch size = 4,份数结果=16
因此当W,H都有patch size = 16,份数结果=4
这里的patch size 得确保能被整除。
在这里插入图片描述
在这里插入图片描述

自己的思考

分割的份数对Transformer有什么影响?

好处:
由于,后续在Transofomer的encoder中会计算每个分块与其它所有分块的关系,也许对于画面细节的对应上会更优秀。而分的大块可能会错失细节信息。
比CNN好在它可以和画面其它部分作关联。

坏处:
分割的越多,computation time complexity越大

计算过程

在这里插入图片描述

Segmenter

运行 Train

Steps:

  1. 按照readme 把路径和数据下载好
  2. 把Script里带segm的import 引用找到,并删掉前缀
    比如:from segm.utils.distributed import sync_model 改成 from utils.distributed import sync_model
  3. 找到train.py
@click.option("--log-dir", type=str, help="logging directory",default="seg_tiny_mask")
@click.option("--dataset", type=str,default="ade20k")
@click.option("--backbone", default="vit_tiny_patch16_384", type=str)
@click.option("--decoder", default="mask_transformer", type=str)
  1. 如果用的Windows电脑,会报错:
    Windows RuntimeError: Distributed package doesn‘t have NCCL built in
    因此要改代码,把backend赋值为gloo
dist.init_process_group(backend='gloo') 
#这里是报错的地方,但是源代码的错误根本在main function

找到train.py:
main function 里的第一行(line 71)更改为distributed.init_process(backend='gloo')

  1. 如果是单片GPU,建议将batch_size 换成 1.
  2. 然后可以train了。

Train 里的结构

在这里插入图片描述

DERT

DERT 步骤

segmentation数据

下载:

wget http://images.cocodataset.org/annotations/panoptic_annotations_trainval2017.zip

下好的包裹里有以下文件的ZIP,ZIP打开后,将文件夹按一下排列:

  • coco
    • panoptic_trainval2017
      • annotations
        • panoptic_train2017.json
        • panoptic_val2017.json
      • panoptic_train2017
      • panoptic_val2017

–coco_path :E:\coco
–coco_panoptic_path :E:\coco\panoptic_trainval2017
–dataset_file: panoptic_trainval2017 (不太确定)
–output_dir: /output/path/box_model

segmentaion 快速测试 webcam

import io
from PIL import Image
import numpy
import torch
from typing import List

import cv2
import torchvision.transforms as T
import panopticapi
from panopticapi.utils import id2rgb, rgb2id
import itertools
import seaborn as sns
palette = itertools.cycle(sns.color_palette())

if __name__ == '__main__':
    # standard PyTorch mean-std input image normalization
    transform = T.Compose([
        T.ToTensor(),
        T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    # model, postprocessor = detr_resnet50_panoptic(pretrained=False,return_postprocessor=True,).eval()
    model, postprocessor = torch.hub.load('facebookresearch/detr', 'detr_resnet101_panoptic', pretrained=True, return_postprocessor=True, num_classes=250)
    model.eval()
    ret = False
    cap = cv2.VideoCapture(0)

    while True:
        ret, im = cap.read()
        if ret == False:
            break
        cv2.imshow('',im)
        im = Image.fromarray(im)
        img = transform(im).unsqueeze(0)
        out = model(img)
    
        result = postprocessor(out, torch.as_tensor(img.shape[-2:]).unsqueeze(0))[0]
        panoptic_seg = Image.open(io.BytesIO(result['png_string']))
        panoptic_seg = numpy.array(panoptic_seg, dtype=numpy.uint8).copy()
        panoptic_seg_id = rgb2id(panoptic_seg)
        panoptic_seg[:, :, :] = 0
        for id in range(panoptic_seg_id.max() + 1):
            panoptic_seg[panoptic_seg_id == id] = numpy.asarray(next(palette)) * 255
        
        cv2.imshow('seg',panoptic_seg)
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

DERT segmentaion 测试 webcam 结果

在我1个GPU的机子上测试:
Inference 耗时:0.08(平均)
从Inference的结果组合结果耗时:0.0145 (平均)

Detectron 2

import io
from PIL import Image
import numpy
import torch
from typing import List
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
from copy import deepcopy

import cv2
import torchvision.transforms as T
import panopticapi
from panopticapi.utils import id2rgb, rgb2id
import itertools
import seaborn as sns
palette = itertools.cycle(sns.color_palette())
import time

if __name__ == '__main__':
    # standard PyTorch mean-std input image normalization
    transform = T.Compose([
        T.ToTensor(),
        T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    # model, postprocessor = detr_resnet50_panoptic(pretrained=False,return_postprocessor=True,).eval()
    model, postprocessor = torch.hub.load('facebookresearch/detr', 'detr_resnet101_panoptic', pretrained=True, return_postprocessor=True, num_classes=250)
    model.eval()
    ret = False
    cap = cv2.VideoCapture(0)

    while True:
        ret, im = cap.read()
        if ret == False:
            break
        cv2.imshow('',im)
        im = Image.fromarray(im)
        img = transform(im).unsqueeze(0)
        out = model(img)

        start_time = time.time()
        result = postprocessor(out, torch.as_tensor(img.shape[-2:]).unsqueeze(0))[0]
        print("--- %s seconds 1 ---" % (time.time() - start_time))
        start_time = time.time()
        segments_info = deepcopy(result["segments_info"])
        panoptic_seg = Image.open(io.BytesIO(result['png_string']))
        final_w, final_h = panoptic_seg.size
        panoptic_seg = numpy.array(panoptic_seg, dtype=numpy.uint8)
        panoptic_seg = torch.from_numpy(rgb2id(panoptic_seg))
        meta = MetadataCatalog.get("coco_2017_val_panoptic_separated")
        for i in range(len(segments_info)):
            c = segments_info[i]["category_id"]
            segments_info[i]["category_id"] = meta.thing_dataset_id_to_contiguous_id[c] if segments_info[i]["isthing"] else meta.stuff_dataset_id_to_contiguous_id[c]
        v = Visualizer(numpy.array(im.copy().resize((final_w, final_h)))[:, :, ::-1], meta, scale=1.0)
        v._default_font_size = 20
        v = v.draw_panoptic_seg_predictions(panoptic_seg, segments_info, area_threshold=0)
        print("--- %s seconds 2 ---" % (time.time() - start_time))
        cv2.imshow('seg',v.get_image())
        key = cv2.waitKey(1)
        if key == ord('q'):
            break

DETECTRON 2 测试 webcam 结果

这里和之前DERT不同于,这里加入了meta的语义信息,速度其实和之前的相差不大。
在我1个GPU的机子上测试:
Inference 耗时:0.08(平均)
从Inference的结果组合结果耗时:0.0145 (平均)

个人思考

因为这里测试的都是全景的panopticap, Inference的耗时会大一些,如果有指定训练的几个类别的instance segmentation, Inference 应该会和检测差不多,个人保守估计(乐观估计?)0.03 每个frame.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/46544.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

命名空间提示“http://schemas.microsoft.com/xaml/behaviors”不存在Interation的解决办法

以下面的部分wpf程序为例&#xff1a; <Button Grid.Column"3" Margin"5" Content"<" FontSize"18" Background"Transparent" Foreground"LightGray"><b:Interaction.Triggers><b:EventTrigge…

static应用知识:单例设计模式

1、什么是设计模式&#xff08;Design pattern&#xff09; 开发中经常遇到一些问题&#xff0c;一个问题通常有n种解法的&#xff0c;但其中肯定有一种解法是最优的&#xff0c;这个最优的解法被人总结出来了&#xff0c;称之为设计模式。 设计模式有20多种&#xff0c;对应2…

轻松上手 | 使用国内资源安装 K3s 全攻略

作者&#xff1a; 王海龙&#xff0c;SUSE Rancher 中国社区技术经理&#xff0c;Linux Foundation APAC Evangelist&#xff0c;负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验&#xff0c;经历了 OpenStack 到 Kubernetes 的技术变革&#xff0c;无论底层…

3D帧间匹配-----剔除动态障碍物

0. 简介 作为SLAMer在建图时最怕的就是大量的动态障碍物存在&#xff0c;这会导致建图的不精确&#xff0c;而本文主要围绕着如何剔除动态障碍物开始讲起&#xff0c;并提供一种快速的过滤障碍物的方法。 1. 主要方法 在调研的过程中主要存在有两种方法&#xff0c;第一种如…

安全标准汇总

文章目录资源导航法律法规0x01常见标准代号0x02 2022年新发布0x03 按体系分类一般性法律规定规范和惩罚信息网络犯罪的法律直接针对信息安全的特别规定具体规范信息安全技术、信息安全管理0x04 安全等级保护0x05 数据安全声明资源导航 国家标准全文公开系统&#xff1a;国家标…

代码随想录训练营第35天|LeetCode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

参考 代码随想录 题目一&#xff1a;LeetCode 860.柠檬水找零 这个题在做的时候有误解&#xff0c;第一不能对数组bills排序&#xff0c;只能按照给定的顺序处理&#xff1b;第二&#xff0c;只能从头开始处理&#xff0c;不能中间的某个点开始。 其实这个题很简单&#xff…

synchronized锁升级过程

【一些面试真题】&#xff1a; 阿里P9——0x80的执行过程。 【 重温CAS过程 】&#xff1a; 【硬件】&#xff1a; Lock指令在执行后面指令的时候锁定一个北桥信号&#xff08;不采用锁总线的方式&#xff09;。 【用户态 与 内核态】&#xff1a; 作为操作系统来说&#x…

WebRTC学习笔记二 基础概念

一、WebRTC与架构 简单来说&#xff0c;WebRTC 是一个可以在 Web 应用程序中实现音频&#xff0c;视频和数据的实时通信的开源项目。在实时通信中&#xff0c;音视频的采集和处理是一个很复杂的过程。比如音视频流的编解码、降噪和回声消除等&#xff0c;但是在 WebRTC 中&…

C. Strange Test(位运算或)

Problem - 1632C - Codeforces 伊戈尔正在读11年级。明天他将不得不写一份信息学测试&#xff0c;由学校最严格的老师帕维尔-杰尼索维奇负责。 伊戈尔知道测试将如何进行&#xff1a;首先&#xff0c;老师会给每个学生两个正整数a和b&#xff08;a<b&#xff09;。之后&…

[2022-11-28]神经网络与深度学习 hw10 - LSTM和GRU

contentshw10 - LSTM 和GRU相关习题task 1题目内容题目分析题目解答题目总结task 2题目内容题目分析题目解答题目总结task 3题目内容题目分析题目解答题目总结task 4题目内容题目分析题目解答问题总结hw10 - LSTM 和GRU相关习题 task 1 题目内容 当使用公式htht−1g(xt,ht−…

Linux系统中利用C语言控制LED的方法

大家好&#xff0c; 今天主要和大家聊一聊&#xff0c;如何利用C语言控制LED灯的实验。 目录 ​第一&#xff1a;C语言板控制LED灯简介 第二&#xff1a;实验程序实现 ​第三&#xff1a;C语言实验控制程序 ​第一&#xff1a;C语言板控制LED灯简介 实际工作中很少会使用到汇…

分离变数法

今天是2022年11月28号 我的方程学的不太好&#xff0c;一些讲宇宙的&#xff0c;讲技术的&#xff0c;方程实在是看不懂很多方程的解与参数不可分割期末来了 有的人回去了有的人要看光学了我呢&#xff0c;已经废物了&#xff0c;节日快乐&#xff0c;大家伙节日快乐啊&#xf…

Spirng 痛苦源码学习(二)——手写spring大致总框架(一)

文章目录前言一、总体步骤如下1、spring 文件夹2、myProject 文件夹二、主要coding1、配置文件2、容器3、一些spring中的重要的注解4、项目中的使用5.重要的bean定义信息6、postProcessor重要&#xff0c;前置通知和后置主要项目的截图前言 本文主要基于spring的注解的方式完成…

Spring相关源码解读

框架1.ApplicationContext refresh的流程2.spring bean 的生命周期3.spring事务失效的几种场景以及原因4.springMVC执行流程5.一些注解&#xff08;1&#xff09;Configuration&#xff08;2&#xff09;Import&#xff08;3&#xff09;SpringBootApplication6.spring中有哪些…

BP神经网络详解,Python实现求解异或问题

BP神经网络 符号及其含义 nln_lnl​表示第lll层神经元的个数&#xff1b;f(⋅)f()f(⋅)表示神经元的激活函数&#xff1b;W(l)∈Rni∗ni−1W^{(l)}\in\mathbb R^{n_i*n_{i-1}}W(l)∈Rni​∗ni−1​表示第l−1l-1l−1层到第lll层的权重矩阵&#xff1b;wij(l)w_{ij}^{(l)}wij(l…

基于tensorflow的ResNet50V2网络识别动物

前言 之前很多人在&#xff0c;如何进行XXX的识别&#xff0c;对应的神经网络如何搭建。对应神经网络怎么搭建&#xff0c;我也是照本宣科&#xff0c;只能说看得懂而已&#xff0c;没有对这块进行深入的研究&#xff0c;但是现在tensorflow&#xff0c;paddle这些工具&#x…

长期稳定的项目—steam搬砖

大家好&#xff0c;我是阿阳 steam搬砖项目一直稳稳定定的进行着&#xff0c;有些朋友基本都观察了近2年 所以很多人问我公众号的项目是不能做了吗&#xff1f;怎么最近做新的去了&#xff1f;很明显这是几乎不可能的事情&#xff0c;steam做2年了&#xff0c;本公众号都能翻到…

这几个数据分析项目,让我看到了什么才叫专业!!

大家好&#xff0c;我是小一 新的一周又来了&#xff0c;从今天开始&#xff0c;会出一个新的系列《数分实验室》 实验室会介绍一些有内核、有科技的数据分析实战项目。 项目数据集、源代码都是公开的&#xff0c;非常适合想练手但是又没数据、没参考案例的同学 今天先热热…

ES的基础概念

1、ES是什么 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单&#xff0c;它不仅包括了全文搜索功能&#xff0c;还可以进行以下工作:分布式实时文件存储&am…

6-1分支限界法

6-1分支限界法 1.分支限界法与回溯法的不同 &#xff08;1&#xff09;求解目标: 回溯法的求解目标是找出解空间树中满足约束条件的所有解&#xff08;或一个最优解&#xff09;&#xff0c; 而分支限界法的求解目标则是找出满足约束条件的一个解&#xff08;或最优解&#x…