目录

  • 目标检测的评价指标
    • 交并比 (Intersection of Union, IoU)
    • mAP (mean Average Precision)
    • 其他指标
  • 非极大值抑制 (Non-Maximum Suppression, NMS)
    • NMS 基本过程
    • 抑制得分: Soft NMS
    • 加权平均: Softer NMS
      • Bounding Box Parameterization
      • Bounding Box Regression with KL Loss
      • Variance Voting
    • 定位置信度: IoU-Net
      • Precise RoI Pooling (PrRoI Pooling)
      • Learning to predict IoU
      • IoU-guided NMS
      • Bounding box refinement as an optimization procedure
  • 参考文献

目标检测的评价指标

交并比 (Intersection of Union, IoU)

def iou(boxA, boxB):# 计算重合部分的上、下、左、右 4 个边的值,注意最大最小函数的使用left_max = max(boxA[0], boxB[0])top_max = max(boxA[1], boxB[1])right_min = min(boxA[2], boxB[2])bottom_min = min(boxA[3], boxB[3])# 计算重合部分的面积inter = max(0, (right_min-left_max))* max(0, (bottom_min-top_max)  Sa = (boxA[2]-boxA[0])*(boxA[3]-boxA[1])Sb = (boxB[2]-boxB[0])*(boxB[3]-boxB[1])# 计算所有区域的面积并计算iou,如果是Python 2,则要增加浮点化操作union = Sa+Sb-interiou = inter/unionreturn iou

mAP (mean Average Precision)

TP, FP, FN, TN

  • 由于图像中存在背景与物体两种标签,预测框也分为正确与错误,因此在评测时会产生以下 4 种样本:

    • (1) 正确检测框 TP (True Positive):预测框正确地与标签框匹配了,两者间的 IoU 大于 0.5
    • (2) 误检框 FP (False Positive):将背景预测成了物体,通常这种框与图中所有标签的 IoU 都不会超过 0.5
    • (3) 漏检框 FN (False Negative):本来需要模型检测出的物体,模型没有检测出
    • (4) 正确背景 TN (True Negative):本身是背景,模型也没有检测出来,这种情况在物体检测中通常不需要考虑

P-R 曲线

预测值 (Dets): 物体类别、边框位置的 4 个预测值、该物体的得分
标签值 (GTs): 物体类别、边框位置的 4 个真值

  • 遍历到每一个预测框时,都可以生成一个对应的 PPP (Precision, 准确率) 与 RRR (Recall, 召回率)
    P=TPTP+FPP=\frac{TP}{TP+FP}P=TP+FPTP​R=TPTP+FN=TPlen(GTs)R=\frac{TP}{TP+FN}=\frac{TP}{len(GTs)}R=TP+FNTP​=len(GTs)TP​将所有的点绘制成曲线,即形成了 P-R 曲线 (每一个类别都可以绘制出一个单独的 P-R 曲线):

mAP (mean Average Precision)

  • 即使有了 P-R 曲线,评价模型仍然不直观,如果直接取曲线上的点,在哪里选取都不合适,因为召回率高的时候准确率会很低,准确率高的时候往往召回率很低。这时,AP 就派上用场了:
    AP=∫01PdRAP=\int_0^1PdRAP=∫01​PdR严格意义上讲,还需要对曲线进行一定的修正,再进行 AP 计算。除了求面积的方式,还可以使用 11 个不同召回率对应的准确率求平均的方式求 AP
  • 每个类别的 AP 是相互独立的,将每个类别的 AP 进行平均,即可得到 mAP。我们常使用 mAP 这一指标来评价一个模型的好坏

其他指标

  • 速度需求:自动驾驶等场景下,通常需要对图像处理达到非常低的时延才能保证足够的安全,这时检测器需要达到实时性;而在机械臂自动分拣等系统中,速度并不是第一考虑因素
  • 召回率:在交通流量统计系统中,首先需要保障的指标是车辆、行人等物体的召回率,这会直接影响流量统计,相比之下,检测的边框精准度是次要的指标
  • 边框精准度:在智能测量、机械臂自动分拣等应用中,检测边框的精准度直接影响系统的成功率,因此需要选择边框精准度更高的网络,这是首要因素

非极大值抑制 (Non-Maximum Suppression, NMS)

NMS 基本过程

  • 当前的物体检测算法为了保证召回率,对于同一个真实物体往往会有多于 1 个的候选框输出。由于多余的候选框会影响检测精度,因此需要利用 NMS 过滤掉重叠的候选框,得到最佳的预测输出

