用于视频识别的快慢网络

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 摘要
  • Abstract
  • 文献阅读:用于视频识别的快慢网络
    • 1、文献摘要
    • 2、提出方法
      • 2.1、SlowFast模型
      • 2.2、SlowFast 提出思想
    • 3、相关方法
      • 3.1、时空间卷积
      • 3.2、基于光流的视频识别
      • 3.3、横向连接(Lateral connections)
    • 4、实验工作
      • 4.1、动作分类实验
      • 4.2、消融实验
    • 5、总结
  • YOLO V5 -- 架构学习
    • Backbone -- CSPDarknet
      • Backbone CSPDarknet 代码实现
      • FPN 代码实现
  • 总结


摘要

本周主要阅读了CVPR文章, SlowFast Networks for Video Recognition。SlowFast模型网络是一种用于视频识别任务的深度学习模型。它的核心思想是将两种不同帧率的路径(慢途径和快途径)结合在一起,以便更好地捕捉视频中的时空特征。一个慢途径和一个快途径。慢途径以较低的帧率运行,负责处理低帧率下的信息,这意味着它具有较低的时间分辨率;而快途径以较高的帧率运行,负责处理高帧率下的信息,具有较高的时间分辨率。除了阅读文献之外,还学习了yoloV5框架的代码知识。

Abstract

This week, the main focus was on reading the CVPR paper, “SlowFast Networks for Video Recognition.” The SlowFast model network is a deep learning model designed for video recognition tasks. Its core concept involves integrating two pathways with different frame rates—the slow pathway and the fast pathway—to better capture the spatiotemporal features within videos. There is a slow pathway and a fast pathway. The slow pathway operates at a lower frame rate, processing information at a reduced frame rate, which means it has lower temporal resolution; whereas the fast pathway runs at a higher frame rate, handling information at an increased frame rate, thus possessing higher temporal resolution. In addition to studying the literature, knowledge of the code for the YOLOv5 framework was also acquired.

文献阅读:用于视频识别的快慢网络

Title: SlowFast Networks for Video Recognition
Author:Christoph Feichtenhofer Haoqi Fan Jitendra Malik Kaiming H
From:2019 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)

1、文献摘要

随着深度学习和计算机视觉技术的快速发展,视频行为识别成为了一个备受关注的研究领域。文献提出了用于视频识别的SlowFast网络,模型包括:(i)以低帧速率的慢速路径来捕获空间语义;(ii)以高帧速率的快速路径来捕获精细时间分辨率的运动。快速路径可以通过减少通道容量而变得非常轻量级,并且可以学习有用的时间信息用于视频识别。文献的 SlowFast 模型在视频中的行为分类和检测方面都取得了很好的性能,概念也有很大的改进。SlowFast 模型在没有使用任何预训练的情况下,得到Kinetics数据集的准确率为79.0%,AVA数据集的mAP为28.2%。

2、提出方法

2.1、SlowFast模型

文献提出了SlowFast模型,SlowFast模型网络是一种用于视频识别任务的深度学习模型。它的核心思想是将两种不同帧率的路径(慢途径和快途径)结合在一起,以便更好地捕捉视频中的时空特征。一个慢途径和一个快途径。慢途径以较低的帧率运行,负责处理低帧率下的信息,这意味着它具有较低的时间分辨率。然而,由于较低的帧率,它可以处理更长的时间跨度,从而捕捉到视频中的长期依赖关系,具有较低的时间分辨率;而快途径以较高的帧率运行,负责处理高帧率下的信息,具有较高的时间分辨率。这意味着它可以更敏感地捕捉到视频中的快速变化和短期动态。在实际应用中,SlowFast网络会将慢途径和快途径的特征进行融合,以便同时利用两种途径的优势。这种设计使得SlowFast网络在处理视频识别任务时能够取得较好的性能。
在这里插入图片描述

2.2、SlowFast 提出思想

SlowFast模型是受到灵长类动物视觉系统中视网膜神经节细胞的生物学研究启发的。这些细胞中约80%是小细胞(P-cells),它们提供精细的空间细节和颜色信息,但时间分辨率较低;而约15-20%是大细胞(M-cells),它们对快速时间变化敏感,但对空间细节或颜色不敏感。视觉内容的分类空间语义通常变化缓慢,而运动可以比它们的主题身份变化快得多。因此,Slow路径设计用于捕获可以由图像或少数稀疏帧提供的信息,而Fast路径则负责捕获快速变化的运动,基于这些理论研究,提出了快慢路径融合的方法。

