目标检测与目标跟踪算法技术汇总
现如今chatgpt的爆火,我也使用了一段时间,问了许多关于人工智能技术的问题,基本是它能够回答了大部分的原理的,至于其人工智能涉及到的算法以及网络,考虑到也没有图,可能在给出这类回答上,是不太容易理解的。
本章旨在介绍当前热门的目标检测、目标跟踪算法和方法,我选择使用chatgpt给出答案辅助我完成这篇文章
文章后面会给出算法的github链接
目标检测与目标跟踪算法技术汇总
- 1 传统方法
- 2 目标检测进展
- 2.1 R-CNN
- ChatGPT实现R-CNN
- 2.2 Fast R-CNN
- 2.3 Fatster R-CNN
- 2.4 Mask R-CNN
- 2.5 YOLO
- 2.6 SSD
- 2.7 RetinaNet
- 3 目标跟踪进展
- 3.1 Recurrent YOLO
- 3.2 SiamMask
- 3.3 DeepSort
- 3.4 TrackR-CNN
- 3.5 Tracktor++
- 3.6 JDE
- 4 总结
- 5 代码
- 5.1 目标检测代码
- 5.1.1 Fast R-CNN
- 5.1.2 Mask R-CNN
- 5.1.3 YOLO
- 5.1.4 SSD
- 5.1.5 RetinaNet
- 5.2 目标跟踪代码
- 5.2.1 Recurrent YOLO
- 5.2.2 SiamMask
- 5.2.3 Deepsort
- 5.2.4 Track R-CNN
- 5.2.5 Tracktor++
- 5.2.6 JDE
1 传统方法
目标检测已经存在了相当长一段时间;传统的计算机视觉方法来进行物体检测出现在90年代后期。这些方法使用经典的功能检测,结合KNN或SVM等机器学习算法进行分类,或与FLAN等描述匹配器进行对象检测。
最值得注意的特征检测算法可以说是SIFT和SURFas特征描述符,以及用于角检测的FAST。特征描述符使用一系列数学近似来学习缩放不变的图像表示。其中一些古老的学校方法有时可以完成这项工作,但我们还有很多事情要做。
至于目标跟踪,传统方法似乎比目标检测方法更经得起时间的考验。卡尔曼滤波、稀疏和致密的光流等想法仍然被广泛使用。当卡尔曼滤波在阿波罗PGNCS中使用它根据过去的位置测量和新数据为航天器提供最佳位置估计时,它进入了名人堂。今天,它的影响仍然可以在许多算法中看到,例如简单在线和实时跟踪(SORT),它使用匈牙利算法和卡尔曼滤波器的组合来实现体面的对象跟踪。
2 目标检测进展
2.1 R-CNN
早在2014年,具有CNN特征的区域(R-CNN)就是一种用于目标检测和语义分割的新鲜空气,因为之前最先进的方法被认为是与SIFT相同的旧算法,仅包含在复杂的集成中,需要大量的计算能力,并且主要依赖于边缘、渐变和角等低级特征。
R-CNN系统由三个主要模块组成。最重要的模块使用称为选择性搜索的分割算法提取了大约2000个区域提案,以找出图像的哪些部分最有可能包含对象。选择性搜索应用各种不同的策略,因此它可以处理尽可能多的图像条件。该算法使用各种比例的窗口扫描图像,并查找共享颜色和纹理的相邻像素,同时考虑闪电条件。
第二个模块是一个大型卷积神经网络,从选择性搜索返回的每个提案中提取固定长度的特征向量。无论大小或宽高比如何,候选区域都会进行图像翘曲,以达到所需的输入大小。最后,最后一个模块用特定类别的线性支持向量机对每个区域进行分类。
R-CNN的训练和测试非常缓慢,按照今天的标准,也不是很准确。尽管如此,这是为Fast R-CNN以及当前最先进的Faster R-CNN和Mask R-CNN铺平道路的基本方法
ChatGPT实现R-CNN
R-CNN模型是一种经典的目标检测模型,其基本思想是在图像中选取一些候选框,然后对每个候选框进行特征提取和分类,从而得到图像中的目标位置和类别。下面是使用PyTorch实现R-CNN模型的一些基本步骤:
- 数据预处理:首先需要将训练数据和测试数据转换为PyTorch中的Dataset和DataLoader对象,然后对数据进行预处理,如缩放、裁剪、归一化等。
- 候选框提取:使用selective search等方法从输入图像中提取候选框,得到一个候选框列表。
- 特征提取:将每个候选框中的图像块输入到CNN中进行特征提取,得到一个特征向量。
- 目标分类:将每个特征向量输入到分类器中进行目标分类,得到每个候选框中目标的概率分布。
- 边界框回归:对于每个候选框,使用回归器预测其准确的边界框位置。
- 非极大值抑制:根据目标概率分布和边界框位置,使用非极大值抑制方法剔除重复的目标检测结果。
下面是一个使用PyTorch实现R-CNN模型的基本代码框架
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.models as models
import torchvision.transforms as transforms# 定义CNN模型
class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()# 使用预训练的VGG16模型作为特征提取器self.cnn = models.vgg16(pretrained=True).features[:30]def forward(self, x):x = self.cnn(x)return x# 定义R-CNN模型
class RCNN(nn.Module):def __init__(self):super(RCNN, self).__init__()self.cnn = CNN()self.fc1 = nn.Linear(512*7*7, 4096)self.fc2 = nn.Linear(4096, 4096)self.fc3 = nn.Linear(4096, 21) # 用于分类的全连接层,输出21维向量,表示21个类别的概率self.fc4 = nn.Linear(4096, 4) # 用于回归的全连接层,输出4维向量,表示边界框的坐标def forward(self, x):x = self.cnn(x)x = x.view(x.size(0), -1)x = self.fc1(x)x = self.fc2(x)cls = self.fc3(x)bbox = self.fc4(x)return cls, bbox# 训练模型
model = RCNN()
criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) # 随机梯度下降优化器for epoch in range(num_epochs):for i, (images, labels) in enumerate(train_loader):images = images.to(device)labels = labels.to(device)optimizer.zero_grad()cls, bbox = model(images)loss_cls = criterion(cls, labels)loss_bbox = criterion(bbox, targets) # 回归损失函数loss = loss_cls + loss_bbox # 总损失函数loss.backward()optimizer.step()if (i+1) % 100 == 0:print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))# 测试模型
model.eval()
with torch.no_grad():correct = 0total = 0for images, labels in test_loader:images = images.to(device)labels = labels.to(device)cls, bbox = model(images)_, predicted = torch.max(cls.data, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print('Test Accuracy of the model on the {} test images: {} %'.format(total, 100 * correct / total))
2.2 Fast R-CNN
Fast R-CNN是由R-CNN的作者之一提出的,作为有价值的继任者。与R-CNN相比,一个很大的改进是,Fast R-CNN没有为每个区域提案进行约2000个前传,而是在网络的单个正向传递中计算整个输入图像的卷积特征图,使其速度要快得多。另一个改进是,该架构经过端到端训练,并导致多任务丢失,从而简化了更简单的训练。
Fast R-CNN的输入是一个图像,以及一组对象提案。首先,它们通过一个完全卷积网络来获取卷积特征映射。接下来,对于每个对象提案,使用感兴趣的区域(RoI)池层从特征映射中提取固定长度的特征向量。快速R-CNN使用完全连接的图层将每个RoI映射到特征向量,最终输出软最大概率和边界框,它们分别是对象的类和位置。
2.3 Fatster R-CNN
事实证明,Fast R-CNN仍然相当缓慢,这主要是因为CNN受到上述区域提案算法选择性搜索的瓶颈。Fast R-CNN通过放弃传统的区域提案方法,并依靠完全深入的学习方法来解决这个问题。它由两个模块组成:名为区域提案网络(RPN)的CNN和Fast R-CNN探测器。这两个模块合并成一个网络,并进行端到端训练。
Faster R-CNN的作者在设计RPN以强调输入图像中的重要内容时,从注意力机制中汲取了灵感。通过在网络的最后一个共享卷积层上滑动一个小网络来创建区域提案。小网络需要卷积特征映射的(n x n)窗口作为输入。每个滑动窗口都映射到一个较低维度的特征,因此像以前一样,它被输入到两个完全连接的层:盒子分类和盒子回归层。
值得一提的是,边界框相对于被称为锚的手工挑选的参考框是参数化的。换句话说,RPN预测四个校正坐标将锚移动并调整锚的大小,而不是图像上的坐标。默认情况下,更快的R-CNN使用3个刻度和3个宽高比,导致每个滑动窗口有9个锚。
Faster R-CNN被认为是最先进的,它肯定是目标检测的最佳选择之一。然而,它没有在检测到的物体上提供分割,即它无法找到物体的确切像素,而只能定位物体周围的边界框。在许多情况下,这不需要,但当它需要时,Mask R-CNN应该是第一个想到的。
2.4 Mask R-CNN
Facebook AI Research(FAIR)的Mask R-CNN作者扩展了Faster R-CNN,以执行实例分割,以及类和边界框。实例分割是对象检测和语义分割的组合,这意味着它既可以检测图像中的所有对象,也可以分割每个实例,同时将其与其他实例区分开来。
Mask R-CNN的第一阶段(区域提案)与其前身相同,而在第二阶段,它为每个RoI输出一个与类和边界框平行的二进制掩码。这个二进制掩码表示像素是否是任何对象的一部分,而不考虑类别。像素的类将仅由它们所在的边界框分配,这使得模型更容易训练。
第二阶段的另一个区别是,Fast R-CNN中引入的RoI池层(RoIPool)被RoIAlign取代。使用RoIPool执行实例分割会导致许多像素不准确,即与原始图像相比,特征映射错位。发生这种情况是因为RoIPool对感兴趣的区域进行量化,包括在生成的特征映射中将浮点值四舍五入到十进制值。另一方面,改进的RoIAlign通过完全避免任何量化,而不是使用双线性插值来计算输入特征的确切值,将提取的特征与输入正确对齐。
2.5 YOLO
我们现在正在将重点从以准确性为导向的解决方案转向以速度为导向的解决方案。你只看一次(YOLO)是当今最受欢迎的物体检测方法,这是有充分理由的。它能够以最小的延迟处理实时视频,同时保持可观的准确性。顾名思义,它只需要一个正向传播来检测图像中的所有对象。
YOLO是在Darknet中设计的,Darknet是一个用C和CUDA编写的开源神经网络框架,由创建YOLO的作者Joseph Redmon开发。上次迭代是YOLOv3,与之前的版本相比,它更大,在小对象上更准确,但在较大的对象上略差。在YOLOv3中,使用Darknet-53(具有剩余连接的53层CNN),这比YOLOv2之前的Darknet-19(19层CNN)大跃。
与之前输出框的边界框、置信度和类的YOLO版本不同,YOLOv3在网络的不同深度上以3个不同比例预测边界框。图像上的最终对象检测使用非最大抑制(NMS)来确定,NMS是一种简单的方法,可以删除相互重叠的边界框,而不是预定义的交叉-联(IoU)阈值。在这种重叠的冲突中,YOLO分配的信心最大的边界框获胜,而其他盒子则被丢弃。
就像在Faster R-CNN中一样,框值相对于引用锚点。然而,它没有为任何任务拥有相同的精心挑选的锚点,而是使用训练数据集上的k均值聚类来找到任务的最佳锚点。YOLOv3的默认锚点数为9个。令人惊讶的是,softmax不用于类预测,而是用于多个独立的逻辑分类器,训练有二进制交叉熵损失
2.6 SSD
单发多盒探测器(SSD)在YOLO作为有价值的替代品几个月后问世。与YOLO类似,对象检测是在网络的单个正向传播中完成的。这个端到端CNN模型通过一系列卷积层传递输入图像,沿途从不同尺度生成候选边界框。
作为训练的地面真相,SSD将标记对象视为积极示例,而与正值不重叠的任何其他边界框都是负示例。事实证明,以这种方式构建数据集使其非常不平衡。因此,SSD在执行NMS后立即应用了一种称为硬负采矿的方法。硬负采矿是一种仅选择置信度损失最高的负数的方法,因此正负数和负数之间的比率最多为1:3。这导致更快的优化和更稳定的训练阶段。
在官方文件的上图中,我们可以看到骨干网络是VGG-16。然而,如今,我们经常可以看到带有ResNet、Inception甚至MobileNet主干的SSD。
2.7 RetinaNet
RetinaNet早在2017年就由FAIR的研究人员提出。它也是像YOLO和SSD这样的单阶段框架,它用速度换取比R-CNN变体等两阶段框架更差的准确性。RetinaNet使用ResNet + FPN主干来生成丰富的多尺度卷积特征金字塔。像往常一样,顶部连接着两个子网络,一个用于对锚框进行分类,另一个用于从锚框生成偏移到地面真相对象框。
如前所述,密集探测器训练期间的班级不平衡压倒了交叉熵损失。创新的焦点丢失提高了对稀疏的硬示例进行集中训练的准确性,同时限制了容易的底片的数量。这是通过重塑损失函数来实现的,使其不像硬示例那样重视简单的示例。
焦点损失定义,其中α ∈ [0, 1]是解决类失衡的加权因子,γ是聚焦参数
引入加权因子α是解决阶级失衡的常见方法。作者首先尝试了α=0,但这比α平衡形式更准确。您可能还会注意到,当γ=0时,焦距损耗等价于交叉熵损耗。
3 目标跟踪进展
3.1 Recurrent YOLO
首先,我们可以查看Recurrent YOLO(ROLO),这是一种结合对象检测和循环神经网络的单个对象跟踪方法。ROLO是YOLO和LSTM的组合。对象检测模块使用YOLO收集视觉特征以及位置推断先验。在每个时间步(帧)上,LSTM都会收到长度为4096的输入特征向量,并返回跟踪对象的位置。
3.2 SiamMask
在单个对象跟踪方面,SiamMask是一个绝佳的选择。它基于迷人的暹罗神经网络,该网络在谷歌的Facenet中越来越受欢迎。除了以每秒55帧的速度生产旋转边界框外,它还提供与类无关的对象分割掩码。为了实现这一点,SiamMask需要用单个边界框初始化,以便它能够跟踪所需的对象。然而,这也意味着SiamMask无法使用多个对象跟踪(MOT),并且修改模型以支持,这将给我们留下一个明显缓慢的物体检测器。
还有其他几个著名的对象跟踪器使用暹罗神经网络,例如DaSiamRPN,它赢得了VOT-18挑战(PyTorch 0.3.1代码)和SiamDW(PyTorch 0.3.1代码)。
3.3 DeepSort
我们之前提到SORT是对象跟踪的算法方法。Deep SORT正在通过用一种新的余弦度量学习取代关联度量来改进SORT,这是一种通过软最大制度的重参数化有效优化余弦相似性的特征空间的方法。
轨道处理和卡尔曼过滤框架与原始SORT几乎相同,但边界框是使用预先训练的卷积神经网络计算的,该网络训练在大规模的人称重新识别数据集上。这种方法是多个对象检测的绝佳起点,因为它易于实现,提供可靠的准确性,但最重要的是实时运行。
3.4 TrackR-CNN
TrackR-CNN只是作为多对象跟踪和分割(MOTS)挑战的基线引入的,但事实证明它实际上是有效的。首先,对象检测模块在ResNet-101主干网上使用掩码R-CNN。跟踪器是通过集成应用于骨干功能的3D卷积来创建的,并结合了视频的时间上下文。作为替代方案,还考虑了卷积LSTM,但与基线相比,后一种方法不会产生任何收益。
TrackR-CNN还通过关联头扩展了掩码R-CNN,以便能够随着时间的推移关联检测。这是一个完全连接的层,接收区域提案,并为每个提案输出一个关联向量。协会负责人的灵感来自暹罗网络和用于个人重新识别的嵌入向量。它使用批量硬三重丢失的视频序列改编进行训练,这是一种比原始三重丢失更有效的方法。为了产生最终结果,系统必须决定报告哪些检测结果。之前的帧检测和当前提案之间的匹配是使用匈牙利算法完成的,同时只允许对小于某个阈值的关联向量进行检测
3.5 Tracktor++
多对象跟踪基准由于其公共排行榜,可以更轻松地找到MOT的最新突破。CVPR 2019跟踪挑战推动了跟踪器准确性和速度的进步。Tracktor++以一种非常简单但有效的方法主导了排行榜。该模型通过计算边界框回归来预测物体在下一帧中的位置,而无需训练或优化任何跟踪数据。Tracktor++的对象检测器是通常具有101层ResNet和FPN的Faster R-CNN,在MOT17Det行人检测数据集上训练。
Tracktor++的主要想法是使用Faster R-CNN的回归分支进行帧到帧的跟踪,方法是从当前帧中提取功能,然后使用上一个帧的对象位置作为RoI池过程的输入,将其位置返回到当前帧中。它还利用了一些运动模型,例如基于图像注册的相机运动补偿和短期重新识别。重新识别方法缓存固定帧数的已停用轨道,然后将新检测到的轨道与它们进行比较,以便重新识别。轨道之间的距离由暹罗神经网络测量。
3.6 JDE
联合检测和嵌入(JDE)是最近与视网膜网络类似的提案,偏离了两阶段范式。这种单发检测器旨在解决多任务学习问题,即锚分类、边界框回归和嵌入学习。JDE使用Darknet-53作为骨干,以三尺度获取输入的特征映射。之后,使用上采样和残余连接将特征映射融合在一起。最后,预测头附在融合特征图的顶部,该特征图为上述三项任务输出密集的预测图。
为了实现对象跟踪,除了边界框和类外,JDE模型还在处理帧时输出外观嵌入向量。这些外观嵌入与使用亲和力矩阵对之前检测到的物体的嵌入进行比较。最后,良好的旧匈牙利算法和卡尔曼滤波器用于平滑轨迹并预测当前帧中之前检测到的物体的位置。
4 总结
总的来说在机器,配备GPU一样的情况下,使用同样的实例视频(MOT17测试数据集),不同的算法效果如下:
- 由于其简单性,Deep SORT是这堆中最快的。它平均产生16FPS,同时仍然保持良好的准确性,这绝对使其成为多个物体检测的可靠选择。
- Tracktor++相当准确,但一个大缺点是它不适合实时跟踪。我们的实验得出的平均执行率为3FPS。如果实时执行不令人担忧,这是一个很好的竞争者。
- TrackR-CNN很好,因为它提供细分作为奖励。但与Tracktor++一样,它很难用于实时跟踪,平均执行率为1.6 FPS。
- JDE平均表现出12FPS的良好表现。需要注意的是,该模型的输入大小为1088x608,因此,如果模型在全高清上训练,我们应该期望JDE达到较低的FPS。尽管如此,它具有很高的准确性,应该是一个很好的选择。
5 代码
5.1 目标检测代码
Detectron2是FAIR对象检测和分割框架的第二次迭代。它包括许多预训练的模型,可以在Model Zoo找到。如果你喜欢PyTorch,我建议使用Detectron2,它基本上是即插即用!
Detection2:https://github.com/facebookresearch/detectron2
不过,如果您更喜欢TensorFlow,您可以使用官方的TensorFlow对象检测API,在那里您可以找到代码以及预训练的Model Zoo。
TensorFlow API:https://github.com/tensorflow/models/tree/master/research/object_detection
5.1.1 Fast R-CNN
- PyTorch:Detectron2
- TensorFlow:TF对象检测API
5.1.2 Mask R-CNN
- PyTorch:Detectron2
- TensorFlow:TF对象检测API
5.1.3 YOLO
- pytorch:https://github.com/eriklindernoren/PyTorch-YOLOv3
5.1.4 SSD
- pytorch:https://github.com/amdegroot/ssd.pytorch
- TensorFlow:TF对象检测API
5.1.5 RetinaNet
- PyTorch:Detectron2
- Keras:https://github.com/fizyr/keras-retinanet
5.2 目标跟踪代码
5.2.1 Recurrent YOLO
- TensorFlow:https://github.com/Guanghan/ROLO
5.2.2 SiamMask
- PyTorch 0.4.1:https://github.com/foolwood/SiamMask
5.2.3 Deepsort
- PyTorch ≥ 0.4.0:https://github.com/ZQPei/deep_sort_pytorch
- TensorFlow ≥ 1.0:https://github.com/nwojke/deep_sort
5.2.4 Track R-CNN
- TensorFlow 1.13.1:https://github.com/VisualComputingInstitute/TrackR-CNN
5.2.5 Tracktor++
- PyTorch 1.3.1:https://github.com/phil-bergmann/tracking_wo_bnw
5.2.6 JDE
- PyTorch ≥ 1.2.0:https://github.com/Zhongdao/Towards-Realtime-MOT
相关文章:
目标检测与目标跟踪算法技术汇总
现如今chatgpt的爆火,我也使用了一段时间,问了许多关于人工智能技术的问题,基本是它能够回答了大部分的原理的,至于其人工智能涉及到的算法以及网络,考虑到也没有图,可能在给出这类回答上,是不太…...
Linux 系统启动过程
过去几十年,公用事业行业发生了重大变化。能源需求的转变导致企业利润率的波动,但不是运营成本的波动。 许多公用事业公司通过后勤部门流程自动化来削减成本,比如招采流程自动化。 在招采活动中,人工招采会产生盲点。由于公共事业…...
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
表现良好的最长时间段【LC1124】 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内&#…...
vue使用nprogress(进度条)
目录 1.安装 2.引入 3.配置 4.使用 5.使用场景 6.改变颜色 1.安装 npm install --save nprogress2.引入 import NProgress from nprogress import nprogress/nprogress.css3.配置 NProgress.configure({easing: ease, // 动画方式,和css动画属性一样&#…...
@NotNull 、@NotBlank、@NotEmpty区别和使用
引言 今天在使用validation校验的时候,发现了使用校验不起作用,一时间有点摸不到头绪,就看了一下同事提交的代码,发现了问题在用NotNull用法,用的有些错误,所以在这里讲一下NotNull、NotBlank、NotEmpty区…...
Nacos——Nacos简介以及Nacos Server安装
资料来源:02-Nacos配置管理-什么是配置中心_哔哩哔哩_bilibili nacos记得下载2.x版本的,负责以后新建配置的时候会出现“发布错误,请检查参数是否正确”错误!!!! 目录 一、Nacos简介 1.1 四…...
Presto 文档和笔记
1. Presto Presto 官网 Presto 文档 2. 配置 3.1 node 配置 cat etc/node.properties # Generated by Apache Ambari. Fri Feb 10 14:52:10 2023node.data-dir/mnt/bmr/presto/data node.environmentproduction node.idbmr-master-4b7cbaa3.2 jvm 配置 cat etc/jvm.confi…...
大尺度衰落与小尺度衰落
一. 大尺度衰落 无线电磁波信号在收发天线长距离(远大于传输波长)或长时间范围发生的功率变化,称为大尺度衰落,一般可以用路径损耗模型来描述,路径损耗是由发射功率在空间中的辐射扩散造成的,根据功率传输…...
完美解决:重新安装VMware Tools灰色。以及共享文件夹的创建(centos8)
解决:重新安装VMware Tools灰色问题:重新安装VMware Tools灰色解决方案-挂载VMware中的linux.iso1. vmtools的linux.iso挂载及安装2. 共享文件夹的创建及配置问题:重新安装VMware Tools灰色 发现一个小问题,我的vm虚拟机安装后发…...
达梦数据库作业管理
一、基本功能 作业系统大致包含作业,警报,操作员三部分。 作业可运行DMPL/SQL脚本,定期备份数据库,检查等。可定时执行,也可通过警报触发执行,可产生警报通知用户状态。一个作业由多个步骤组成,…...
数据结构-考研难点代码突破(C++实现树型查找-二叉搜索树(二叉排序树))
文章目录1.二叉搜索树基本操作二叉搜索树的效率分析2. C实现1.二叉搜索树基本操作 二叉排序树是具有下列特性的二叉树: 若左子树非空,则左子树上所有结点的值均小于根结点的值。若右子树非空,则右子树上所有结点的值均大于根结点的值。左、…...
emqx异常处理
启动异常 通过解压tar压缩包安装后通过 ./bin/emqx start 启动报错 WARNING: Default (insecure) Erlang cookie is in use. WARNING: Configure node.cookie in /opt/emqx/etc/emqx.conf or override from environment variable EMQX_NODE__COOKIE NOTE: Use the same config…...
Web前端:开始学习ReactJS需要知道什么?
毫无疑问,ReactJS是前端开发者中最著名的库之一,它的受欢迎程度与日俱增。用ReactJS构建的网站看起来非常棒,大多数开发新手都被它吸引住了。然而,许多新人和有经验的开发人员在没有首先了解先决条件的情况下,就直接用…...
卡诺图化简
1.相关概念 最小项:函数的某个乘积项包含了函数的全部变量(原变量或反变量的形式),且每个变量仅出现一次,则这个乘积项为该函数的一个标准积项。 最小项中的原变量记为1,反变量记为0,当变量顺序…...
带你了解软件测试是做什么的
软件测试是互联网技术中一门重要的学科,它是软件生命周期中不可或缺的一个环节,担负着把控、监督软件的质量的重任。 人才稀缺,对于求职者来说就意味着机会。但是很多想学习软件测试的人对这个学科并不了解,也不知道该如何学习&a…...
企业电子招投标采购系统源码之功能模块功能描述
功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外…...
职场中的高手,是如何高质量解决问题?
职场总会遇见很多新问题,高手会从容应对,因为他们学习了一套通 用理论,可以处理工作当中的大部分内容,剩下的一部分能够用快速 提问的方式找到思路。 记得几年前有个同事 A,下午四点多项目突然丢过来一个活,…...
报表生成工具Stimulsoft中的电子签名和 PDF 数字签名
Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…...
【Hello Linux】Linux环境下写的第一个程序 -- 进度条
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:写出Linux中的第一个小程序 进度条 进度条小程序行缓冲区概念\r 和 \n进度条代码和演示行缓冲区概念 我们首先用两段代码来感受下行缓…...
【基础】性能测试,从0到实战(手把手教,非常实用)
一、性能基础 什么是性能测试--->本质? 基于协议来模拟用户发送的请求(业务模拟),对服务器形成一定负载。关注点:时间性能、空间性能与界面无关 性能测试分类 性能测试(狭义) 性能测试方法是通过模…...
07-Java异常分类以及处理机制
1.异常概念 Java标准库内建了一些通用的异常,这些类以Throwable为顶层父类。Throwable又派生出Error类和Exception类。 1.错误:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示…...
用到的C++的相关知识-----未完待续
文章目录前言一、vector函数的使用1.1 构造向量二、常用函数2.1 矩阵输出函数2.2 向量输出函数2.3 矩阵的使用2.4三、new的用法3.1 内存的四种分区3.2 new的作用3.33.4四、4.14.24.34.4总结前言 只是为方便学习,不做其他用途 一、vector函数的使用 有关的文章 C v…...
JavaScript刷LeetCode拿offer-贪心算法
前言 学习算法的时候,总会有一些让人生畏的名词,比方动态规划,贪心算法 等,听着就很难;而这一 part 就是为了攻破之前一直没有系统学习的 贪心算法; 有一说一,做了这些贪心题,其实…...
selenium
下载并安装selenium 安装:cmd中执行 pip install -i https://pypi.douban.com/simple selenium执行完成后 pip show selenium 可查看安装是否成功安装浏览器驱动,查看当前浏览器的版本选择合适的驱动并下载 chrome的链接:https://chromedrive…...
SpringMVC的视图
转发视图ThymeleafView若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。解析:当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会…...
idea使用本地代码远程调试线上运行代码---windows环境
场景: 今天在书上看了一个代码远程调试的方法,自己本地验证了一下感觉十分不错!! windows环境: 启动测试jar包:platform-multiappcenter-base-app-1.0.0-SNAPSHOT.jar 测试工具:postman,idea 应…...
简单记录简单记录
目录1.注册Gmail2.注册ChatGPT3.验证“真人”使用4.开始使用1.注册Gmail 第一步先注册一个谷歌邮箱,你也可以使用微软账号,大部分人选择使用gmail。 申请谷歌邮箱 选择个人用途创建账号即可。 📌温馨提示: 你直接使用guo内的网…...
源码系列 之 ThreadLocal
简介 ThreadLocal的作用是做数据隔离,存储的变量只属于当前线程,相当于当前线程的局部变量,多线程环境下,不会被别的线程访问与修改。常用于存储线程私有成员变量、上下文,和用于同一线程,不同层级方法间传…...
C语言入门(1)——特点及关键字
1、C特点及与Java区别 1.1、C特点 面向过程 一般用于嵌入式开发、编写最底层的程序、操作系统 可以直接操作内存 可以封装动态库 不容易跨平台 有指针 可以直接操作串口 线程更加灵活 和硬件打交道速度是最快的 1.2、和Java区别 C是C的增强版,增加了一些新的特性&…...
react中useEffect和useLayoutEffect的区别
布局上 useEffect在浏览器渲染完成后执行useLayoutEffect在DOM更新后执行 特点 useLayoutEffect 总是比 useEffect 先执行;useLayoutEffect与componentDidMount、componentDidUpdate调用时机相同,都是在DOM更新后,页面渲染前调用࿱…...
网站建设的组织保障/如何找客户资源
2019独角兽企业重金招聘Python工程师标准>>> Abstract: 工厂方法模式属于创建型模式,本文深入浅出的讲述了设计模式中的工厂方法模式 , 并给出了简单的示例 , 例子浅显易懂 , 并附带源代码。 工厂方法经常用在以下两种情况中: 第一种情况是对于某个产品&…...
怎么找到合适的网站建设商/产品免费推广网站有哪些
1、创建索引 ALTER TABLE TBL_STUDENT-表名 ADD INDEX INDEX_NAME(STU_NAME-列名) 2、EXPLAIN命令 MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP)。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它能…...
网站icp备案代办/郑州网络公司
pool.close()pool.join() 是可以循环使用的,中间作为断点继传的时间点...
罗湖中心区做网站/今日新闻热点大事件
具体代码:(代码放在UI上,该UI添加了BoxCollider)效果如下:...
呼家楼做网站的公司哪家好/北京排名seo
1.福利 | 飞桨中国行——生产制造专场 https://ai.baidu.com/support/news?actiondetail&id2704&hmsrAI&hmplZ 2.利器 | 数字化石油的开采利器:智能图像识别系统 https://ai.baidu.com/support/news?actiondetail&id2707&hmsrAI&hmplZ…...
个人网站对应网站网址/网络运营师
0.353表示一个数里有3个(1/10),5个(1/100),3个(1/1000)。0.11001表示一个数里有1个(1/2),1个(1/4),1个(1/32)。0.353里有多少个(1/2)?floor(0.353/0.5)0个。0.353里有多少个(1/4)?floor(0.353/0.25)1个。0.…...