层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...

点击上方“蓝字”,关注我们吧!3b422f3a309b1cf1e6bba82775965fba.pngd71ddbc58bba2631926cddf52a5468c0.gif

目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3]、视 频分析[4] 等各种视觉应用的先决条件. 

近些年, 伴随着深度卷积神经网络的充分发展[5] 以及良好的数据集注释先验工作的积累[6] , 物体检测器 的性能得到了显著提高. 但是, 物体检测过程中的尺度变化仍然是所有检测器的关键挑战, 为了识别不同尺 度的物体, 早期大多数的检测器都是基于手工制作的 特征[7] , 并且利用图像金字塔. 考虑到内存和检测时间, 这些工作无论在计算还是花费上都是昂贵的. 得益于 卷积神经网络的发展, 手工设计的特征已逐渐被卷积 神经网络计算的特征所取代. 最近的检测系统[8,9] 利用 卷积神经网络 (ConvNets) 在单个输入尺度图像依次进 行运算, 获得不同尺度的特征图, 然后用最顶层特征图 来预测具有不同尺度和纵横比的候选边界框. 然而, 最 顶部的特征图具有固定的感受野, 与自然图像中的不 同尺度的物体冲突. 特别是小物体在最顶层上几乎没 有信息, 因此可能会损害物体检测性能, 尤其是小物体.

信息, 因此可能会损害物体检测性能, 尤其是小物体. 在解决多尺度问题方面, SSD 利用从下到上的特 征金字塔来适应各种尺寸的物体, 然而, SSD 算法的特 征金字塔形式未能利用深层特征图中强大的语义信息, 这对于小物体检测至关重要. 因为语义信息对于检测 视觉上困难的物体 (例如小的, 遮挡的物体) 是决定性 的, 为了克服 SSD 的缺点并使网络对对象尺度更加稳 健, 最近的工作 (例如 FPN[9] , DSSD[10] , RON[11] ) 建议将 低分辨率带有强语义信息的特征图同具有高分辨率但 带有弱语义弱信息的特征图通过自上而下的通道横向 连接. 

与 SSD 中的自下而上的方式相比, 横向连接将 语义信息一个接一个地传递到浅层, 从而增强了浅层 特征的检测能力. 与传统检测器相比, 这些网络在精度 方面有着显著的提高. 但是我们注意到这些在最顶层 特征图中使用反卷积层的方法完全丢失了小物体的精 细细节. 本文致力于提高小物体的检测性能, 缓解 SSD 算法的尺度变化问题, 同时又不失实时检测速度. 通常, 较深层中的深层特征对于分类子任务更具辨别性, 而 较浅层中的浅层特征则对于物体位置回归子任务更有 利. 

此外, 浅层特征更适合于具有简单外观的特征对象, 而深层特征适用于具有复杂外观的对象. 基于此, 本文 通过特征融合模块将具有语义信息的深层特征添加到 浅层特征中, 以获得具有丰富信息的特征图, 将来自不 同层次的不同尺度的特征图投影并连接在一起, 然后 用 BN[12] 层进行归一化处理, 最后附加下采样层以生 成新的特征金字塔, 此外, 添加了感受野模块 (RFM), 以加强从轻量级 CNN 模型中学到的深层特征, 使它们 有助于检测器快速准确. 与传统 SSD 相比, 本文算法 RF_SSD 主要选择 VGG16 作为骨干网络, 而不是更深 层次的 ConvNets (例如 ResNet[13] 或 DenseNet[14] ), 原 因是深层卷积神经网络 (ConvNets) 虽然对特征提取有 利但会加大计算量同时降低检测速度, 实验表明本文 所提出的结构在精度上比 SSD 算法有所提升. 

本文的 贡献主要表现为以下几点:

(1) 提出了新颖的、轻量级的特征融合方式, 主要 是将不同层的特征图合并, 并生成特征金字塔, 降低了 重复检测一个对象的多个部分或者多个对象合并到一 个对象的检测概率, 同时小物体检测表现更好.