3、相关方法

3.1、时空间卷积

在视频处理和分析中同时对视频帧的空间维度(即图像的宽度和高度)和时间维度进行卷积操作。其能够捕捉视频中的局部空间特征(如纹理和形状)以及随时间变化的特征(如物体的运动)。这种卷积操作通常在3D CNN中实现,其中卷积核在视频的帧序列上滑动,从而提取出具有时间连续性的特征。时间空间卷积可以有效地捕捉视频中的动作模式,因为它们能够考虑到帧与帧之间的时间关系。这使得3D CNN特别适合于动作识别、视频分类和其他需要理解视频中时间动态的任务。 时间空间卷积的核心优势在于其能够同时处理空间和时间信息,生成一个综合了视觉内容和运动信息的特征表示,这对于准确的视频内容分析至关重要。下图为SlowFast的网络结构表,其中T x S2的T为时间维度,S为普通的二维内容。
在这里插入图片描述

3.2、基于光流的视频识别

基于光流的视频识别是一种利用视频中物体运动信息来进行动作识别或视频内容分析的方法。光流(Optical Flow)是指图像中物体亮度模式的移动,它是由场景中物体的运动引起的。它通过分析视频中连续帧之间像素点的移动来捕捉物体的运动信息,光流图像可以被转换成特征向量,这些特征向量可以描述物体的运动模式,从而识别视频中的动作或事件。这种技术尤其适合于理解视频中的动态变化,因为它直接提取了物体运动的速度和方向。

3.3、横向连接(Lateral connections)

Lateral connections指的是在神经网络中用于连接不同路径或层的连接,特别是在SlowFast网络中,它们被用于将信息从Fast pathway融合到Slow pathway。这些连接允许两个路径在不同时间速度上处理信息,并通过合并它们的特征来提高网络的整体性能。在SlowFast网络中,这些lateral connections有助于结合两个路径的优势,从而更有效地进行视频分类任务。
需要注意的是横向连接具有以下三种方式,文献中主要使用的是T-conv方法,因其简单性和有效性而被选作默认的融合方式。通过这种方式,Fast pathway的特征被有效地合并到Slow pathway中,使得网络能够更好地利用视频数据中的时间和空间信息来进行视频分类任务。

  • Time-to-channel (TtoC):这是一种通过重塑和转置Fast pathway的特征来匹配Slow pathway的特征的方法。它将Fast pathway的输出(具有高时间分辨率和低通道容量)转换为与Slow pathway的输出具有相同的时间维度和通道维度的形式,然后通过求和或拼接的方式将其与Slow pathway的输出融合。
  • Time-strided sampling (T-sample):这种方法通过时间步长对Fast pathway的输出进行下采样,使其与Slow pathway的输出在时间维度上匹配,然后再将它们融合。
  • Time-strided convolution (T-conv):这种方法应用了时间步长卷积,它通过在时间维度上应用1×1卷积来减少Fast pathway的通道数,使其与Slow pathway的输出相匹配,然后将它们融合。

4、实验工作

4.1、动作分类实验

使用动作分类的数据集包括UCF-Crime、Kinetics、HMDB-51、UCF-101,使用这些数据集评估SlowFast的模型性能,并使用标准的评估协议。除此之外选择了诸如top-1准确率(Top-1 Accuracy)、top-5准确率(Top-5 Accuracy)和GFLOPs(Giga Floating-point Operations Per Second,用于衡量模型的计算量)等指标来评价模型性能,以下是使用这些标准与其他模型进行性能对比的实验图。
在这里插入图片描述
在Kinetics-400数据集上,SlowFast(绿色)与仅Slow(蓝色)架构的准确性与复杂性权衡。在所有情况下,SlowFast始终优于其仅Slow对应物(绿色箭头)。SlowFast比时间密集型的仅Slow(例如红色箭头)提供更高的准确性和更低的成本。
在这里插入图片描述
Kinetics-600数据集上与最先进技术的比较,其中包含不同规格的SlowFast模型。
在这里插入图片描述
Charades数据集上与最先进技术的比较,其中包含不同规格的SlowFast模型。
在这里插入图片描述

