论文解读4 STRM《Spatio-temporal Relation Modeling for Few-shot Action Recognition》少镜头动作识别 CVPR2022

Spatio-temporal Relation Modeling for Few-shot Action Recognition

少镜头动作识别的时空关系建模

文章链接:https://arxiv.org/abs/2112.05132
C-way K-shot L帧
在这里插入图片描述
第一步:
常规操作,L视频帧通过图像特征提取器,该提取器输出空间分辨率为P×P的D维帧特征,对帧特征进行空间展平,维度变为p2×D(reshape)

第二步:
通过spatio-temporal enrichment module 中的Enriching Local Patch Features(PLE)
增强单个帧中的局部补丁特征,在每个帧内局部地聚集空间上下文。这使得能够聚焦于帧中的相关对象。
在这里插入图片描述
先position embedding一下输入的xi,值嵌入通过查询和键之间的标准化成对得分重新加权,以获得关注特征αi。
在这里插入图片描述
最后将attention通过子网络(3-layer Bottleneck MLP followed by a residual layer),得到输出结果
在这里插入图片描述

第三步:
通过spatio-temporal enrichment module 中的frame level enrichment (FLE)
增强全局帧特征在时间上跨越视频中的帧,在视频内的帧之间全局地富集时间上下文。
(引入了MLP 作为Google ViT团队最近刚提出的一种的CV框架,MLP-Mixer使用多层感知机(MLP)来代替传统CNN中的卷积操作(Conv)和Transformer中的自注意力机制(Self-Attention))

在这里插入图片描述
先 avg一下(torch.mean())得到FLE的输入
在这里插入图片描述
再通过两个MLP模块(nn.Linear+nn.ReLU+nn.Linear,再加上本身)
在这里插入图片描述
空富集模块利用了局部和全局、样本依赖和样本不可知的富集机制的优势,以改进行动的空间和时间上下文的聚合。结果,随着在较低基数表示中同化高阶时间关系,获得了特定于类的区分特征。

第四步:
Loss由两部分组成,交叉熵损失,λ=0.1
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用zlib库提供的函数和结构体来实现字节数组的解压缩,然后再使用iconv库来实现指定UTF-8编码方式的转换。 以下是一个示例代码: ```c++ #include <iostream> #include <zlib.h> #include <iconv.h> int main() { // 假设您已经有了一个Gzip压缩后的字节数组 data,以及它的长度 data_len // 初始化zlib相关数据结构 z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = data_len; strm.next_in = (Bytef*)data; int ret = inflateInit2(&strm, MAX_WBITS + 16); if (ret != Z_OK) { std::cerr << "inflateInit2 error: " << ret << std::endl; return -1; } // 解压缩数据 char buf[1024]; std::string output; do { strm.avail_out = sizeof(buf); strm.next_out = (Bytef*)buf; ret = inflate(&strm, Z_NO_FLUSH); if (ret < 0) { std::cerr << "inflate error: " << ret << std::endl; inflateEnd(&strm); return -1; } output.append(buf, sizeof(buf) - strm.avail_out); } while (strm.avail_out == 0); // 结束解压缩 inflateEnd(&strm); // 将解压后的数据转换为UTF-8编码 iconv_t cd = iconv_open("UTF-8", "ISO-8859-1"); if (cd == (iconv_t)-1) { std::cerr << "iconv_open error" << std::endl; return -1; } char* inbuf = (char*)output.data(); size_t inlen = output.size(); size_t outlen = inlen * 2; char* outbuf = new char[outlen]; char* outptr = outbuf; size_t retlen = iconv(cd, &inbuf, &inlen, &outptr, &outlen); if (retlen == (size_t)-1) { std::cerr << "iconv error" << std::endl; iconv_close(cd); delete[] outbuf; return -1; } std::string utf8(outbuf, outlen - inlen); delete[] outbuf; iconv_close(cd); // 输出解压后的、转换为UTF-8编码的数据 std::cout << utf8 << std::endl; return 0; } ``` 需要注意的是,使用iconv库进行编码转换时,需要先将解压后的数据存储在一个std::string对象中,因为iconv库只能处理C风格的字符串(即以'\0'结尾),而zlib库输出的是一个字节数组,不一定以'\0'结尾。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值