(2) 借鉴混合空洞卷积和 Inception 结构, 设计并添 加感受野模块来增强网络的特征提取能力, 同时在不 增加卷积参数的前提下增大卷积感受野, 加强轻量级 卷积神经网络学到的深层特征, 保证检测器的实时性. 

(3) 在 PASCAL VOC 数据集上进行了定性与定量 的实验, 结果表明, 同传统 SSD 算法相比, 本文所提出 的算法在目标检测性能上有显著的提升, 同时以相对 低的速度损耗提高了小物体的准确率. 

1   相关工作

在目标检测算法研究中, 无论是在单阶段检测器 还是两阶段检测器中, 相关研究者都投入了大量的工 作来改善目标检测中的尺度变化问题, 大致可分为两 种策略. 一种是图像金字塔, 通过图像的尺度变化来产 生具有语义代表性的多尺度特征, 然后用来自不同尺 度的图像的特征分别产生预测, 最后将这些预测放在 一起进行评估以给出最终预测. 在识别精度和定位精 度方面, 来自多尺寸图像的特征确实超越仅基于单尺 度图像的特征. 诸如 OHEM[15] 和 SNIP[16] 之类的方法 都采用了这种策略. 虽然性能得到了提升, 但这种策略 在时间和内存方面花销很大, 所以在实时任务中很难 得到应用. 另一种是利用网络内的特征金字塔以较低 的计算成本来模拟图像金字塔. 该策略比第一个策略 需要的内存和计算成本要少得多, 从而可以在实时网 络的训练和测试阶段中进行使用. 此外, 特征金字塔构 建模块可以很容易地修改, 并应用在最先进的基于深 度神经网络的探测器. MS-CNN[17] , SSD[8] , DSSD[10] , FPN[9] , YOLOv3[18] , RetinaNet[19] 和 RefineDet[20] 以不 同的方式采用了这种策略. 

此外, MS-CNN[17] 提出了两个子网络, 并首先将多 尺度特征结合到用于物体检测的深度卷积神经网络中. 提议子网利用几种分辨率的特征图来检测图像中的多尺度物体. SSD 利用 VGG16 网络的后几层的特征图和 额外特征层进行多尺度预测. FPN 将高层特征与低层 特征相结合, 由最近邻居上采样和横向连接实现. DSSD 实现了反卷积层, 用于聚合上下文和增强浅层特征的 高级语义信息, RefineDet[20] 采用了两步级联回归, 在 保持 SSD 效率的同时, 在准确性方面取得了显著提高.

2   RF_SSD 算法 

本节将在 SSD 框架基础上, 分析算法涉及到的特 征融合处理、感受野模块的设计以及算法的具体处理 过程.

S SD 采用不同尺度的特征图来检测物体,  以 VGG16[21] 作为骨干网络, 采用级联卷积的方式生成不 同尺度的特征图, 结合 YOLO 的回归思想和 FasterRCNN 的 Anchor 机制, 使用全图各个位置的多尺度区 域特征进行回归, 既保证检测速度又保持了精度. 同时 在对特征图预测时, 采用卷积核来预测一系列 Default Bounding Boxes 的类别和坐标偏移. 

由于小物体不会在浅层中丢失太多的位置信息, 并且大物体也可以在较深层中很好地定位和识别, 所 以 SSD 算法使用浅层特征图检测小物体, 深层特征图 检测大物体这种策略是合理的, 但问题是由浅层产生 的小物体的特征缺乏足够的信息, 这将导致小物体检 测性能的不良. 此外, 小物体也严重依赖于上下文信息, SSD 网络结构如图 1 所示.

3323a1b11cabfc679952be8d028f8909.png

2.1 特征融合 (Feature Fusion) 

针对传统 SSD 算法缺点, FPN 和 DSSD 利用顶层 特征的反卷积层, 经过验证, 这种方法可以大大提高传 统探测器的性能, 但却需要多个功能合并过程. 而且右 侧的新特征只能融合相应的左侧和更高层级的特征[9,10] . 