4.2、消融实验

文献的消融实验主要关注于评估SlowFast网络中各个组件对视频识别性能的具体贡献。通过改变网络的不同部分,如调整Fast路径的通道容量比例、融合方式、以及对Fast路径输入的空间信息进行减弱等,研究者能够逐一分析这些变化对模型准确度的影响。例如,通过减少Fast路径的通道数,研究者发现即使在降低计算量的情况下,网络仍能有效捕捉运动信息。此外,实验还发现,即使是灰度图像或时间差分图像,Fast路径也能提供与RGB图像相似的性能,同时减少计算量。这些发现表明,SlowFast网络的Fast路径是一个高效且轻量级的视频识别组件。
在这里插入图片描述
在AVA数据集上的动作检测任务中,消融实验进一步证明了SlowFast网络相比于仅使用Slow路径的模型在性能上的显著提升。通过对比Slow-only基线和SlowFast模型的每类平均精度(AP),研究者发现SlowFast模型在多个动作类别上都有较大的增益,尤其是在那些动态性较强的动作上。这些实验结果不仅验证了SlowFast网络设计的有效性,也为后续的视频识别研究提供了宝贵的洞察。
在这里插入图片描述

5、总结

论文提出了一种创新的视频识别框架——SlowFast网络,它通过结合两个互补的子网络来同时捕捉视频中的空间语义和动态运动信息。Slow路径负责处理低帧率视频,以提取缓慢变化的视觉内容,而Fast路径则以高帧率运行,专注于捕获快速运动的细节。这种架构使得模型能够灵活地处理视频中的复杂动态,同时保持计算效率。论文中的实验表明,SlowFast网络在多个视频识别基准测试中取得了突破性的性能,包括Kinetics、Charades和AVA数据集,验证了其设计的有效性。此外,作者还提供了模型的开源代码,鼓励社区进一步探索和改进视频识别技术。这一研究不仅推动了视频识别领域的进展,也为未来在视频理解和分析方面的研究提供了新的思路和工具。


YOLO V5 – 架构学习

yolo V5总体结构图:
在这里插入图片描述

Backbone – CSPDarknet

YOLOv5的设计中采用了多种技术来提高效率和准确性,其中之一就是 Cross Stage Partial Network(CSPNet)的概念。
CSPDarknet 是 YOLOv5 架构中的一个组件,它是一种特殊的网络结构,用于减少计算复杂度和模型大小,同时尽量保持检测性能。CSP 的核心思想是在网络的每个阶段只使用部分计算资源来处理输入,而不是全部资源。这种方法可以显著减少模型的参数数量和计算量,从而加快推理速度,特别是在资源受限的环境中。

Backbone CSPDarknet 代码实现

下列代码结构完全按照上述结构图实现,其中输入图片是640, 640, 3,且初始的基本通道base_channels是64。

class CSPDarknet(nn.Module):def __init__(self, base_channels, base_depth, phi, pretrained):super().__init__()#   利用focus网络结构进行特征提取#   640, 640, 3 -> 320, 320, 12 -> 320, 320, 64self.stem       = Focus(3, base_channels, k=3)#   完成以下卷积之后,320, 320, 64 -> 160, 160, 128self.dark2 = nn.Sequential(# 320, 320, 64 -> 160, 160, 128Conv(base_channels, base_channels * 2, 3, 2),# 160, 160, 128 -> 160, 160, 128C3(base_channels * 2, base_channels * 2, base_depth),)#   完成卷积之后,160, 160, 128 -> 80, 80, 256#   完成CSPlayer之后,80, 80, 256 -> 80, 80, 256self.dark3 = nn.Sequential(Conv(base_channels * 2, base_channels * 4, 3, 2),C3(base_channels * 4, base_channels * 4, base_depth * 3),)#   完成卷积之后,80, 80, 256 -> 40, 40, 512#   完成CSPlayer之后,40, 40, 512 -> 40, 40, 512self.dark4 = nn.Sequential(Conv(base_channels * 4, base_channels * 8, 3, 2),C3(base_channels * 8, base_channels * 8, base_depth * 3),)#   完成卷积之后,40, 40, 512 -> 20, 20, 1024#   完成SPP之后,20, 20, 1024 -> 20, 20, 1024self.dark5 = nn.Sequential(Conv(base_channels * 8, base_channels * 16, 3, 2),SPP(base_channels * 16, base_channels * 16),C3(base_channels * 16, base_channels * 16, base_depth, shortcut=False),)def forward(self, x):x = self.stem(x)x = self.dark2(x)#   dark3的输出为80, 80, 256,是一个有效特征层x = self.dark3(x)feat1 = x#   dark4的输出为40, 40, 512,是一个有效特征层x = self.dark4(x)feat2 = x#   dark5的输出为20, 20, 1024,是一个有效特征层x = self.dark5(x)feat3 = x##此处返回的为进入FPN三个层次return feat1, feat2, feat3