在上图中,候选框 C 的得分比 A 要低,在评测时,C 候选框会被当做一个 False Positive 来看待,从而降低模型精度。实际上,由于候选框 A 的质量要比 C 好,理想的输出是 A 而不是 C,我们希望能够抑制掉候选框 C


NMS 方法

  • NMS 方法简单有效,并且对检测结果至关重要,在物体检测算法中有着广泛的应用。基本的 NMS 方法利用得分高的边框抑制得分低且重叠程度高的边框,因此涉及以下两个量化指标

    • 预测得分:NMS 假设一个边框的预测得分越高,这个框就要被优先考虑,其他与其重叠超过一定程度的边框要被舍弃,非极大值即是指得分的非极大值
    • IoU:IoU 用于评价两个边框的重合程度。如果两个边框的 IoU 超过一定阈值时,得分低的边框会被舍弃。阈值通常会取 0.5 或者 0.7

NMS 方法的实现

def nms(bboxes, scores, thresh=0.5):"""Args:bboxes: 所有预测框的左上点坐标、右下点坐标 (图片的最左上点坐标为 [0, 0])scores: 所有预测框的得分thresh: 设定的 IoU 阈值"""x1, y1 = bboxes[:,0], bboxes[:,1]  # 所有预测框的左上角坐标x2, y2 = bboxes[:,2], bboxes[:,3] # 所有预测框的右下角坐标# 计算每个 box 的面积areas = (x2 - x1 + 1) * (y2 - y1 + 1)# 对得分进行降序排列,order 为降序排列的索引_, order = scores.sort(0, descending=True)# keep 保留了 NMS 留下的边框 boxkeep = []while order.numel() > 0:if order.numel() == 1:   # 保留框只剩一个         i = order.item()keep.append(i)breakelse:i = order[0].item()  # 保留 scores 最大的那个框 box[i]keep.append(i)# 巧妙利用 tensor.clamp 函数求取每一个框与当前框的最大值和最小值xx1 = x1[order[1:]].clamp(min=x1[i])  # 取 Anchor[i] 与其余 Anchors 的最大 x1, y1yy1 = y1[order[1:]].clamp(min=y1[i])  xx2 = x2[order[1:]].clamp(max=x2[i])  # 取 Anchor[i] 与其余 Anchors 的最小 x2, y2yy2 = y2[order[1:]].clamp(max=y2[i])# 求取每一个框与当前框的重合部分面积inter = (xx2 - xx1 + 1).clamp(min=0) * (yy2 - yy1 + 1).clamp(min=0)# 计算每一个框与当前框的 IoUiou = inter / (areas[i] + areas[order[1:]] - inter)# 保留 IoU 小于阈值的边框索引 (nonzero 用于返回非零元素的索引)idx = (iou <= threshold).nonzero().squeeze()if idx.numel() == 0:break# 这里的 +1 是为了补充 idx 与 order 之间的索引差order = order[idx+1]# 返回保留下的所有边框的索引值return torch.LongTensor(keep)

NMS 的缺陷

  • (1) 最大的问题就是将得分较低的边框强制性地去掉,如果物体出现较为密集时,本身属于两个物体的边框,其中得分较低的也有可能被抑制掉,从而降低了模型的召回率
  • (2) 阈值难以确定。过高的阈值容易出现大量误检,而过低的阈值则容易降低模型的召回率,这个超参很难确定
  • (3) 将得分作为衡量指标。NMS 简单地将得分作为一个边框的置信度,但在一些情况下,得分高的边框不一定位置更准,因此这个衡量指标也有待考量
  • (4) 速度:NMS 的实现存在较多的循环步骤,GPU 的并行化实现不是特别容易,尤其是预测框较多时,耗时较多

针对上述问题陆续产生了一系列改进的方法,如 Soft NMSSofter NMSIoU-Net

