标题:You Only Look Once: Unified, Real-Time Object Detection
会议:CVPR2016
论文地址:http://ieeexplore.ieee.org/document/7780460/
官方代码:http://pjreddie.com/yolo/
作者单位:华盛顿大学、艾伦AI研究所、FAIR

文章目录

  • Abstract
  • 1. Introduction
  • 2. Unified Detection
    • 2.1. Network Design
    • 2.2. Training
    • 2.3. Inference
    • 2.4. Limitations of YOLO
  • 3. Comparison to Other Detection Systems
  • 4. Experiments
    • 4.1. Comparison to Other Real-Time Systems
    • 4.2. VOC 2007 Error Analysis
    • 4.3. Combining Fast R-CNN and YOLO
    • 4.4. VOC 2012 Results
    • 4.5. Generalizability: Person Detection in Artwork
  • 5. Real-Time Detection In The Wild
  • 6. Conclusion

Abstract

我们提出了YOLO,一种新的目标检测方法。先前的目标检测工作对分类器稍加修改来执行检测。取而代之的是,我们将目标检测表示为空间上分离的边界框的回归问题和与之相关的类别概率。单个神经网络在一次评估中直接从整个图像中预测边界框和类别概率。由于整个检测pipeline是一个单一的网络,因此可以直接对检测性能进行端到端的优化。
我们的统一结构速度极快。我们的基础YOLO模型可以以每秒45帧的速度实时处理图像。该网络的一个较小的版本,Fast YOLO,以惊人的每秒155帧的速度运行,同时还达到了其它实时检测器mAP的两倍。与SOTA的检测系统相比,YOLO会产生更多的定位错误,但将背景预测成假阳性的可能性更小。最后,YOLO学习到的目标表示非常general。当从自然图像泛化到艺术品等其它领域时,它都优于包括DPM和R-CNN在内的其它检测方法。

1. Introduction

人类扫视一幅图像,立刻知道图像中的目标是什么,它们在哪里,以及它们是如何交互的。人类的视觉系统是快速和准确的,使我们用很少的意识就能够执行复杂的任务,比如驾驶。快速、准确的目标检测算法将使计算机能够在没有专门传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时的场景信息,并释放通用、响应性的机器人系统的潜能。
目前的检测系统都是对分类器稍加修改来进行检测。为了检测一个目标,这些系统对其采用分类器,并在测试图像的不同位置和尺度上对其进行评估。像可变形部件模型(deformable parts models,DPM)这样的系统使用滑动窗口方法,其分类器在整个图像均匀间隔的位置上运行。
最近的方法如R-CNN使用区域建议方法首先在图像中生成潜在的边界框,然后在这些边界框上运行分类器。分类完成后,利用后处理对边界框进行细化,剔除重复检测,并基于场景中的其它目标对边界框重新评分。这些复杂的pipeline是缓慢且难以优化的,因为每个单独组件都必须单独训练。
我们将目标检测重新表示为单个回归问题,直接从图像像素到边界框坐标和类别概率。使用我们的系统,一幅图像你只需看一遍(YOLO),就可以预测有哪些目标以及它们在哪里。

YOLO简单得令人耳目一新:见图1。单个卷积网络同时预测多个边界框和这些框的类别概率。YOLO在整个图像上进行训练,直接优化检测性能。这种统一的模型与传统的目标检测方法相比有很多优点。
第一,YOLO速度极快。因为我们将检测表示为一个回归问题,所以我们不需要复杂的pipeline。我们只需在测试时在新的图像上运行我们的神经网络来预测检测。我们的基础网络在Titan X GPU上没有批处理以每秒45帧的速度运行,快速版本的运行速度超过150 fps。这意味着我们可以以小于25毫秒的延迟实时处理流式视频。此外,YOLO达到了其它实时系统平均精度的两倍以上。
第二,YOLO在做预测时对图像进行全局推理。与基于滑动窗口和区域建议的技术不同,YOLO在训练和测试期间看到整个图像,因此它隐式地编码了关于类别及其外观的上下文信息。Fast R-CNN是一种顶级的检测方法,由于无法看到较大的上下文,会将图像中的背景块误判为目标。与Fast R-CNN相比,YOLO的背景误差数量不到一半。
第三,YOLO学习目标的通用表示。当在自然图像上训练然后在艺术品上测试时,YOLO比DPM和R-CNN等顶级检测方法有更大的优势。由于YOLO是高度可泛化的,当应用于新领域或非预期输入时,YOLO不太可能崩溃。
YOLO在准确率上仍然落后于SOTA检测系统。虽然它可以快速地识别图像中的目标,但它难以精确地定位一些目标,特别是小目标。我们在实验中进一步检验了这些权衡。