FPN 代码实现

class YoloBody(nn.Module):def __init__(self, anchors_mask, num_classes, phi, backbone='cspdarknet', pretrained=False, input_shape=[640, 640]):super(YoloBody, self).__init__()base_channels       = int(wid_mul * 64)  # 64base_depth          = max(round(dep_mul * 3), 1)  # 3#   生成CSPdarknet53的主干模型#   获得三个有效特征层,他们的shape分别是:#   80,80,256#   40,40,512#   20,20,1024self.backbone   = CSPDarknet(base_channels, base_depth, phi, pretrained)feat1_c, feat2_c, feat3_c = in_channels self.conv_1x1_feat1 = Conv(feat1_c, base_channels * 4, 1, 1)self.conv_1x1_feat2 = Conv(feat2_c, base_channels * 8, 1, 1)self.conv_1x1_feat3 = Conv(feat3_c, base_channels * 16, 1, 1)self.upsample   = nn.Upsample(scale_factor=2, mode="nearest")self.conv_for_feat3         = Conv(base_channels * 16, base_channels * 8, 1, 1)self.conv3_for_upsample1    = C3(base_channels * 16, base_channels * 8, base_depth, shortcut=False)self.conv_for_feat2         = Conv(base_channels * 8, base_channels * 4, 1, 1)self.conv3_for_upsample2    = C3(base_channels * 8, base_channels * 4, base_depth, shortcut=False)self.down_sample1           = Conv(base_channels * 4, base_channels * 4, 3, 2)self.conv3_for_downsample1  = C3(base_channels * 8, base_channels * 8, base_depth, shortcut=False)self.down_sample2           = Conv(base_channels * 8, base_channels * 8, 3, 2)self.conv3_for_downsample2  = C3(base_channels * 16, base_channels * 16, base_depth, shortcut=False)# 80, 80, 256 => 80, 80, 3 * (5 + num_classes) => 80, 80, 3 * (4 + 1 + num_classes)self.yolo_head_P3 = nn.Conv2d(base_channels * 4, len(anchors_mask[2]) * (5 + num_classes), 1)# 40, 40, 512 => 40, 40, 3 * (5 + num_classes) => 40, 40, 3 * (4 + 1 + num_classes)self.yolo_head_P4 = nn.Conv2d(base_channels * 8, len(anchors_mask[1]) * (5 + num_classes), 1)# 20, 20, 1024 => 20, 20, 3 * (5 + num_classes) => 20, 20, 3 * (4 + 1 + num_classes)self.yolo_head_P5 = nn.Conv2d(base_channels * 16, len(anchors_mask[0]) * (5 + num_classes), 1)def forward(self, x):#  backbonefeat1, feat2, feat3 = self.backbone(x)if self.backbone_name != "cspdarknet":feat1 = self.conv_1x1_feat1(feat1)feat2 = self.conv_1x1_feat2(feat2)feat3 = self.conv_1x1_feat3(feat3)# 20, 20, 1024 -> 20, 20, 512P5          = self.conv_for_feat3(feat3)# 20, 20, 512 -> 40, 40, 512P5_upsample = self.upsample(P5)# 40, 40, 512 -> 40, 40, 1024P4          = torch.cat([P5_upsample, feat2], 1)# 40, 40, 1024 -> 40, 40, 512P4          = self.conv3_for_upsample1(P4)# 40, 40, 512 -> 40, 40, 256P4          = self.conv_for_feat2(P4)# 40, 40, 256 -> 80, 80, 256P4_upsample = self.upsample(P4)# 80, 80, 256 cat 80, 80, 256 -> 80, 80, 512P3          = torch.cat([P4_upsample, feat1], 1)# 80, 80, 512 -> 80, 80, 256P3          = self.conv3_for_upsample2(P3)# 80, 80, 256 -> 40, 40, 256P3_downsample = self.down_sample1(P3)# 40, 40, 256 cat 40, 40, 256 -> 40, 40, 512P4 = torch.cat([P3_downsample, P4], 1)# 40, 40, 512 -> 40, 40, 512P4 = self.conv3_for_downsample1(P4)# 40, 40, 512 -> 20, 20, 512P4_downsample = self.down_sample2(P4)# 20, 20, 512 cat 20, 20, 512 -> 20, 20, 1024P5 = torch.cat([P4_downsample, P5], 1)# 20, 20, 1024 -> 20, 20, 1024P5 = self.conv3_for_downsample2(P5)#---------------------------------------------------##   第三个特征层#   y3=(batch_size,75,80,80)#---------------------------------------------------#out2 = self.yolo_head_P3(P3)#---------------------------------------------------##   第二个特征层#   y2=(batch_size,75,40,40)#---------------------------------------------------#out1 = self.yolo_head_P4(P4)#---------------------------------------------------##   第一个特征层#   y1=(batch_size,75,20,20)#---------------------------------------------------#out0 = self.yolo_head_P5(P5)return out0, out1, out2