抑制得分: Soft NMS

  • 如前所述,当物体比较密集时,NMS 有降低召回率的风险
    造成这种现象的原因在于 NMS 的计算公式
    其中,sis_isi​ 代表了每个个边框的得分,MMM 为当前得分最高的框,bib_ibi​ 为剩余框的某一个,NtN_tNt​ 为设定的阈值,可以看到当 IoU 大于 NtN_tNt​ 时,该边框的得分直接置 0,相当于被舍弃掉了,从而有可能造成边框的漏检
  • 基于此原因,诞生了 Soft NMS 方法,它对于 IoU 大于阈值的边框,没有将其得分直接置 0,而是降低该边框的得分
    上式并不是一个连续的函数,当一个边框与 MMM 的重叠 IoU 超过阈值 NtN_tNt​ 时,其得分会发生跳变,这种跳变会对检测结果产生较大的波动,因此还需要寻找一个更为稳定、连续的得分重置函数,最终 Soft NMS 给出了如下式所示的重置函数进行得分衰减:
    Soft NMS 的计算复杂度与 NMS 相同,是一种更为通用的非极大值抑制方法,可以将 NMS 看做 Soft NMS 的二值化特例。当然,Soft NMS 也是一种贪心算法,并不能保证找到最优的得分重置映射。经过多种实验证明,Soft NMS 在不影响前向速度的前提下,能够有效提升物体检测的精度

Soft NMS 只是降低了一些检测框的置信度,因此仍需要调节阈值超参

加权平均: Softer NMS

  • paper: Bounding Box Regression with Uncertainty for Accurate Object Detection

Bounding Box Parameterization

位置置信度与分类置信度

  • NMS 的本意是筛选出位置最精准的边框,但 NMS 与 Soft NMS 算法都使用了预测分类置信度作为衡量指标,即假定分类置信度越高的边框,其位置也更为精准,而具有高分类置信度的边框位置并不总是最精准的,也就是说,位置置信度与分类置信度并不是强相关的关系,直接使用分类置信度作为 NMS 的衡量指标并非是最佳选择
  • 为此,Softer NMS 额外让网络输出边框的位置置信度 (Localization Confidence)

