DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门,不同的系列有不同的理论依据,DETR的亮点在于它是完全端到端的第一个目标检测模型,DETR(Detection Transformer)是一种基于Transformer的目标检测模型,由Facebook AI Research开发。它采用了端到端的方法,在目标检测任务中同时完成目标定位和分类。DETR模型结合了Transformer的自注意力机制和编码器-解码器结构。通过将图像作为输入,并使用Transformer解码器来生成预测框和对应的类别。与传统的目标检测方法不同,DETR不需要使用锚框或候选区域,而是直接从全局观察中生成预测。

DETR模型的训练过程包括两个阶段:首先,使用交叉熵损失函数对预测框和类别进行监督学习;然后,使用匈牙利算法将预测框与真实框进行匹配,计算IoU损失以进一步优化预测结果。DETR模型在目标检测任务上取得了很好的性能,并且具有较高的效率和灵活性。它可以应用于多种场景,如物体检测、实例分割等任务。

DETR官方项目地址在这里,如下所示:

 目前已经有超过11.4k的star量,足以见得这是一款很出色的检测模型了。

 DETR(DEtection TRansformer)是一种基于Transformer的目标检测模型,提供了PyTorch训练代码和预训练模型。它用Transformer替代了传统的复杂手工设计的目标检测流程,并使用ResNet-50与Faster R-CNN进行比较,在COCO数据集上以相同参数数量和一半计算量(FLOPs)下获得了42 AP的准确率。在只有50行PyTorch代码的情况下,可以进行推断。

DETR的特点是将目标检测作为直接集合预测问题来处理,它包括一个基于集合的全局损失函数,通过二分图匹配强制生成唯一的预测结果,以及一个Transformer编码器-解码器架构。给定一组固定的学习对象查询(object queries),DETR根据对象之间的关系和全局图像上下文直接并行输出最终的预测结果。由于这种并行性质,DETR非常快速高效。

关于代码,我们认为目标检测不应该比分类更困难,也不应该需要复杂的训练和推断库。DETR的实现和实验非常简单,我们提供了一个独立的Colab Notebook,在几行PyTorch代码中展示了如何使用DETR进行推断。训练代码也遵循这个思路,它不是一个库,而只是一个主要的.py文件,导入模型和标准训练循环。此外,我们还提供了Detectron2的封装,位于d2/文件夹中。请参阅那里的自述文件以获取更多信息。

接下来我们来整体看下,如何一步一步基于DETR开发构建自己的个性化目标检测模型。

一、下载准备项目

 直接页面端安装红框所示点击即可下载源码项目到本地如下所示:

 解压缩如下所示:

 看起来比较乱,这里删除掉不需要的文件,精简一下,如下所示:

 到这里项目下载准备工作已经完成了。

二、项目参数修改

这里主要是根据自己的数据集情况要做一些项目参数的配置修改,首先到这里下载官方提供的预训练模型权重文件。如下所示:

 接下来编写下述代码来对预训练模型文件进行修改,修改适配自己的数据集:

import torchpretrained_weights = torch.load("./detr-r50-e632da11.pth")
num_class = 1 + 1
pretrained_weights["model"]["class_embed.weight"].resize_(num_class+1,256)
pretrained_weights["model"]["class_embed.bias"].resize_(num_class+1)
torch.save(pretrained_weights,'detr_r50_%d.pth'%num_class)

这里的核心就是num_class,这里我的类别只有一个所有就是1(目标数量)+1(背景),根据自己的实际情况修改即可,执行上述代码将会生成可用于训练自己数据集的预训练模型文件如下所示:

 接下来进入到models目录,如下所示:

 来修改detr.py的源码:

 修改内容如下所示:

 同样也是根据自己的数据集的实际情况进行修改即可。

官方的实例都是以COCO数据集为基础的,这里为了方便直接使用我的数据集,我这里同时修改了datasets目录下的coco.py模块,如下所示:

 这里不是必须的,只是因为我前面写yolo系列的超详细教程的时候习惯了以0000目录为基准作为数据集的目录而已,这个根据自己实际情况来就行。