此外, 潜在特征和大量特征的 element-wise process 过程也会消耗大量时间. 基于此, 本文提出了一种轻量 级和高效的特征融合模块来处理这项任务. 本文的动 机是以适当的方式一次融合不同级别的特征, 并从融 合特征生成特征金字塔. 传统的 SSD300 是基于 VGG16 的, 作者选择 Conv4_3, FC7 和新添加的 Conv8_2, Conv9_2, Conv10_2, Conv11_2 层特征图进行检测. 相应的特征图的大小为 38×38, 19×19,10×10,5×5,3×3 和 1×1. 本文认为大小小于 10×10 的特征图太小而几乎没有要合并的信息, 所以本文先 将 Conv8_2 的 stride 设为 1, 这样 Conv9_2 的大小为 10×10, 然后本文选择 Conv4_3, Conv9_2 融合为新的 特征图, 增强了浅层特征的语义信息, 同时也有很强的 几何细节信息表征能力. 在传统的处理方法中, 主要有两种方法合并不同 的特征图: concatenation 及 element-wise summation. Element-wise summation 要求特征图的通道相同, 这意 味着我们必须将特征图转换为相同的通道. 

由于此 要求限制了融合特征图的灵活性, 所以我们选择用 concatenation 方式. 为了使 Conv4_3, Conv9_2 融合为 新的特征图, 需对 Conv9_2 进行上采样处理. 如图 2 所 示, 首先使用大小为 2×2, 通道数为 256 的反卷积核进 行上采样, 将输出通过 3×3 的卷积核映射至 BN 层, 然 后再到下一个反卷积核. Con4_3 通过 1×1 的卷积核直 接映射输出至 BN 层. 最终将 Conv4_3 通过 1×1 卷积 层的输出与 Con9_2 经过两层反卷积层的输出进行 concat 操作, 之后传入至 ReLU 层, 再通过 L2 Normalization 层做归一化处理, 同时增加模型的鲁棒性.

703bfc16fcfaa44171f32fd634188faa.png

2.2 感受野模块 

本模块采用多支路卷积形式, 其内部结构可以分 为两个部分: 多支路卷积层和空洞卷积层. 多支路卷积 层的结构和 Inception 相同, 模拟不同尺寸的感受野, 空 洞卷积层利用空洞卷积模拟不同尺寸感受野之间的关系[22] . 在卷积神经网络中, 卷积核的感受野大小和卷积 核的尺寸成正相关, 通过改变卷积核的尺寸可以获得 不同大小的感受野, 进而更加有效的利用特征信息. 本 文的设计借鉴了 Inception-V4 和 Inception -ResNet[23] , 结构如图 3 所示, 首先在每个分支结构中使用 1×1 的 卷积层, 减少特征图中通道数量, 用 2 个连续的 3×3 Conv 替代 Inception 模块中的 5×5 Conv, 从而实现网 络深度的增加, 之后将原有 3×3 的卷积核分解成两个 一维的卷积核 (1×3 和 3×1), 目的是加速计算, 同时网 络宽度增加, 增加了网络的非线性. 除此之外, 为了保 留更多的原始特征信息, 增加了一条剪接支路.

a837c5b41c1e3f3297b6895a99f40c78.png

本算法感受野模块结构上借鉴了混合空洞卷积和 Inception, 混合空洞卷积 (hybrid dilated convolution) 由文献 [24] 提出, 通过叠加多个不同空洞率的空洞卷 积来避免网格效应和平衡不同尺寸感受野之间的关系, 解决了传统卷积神经网络采用池化层所造成的内部数 据结构遗失和小物体信息无法重建等问题, 同时协调 多支路卷积, 在很好的结合多支路卷积的同时提高了 算法的检测效率.

2.3 算法结构 

本文算法是以 SSD 算法框架为基础构建的, 提出 新的特征融合模块来充分利用深层的特征信息以此提 高算法的检测精度, 同时改善小物体检测的效果, 另外, 通过在特征提取网络上添加感受野模块来提高特征的 提取能力. 无论特征融合模块还是感受野模块都比较 简单, 所以在极大程度上保留了 SSD 原有的网络结构, 保证了检测速度. 