总结

本周主要阅读了CVPR文章, SlowFast Networks for Video Recognition。SlowFast模型网络是一种用于视频识别任务的深度学习模型。它的核心思想是将两种不同帧率的路径(慢途径和快途径)结合在一起,以便更好地捕捉视频中的时空特征。一个慢途径和一个快途径。慢途径以较低的帧率运行,负责处理低帧率下的信息,这意味着它具有较低的时间分辨率;而快途径以较高的帧率运行,负责处理高帧率下的信息,具有较高的时间分辨率。除了阅读文献之外,还学习了yoloV5框架的代码知识。下周再接再厉!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入解析RedisSearch:全文搜索的新维度

码到三十五 : 个人主页 在当今的数据时代,信息的检索与快速定位变得尤为关键。Redis,作为一个高性能的内存数据库,已经在缓存和消息系统中占据了重要地位。然而,Redis并不直接支持复杂的搜索功能。为了填补这一空白&am…

零代码平台助力中国石化江苏油田实现高效评价体系

概述: 中国石化集团江苏石油勘探局有限公司面临着评价体系依赖人工处理数据、计算繁琐且容易出错的挑战。为解决这一问题,他们决定借助零代码平台明道云开发江苏油田高质量发展经济指标评价系统。该系统旨在实现原始数据批量导入与在线管理、权重及评分…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…

【Linux】从零开始认识动静态库 -动态库

送给大家一句话: 我不要你风生虎啸, 我愿你老来无事饱加餐。 – 梁实秋 《我把活着欢喜过了》 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚ଘ(੭ˊᵕˋ)੭…

【小红书采集软件】根据关键词批量爬取小红书笔记正文、笔记链接、发布时间、转评赞藏等

一、背景介绍 1.1 爬取目标 熟悉我的小伙伴可能了解,我之前开发过2款软件: 【GUI软件】小红书搜索结果批量采集,支持多个关键词同时抓取! 【GUI软件】小红书详情数据批量采集,含笔记内容、转评赞藏等,支…

用大于meilisearch-java-0.7.0.jar的报错的解决

Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求,极快,单文件,超轻量。 所以,对于中小型项目来说…

数组元素翻倍C++

编写一个 C 程序&#xff0c;实现一个功能&#xff0c;即将数组中的每个元素值翻倍。程序应定义一个函数 doubleArray&#xff0c;该函数接收一个整数数组的指针和数组的大小&#xff0c;然后将数组中的每个元素都翻倍。 代码 #include <iostream>void doubleArray(int…

Rust使用HashSet对Vec类型的元素进行去重

在Rust语言中&#xff0c;对Vec类型的元素进行去重&#xff0c;一种常见的方法是使用一个HashSet来帮助我们快速检查元素是否已经存在。以下是使用HashSet对Vec进行去重的示例代码&#xff1a; use std::collections::HashSet;fn main() {let vec_numbers vec![1, 2, 2, 3, 4…