0000/coco/目录下如下所示:

 annotations目录下如下所示:

 train和val目录都是图像数据目录。

到这里全部的数据集准备和参数修改配置就完成了。

三、模型训练

完成前面步骤一和步骤二之后就可以开始模型的训练工作了,终端输入下面的命令即可:

python3 main.py --dataset_file "coco" --coco_path "/0000/coco" --epoch 100 --lr=1e-4 --batch_size=2 --num_workers=0 --output_dir="outputs" --resume="weights/detr_r50_2.pth"

终端日志输出如下所示:

 感觉这个日志输出的形式和yolo系列的模型风格差异还是很大的,最开始使用的时候多多少少是有点不太适应的。

静静等待,100次epoch训练完成后,结果目录如下所示:

 这里我们看一个epoch的结果数据如下所示:

{"train_lr": 0.00010000000000000072, "train_class_error": 8.246314652760823, "train_loss": 11.92804820438226, "train_loss_ce": 0.45436179675161836, "train_loss_bbox": 0.19398587183095514, "train_loss_giou": 1.2654916323721408, "train_loss_ce_0": 0.6175143427525958, "train_loss_bbox_0": 0.21694033461002013, "train_loss_giou_0": 1.3583310965448618, "train_loss_ce_1": 0.5325561841484159, "train_loss_bbox_1": 0.19919901308603585, "train_loss_giou_1": 1.2892874646931887, "train_loss_ce_2": 0.49897560079116376, "train_loss_bbox_2": 0.19595884778536857, "train_loss_giou_2": 1.2676222202057639, "train_loss_ce_3": 0.47517175901836406, "train_loss_bbox_3": 0.19423701039825877, "train_loss_giou_3": 1.2563509756699205, "train_loss_ce_4": 0.457715673193646, "train_loss_bbox_4": 0.19406218592387933, "train_loss_giou_4": 1.2602861863871415, "train_loss_ce_unscaled": 0.45436179675161836, "train_class_error_unscaled": 8.246314652760823, "train_loss_bbox_unscaled": 0.038797174374728155, "train_loss_giou_unscaled": 0.6327458161860704, "train_cardinality_error_unscaled": 25.414583333333333, "train_loss_ce_0_unscaled": 0.6175143427525958, "train_loss_bbox_0_unscaled": 0.04338806696857015, "train_loss_giou_0_unscaled": 0.6791655482724309, "train_cardinality_error_0_unscaled": 29.636458333333334, "train_loss_ce_1_unscaled": 0.5325561841484159, "train_loss_bbox_1_unscaled": 0.03983980262031158, "train_loss_giou_1_unscaled": 0.6446437323465943, "train_cardinality_error_1_unscaled": 27.819791666666667, "train_loss_ce_2_unscaled": 0.49897560079116376, "train_loss_bbox_2_unscaled": 0.03919176950973148, "train_loss_giou_2_unscaled": 0.6338111101028819, "train_cardinality_error_2_unscaled": 27.161458333333332, "train_loss_ce_3_unscaled": 0.47517175901836406, "train_loss_bbox_3_unscaled": 0.03884740209129329, "train_loss_giou_3_unscaled": 0.6281754878349602, "train_cardinality_error_3_unscaled": 26.110416666666666, "train_loss_ce_4_unscaled": 0.457715673193646, "train_loss_bbox_4_unscaled": 0.038812437271311256, "train_loss_giou_4_unscaled": 0.6301430931935708, "train_cardinality_error_4_unscaled": 25.4625, "test_class_error": 3.091428756713867, "test_loss": 10.50865466594696, "test_loss_ce": 0.2767929275830587, "test_loss_bbox": 0.14404282706479232, "test_loss_giou": 1.2663704454898834, "test_loss_ce_0": 0.3979991920292377, "test_loss_bbox_0": 0.16362756925324598, "test_loss_giou_0": 1.36108036339283, "test_loss_ce_1": 0.3436319828033447, "test_loss_bbox_1": 0.1497225967546304, "test_loss_giou_1": 1.3024949004252753, "test_loss_ce_2": 0.30994254574179647, "test_loss_bbox_2": 0.14414388077954451, "test_loss_giou_2": 1.249400516351064, "test_loss_ce_3": 0.2894516279300054, "test_loss_bbox_3": 0.144076735774676, "test_loss_giou_3": 1.270151581366857, "test_loss_ce_4": 0.2760662081340949, "test_loss_bbox_4": 0.1443922327210506, "test_loss_giou_4": 1.2752665122350058, "test_loss_ce_unscaled": 0.2767929275830587, "test_class_error_unscaled": 3.091428756713867, "test_loss_bbox_unscaled": 0.028808565282573303, "test_loss_giou_unscaled": 0.6331852227449417, "test_cardinality_error_unscaled": 31.85, "test_loss_ce_0_unscaled": 0.3979991920292377, "test_loss_bbox_0_unscaled": 0.03272551361781855, "test_loss_giou_0_unscaled": 0.680540181696415, "test_cardinality_error_0_unscaled": 43.225, "test_loss_ce_1_unscaled": 0.3436319828033447, "test_loss_bbox_1_unscaled": 0.02994451941922307, "test_loss_giou_1_unscaled": 0.6512474502126376, "test_cardinality_error_1_unscaled": 39.733333333333334, "test_loss_ce_2_unscaled": 0.30994254574179647, "test_loss_bbox_2_unscaled": 0.02882877611555159, "test_loss_giou_2_unscaled": 0.624700258175532, "test_cardinality_error_2_unscaled": 37.733333333333334, "test_loss_ce_3_unscaled": 0.2894516279300054, "test_loss_bbox_3_unscaled": 0.028815347344304125, "test_loss_giou_3_unscaled": 0.6350757906834285, "test_cardinality_error_3_unscaled": 34.483333333333334, "test_loss_ce_4_unscaled": 0.2760662081340949, "test_loss_bbox_4_unscaled": 0.02887844655973216, "test_loss_giou_4_unscaled": 0.6376332561175029, "test_cardinality_error_4_unscaled": 31.533333333333335, "test_coco_eval_bbox": [0.0784053628963453, 0.27165513666939684, 0.02143312972132683, 0.05011304279117235, 0.10950960486820328, 0.248747506997248, 0.01054397316079559, 0.07481428229091781, 0.18171579199616583, 0.13471350899205353, 0.2401053864168618, 0.3527027027027027], "epoch": 0, "n_parameters": 41279495}