整体的算法结构如图 4 所示, 骨干网 络采用 VGGNet, 先对 Con9_2 层特征图进行尺寸调整, 后将调整尺寸后的 Con9_2 层特征图与 Con4_3 层特 征图传入 Feature Fusion 模块产生新特征图, 经 BN 层 后, 通过一系列下采样形成特征金字塔, 同时加入感受 野模块. 具体描述如下: 

第一是将 Conv8_2 的 stride 设 为 1, 这样 Conv9_2 的大小为 10×10, 然后使用两层反 卷积核对 Conv9_2 进行上采样处理. 之后将输出和经 过 BN 层的 Conv4_3 进行 concat 操作, 之后传入至 ReLU 层, 再通过 L2Normalization 层做归一化处理. 

第二, 对 新得到的特征图进行下采样 (包含一些 1×1 和 stride 为 2 的 3×3 的卷积层来改变通道数和特征图的大小), 形成新的特征金字塔, 同时利用新添加的感受野模块 对新的特征信息进行检测. 第三, 用 RFM 替换掉中间 两层卷积层, 考虑到最后两个卷积层的尺寸, 将最后两 层保持不变.

1019462e2718e50752477e802d274aab.png

cd03889cdd4d36904798d813c09630fc.png

b4d45ee8166ac88f16a41b34c01a19ed.png

3   实验分析

3.1 数据增强 

在进行训练之前, 可先通过数据增强的方式对数 据进行预处理, 以此提高数据集的多样性, 使模型有更 高的鲁棒性. 常用的数据增强方式如随机翻转、缩 放、颜色变化和裁剪等. 通过将数据增强方式应用到 训练当中, 可使模型学到旋转不变性和对称不变性. 

3.2 网络训练策略 

本文算法采用与 SSD 算法相似的训练策略, 都是 使用训练好 VGGNet 网络, 本文使用 PASCAL VOC 2007 和 PASCAL VOC 2012 数据集, 同时把与真实框 (ground truth) 的交并比 (IOU) 大于 0.5 的预测框认为 是正样本. 采用平均精度 (mAP) 作为评测算法性能的 度量, 帧速 (Frame Per Second, FPS) 作为目标检测速度 的评价指标. 训练阶段将输入图像的大小设为 300×300 像素. 

训练时, 我们用 VOC 2007 trainvaland VOC2012 trainval (VOC07+12) 的联合数据集训练, 在 VOC 2007 test 测试集上测试. 本文的硬件环境为深度学习框架 Caffe, ubuntu16.04 系统, GPU 显卡型号为 NVIDIA 1080Ti, Batch size=16, 初始学习率设定为 0.001, max_epoch 设置为 180 K, 然后在步骤 100 K, 140 K 和 180 K 除以 10. 将权重衰减设置为 0.0005. 和 SSD 算法 一样采用动量为 0.9 的 SGD 来优化本文算法.

3.3 PASCAL VOC2007 测试结果分析 

PASCAl VOC 是一个用于物体分类识别和检测的 标准数据集, 该数据集包括 20 个类别, 表 1 为 PASCAl VOC 具体类别.

110586d4552cb8a6e06c1ff244bcd048.png

不同目标检测算法在精度和速度上的分布如图 5 所示, Faster-RCNN, R-FCN, YOLOv2, DSOD, RSSD, DSSD 算法是在 Titan X GPU 上进行测试的, 而 SSD 和本文提出的算法是在 1080 Ti GPU 上测试的. 从图 5 中也可看出本文的算法在检测速度和精度上有着一定 的优势.

345cdeca5e9b777f2ab407756d8a396c.png

本文将传统的 SSD 算法和 RF_SSD 算法在每一 类目标检测的精度上进行比较, 结果如表 3 所示. 从表 中可知, 飞机, 自行车, 鸟, 船, 瓶子, 公交车等类别都有 显著的提升, 其中, 瓶子, 盆栽的检测精度较低, 虽然得 益于本文提出的网络结构, 相比于传统的 SSD 算法, 精确度有所提升, 但因物体相比于其他类别太小, 特征 提取较少, 导致相应检测精度不高. 

