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")
简单看下可视化结果:
当然了,还有很多很多,这里不再一一展示了,可以自行动手实践下即可:
我这里绘制的很简单,单个指标就是一幅图,可以多个指标叠在一张图上面都是可以的,感兴趣的话可以自己试试。
最后简单看下推理检测实例,如下所示:
到这里本文的实践就结束了,感兴趣的话就自己动手试试吧。
相关文章:

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程
目标检测系列的算法模型可以说是五花八门,不同的系列有不同的理论依据,DETR的亮点在于它是完全端到端的第一个目标检测模型,DETR(Detection Transformer)是一种基于Transformer的目标检测模型,由Facebook A…...

C++初阶 - 5.C/C++内存管理
目录 1.C/C的内存分布 2.C语言中动态内存管理方式:malloc、calloc、realloc、free 3.C内存管理方式 3.1 new/delete操作内置类型 3.2 new 和 delete操作自定义类型 4.operator new 与 operator delete 函数(重要点) 4.1 operator new 与…...

数学建模学习(3):综合评价类问题整体解析及分析步骤
一、评价类算法的简介 对物体进行评价,用具体的分值评价它们的优劣 选这两人其中之一当男朋友,你会选谁? 不同维度的权重会产生不同的结果 所以找到每个维度的权重是最核心的问题 0.25 二、评价前的数据处理 供应商ID 可靠性 指标2 指…...
【后端面经】微服务构架 (1-5) | 限流:濒临奔溃?限流守护者拯救系统于水火之中!
文章目录 一、前置知识1、什么是限流?2、限流算法A) 静态算法a) 漏桶b) 令牌桶c) 固定窗口d) 滑动窗口B) 动态算法3、限流的模式4、 限流对象4、限流后应该怎么做?二、面试环节1、面试准备2、基本思路3、亮点展现A) 突发流量(针对请求个数而言)B) 请求大小(针对请求大小而言)…...

HDFS异构存储详解
异构存储 HDFS异构存储类型什么是异构存储异构存储类型如何让HDFS知道集群中的数据存储目录是那种类型存储介质 块存储选择策略选择策略说明选择策略的命令 案例:冷热温数据异构存储对应步骤 HDFS内存存储策略支持-- LAZY PERSIST介绍执行使用 HDFS异构存储类型 冷…...

《面试1v1》Kafka消息是采用Pull还是Push模式
🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结…...

Windows环境Docker安装
目录 安装Docker Desktop的步骤 Docker Desktop 更新WSL WSL 的手动安装步骤 Windows PowerShell 拉取(Pull)镜像 查看已下载的镜像 输出"Hello Docker!" Docker Desktop是Docker官方提供的用于Windows的图形化桌面应用程序,…...
Spring 6.0官方文档示例(23): singleton类型的bean和prototype类型的bean协同工作的方法(二)
使用lookup-method: 一、实体类: package cn.edu.tju.domain2;import java.time.LocalDateTime; import java.util.Map;public class Command {private Map<String, Object> state;public Map<String, Object> getState() {return state;}public void …...

Docker Compose 容器编排
Docker compose Docker compose 实现单机容器集群编排管理(使用一个模板文件定义多个应用容器的启动参数和依赖关系,并使用docker compose来根据这个模板文件的配置来启动容器) 通俗来说就是把之前的多条docker run启动容器命令 转换为docker…...
while循环
while循环是一种常见的循环结构,它会重复执行一段代码,直到指定的条件不再满足。 基本语法如下: while 条件: # 循环体代码 其中,条件是一个布尔表达式,如果为True,则执行循环体中的代码;如果…...
从JVM指令看String对象的比较
在翻看各类 java 知识中,总会提到如下知识:比较 String 对象,例如: String a1new String("10"); String a2"10"; String a3"1""0";//结果 System.out.println(a1a2); //false System.ou…...

python与深度学习(六):CNN和手写数字识别二
目录 1. 说明2. 手写数字识别的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试…...

Linux使用教程
一、Linux命令基础 1、ls、ll命令——展示数据 ①ls命令——平铺展示数据 其中ls命令以平铺的方式展现数据 ②ll命令——列表展示数据 ll命令以列表的方式展现数据 -a选项,表示:all的意思,即列出全部文件(包含隐藏的文件/文件夹…...

项目名称:智能家居边缘网关项目
一,项目介绍 软件环境: C语言 硬件环境: STM32G030C8TX单片机开发板 开发工具: Linux平台GCC交叉编译环境以及ukeil (1)边缘网关概念 边缘网关是部署在网络边缘侧的网关,通过网络联接、协议转换等功能联接物理和数字世界,提供轻量化的联接管…...

SciencePub学术 | 物联网类重点SCIEEI征稿中
SciencePub学术 刊源推荐: 物联网类重点SCIE&EI征稿中!信息如下,录满为止: 一、期刊概况: 物联网类重点SCIE&EI 【期刊简介】IF:7.5-8.0,JCR1区,中科院1/2区TOP; 【出版社…...

EtherNet/IP转Modbus网关以连接AB PLC
本案例为西门子S7-1200 PLC通过捷米特Modbus转EtherNet/IP网关捷米特JM-EIP-RTU连接AB PLC的配置案例。 网关分别从ETHERNET/IP一侧和MODBUS一侧读写数据,存入各自的缓冲区,网关内部将缓冲区的数据进行交换,从而实现两边数据的传输。 网关做为…...

mysql用户添加
一、连接mysql服务 mysql -u root -p 二、查询用户表 use mysql ; SELECT User, Host FROM mysql.user; 三、新增用户并授权 Create USER dev4rw% IDENTIFIED WITH mysql_native_password BY 新密码; GRANT ALL PRIVILEGES ON *.* TO dev4rw% WITH GRANT OP…...

628. 三个数的最大乘积
628. 三个数的最大乘积 class Solution {public int maximumProduct(int[] nums) {Arrays.sort(nums); return Math.max(nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3],nums[0]*nums[1]*nums[nums.length-1]);} }...

linux驱动开发入门(学习记录)
2023.7.6及7.7 概述了解 一 1.驱动框架 2. 字符设备 块设备,存储相关 网络设备驱动 不一定属于某一种类型二 1.获取外设或传感器数据,控制外设,数据会提交给应用程序 2.编写一个驱动,及测试应用程序 app。驱动和应用完全分开 3.驱…...

SpringCloud-Alibaba之Sentinel熔断与限流
一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程,并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化)配置文件 se…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...