可以看到:这是一个标准的字典数据。

完成模型的训练之后就可以对模型进行评估测试了,执行下述的命令:

python3 main.py --batch_size 2 --no_aux_loss --eval --resume outputs/checkpoint.pth --coco_path "/0000/coco"

结果输出如下所示:

Accumulating evaluation results...
DONE (t=0.12s).
IoU metric: bboxAverage Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.249Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.614Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.147Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.156Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.356Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.548Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.017Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.142Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.362Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.279Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.468Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.622

初步来看效果还不错,不过跟yolo系列的模型实验结果对比起来还是逊色的。

到这里模型的开发训练和测试评估就结束了

四、训练可视化

想必到这里大家都意识到了DETR项目没有像YOLO那样的可视化功能,所以想要有可视化指标的话还是需要自己去进行可视化绘图的。

这里仅仅是自己的简单绘图,可以根据自己的需要自行实现即可。我将单个epoch训练日志数据进行解析,如下所示:

train_lr 0.00010000000000000072
train_class_error 8.246314652760823
train_loss 11.92804820438226
train_loss_ce 0.45436179675161836
train_loss_bbox 0.19398587183095514
train_loss_giou 1.2654916323721408
train_loss_ce_0 0.6175143427525958
train_loss_bbox_0 0.21694033461002013
train_loss_giou_0 1.3583310965448618
train_loss_ce_1 0.5325561841484159
train_loss_bbox_1 0.19919901308603585
train_loss_giou_1 1.2892874646931887
train_loss_ce_2 0.49897560079116376
train_loss_bbox_2 0.19595884778536857
train_loss_giou_2 1.2676222202057639
train_loss_ce_3 0.47517175901836406
train_loss_bbox_3 0.19423701039825877
train_loss_giou_3 1.2563509756699205
train_loss_ce_4 0.457715673193646
train_loss_bbox_4 0.19406218592387933
train_loss_giou_4 1.2602861863871415
train_loss_ce_unscaled 0.45436179675161836
train_class_error_unscaled 8.246314652760823
train_loss_bbox_unscaled 0.038797174374728155
train_loss_giou_unscaled 0.6327458161860704
train_cardinality_error_unscaled 25.414583333333333
train_loss_ce_0_unscaled 0.6175143427525958
train_loss_bbox_0_unscaled 0.04338806696857015
train_loss_giou_0_unscaled 0.6791655482724309
train_cardinality_error_0_unscaled 29.636458333333334
train_loss_ce_1_unscaled 0.5325561841484159
train_loss_bbox_1_unscaled 0.03983980262031158
train_loss_giou_1_unscaled 0.6446437323465943
train_cardinality_error_1_unscaled 27.819791666666667
train_loss_ce_2_unscaled 0.49897560079116376
train_loss_bbox_2_unscaled 0.03919176950973148
train_loss_giou_2_unscaled 0.6338111101028819
train_cardinality_error_2_unscaled 27.161458333333332
train_loss_ce_3_unscaled 0.47517175901836406
train_loss_bbox_3_unscaled 0.03884740209129329
train_loss_giou_3_unscaled 0.6281754878349602
train_cardinality_error_3_unscaled 26.110416666666666
train_loss_ce_4_unscaled 0.457715673193646
train_loss_bbox_4_unscaled 0.038812437271311256
train_loss_giou_4_unscaled 0.6301430931935708
train_cardinality_error_4_unscaled 25.4625
test_class_error 3.091428756713867
test_loss 10.50865466594696
test_loss_ce 0.2767929275830587
test_loss_bbox 0.14404282706479232
test_loss_giou 1.2663704454898834
test_loss_ce_0 0.3979991920292377
test_loss_bbox_0 0.16362756925324598
test_loss_giou_0 1.36108036339283
test_loss_ce_1 0.3436319828033447
test_loss_bbox_1 0.1497225967546304
test_loss_giou_1 1.3024949004252753
test_loss_ce_2 0.30994254574179647
test_loss_bbox_2 0.14414388077954451
test_loss_giou_2 1.249400516351064
test_loss_ce_3 0.2894516279300054
test_loss_bbox_3 0.144076735774676
test_loss_giou_3 1.270151581366857
test_loss_ce_4 0.2760662081340949
test_loss_bbox_4 0.1443922327210506
test_loss_giou_4 1.2752665122350058
test_loss_ce_unscaled 0.2767929275830587
test_class_error_unscaled 3.091428756713867
test_loss_bbox_unscaled 0.028808565282573303
test_loss_giou_unscaled 0.6331852227449417
test_cardinality_error_unscaled 31.85
test_loss_ce_0_unscaled 0.3979991920292377
test_loss_bbox_0_unscaled 0.03272551361781855
test_loss_giou_0_unscaled 0.680540181696415
test_cardinality_error_0_unscaled 43.225
test_loss_ce_1_unscaled 0.3436319828033447
test_loss_bbox_1_unscaled 0.02994451941922307
test_loss_giou_1_unscaled 0.6512474502126376
test_cardinality_error_1_unscaled 39.733333333333334
test_loss_ce_2_unscaled 0.30994254574179647
test_loss_bbox_2_unscaled 0.02882877611555159
test_loss_giou_2_unscaled 0.624700258175532
test_cardinality_error_2_unscaled 37.733333333333334
test_loss_ce_3_unscaled 0.2894516279300054
test_loss_bbox_3_unscaled 0.028815347344304125
test_loss_giou_3_unscaled 0.6350757906834285
test_cardinality_error_3_unscaled 34.483333333333334
test_loss_ce_4_unscaled 0.2760662081340949
test_loss_bbox_4_unscaled 0.02887844655973216
test_loss_giou_4_unscaled 0.6376332561175029
test_cardinality_error_4_unscaled 31.533333333333335
test_coco_eval_bbox [0.0784053628963453, 0.27165513666939684, 0.02143312972132683, 0.05011304279117235, 0.10950960486820328, 0.248747506997248, 0.01054397316079559, 0.07481428229091781, 0.18171579199616583, 0.13471350899205353, 0.2401053864168618, 0.3527027027027027]
epoch 0
n_parameters 41279495