但总体来说, 本文 算法相比于 SSD 算法 mAP 提高了 2.7%, 基本满足实 际需求, 同时也论证了本文算法思想的可行性. 同时本文对比了感受野模块对算法检测结果的影 响 (参见表 4), 通过实验可知添加感受野模块可提高算 法的准确率, 说明感受野对算法性能有一定的提升, 同 时由于感受野模块采用多个支路卷积, 提高了模型的 复杂度, 所以导致检测速度降低.

5a842a567645ab79ca21148357552513.png

96e691ebd79d1eabefa93413d7c53f0e.png

最后本文分析了不同卷积层融合后的结果, 结果 如表 5, 若融合 Conv3_3, Conv4_3, 和 Conv9_2, 则在 VOC2007 的 mAP 为 79.8%, 若去掉 Conv3_3, 则 mAP 为 80.2%, 表明 Conv3_3 对检测器的结果并没有 太大的影响, 原因在于 Conv3_3 卷积层提取的特征图 包含较多的背景噪声. 此外, 本文从 COCO 数据集中随 机挑选了几张照片, 测试结果如图 6 所示.

115ef6e24b05b23490bfabf43e0a9658.png

4   结论 

本文基于 SSD 算法, 提出了一种新颖高效的目标 检测算法, 通过将不同层的特征图以轻量级的方式融 合在一起, 使新的特征图既有深层特征的语义信息, 同 时又有高分辨率, 然后采用下采样层生成特征金字塔, 之后设计添加感受野模块, 提高网络的特征提取能力, 提高了算法的整体精度, 也改善了小目标的检测效果. 本文的算法在精度上超越了传统 SSD 算法以及一系 列其他目标检测算法, 由于添加感受野模块, 增加了网 络特征的提取能力, 增加了精度, 但加深了深度和模型 复杂度, 导致检测速度降低, 虽以速度换取精度, 但基 本满足实时检测要求. 和大多数单阶段目标检测结构 一样, 本算法类别不平衡问题依旧未能得到解决. 未来, 将继续改进该算法, 使用 anchor-free 模型方法或进一 步修改目标损失函数改善类别不平衡问题, 设计轻量 型的特征提取和融合网络结构, 在不降低精度的同时 提高速度.

本文转载《计算机系统应用》期刊 2020年第29卷第9期

155f06ea2715bec6cf97498d9dbe0c21.png

关注我们公众号,还可以获得PS AI等工具包哦~

b86ee2b6f3fd3d34cbca0d9dd0a6cde3.gif

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

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

相关文章

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心,实践应用 Ant Design Blazor 和 FreeSql 两个技术, 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦,对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version,获取JDK版本…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言:从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用,我们在进行FPGA外设硬件及软件设计时,如ADC、PHY、DDR3等,通常会涉及到该资源。本节我们介绍以下知识点:SelectIO资源概述及结构SelectIO管脚通用设…

IdentityServer4系列 | 混合模式

一、前言在上一篇关于授权码模式中, 已经介绍了关于授权码的基本内容,认识到这是一个拥有更为安全的机制,但这个仍然存在局限,虽然在文中我们说到通过后端的方式去获取token,这种由web服务器和授权服务器直接通信,不需要经过用户的…

3m格式的文件怎么转换成mp3_一招就能让PDF与其他格式文件相互转换,这样的大招你值得拥有...

大家都知道,现在不少的大佬比起用Word、Excel等等这些格式文件,它们更喜欢使用PDF文件。而我们不管是将Word、Excel等文件转换成PDF,还是将PDF转换成其他格式文件,都是一件麻烦事,更别说在手机上操作这一切了。别担心&…

如何使用 C# 中的 Tuple

开局一张图,首先声明的是 Tuple 不是什么新鲜概念,在编程语言 F#,Python 中早就有这个了,Tuple 是一种 有序的,有限不可变的,支持混杂类型的固定个数的 一种数据结构,有些朋友可能就想问了&…

中设置colorbar_【值得收藏】如何画出学术论文中需要的各种精美插图,看这一篇就够了!...