2. Unified Detection

我们将目标检测的各个组成部分统一到单个神经网络中。我们的网络使用来自整个图像的特征来预测每个边界框。它同时预测图像中所有类别的所有边界框。这意味着我们的网络对整个图像和图像中的所有目标进行全局推理。YOLO的设计可以实现端到端训练和实时速度,同时保持高的平均精度。
我们的系统将输入图像划分成 S × S S×S S×S的网格。如果一个目标的中心落入一个网格单元中,则该网格单元负责检测该目标。
每个网格单元预测 B B B个边界框以及这些框的置信度。这些置信度反映了模型对框包含目标的信心程度,也反映了模型认为框预测的准确性。形式上,我们将置信度定义为 P r ( O b j e c t ) ∗ I o U p r e d t r u t h \mathrm{Pr}(\mathrm{Object})*\mathrm{IoU_{pred}^{truth}} Pr(Object)∗IoUpredtruth​。如果该单元格中不存在目标,则置信度应为零。否则我们想要置信度等于预测框与真值之间的交并比(IoU)。
每个边界框由5个预测组成: x x x、 y y y、 w w w、 h h h和置信度。 ( x , y ) (x,y) (x,y)坐标表示框中心相对于网格单元边界的位置。宽度和高度是相对于整个图像预测的。最后,置信度预测表示预测框和任一真值框之间的IOU。
每个网格单元还预测 C C C个条件类别概率 P r ( C l a s s i ∣ O b j e c t ) \mathrm{Pr}(\mathrm{Class}_i|\mathrm{Object}) Pr(Classi​∣Object)。这些概率是以网格单元包含一个目标的为条件的。我们只预测每个网格单元的一组类别概率,而不考虑框的个数 B B B。
在测试时,我们将条件类别概率和单个框的置信度预测相乘:
P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I o U p r e d t r u t h = P r ( C l a s s i ) ∗ I o U p r e d t r u t h (1) \mathrm{Pr}(\mathrm{Class}_i|\mathrm{Object})*\mathrm{Pr}(\mathrm{Object})*\mathrm{IoU_{pred}^{truth}}=\mathrm{Pr}(\mathrm{Class}_i)*\mathrm{IoU_{pred}^{truth}}\tag{1} Pr(Classi​∣Object)∗Pr(Object)∗IoUpredtruth​=Pr(Classi​)∗IoUpredtruth​(1)这给了我们每个框具体类别(class-specific)的置信度。这些分数既编码了该类别在框中出现的概率,也编码了预测框与目标的拟合程度。

对于在PASCAL VOC上评估YOLO,我们使用 S = 7 S=7 S=7, B = 2 B=2 B=2。PASCAL VOC有20个标签类别,因此 C = 20 C=20 C=20。我们最终的预测是一个 7 × 7 × 30 7×7×30 7×7×30的张量。

2.1. Network Design

我们将此模型实现为一个卷积神经网络,并在PASCAL VOC检测数据集上进行评估。网络最初的卷积层从图像中提取特征,而全连接层则预测输出概率和坐标。
我们的网络结构受用于图像分类的GoogLeNet模型的启发。我们的网络有24个卷积层和2个全连接层。与NIN类似,代替GoogLeNet使用的inception模块,我们简单地使用1×1缩减层和3×3卷积层。完整的网络如图3所示。
我们还训练了一个快速版本的YOLO,旨在推动快速目标检测的边界。Fast YOLO使用的神经网络具有更少的卷积层(9而不是24)并且这些层中的滤波器更少。除了网络大小之外,YOLO和Fast YOLO之间所有的训练和测试参数都相同。

我们网络的最终输出是 7 × 7 × 30 7×7×30 7×7×30的预测张量。