可以看到:不同指标拆分得很细,单个指标核心绘图实现很简单,如下所示:

plt.clf()
plt.figure(figsize=(10,8))
plt.plot(one_value)
plt.title(one_key + "cruve")
plt.savefig("outputs/pictures/"+one_key+".jpg")

简单看下可视化结果:

 当然了,还有很多很多,这里不再一一展示了,可以自行动手实践下即可:

 我这里绘制的很简单,单个指标就是一幅图,可以多个指标叠在一张图上面都是可以的,感兴趣的话可以自己试试。

最后简单看下推理检测实例,如下所示:

 到这里本文的实践就结束了,感兴趣的话就自己动手试试吧。

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

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

相关文章

Redis 从入门到精通【进阶篇】之高可用集群(Redis Cluster)详解

文章目录 0. 前言设计目标核心概念 1. 架构设计和原理1.1. 数据分片2. 节点间通信6. 扩容和缩容 2. 总结3. Redis从入门到精通系列文章4. Redis Cluster面试题4.1. Redis Cluster如何进行扩容和缩容?4.2. Redis Cluster如何进行故障转移?4.3. Redis Clus…

【问题分析解决】git添加.gitignore后不生效问题

一,问题现象 在已经提交过的git管理的项目中,新增加一个.gitignore文件,或者修改.gitignore文件之后,新增的内容不生效。 二,问题原因 因为我们误解了.gitignore文件的用途,该文件只能作用于Untracked F…