分布假设与位置置信度

  • 设预测框为 xex_exe​ (xex_exe​ 可表示 (x1,y1,x2,y2)(x_1,y_1,x_2,y_2)(x1​,y1​,x2​,y2​) 中的任何一个坐标),GT 框为 xgx_gxg​
  • 单变量高斯分布 PΘ(x)P_\Theta(x)PΘ​(x): Softer NMS 假设预测框 xxx 服从如下单变量高斯分布 (这是一个比较强的先验条件,它假定了边框的 4 个坐标之间相互独立,也没有考虑高斯混合分布等更加复杂的分布情况):
    其中 Θ\ThetaΘ 为网络参数,标准差 σ\sigmaσ 可用于衡量预测框的位置置信度,例如 σ→0\sigma\rightarrow0σ→0 表示网络对预测框位置置信度很高。如下图所示,Softer NMS 直接使用一个新的全连接层 + 绝对值层来输出标准差 σ\sigmaσ (使用绝对值层而非 ReLU 是为了防止标准差为 0):
  • Dirac delta 分布 PD(x)P_D(x)PD​(x): 真实物体边框 xxx 服从 Dirac delta function
    其中,狄拉克分布为标准差为 0 的高斯分布的极限
    δ(x)={∞if x=00if x≠0\delta(x)=\left\{\begin{aligned} \infty & \quad\text { if } x=0 \\ 0 &\quad \text { if } x \neq 0 \end{aligned}\right.δ(x)={∞0​ if x=0 if x​=0​

Bounding Box Regression with KL Loss

  • 上面给出了预测框和真实物体边框服从的分布,因此很自然地就可以想到让这两个分布尽量接近。为此,Softer NMS 将回归损失定义为了预测框分布 PΘ(x)P_\Theta(x)PΘ​(x) 和真实物体边框 PD(x)P_D(x)PD​(x) 的 KL 散度
    Lreg =DKL(PD(x)∥PΘ(x))=∫PD(x)log⁡PD(x)dx−∫PD(x)log⁡PΘ(x)dx=−H(PD(x))−PD(xg)log⁡PΘ(xg)=−log⁡PΘ(xg)−H(PD(x))=(xg−xe)22σ2+log⁡(σ2)2+log⁡(2π)2−H(PD(x))\begin{aligned} L_{\text {reg }} &=D_{K L}\left(P_{D}(x) \| P_{\Theta}(x)\right) \\ &=\int P_{D}(x) \log P_{D}(x) \mathrm{d} x-\int P_{D}(x) \log P_{\Theta}(x) \mathrm{d} x \\ &=-H\left(P_{D}(x)\right)-P_D(x_g)\log P_\Theta(x_g)\\ &=-\log P_\Theta(x_g)-H\left(P_{D}(x)\right) \\ &=\frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{\log \left(\sigma^{2}\right)}{2}+\frac{\log (2 \pi)}{2}-H\left(P_{D}(x)\right) \end{aligned} Lreg ​​=DKL​(PD​(x)∥PΘ​(x))=∫PD​(x)logPD​(x)dx−∫PD​(x)logPΘ​(x)dx=−H(PD​(x))−PD​(xg​)logPΘ​(xg​)=−logPΘ​(xg​)−H(PD​(x))=2σ2(xg​−xe​)2​+2log(σ2)​+2log(2π)​−H(PD​(x))​去掉最后两项常数项可得:
    Lreg∝(xg−xe)22σ2+12log⁡(σ2)L_{r e g} \propto \frac{\left(x_{g}-x_{e}\right)^{2}}{2 \sigma^{2}}+\frac{1}{2} \log \left(\sigma^{2}\right)Lreg​∝2σ2(xg​−xe​)2​+21​log(σ2)(当 σ=1\sigma=1σ=1 时,KL 损失就退化为了标准的欧几里得损失)
  • 将回归损失对 xex_exe​ 和 σ\sigmaσ 求导可得:
    由于 σ\sigmaσ 在分母上,在训练初期很可能出现梯度爆炸的情况,为此,网络不再直接输出 σ\sigmaσ,而是改为输出 α=log⁡(σ2)\alpha=\log(\sigma^2)α=log(σ2),此时回归损失为:
    与 Faster RCNN 类似,当 δ=∣xg−xe∣>1\delta=|x_g-x_e|>1δ=∣xg​−xe​∣>1 时,Softer NMS 也采用了 smooth L1L_1L1​ loss 来帮助模型收敛:

设 δ=∣xg−xe∣\delta=|x_g-x_e|δ=∣xg​−xe​∣,则 dLregdα=−12δ2e−α+12\frac{dL_{reg}}{d\alpha}=-\frac{1}{2}\delta^2e^{-\alpha}+\frac{1}{2}dαdLreg​​=−21​δ2e−α+21​. 令 dLregdα=0\frac{dL_{reg}}{d\alpha}=0dαdLreg​​=0 可得 α=log⁡δ2\alpha=\log\delta^2α=logδ2 时回归损失有最小值,也就是说,当预测框与 GT 框差别很大时,理想模型输出的标准差 σ\sigmaσ 也应该很大:

Variance Voting

  • 如下图所示,对于一个真实物体,可能所有的预测边框都是不准确的
    为此,Softer NMS 利用位置置信度将多个框加权合成最后的框,从而使得高分类置信度的边框位置变得更加准确,有效提升了检测性能

B\mathcal BB 为所有预测框的位置坐标,S\mathcal SS 为所有预测框的分类置信度,C\mathcal CC 为所有预测框的位置置信度,D\mathcal DD 为所有利用 var voting 更新完位置坐标的预测框,σt\sigma_tσt​ 为 var voting 的温度系数,Sf()\mathcal {Sf}()Sf() 为 Soft NMS 对应的分类得分衰减函数

  • Softer NMS 在 Soft NMS 的基础上增加了绿色的 3 行代码。在选出当前具有最大分类得分的预测框 bbb 后,使用加权平均的方法,利用 bbb 周围的预测框去提升 bbb 的位置精度:
    其中,pi/σx,i2p_i/\sigma_{x,i}^2pi​/σx,i2​ 为预测框 bbb 附近边框 bib_ibi​ 的权重,bib_ibi​ 与 bbb 的 IoU 越大、位置置信度越高,则它的权重就越大;xxx 为加权平均后预测框 bbb 的新坐标 (注意,在位置修正的过程中,只用到了位置置信度,没有使用分类置信度)
  • 至此,通过这种加权平均的方法,Softer NMS 成功避免了下面两种检测错误:

定位置信度: IoU-Net

  • paper: Acquisition of Localization Confidence for Accurate Object Detection

  • 与 Softer NMS 类似,IoU-Net 也是瞄准了当前目标检测网络不能输出定位置信度的痛点,在 Faster RCNN 的网络基础上设计了新的网络分支去输出预测框和 GT 框的 IoU 作为当前预测框的定位置信度,并通过位置置信度改进 NMS 来保留位置更精准的预测框。除此之外,IoU-Net 还进一步提出了基于优化的预测框位置修正方法,通过最大化定位置信度来修正预测框位置

Precise RoI Pooling (PrRoI Pooling)

  • RoI Align 通过采样的方法有效避免了量化操作,减小了 RoI Pooling 的误差,但 RoI Align 也存在一个缺点,即对每一个区域都采取固定数量的采样点,但区域有大有小,都采取同一个数量点,显然不是最优的方法
  • 以此为出发点,IoU-Net 提出了 PrRoI Pooling,采用积分的方式实现了更为精准的感兴趣区域池化。与 RoI Align 只采样 4 个点不同,PrRoI Pooling 方法将整个区域看做是连续的,采用积分公式求解每一个区域的池化输出值:
    其中 binbinbin 为 RoI 中的一个区域,F\mathcal FF 为特征图,f(x,y)f(x,y)f(x,y) 为通过双线性插值得到的点 (x,y)(x,y)(x,y) 处的权重:
    其中,wi,jw_{i,j}wi,j​ 为 F\mathcal FF 上点 (i,j)(i,j)(i,j) 处的权重,
    IC(x,y,i,j)=max⁡(0,1−∣x−i∣)×max⁡(0,1−∣y−j∣)I C(x, y, i, j)=\max (0,1-|x-i|) \times \max (0,1-|y-j|)IC(x,y,i,j)=max(0,1−∣x−i∣)×max(0,1−∣y−j∣)
  • 总的来说,PrRoI Pooling 避免了任何的坐标量化过程,同时与 RoI Align 和 RoI Pooling 不同,PrRoI Pooling 对于预测框的坐标 x1,x2,y1,y2x_1,x_2,y_1,y_2x1​,x2​,y1​,y2​ 还连续可导,这有利于之后的预测框位置修正过程

实现时仍然通过采样离散的点去近似积分项

Learning to predict IoU

  • IoU-Net 在 Head 处增加了一个预测 IoU 的分支,与分类回归分支并行,用于预测每一个候选框的定位置信度 (IoU-Net uses class-aware IoU predictors)
  • 需要注意的是,在训练时 IoU-Net 通过自动生成候选框的方式来训练 IoU 分支,而不是从 RPN 获取。具体来讲,Jittered RoIs 在训练集的真实物体框上增加随机扰动,生成了一系列候选框,并移除与真实物体框 IoU 小于 0.5 的边框。实验证明这种方法来训练 IoU 分支可以带来更高的性能与稳健性。因此,在整个模型的联合训练时,IoU 预测分支的训练数据需要从每一批的输入图像中单独生成。此外,还需要对 IoU 分支的标签进行归一化,保证其分布在 [−1,1][-1,1][−1,1] 区间中

由于这种训练方式只需要提供特征图和 GT 框,因此不依赖于任何特定的目标检测器,当与不同的目标检测器结合使用时都能具有不错的鲁棒性

IoU-guided NMS

  • IoU-Net 使用预测的 IoU 而非分类置信度作为预测框排序的依据,并抑制掉与当前框 IoU 超过设定阈值的其他候选框,从而解决了传统 NMS 分类置信度与定位精度不匹配的问题。此外,在 NMS 过程中,IoU-Net 还做了分类置信度的聚类。具体做法是,在 NMS 过程中,当边框 iii 抑制边框 jjj 时,通过 si=max⁡(si,sj)s_i=\max(s_i,s_j)si​=max(si​,sj​) 来更新边框 iii 的分类置信度,即对于匹配到同一真实物体的边框,选取其中最大的类别置信度

Bounding box refinement as an optimization procedure

  • 预测框位置修正的问题可以被看作如下优化问题
    其中,boxdetbox_{det}boxdet​ 为预测框,boxgtbox_{gt}boxgt​ 为 GT 框;transform\text{transform}transform 为一个变换函数,接受参数 ccc 来调整预测框的位置;critcritcrit 为衡量两个边界框距离的度量指标
  • Regression-based algorithms: 基于回归的预测框位置修正算法直接通过一次网络的前向传播,由网络的回归分支得到 c∗c^*c∗。但这种迭代的回归算法极容易受到输入分布变化的影响,使得迭代过程中定位精度反而下降。同时,定位置信度的缺失也使得回归修正算法缺少可解释性
  • optimization-based bounding box refinement method: 为了解决回归修正算法中存在的问题,IoU-Net 直接将网络预测的 IoU 作为优化指标,利用梯度上升来进行位置修正 (这得益于 PrRoI Pooling 对预测框坐标连续可导),同时还利用预测 IoU 采取早停策略防止迭代过程中定位精度下降。这不仅提高了位置修正的性能,还提高了算法的可解释性

算法第 6 行的 scalescalescale 表示根据坐标所在轴对应的边框尺寸大小对梯度进行放大,例如将 ∇x1\nabla x_1∇x1​ 放大 width(bj)width(b_j)width(bj​) 倍

参考文献

  • 《深度学习之 PyTorch 物体检测实战》
  • 知乎 Mark Lue 关于 AP 的回答

交并比 (IoU), mAP (mean Average Precision), 非极大值抑制 (NMS, Soft NMS, Softer NMS, IoU-Net)相关推荐

  1. 深度学习之非极大值抑制(Non-maximum suppression,NMS)

    非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测.物体识别等. 算法流程 给出一张图片和上面许多物体检测的候选框(即每个框可 ...

  2. 非极大值抑制(Non-Maximum Suppression,NMS)(转)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  3. 锚框、交并比和非极大值抑制(tf2.0源码解析)

    锚框.交并比和非极大值抑制(tf2.0源码解析) 文章目录 锚框.交并比和非极大值抑制(tf2.0源码解析) 一.锚框生成 1.锚框的宽高 2.锚框的个数 3.注意点(★★★) 4.tf2.0代码 二 ...

  4. sklearn逻辑回归 极大似然 损失_收藏!攻克目标检测难点秘籍二,非极大值抑制与回归损失优化之路...

    点击上方"AI算法修炼营",选择加星标或"置顶" 标题以下,全是干货 前面的话 在前面的秘籍一中,我们主要关注了模型加速之轻量化网络,对目标检测模型的实时性难点 ...

  5. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  6. 下拉多选择框 实现方式_非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...

    这是独立于薰风读论文的投稿,作为目标检测模型的拓展阅读,目的是帮助读者详细了解一些模型细节的实现. 薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制, ...

  7. 非极大值抑制算法(Non-Maximum Suppression,NMS)

    所属知识点:Computer Vision:Object Detection 归纳和总结机器学习技术的库:ViolinLee/ML_notes 使用滴滴云AI大师码[0212]消费GPU有9折优惠哦! ...

  8. 【深度学习】:非极大值抑制(NMS)详解

    非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测.物体识别等.Non-Maximum Suppression的翻译是非&qu ...

  9. 锚框的实现-非极大值抑制预测边界框

    大家好,我是阿林.由于各种原因,阿林的组会告吹了.所以阿林的锚框的最后一期非极大值抑制预测边界框提前发布. 我们来回顾一下前两期的内容,并和第三期做一个总结吧. 第一期 我们通过提取出整张图的高宽,利 ...

最新文章

  1. poj3481(map的使用)
  2. 自定义弹框(手机端),定时消失
  3. 《机器学习与R语言(原书第2版)》一2.3 探索和理解数据
  4. Vue源码分析系列四:Virtual DOM
  5. java地图点线面_openlayers之点,线,面(以城市,河流,省份为例,分别对应点线面)...
  6. 两台笔记本的操作系统都为xp的共享上网教程
  7. python中字典和json的区别_详解python中的json和字典dict
  8. sql profiler_这是SQL Profiler的结尾吗?
  9. python爬虫案例
  10. 2018年腾讯社交广告大赛复习总贴
  11. 计算一个整数,转换成二进制,里面有多少个1
  12. 2021-6-28 项目实训-研究生管理系统
  13. python:PIL库中Image类thumbnail方法和resize方法的比较
  14. 英语句子成分分析(四)
  15. 黑发黑眼 hdu2147
  16. 虚拟机装的XP,无法上网,因为没有安装网卡驱动,怎么解决
  17. 合并表格文件的简单方法
  18. 微信网页开发——JS-SDK接入以及微信二次分享图标和标题丢失
  19. 【疑难解答】海康硬盘录像机无法通过rtsp协议连接到EasyNVR的Web页面如何处理?
  20. KMP算法详解:使用部分匹配表PMT来理解KMP算法,使用Java实现

热门文章

  1. 如何获取数组中嵌套对象中属性值不为空的对象?
  2. 12-1 蓝色天空 : 创建一个背景为蓝色的Pygame窗口 12-2 游戏角色 : 找一幅你喜欢的游戏角色位图图像或将一幅图像转换为位图。 创建一个类, 将该角色绘制到屏幕中央, 并将该图像的背景色
  3. 解决Linux 系统,出现不在sudoers 文件中,此事将被报告的问题
  4. m与n的数字运算python_python数值计算
  5. 在 ubuntu20.04下搭建 lamp 环境并制作静态网页
  6. ffmpeg关于sws_scale的那些事儿
  7. 个人中心html更换头像,html5 头像上传更换插件
  8. 15、PIC32系列-输入捕捉ICAP
  9. 项目管理之产品交付1
  10. 单页面cnd 引入 vant+vue+h5 应用vant