2.2. Training

我们在ImageNet 1000-class竞赛数据集上预训练卷积层。对于预训练,我们使用图3中的前20个卷积层,然后是1个平均池化层和1个全连接层。
然后我们转换模型来进行检测。Ren等人的研究表明,在预训练网络中同时加入卷积层和全连接层可以提高性能。根据他们的例子,我们添加了4个卷积层和2个全连接层,并随机初始化权重。检测通常需要细粒度的视觉信息,因此我们将网络的输入分辨率从224×224提高到448×448。
我们的最后一层同时预测类别概率和边界框坐标。我们通过图像的宽度和高度对边界框的宽度和高度进行归一化,使它们落在0到1之间。我们将边界框的 x x x和 y y y坐标参数化为某一网格单元位置的偏移量,因此它们也限制在0到1之间。
我们对最后一层使用线性激活函数,所有的其它层都使用下面的leaky rectified线性激活:
ϕ ( x ) = { x , i f x > 0 0.1 x , o t h e r w i s e (2) \begin{align} \phi(x)=\left\{\begin{matrix} x,&\mathrm{if}~x>0\\ 0.1x,&\mathrm{otherwise} \end{matrix}\right. \end{align}\tag{2} ϕ(x)={x,0.1x,​if x>0otherwise​​(2)我们对模型输出的误差平方和进行优化。我们使用平方和误差,因为它易于优化,但它与我们最大化平均精度的目标并不完全一致。它将定位误差与分类误差等量加权,这可能并不理想。同时,在每幅图像中,许多网格单元不包含任何目标。这将使这些单元的“置信度”分数接近零,常常会压倒包含目标的单元的梯度。这会导致模型不稳定,造成训练过早发散。
为了纠正这一点,我们增加边界框坐标预测的损失,减少不包含目标的框的置信度预测的损失。我们使用两个参数 λ c o o r d \lambda_{\mathrm{coord}} λcoord​和 λ n o o b j \lambda_{\mathrm{noobj}} λnoobj​来实现。我们设置 λ c o o r d = 5 \lambda_{\mathrm{coord}}=5 λcoord​=5和 λ c o o r d = . 5 \lambda_{\mathrm{coord}}=.5 λcoord​=.5。
平方和误差也将大框和小框的误差等量加权。我们的误差度量应该反映出小框中的小偏差要比大框中的小偏差更重要。为了部分地解决这个问题,我们预测边界框宽度和高度的平方根,而不是直接预测宽度和高度。
YOLO为每个网格单元预测多个边界框。在训练时,我们只希望一个边界框预测器负责各自的目标。我们分配一个预测器来“负责”预测一个目标,基于谁的预测具有与真值最高的当前IoU。这将导致边界框预测器之间的专门化。每个预测器都能更好地预测目标的特定尺寸、纵横比或类别,提高整体召回率。
在训练过程中我们优化以下多部分损失函数:
λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C ^ i ) 2 + ∑ i = 0 S 2 I i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 (3) \lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{\mathrm{obj}}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2]+\lambda_{\mathrm{coord}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{\mathrm{obj}}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2]+\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{\mathrm{obj}}(C_i-\hat{C}_i)^2+\lambda_{\mathrm{noobj}}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{\mathrm{noobj}}(C_i-\hat{C}_i)^2+\sum_{i=0}^{S^2}\mathbb{I}_{i}^{\mathrm{obj}}\sum_{c\in{\mathrm{classes}}}(p_i(c)-\hat{p}_i(c))^2\tag{3} λcoord​i=0∑S2​j=0∑B​Iijobj​[(xi​−x^i​)2+(yi​−y^​i​)2]+λcoord​i=0∑S2​j=0∑B​Iijobj​[(wi​ ​−w^i​ ​)2+(hi​ ​−h^i​ ​)2]+i=0∑S2​j=0∑B​Iijobj​(Ci​−C^i​)2+λnoobj​i=0∑S2​j=0∑B​Iijnoobj​(Ci​−C^i​)2+i=0∑S2​Iiobj​c∈classes∑​(pi​(c)−p^​i​(c))2(3)其中, I i o b j \mathbb{I}_{i}^{\mathrm{obj}} Iiobj​表示单元 i i i中是否出现目标, I i j o b j \mathbb{I}_{ij}^{\mathrm{obj}} Iijobj​表示单元 i i i中的第 j j j个边界框预测器对那个预测“负责”。
注意,损失函数只惩罚网格单元中存在目标时的分类误差(因此前面讨论的是条件类别概率)。它也只惩罚部分边界框坐标误差,即如果该预测器是“负责”真值框的时候(即在该网格单元中具有与任何预测器相比最高的IoU)。
我们在Pascal VOC2007和2012的训练和验证数据集上把网络训练了大概135个epoch。当在2012上测试时,我们也把VOC2007测试数据包含在训练里面。整个训练过程中我们使用批大小为64,动量为0.9,衰减率为0.0005。
我们的学习速率安排如下:对于第1个epoch,我们将学习速率从 1 0 − 3 10^{-3} 10−3慢慢提高到 1 0 − 2 10^{-2} 10−2。如果我们以较高的学习速率开始,模型往往由于不稳定的梯度而发散。我们继续以 1 0 − 2 10^{-2} 10−2训练75个epoch,然后以 1 0 − 3 10^{-3} 10−3训练30个epoch,最后以 1 0 − 4 10^{-4} 10−4训练30个epoch。
为了避免过拟合,我们使用dropout和大量的数据增广。在第一个连接层之后加入rate=. 5的dropout层,防止层与层之间的协同适应。对于数据增广,我们引入了高达原始图像尺寸20%的随机缩放和平移。我们还在HSV颜色空间中随机调整图像的曝光度和饱和度至多1.5倍。

2.3. Inference

就像在训练时一样,为测试图像预测检测只需要一次网络评估。在Pascal VOC上,该网络预测每幅图像的98个边界框和每个框的类别概率。与基于分类器的方法不同,YOLO在测试时速度极快,因为它只需要一次网络评估。
网格设计在边界框预测中强制了空间多样性。通常一个目标落在哪个网格单元中很清楚,网络只为每个目标预测一个框。然而,一些较大的目标或靠近多个单元边界的目标可以被多个单元很好地定位。非极大值抑制可以用来解决这些多重检测。虽然非极大值抑制对于YOLO的性能影响不像对于R-CNN或DPM那样重要,但也能增加2−3%的mAP。

2.4. Limitations of YOLO

YOLO对边界框预测施加了强的空间约束,因为每个网格单元只预测两个框,并且只能有一个类别。这种空间约束限制了我们的模型可以预测的附近目标的数量。我们的模型对于出现在群体中的小目标表现艰难,比如鸟群。
由于我们的模型学习从数据中预测边界框,所以它很难泛化到新的或不寻常的纵横比或配置中的目标。我们的模型还使用相对粗糙的特征来预测边界框,因为我们的结构从输入图像开始有多个下采样层。
最后,当我们训练一个类似检测性能的损失函数时,我们的损失函数在小边界框和大边界框中对待误差是相同的。大框中的小误差通常是无害的,但小框中的小误差对IoU的影响要大得多。我们的主要误差来源是错误的定位。

3. Comparison to Other Detection Systems

目标检测是计算机视觉中的一个核心问题。检测pipeline通常从输入图像中提取一组鲁棒的特征开始(Haar、SIFT、HOG、卷积特征)。然后,分类器或定位器用于识别特征空间中的目标。这些分类器或定位器要么以滑动窗口的方式在整幅图像上运行,要么在图像中的某些区域子集上运行。我们将YOLO检测系统与几个顶级检测框架进行比较,突出关键的相似性和差异性。
可变形部件模型。 可变形部件模型(DPM)使用滑动窗口方法来进行目标检测。DPM使用拆开的pipeline来提取静态特征、分类区域、预测高分数区域的边界框等。我们的系统将所有这些不同的部件替换为一个卷积神经网络。该网络同时执行特征提取、边界框预测、非极大值抑制和上下文推理。代替静态特征,网络对特征进行在线训练,并为了检测任务对它们进行优化。我们的统一结构带来了比DPM更快更准确的模型。
R-CNN。 R-CNN及其变体使用区域建议代替滑动窗口来寻找图像中的目标。Selective Search生成潜在的边界框,卷积网络提取特征,SVM对框进行评分,线性模型调整边界框,非极大值抑制消除重复检测。这个复杂pipeline的每个阶段都必须精确地独立调优,由此产生的系统非常缓慢,在测试阶段每张图像需要40秒以上。
YOLO与R-CNN有一些相似之处。每个网格单元提出潜在的边界框,并使用卷积特征对这些框进行评分。然而,我们的系统对网格单元建议进行了空间约束,这有助于减少对同一目标的多个检测。我们的系统也提出了远远更少的边界框,每张图像只有98个,而Selective Search的结果是大约2000个。最后,我们的系统将这些单独的组件组合成一个单一的、联合优化的模型。
其它的快速检测器。 Fast和Faster R-CNN侧重于通过共享计算和使用神经网络生成区域建议来加速R-CNN框架,而不是Selective Search。虽然它们在速度和精度上都比R-CNN有所改进,但仍达不到实时的性能。
许多研究工作致力于加快DPM的速度。它们加速HOG计算,使用级联,并将计算放到GPU。然而,实时运行的DPM实际上只有30Hz。
YOLO没有试图优化大型检测pipeline的单个组件,而是将pipeline完全抛出,经过设计十分快速。
对于像人脸或人这样单个类别的检测器可以高度优化,因为它们必须处理更少的变化。YOLO是一个通用的检测器,学习同时检测多种目标。
Deep MultiBox。 与R-CNN不同,Szegedy等人训练一个卷积神经网络来预测感兴趣区域,而不是使用Selective Search。Deep MultiBox还可以通过将置信度预测替换为单类预测来进行单目标检测。然而,Deep MultiBox无法进行一般的目标检测,仍然只是一个较大的检测pipeline中的一部分,需要进一步的图像块分类。YOLO和Deep MultiBox都使用卷积网络来预测图像中的边界框,但YOLO是一个完整的检测系统。
OverFeat。 Sermanet等人训练了一个卷积神经网络来进行定位,并使用该网络进行检测。OverFeat有效地进行了滑动窗口检测,但仍然是一个拆开的系统。OverFeat优化的是定位性能,而不是检测性能。与DPM一样,定位器在做预测时只看到局部信息。OverFeat无法对全局上下文进行推理,因此需要进行大量的后处理才能产生一致的检测。
MultiGrasp。 我们的工作在设计上与Redmon等人在抓取检测方面的工作类似。我们的边界框预测网格方法基于MultiGrasp系统的回归抓取。然而,抓取检测是一项比目标检测简单得多的任务。对于包含一个目标的图像,MultiGrasp只需要预测一个可抓取区域。它不需要估计目标的大小、位置、边界或者预测其类别,只需要找到一个适合抓取的区域。YOLO同时预测图像中多个类别的多个目标的边界框和类别概率。

4. Experiments

4.1. Comparison to Other Real-Time Systems

和其它实时检测系统的比较,具体的实验结论可以参照原文。

4.2. VOC 2007 Error Analysis


YOLO的定位误差较大,但是背景误差更小,具体的实验结论可以参照原文。

4.3. Combining Fast R-CNN and YOLO


模型结合后效果更好,具体的实验结论可以参照原文。

4.4. VOC 2012 Results


在VOC2012上的结果,具体的实验结论可以参照原文。

4.5. Generalizability: Person Detection in Artwork



在艺术品等数据集上泛化能力很好,具体的实验结论可以参照原文。

5. Real-Time Detection In The Wild

实时检测能力很强,项目网站中可以连接网络摄像头演示,具体的实验结论可以参照原文。

6. Conclusion

我们引入了YOLO,一种用于目标检测的统一模型。我们的模型构建简单,可以直接在整幅图像上进行训练。与基于分类器的方法不同,YOLO是在一个与检测性能直接对应的损失函数上训练的,整个模型是联合训练的。
Fast YOLO是目前文献中速度最快的通用目标检测器,推动了实时目标检测的SOTA。YOLO也可以很好地推广到新的领域,使其对依赖快速、鲁棒目标检测的应用理想。

目标检测论文阅读:YOLOv1算法笔记相关推荐

  1. 2019 sample-free(样本不平衡)目标检测论文阅读笔记

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自知乎,已获作者同意转载,请勿二次转载 (原文地址:https://zhuanlan.zhihu.com/p/100052168) 背景 < ...

  2. 3D目标检测论文阅读摘要

    3D目标检测论文阅读摘要 2D Object Detection 的研究已经非常成熟了,代表作品有RPN系列的FasterRCNN,One Shot系列的YOLOv1-YOLOv3,这里推荐一个2D ...

  3. 目标检测论文阅读:GHM(anchor based)

    目标检测论文阅读:GHM(anchor based) 论文链接:https://arxiv.org/abs/1811.05181 代码链接:https://github.com/libuyu/GHM_ ...

  4. 3D目标检测论文阅读多角度解析

    3D目标检测论文阅读多角度解析 一.前言 CNN(convolutional neural network)在目标检测中大放异彩,R-CNN系列,YOLO,SSD各类优秀的方法层出不穷在2D图像的目标 ...

  5. 毫米波目标检测论文 阅读笔记 | Radar Transformer: An Object Classification Network Based on 4D MMW Imaging Radar

    毫米波目标检测论文 | Radar Transformer: An Object Classification Network Based on 4D MMW Imaging Radar Jie Ba ...

  6. 目标检测论文阅读:FCOS算法笔记

    标题:FCOS: Fully Convolutional One-Stage Object Detection 会议:ICCV2019 论文地址:https://ieeexplore.ieee.org ...

  7. 目标检测论文阅读:DeFCN(POTO+3DMF)算法笔记

    标题:End-to-End Object Detection with Fully Convolutional Network 会议:CVPR2021 论文地址:https://ieeexplore. ...

  8. 目标检测论文阅读:GFL算法笔记

    标题:Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detect ...

  9. 目标检测论文阅读:EfficientDet算法笔记

    标题:EfficientDet: Scalable and Efficient Object Detection 会议:CVPR2020 论文地址:https://ieeexplore.ieee.or ...

最新文章

  1. python psutil库安装_安装psutil模块报错安装python-devel
  2. 信息学奥赛一本通 1170:计算2的N次方 | OpenJudge NOI 1.6 12:计算2的N次方
  3. java调用自身_Java有趣的自己调用自己
  4. ckati与ninja构建demo
  5. js实现无刷新表单提交文件,将ajax请求转换为form请求方法
  6. Java怎样求解n的阶乘 n!(详解)
  7. pytorch nn.AdaptiveAvgPool2d(1)
  8. oracle 进程cpu 高,oracle进程CPU占用太高
  9. STP和RSTP的BPDU报文中flag位 对比+分析
  10. [回顾]2007年木马病毒“英雄榜”,你中过几个
  11. might和could的区别用法_情态动词could,would,might等的用法区别
  12. android 系统/本地日志打印
  13. 计算机考试前的心情作文,考试前的准备中考优秀作文(精选7篇)
  14. 80核处理器_Intel i9-10980XE处理器首发评测:售价“良心”的18核性能旗舰
  15. 中国武术职业联赛(WMA)筹备活动报道--山东烟台
  16. 库克暗示观念差异阻碍苹果和Facebook合作
  17. cas147859-70-9(简称Pheno)苯酚,4,4‘-(10,20-二苯基-21H,23H-卟吩-5,15-二酰基)双酚
  18. mysql通关面试宝典
  19. 使用python自动发邮件(163、QQ、outlook邮箱)
  20. Excel VBA代码密码破解

热门文章

  1. 模块WOODWARD EASYGEN-2500-5 8440-1884
  2. 华为笔记本机械盘卡死_华为笔记本死机了动不了怎么办
  3. 流氓软件?```````````
  4. 联想V450笔记本连接手机蓝牙问题
  5. centos7搭建私人云盘
  6. 打造个人IP需要准备哪些工作?个人IP打造步骤和流程
  7. 世界杯,刹那的12年
  8. crazy的比较级最高级_小学英语比较级和最高级知识点
  9. php波峰,回流焊与波峰焊焊接的工艺流程
  10. element-ui input输入框,校验不能输入中文和特殊字符,输入中文后,英文输不进去的问题