JDK JRE JVM

JDK JRE JVM JDKJREJVM三者之间的联系三者之间的区别 JDK JDK是用于开发、编译、调试和运行Java应用程序的软件包,包含了Java编程语言的开发工具和Java运行时环境。JDK包括Java编译器(javac)、Java虚拟机(JVM)和Java类…

单轴机器人的结构与特点

单轴机器人是由马达驱动的移动平台,由滚珠螺杆和 U型线性滑轨导引构成,其滑座同时为滚珠螺杆的驱动螺帽及线性滑轨的导引滑块,可用半导体、光电、交通运输业、环保节能产业、精密工具机、机械产业、智慧自动化、生技医疗上。 相对于传统的模组…

django使用channels实现webSocket启动失败

问题描述 使用channels启动ASGI结果却是普通启动,如下: Watching for file changes with StatReloader Performing system checks...System check identified no issues (0 silenced). July 15, 2023 - 18:23:49 Django version 4.2, using settings s…

JavaWeb(3)——HTML、CSS、JS 快速入门

一、JavaScript 运算符 • 赋值运算符( ) 赋值运算符执行过程? 将等号右边的值赋予给左边, 要求左边必须是一个容器 出现是为了简化代码, 比如让 let age 18 ,age 加 2 怎么写呢 let age 18age 2console.log(age)age * 2con…

javaee jstl表达式

jstl是el表达式的扩展 使用jstl需要添加jar包 package com.test.servlet;import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.servlet.ServletException; import javax.servlet…

下载编译Chromium