本文整理自知乎问答,仅用于学术分享,著作权归作者所有。如有侵权,请联系后台作删文处理。方法一作者|冯昱尧https://www.zhihu.com/question/21664179/answer/18928725强烈推荐 Python 的绘图模块 matplotlib: python plotting 。…

GraphQL:Descriptor Attributes

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进&#xff0c…

idea怎么把代码放到git_在IDEA中如何初始化Git,把项目推送到Git上

在IDEA中如何初始化Git,把项目推送到Git上登录Gitee(码云)账号,新建仓库先按如下步骤简单新建一个仓库:创建成功后,会出现下图中所示的原始文件:在IDEA上的Terminal中进行操作注意:可能有些朋友刚打开Termi…

大会线上同步直播, 来不到现场也可以线上看直播,以及参会秘籍

紧急提醒:还有1天!2020.NET开发者大会就要开幕啦!你都做好参会准备没有?特殊时期,为方便小伙伴们顺利参会,小编特意整理了这篇大会参会攻略,大到各种日程安排、小到签到、出行、防疫等&#xff…

大曾幽默打油诗_这才是真正的幽默打油诗,逗人一笑,又引人深思!

阅读本文前,请您先点击上面的蓝色字体“点点星光”,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享。完全是免费订阅,请放心关注来源:诗词天地大曾 ,曾初良,也乐斋主&#xff0c…

编程去除背景绿幕抠图,基于.NET+OpenCVSharp

摘要:本文介绍了一种使用OpenCVSharp对摄像头中的绿幕视频进行实时“抠人像、替换背景”的方式,对于项目中的算法进行了分析。本文中给出了简化OpenCVSharp中Mat、MatExpr等托管资源释放的方法。本文还介绍了“高效摄像头播放控件”以及和OpenCVSharp的性…

.NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

2.2.1 核心模块--依赖注入什么是依赖注入.NET Core DI 生命周期服务设计服务范围检查ASP.NET Core 依赖注入:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/dependency-injection?viewaspnetcore-5.0什么是依赖注入Dependency injection 依赖注入Inv…

vue ref 绑定的事件需要移除吗_Vue易遗忘的基础复习(二)

数据请求Vue-resource请求在Vue2.0之后已经被舍弃2. fetch请求因为传统 Ajax (指 XMLHttpRequest)存在一些令人头疼的问题:配置和调用方式非常混乱,而且基于事件的异步模型写起来也没有现代的 Promise,generator/yield…

如何在 ASP.NET Core 中使用 API 分析器

ASP.NET Core 2.2 引入了 API 分析器,它有利于提高 API 的文档化,API分析器 可以应用在任何带有 ApiController 特性的 Controller 上,本篇就和大家一起讨论下。安装 API 分析器 如果你使用的是 ASP.NET Core 2.2 的话,用 Visual …

.net mysql字符串截取_【MySQL】字符串截取之SUBSTRING_INDEX和【MySQL】字符串四则运算...

substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子:strwww.google.com1.count是正数,那么就是从左往右数,第N个分隔符的左边的全部内容SELECT SUBSTRING_INDEX(www.google.com,.,1);结果是:wwwSELEC…

用C#+Selenium+ChromeDriver 爬取网页,完美模拟真实的用户浏览行为

背景Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。而对于爬虫来说,使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀手武器。这里,我将介绍selenium 谷歌浏览器的一般使…

ASP.NET Core ActionFilter引发的一个EF异常

最近在使用ASP.NET Core的时候出现了一个奇怪的问题。在一个Controller上使用了一个ActionFilter之后经常出现EF报错。InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guarante…

BCVP开发者说第5期:QuartzCore.Blazor

沉静岁月,淡忘流年1项目简介QuartzCore.BlazorQuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心,实践应用 Ant Design Blazor 和 FreeSql 两个技术, 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦,对有…

mysql update返回_MySQL中,当update修改数据与原数据相同时会再次执行吗?

本文同步Java知音社区,专注于Java作者:powdbahttps://yq.aliyun.com/articles/694162一、背景本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗?二、测试…