Softing工业推出的edgeConnector将Allen-Bradley控制器集成到工业边缘应用中

2024年4月17日&#xff08;哈尔&#xff09;&#xff0c;Softing宣布扩展其基于Docker的edgeConnector产品系列&#xff0c;推出了新软件模块edgeConnector Allen Bradley PLC&#xff0c;可方便用户访问来自ControlLogix和CompactLogix控制器数据。 &#xff08;edgeConnector…

i春秋-Test

题目 解题 参考WP https://blog.csdn.net/qq_40654505/article/details/107142533/目录扫描 复现wp payload为&#xff1a; search.php?searchtype5&tid&areaeval($_POST[cmd])使用蚁剑连接 http://eci-2ze4iyhwj7xvb68bsb2t.cloudeci1.ichunqiu.com:80/search.ph…

TikTok机房ip好还是住宅ip好?

住宅ip比较好&#xff0c;机房数据中心IP高效、低价&#xff0c;所以使用的人多且用处复杂&#xff0c;这类ip极大可能存在滥用的黑历史&#xff0c;通过此类ip访问tiktok&#xff0c;被禁止的可能性更高&#xff0c;更容易被拉入黑名单。所以我们推荐tiktok独享原生ip搭建节点…

AI写作推荐-写文ai-AI在线写作生成器-3步完成写作任务

AI写作利器&#xff1a;推荐几款神助攻文案创作工具 随着技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;已达到高级水平&#xff0c;在众多领域展现其强大能力。 在文本创作的领域&#xff0c;人工智能&#xff08;AI&#xff09;应用已显著地提升了写作效率和创意…

java--io流(二)

一、打印流&#xff08;PrintStream[字节]、PrintWriter[字符]&#xff09; &#xff08;基本上可以代替前面所学的字节、字符输出流&#xff09;&#xff0c;二者关于打印数据功能相同&#xff08;都方便且高效&#xff09;&#xff0c;但是关于数据写出不同&#xff0c;前者…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我们都知道&#xff0c;嵌入式应用一般都是为了某一个特定应用而存在的。也就是说&#xff0c;和pc不同&#xff0c;这个嵌入式板子一般都是为了解…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡&#xff0c;以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益&#xff0c;以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…

Android解放双手的利器之ViewBinding

文章目录 1. 背景2. ViewBinding是什么3. 开启ViewBinding功能4. 生成绑定类5. 使用ViewBinding5.1Activity 中使用5.2 Fragment 中使用5.3 ViewHolder 中使用 6. ViewBinding的优点7. 与 dataBinding 对比 1. 背景 写代码最繁琐的是什么&#xff1f;重复的机械操作。我们刚接…

Docker搭建ctfd平台

安装docker和docker-compose &#xff08;1&#xff09;安装docker&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun&#xff08;2&#xff09;安装 Docker Compose&#xff1a; yum install docker-compose安装失败参考下面文章 https:/…

二叉搜索树模拟实现

目录 认识二叉搜索树&#xff1a; 模拟实现&#xff1a; 节点结构体构建&#xff1a; insert&#xff08;插入&#xff09;: find&#xff08;查找&#xff09;&#xff1a; erase&#xff08;删除&#xff09;&#xff08;重点&#xff09;&#xff1a; 全部代码 认识二叉…

第十一讲:指针(3)

第十一讲&#xff1a;指针&#xff08;3&#xff09; 1.字符指针变量1.1存储一个字符1.2存储一个字符串1.3一个有趣的面试题 2.数组指针变量2.1什么是数组指针变量2.2数组指针变量的初始化 3.二维数组传参的本质4.函数指针变量4.1介绍函数指针变量4.2 两段有趣的代码4.2.1代码1…

内容安全(AV)

防病毒网关&#xff08;AV&#xff09;简介 基于网络侧 识别 病毒文件&#xff0c;工作范围2~7层。这里的网关指的是内网和外网之间的一个关口&#xff0c;在此进行病毒的查杀。在深信服中就有一个EDR设备&#xff0c;该设备就是有两种部署&#xff0c;一个部署在网关&#xf…