参考:Mac上本地编译Chrome浏览器踩坑笔记(2021.02最新) - 掘金 For Mac: 一、下载编译工具链:deptool git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH"$PATH:/Users/yumlu/cod…

什么是DevOps监控以及如何在组织中实施?

如今的软件开发商经常面临两大挑战——快速交付和大规模创新。DevOps通过在软件开发生命周期(SDLC)中引入自动化来开发和交付高质量的软件,从而帮助解决这些挑战。 持续集成(CI)/持续部署(CD)是DevOps实践中自动化的关键组件。它可以自动化代码构建、测试…

力扣 1005. K 次取反后最大化的数组和

题目来源:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ C题解1:最直接的想法就是负的变正的,如果负的元素数量小于k,就挑选绝对值大的负数变正;如果负的元素数量大于k&#xf…

阿里云声音复刻

阿里云声音复刻 个性化人声定制 阿里云个性化人声定制是智能语音交互产品自学习平台下的一部分 使用方式:https://help.aliyun.com/document_detail/456006.html 方式一:控制台界面定制使用方式 方式二:通过OpenAPI定制:在该页…

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于KELM-Adaboost核极限学习机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于KELM-Adaboo…

IP基础知识总结

IP他负责的是把IP数据包在不同网络间传送,这是网络设计相关的,与操作系统没有关系。所以这部分知识,不是网络的重点。IP和路由交换技术联系紧密。但是要作为基本知识点记住。 一、基本概念 网络层作用:实现主机与主机之间通信。 …

linux之Ubuntu系列(三)远程管理指令☞SSH 高级应用 RSA非对称加密 以及免密登录,配置别名

对称加密 、非对称加密 1、对称加密中加密和解密使用的秘钥是同一个;非对称加密中采用两个密钥,一般使用公钥进行加密,私钥进行解密。 2、对称加密解密的速度比较快,非对称加密和解密花费的时间长、速度相对较慢。 3、对称加密的…

81. 正则表达式

一、概述二、匹配单个字符三、匹配一组字符四、使用元字符五、重复匹配六、位置匹配七、使用子表达式八、回溯引用九、前后查找十、嵌入条件参考资料 一、概述 正则表达式用于文本内容的查找和替换。 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或…

uniapp微信小程序使用axios(vue3+axios+ts版)

版本号 "vue": "^3.2.45", "axios": "^1.4.0", "axios-miniprogram-adapter": "^0.3.5", 安装axios及axios适配器,适配小程序 yarn add axios axios-miniprogram-adapter 使用axios 在utils创建utils/…

7个银行的软件测试项目实战,别再说简历项目不知道怎么写了

目录 前言 项目描述1:上海华瑞银行直连票据项目 项目描述2:平安金服风控中台系统 项目描述3:众安创展APP项目 项 目4: 招商银行VTM自助渠道服务系统 项 目5:招商银行票据支付 项 目6: 平安银行风控系…

Virus Total 曝数据泄露大事件:涉及多国情报部门

The Hacker News 网站披露,可疑文件和病毒在线检测平台 VirusTotal 曝出数据泄露事故,一名员工无意中将部分 VirusTotal 注册客户的姓名、电子邮件地址等敏感数据信息上传到了恶意软件扫描平台,此举导致约 5600 名用户数据泄露。 据悉&#x…

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

深入探索和分析MySQL数据库的数据备份和恢复实战开发指南 MySQL数据库备份全量备份全量备份应用场景 增量备份binlogbinlog主要作用binlog的作用主要有两个方面 开启binlog日志功能要开启MySQL的binlog日志步骤 mysqlbinlogmysqlbinlog的使用案例 全量备份与增量备份结合按天全…

安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用后台模块SessionCookieToken身份验证唯一性

文章目录 开发环境数据导入-mysql架构&库表列数据库操作-mysqli函数&增删改查数据接收输出-html混编&超全局变量第三方插件引用-js传参&函数对象调用身份验证-Cookie使用身份验证-Session使用唯一性判断-Token使用具体安全知识点:Cookie和Session都…