【RT-DETR改进涨点】为什么YOLO版本的RT-DETR训练模型不收敛的问题

前言

大家好,我是Snu77,这里是RT-DETR有效涨点专栏

本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。

其中提到的多个版本ResNet18、ResNet34、ResNet50、ResNet101为本人根据RT-DETR官方版本1:1移植过来的,参数量基本保持一致(误差很小很小),不同于ultralytics仓库版本的ResNet官方版本,同时ultralytics仓库的一些参数是和RT-DETR相冲的所以我也是会教大家调好一些参数,真正意义上的跑ultralytics的和RT-DETR官方版本的无区别,给后期发论文的时候省区许多麻烦。

欢迎大家订阅本专栏,一起学习RT-DETR! 


本文介绍 

本文的内容同样为本专栏的前期预热文章,文章主要解释一下为什么有的人跑ultralytics仓库的RT-DETR精度很差,模型不收敛,mAP异常的情况。

为了验证这一情况我也是跑了多个实验,从多个数据集出发,100-500的数据集我跑了5个数据集,1000的跑了二个,2000的我跑了一个,4000的了一个,同时其中一些版本我也用了不同的batch_size来出发验证精度异常的情况。从这些角度来论证为什么你的数据集在RT-DETR上不能够收敛,同时本文的验证内容均为在修改了我的ResNet18上进行出发和修改了我的超参数和代码调节后的模型上。

最开始我先放一下不同数据集的mAP精度汇总图,让大家心里有一个认识,同时明白自己属于那种情况。


图片说明:在数据集为100张的时候如果小batch_size对于模型来说是可以适当收敛的,当bathc_size过大的时候其就会造成模型无法收敛的情况。

(为什么会有这种情况,这是因为模型过于复杂,但是数据较少你一个batch的图片太少模型任何东西都学不到,所以造成无法收敛的情况,当然这都是在我的调参和更改模型中部分代码和我复现过的ResNet的基础上的实验,其它的版本我没有验证) 


图片说明:数据集为300-500张的时候可以看到在相同的batch_size的情况下图片更多的在更小的epochs下面收敛了当然其中的波动还是因为数据集质量不好,图片较少导致的。 


图片说明:当数据的数量来到了1000-2000张的时候,首先是1000张的数据集虽然有着较小的batch_size但是其波动性也比较大和多,但是图片来到了2000张我们此时的波东西就变小了一些同时收敛的速度也变得更快。 


 图片说明:下面的图片为同一个数据集的不同batch_size结果可以看到模型结果基本一致,但是其中batch_size更小的曲线更平滑,这是因为batch=74对于4000张的图片来说过于大了,有部分的上面的情况,所以我们可以知道数据集过大的时候小batch是可以拟合的,过大的也可以 的。


上面我们已经分析了,为什么会出现模型不拟合的情况,和模型精度波动性较大的情况,当然了这些都是在我的结构当中进行实验中的结果,同时可以看到我的模型参数和官方的R18参数基本保持一致均为2KW,计算量GFLOPs仅有误差1.4。

下面这个文件是RT-DETR官方的版本的ResNet大家可以在下面的链接中找到,其中实现的代码是Paddle实现的,我所有的代码都来源与这个文件的总结,所以可以号称是1:1移植。

 代码地址:RT-DETR官方下载地址

# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. 
#   
# Licensed under the Apache License, Version 2.0 (the "License");   
# you may not use this file except in compliance with the License.  
# You may obtain a copy of the License at   
#   
#     http://www.apache.org/licenses/LICENSE-2.0    
#   
# Unless required by applicable law or agreed to in writing, software   
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
# See the License for the specific language governing permissions and   
# limitations under the License.import math
from numbers import Integralimport paddle
import paddle.nn as nn
import paddle.nn.functional as F
from ppdet.core.workspace import register, serializable
from paddle.regularizer import L2Decay
from paddle.nn.initializer import Uniform
from paddle import ParamAttr
from paddle.nn.initializer import Constant
from paddle.vision.ops import DeformConv2D
from .name_adapter import NameAdapter
from ..shape_spec import ShapeSpec__all__ = ['ResNet', 'Res5Head', 'Blocks', 'BasicBlock', 'BottleNeck']ResNet_cfg = {18: [2, 2, 2, 2],34: [3, 4, 6, 3],50: [3, 4, 6, 3],101: [3, 4, 23, 3],152: [3, 8, 36, 3],
}class ConvNormLayer(nn.Layer):def __init__(self,ch_in,ch_out,filter_size,stride,groups=1,act=None,norm_type='bn',norm_decay=0.,freeze_norm=True,lr=1.0,dcn_v2=False):super(ConvNormLayer, self).__init__()assert norm_type in ['bn', 'sync_bn']self.norm_type = norm_typeself.act = actself.dcn_v2 = dcn_v2if not self.dcn_v2:self.conv = nn.Conv2D(in_channels=ch_in,out_channels=ch_out,kernel_size=filter_size,stride=stride,padding=(filter_size - 1) // 2,groups=groups,weight_attr=ParamAttr(learning_rate=lr),bias_attr=False)else:self.offset_channel = 2 * filter_size**2self.mask_channel = filter_size**2self.conv_offset = nn.Conv2D(in_channels=ch_in,out_channels=3 * filter_size**2,kernel_size=filter_size,stride=stride,padding=(filter_size - 1) // 2,weight_attr=ParamAttr(initializer=Constant(0.)),bias_attr=ParamAttr(initializer=Constant(0.)))self.conv = DeformConv2D(in_channels=ch_in,out_channels=ch_out,kernel_size=filter_size,stride=stride,padding=(filter_size - 1) // 2,dilation=1,groups=groups,weight_attr=ParamAttr(learning_rate=lr),bias_attr=False)norm_lr = 0. if freeze_norm else lrparam_attr = ParamAttr(learning_rate=norm_lr,regularizer=L2Decay(norm_decay),trainable=False if freeze_norm else True)bias_attr = ParamAttr(learning_rate=norm_lr,regularizer=L2Decay(norm_decay),trainable=False if freeze_norm else True)global_stats = True if freeze_norm else Noneif norm_type in ['sync_bn', 'bn']:self.norm = nn.BatchNorm2D(ch_out,weight_attr=param_attr,bias_attr=bias_attr,use_global_stats=global_stats)norm_params = self.norm.parameters()if freeze_norm:for param in norm_params:param.stop_gradient = Truedef forward(self, inputs):if not self.dcn_v2:out = self.conv(inputs)else:offset_mask = self.conv_offset(inputs)offset, mask = paddle.split(offset_mask,num_or_sections=[self.offset_channel, self.mask_channel],axis=1)mask = F.sigmoid(mask)out = self.conv(inputs, offset, mask=mask)if self.norm_type in ['bn', 'sync_bn']:out = self.norm(out)if self.act:out = getattr(F, self.act)(out)return outclass SELayer(nn.Layer):def __init__(self, ch, reduction_ratio=16):super(SELayer, self).__init__()self.pool = nn.AdaptiveAvgPool2D(1)stdv = 1.0 / math.sqrt(ch)c_ = ch // reduction_ratioself.squeeze = nn.Linear(ch,c_,weight_attr=paddle.ParamAttr(initializer=Uniform(-stdv, stdv)),bias_attr=True)stdv = 1.0 / math.sqrt(c_)self.extract = nn.Linear(c_,ch,weight_attr=paddle.ParamAttr(initializer=Uniform(-stdv, stdv)),bias_attr=True)def forward(self, inputs):out = self.pool(inputs)out = paddle.squeeze(out, axis=[2, 3])out = self.squeeze(out)out = F.relu(out)out = self.extract(out)out = F.sigmoid(out)out = paddle.unsqueeze(out, axis=[2, 3])scale = out * inputsreturn scaleclass BasicBlock(nn.Layer):expansion = 1def __init__(self,ch_in,ch_out,stride,shortcut,variant='b',groups=1,base_width=64,lr=1.0,norm_type='bn',norm_decay=0.,freeze_norm=True,dcn_v2=False,std_senet=False):super(BasicBlock, self).__init__()assert groups == 1 and base_width == 64, 'BasicBlock only supports groups=1 and base_width=64'self.shortcut = shortcutif not shortcut:if variant == 'd' and stride == 2:self.short = nn.Sequential()self.short.add_sublayer('pool',nn.AvgPool2D(kernel_size=2, stride=2, padding=0, ceil_mode=True))self.short.add_sublayer('conv',ConvNormLayer(ch_in=ch_in,ch_out=ch_out,filter_size=1,stride=1,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr))else:self.short = ConvNormLayer(ch_in=ch_in,ch_out=ch_out,filter_size=1,stride=stride,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr)self.branch2a = ConvNormLayer(ch_in=ch_in,ch_out=ch_out,filter_size=3,stride=stride,act='relu',norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr)self.branch2b = ConvNormLayer(ch_in=ch_out,ch_out=ch_out,filter_size=3,stride=1,act=None,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr,dcn_v2=dcn_v2)self.std_senet = std_senetif self.std_senet:self.se = SELayer(ch_out)def forward(self, inputs):out = self.branch2a(inputs)out = self.branch2b(out)if self.std_senet:out = self.se(out)if self.shortcut:short = inputselse:short = self.short(inputs)out = paddle.add(x=out, y=short)out = F.relu(out)return outclass BottleNeck(nn.Layer):expansion = 4def __init__(self,ch_in,ch_out,stride,shortcut,variant='b',groups=1,base_width=4,lr=1.0,norm_type='bn',norm_decay=0.,freeze_norm=True,dcn_v2=False,std_senet=False):super(BottleNeck, self).__init__()if variant == 'a':stride1, stride2 = stride, 1else:stride1, stride2 = 1, stride# ResNeXtwidth = int(ch_out * (base_width / 64.)) * groupsself.branch2a = ConvNormLayer(ch_in=ch_in,ch_out=width,filter_size=1,stride=stride1,groups=1,act='relu',norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr)self.branch2b = ConvNormLayer(ch_in=width,ch_out=width,filter_size=3,stride=stride2,groups=groups,act='relu',norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr,dcn_v2=dcn_v2)self.branch2c = ConvNormLayer(ch_in=width,ch_out=ch_out * self.expansion,filter_size=1,stride=1,groups=1,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr)self.shortcut = shortcutif not shortcut:if variant == 'd' and stride == 2:self.short = nn.Sequential()self.short.add_sublayer('pool',nn.AvgPool2D(kernel_size=2, stride=2, padding=0, ceil_mode=True))self.short.add_sublayer('conv',ConvNormLayer(ch_in=ch_in,ch_out=ch_out * self.expansion,filter_size=1,stride=1,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr))else:self.short = ConvNormLayer(ch_in=ch_in,ch_out=ch_out * self.expansion,filter_size=1,stride=stride,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=lr)self.std_senet = std_senetif self.std_senet:self.se = SELayer(ch_out * self.expansion)def forward(self, inputs):out = self.branch2a(inputs)out = self.branch2b(out)out = self.branch2c(out)if self.std_senet:out = self.se(out)if self.shortcut:short = inputselse:short = self.short(inputs)out = paddle.add(x=out, y=short)out = F.relu(out)return outclass Blocks(nn.Layer):def __init__(self,block,ch_in,ch_out,count,name_adapter,stage_num,variant='b',groups=1,base_width=64,lr=1.0,norm_type='bn',norm_decay=0.,freeze_norm=True,dcn_v2=False,std_senet=False):super(Blocks, self).__init__()self.blocks = []for i in range(count):conv_name = name_adapter.fix_layer_warp_name(stage_num, count, i)layer = self.add_sublayer(conv_name,block(ch_in=ch_in,ch_out=ch_out,stride=2 if i == 0 and stage_num != 2 else 1,shortcut=False if i == 0 else True,variant=variant,groups=groups,base_width=base_width,lr=lr,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,dcn_v2=dcn_v2,std_senet=std_senet))self.blocks.append(layer)if i == 0:ch_in = ch_out * block.expansiondef forward(self, inputs):block_out = inputsfor block in self.blocks:block_out = block(block_out)return block_out@register
@serializable
class ResNet(nn.Layer):__shared__ = ['norm_type']def __init__(self,depth=50,ch_in=64,variant='b',lr_mult_list=[1.0, 1.0, 1.0, 1.0],groups=1,base_width=64,norm_type='bn',norm_decay=0,freeze_norm=True,freeze_at=0,return_idx=[0, 1, 2, 3],dcn_v2_stages=[-1],num_stages=4,std_senet=False,freeze_stem_only=False):"""Residual Network, see https://arxiv.org/abs/1512.03385Args:depth (int): ResNet depth, should be 18, 34, 50, 101, 152.ch_in (int): output channel of first stage, default 64variant (str): ResNet variant, supports 'a', 'b', 'c', 'd' currentlylr_mult_list (list): learning rate ratio of different resnet stages(2,3,4,5),lower learning rate ratio is need for pretrained model got using distillation(default as [1.0, 1.0, 1.0, 1.0]).groups (int): group convolution cardinalitybase_width (int): base width of each group convolutionnorm_type (str): normalization type, 'bn', 'sync_bn' or 'affine_channel'norm_decay (float): weight decay for normalization layer weightsfreeze_norm (bool): freeze normalization layersfreeze_at (int): freeze the backbone at which stagereturn_idx (list): index of the stages whose feature maps are returneddcn_v2_stages (list): index of stages who select deformable conv v2num_stages (int): total num of stagesstd_senet (bool): whether use senet, default False."""super(ResNet, self).__init__()self._model_type = 'ResNet' if groups == 1 else 'ResNeXt'assert num_stages >= 1 and num_stages <= 4self.depth = depthself.variant = variantself.groups = groupsself.base_width = base_widthself.norm_type = norm_typeself.norm_decay = norm_decayself.freeze_norm = freeze_normself.freeze_at = freeze_atif isinstance(return_idx, Integral):return_idx = [return_idx]assert max(return_idx) < num_stages, \'the maximum return index must smaller than num_stages, ' \'but received maximum return index is {} and num_stages ' \'is {}'.format(max(return_idx), num_stages)self.return_idx = return_idxself.num_stages = num_stagesassert len(lr_mult_list) == 4, \"lr_mult_list length must be 4 but got {}".format(len(lr_mult_list))if isinstance(dcn_v2_stages, Integral):dcn_v2_stages = [dcn_v2_stages]assert max(dcn_v2_stages) < num_stagesif isinstance(dcn_v2_stages, Integral):dcn_v2_stages = [dcn_v2_stages]assert max(dcn_v2_stages) < num_stagesself.dcn_v2_stages = dcn_v2_stagesblock_nums = ResNet_cfg[depth]na = NameAdapter(self)conv1_name = na.fix_c1_stage_name()if variant in ['c', 'd']:conv_def = [[3, ch_in // 2, 3, 2, "conv1_1"],[ch_in // 2, ch_in // 2, 3, 1, "conv1_2"],[ch_in // 2, ch_in, 3, 1, "conv1_3"],]else:conv_def = [[3, ch_in, 7, 2, conv1_name]]self.conv1 = nn.Sequential()for (c_in, c_out, k, s, _name) in conv_def:self.conv1.add_sublayer(_name,ConvNormLayer(ch_in=c_in,ch_out=c_out,filter_size=k,stride=s,groups=1,act='relu',norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,lr=1.0))self.ch_in = ch_inch_out_list = [64, 128, 256, 512]block = BottleNeck if depth >= 50 else BasicBlockself._out_channels = [block.expansion * v for v in ch_out_list]self._out_strides = [4, 8, 16, 32]self.res_layers = []for i in range(num_stages):lr_mult = lr_mult_list[i]stage_num = i + 2res_name = "res{}".format(stage_num)res_layer = self.add_sublayer(res_name,Blocks(block,self.ch_in,ch_out_list[i],count=block_nums[i],name_adapter=na,stage_num=stage_num,variant=variant,groups=groups,base_width=base_width,lr=lr_mult,norm_type=norm_type,norm_decay=norm_decay,freeze_norm=freeze_norm,dcn_v2=(i in self.dcn_v2_stages),std_senet=std_senet))self.res_layers.append(res_layer)self.ch_in = self._out_channels[i]if freeze_at >= 0:self._freeze_parameters(self.conv1)if not freeze_stem_only:for i in range(min(freeze_at + 1, num_stages)):self._freeze_parameters(self.res_layers[i])def _freeze_parameters(self, m):for p in m.parameters():p.stop_gradient = True@propertydef out_shape(self):return [ShapeSpec(channels=self._out_channels[i], stride=self._out_strides[i])for i in self.return_idx]def forward(self, inputs):x = inputs['image']conv1 = self.conv1(x)x = F.max_pool2d(conv1, kernel_size=3, stride=2, padding=1)outs = []for idx, stage in enumerate(self.res_layers):x = stage(x)if idx in self.return_idx:outs.append(x)return outs@register
class Res5Head(nn.Layer):def __init__(self, depth=50):super(Res5Head, self).__init__()feat_in, feat_out = [1024, 512]if depth < 50:feat_in = 256na = NameAdapter(self)block = BottleNeck if depth >= 50 else BasicBlockself.res5 = Blocks(block, feat_in, feat_out, count=3, name_adapter=na, stage_num=5)self.feat_out = feat_out if depth < 50 else feat_out * 4@propertydef out_shape(self):return [ShapeSpec(channels=self.feat_out,stride=16, )]def forward(self, roi_feat, stage=0):y = self.res5(roi_feat)return y


本文总结

从今天开始正式开始更新RT-DETR剑指论文专栏,本专栏的内容会迅速铺开,在短期呢大量更新,价格也会乘阶梯性上涨,所以想要和我一起学习RT-DETR改进,可以在前期直接关注,本文专栏旨在打造全网最好的RT-DETR专栏为想要发论文的家进行服务。

 官方链接:RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR

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

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

相关文章

书生·浦语大模型实战营作业(四)

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 数据集 回答结果 进阶作…

指针面试题详解

文章目录 指针笔试题解析笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8 总结 指针笔试题解析 数组名是首元素地址,两种情况除外: 1.sizeof(数组名) , 这是这是计算整个数组的大小,单位是字节; 2.&数组名 , 得出的是整个数组的地址; 笔试题1 #include<st…

Jenkins-执行脚本案例-初步认识JenKins的使用

环境搭建 docker pull jenkins/jenkins:2.440 docker run -d -p 10240:8080 -p 10241:50000 -v /env/liyong/data/docker/jenkins_mount:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins/jenkins:2.440 #在挂载的目录下去修改仓库地址 vim hudson…

vulhub中的Nginx漏洞的详细解析

Nginx漏洞 1.cd到nginx_parsing_vulnerability cd /opt/vulhub/nginx/nginx_parsing_vulnerability 2.执行docker-compose up -d 3.查看靶场是否开启成功 dooker ps 4.访问浏览器 因为这里是80端口所以直接使用ip就能访问成功 5.上传图片 注意这里的图片是含有一句话木马的图…

【Vue3】2-13 : 章节总结

本书目录&#xff1a;点击进入 一、总结内容 二、习题 2.1 【选择题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; 2.2 【编程题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; &#xff1e; 效果 &#xff1e; 代码 一、总结内容 了解核…

1116: 删除元素(数组)

题目描述 输入一个递增有序的整型数组A有n个元素&#xff0c;删除下标为i的元素&#xff0c;使其仍保持连续有序。注意&#xff0c;有效下标从0开始。 定义如下两个函数分别实现删除元素操作和数组输出操作。 void del(int a[], int n, int i); /*删除数组a中下标为i的元素*…

分布式计算平台 Hadoop 简介

Hadoop简介 Hadoop是一种分析和处理大数据的软件平台&#xff0c;是一个用Java语言实现的Apache的开源软件框架&#xff0c;在大量计算机组成的集群中实现了对海量数据的分布式计算。其主要采用MapReduce分布式计算框架&#xff0c;包括根据GFS原理开发的分布式文件系统HDFS、…

鸿蒙App开发-网络请求-下拉刷新三方库-底部Tab栏-滚动组件(含源码)

本文介绍一个基于鸿蒙ArkTS开发的App&#xff0c;是一个包含轮播图、文章列表和 Web 页面等功能的多页面应用。 本文主要内容包括&#xff1a; 一、效果图 首页 详情页 二、内容简介 1.底部Tab栏和两个页面 App底部是一个TabBar&#xff0c;点击TabBar可以切换上面的页面。共…

FFmpeg解决视频播放加载卡顿问题(FFmpeg+M3U8分片)

FFmpeg解决视频播放加载卡顿问题(FFmpegM3U8分片) 在这静谧的时光里&#xff0c;我们能够更清晰地审视自己&#xff0c;思考未来的方向。每一步的坚实&#xff0c;都是对勇气的拥抱&#xff0c;每一个夜晚的努力&#xff0c;都是对未来的信仰。不要害怕独行&#xff0c;因为正是…

spring boot application yaml key下划线如何转java的Properties对象字段驼峰

spring boot yaml key和value如何映射到Properties对象 下面以MybatisPlusProperties为例 ##java properties 字段驼峰 ##yaml文件如图&#xff0c;key使用下划线 ##java对象驼峰转下划线匹配yaml文件key DataObjectPropertyName.toDashedForm(name);//驼峰转下划线 ##设置P…

开发er们必知的Git命令

Git和GitHub是每位软件工程师都必须了解的最基本的东西。这些工具是开发人员日常工作的组成部分,因为我们每天都要与它们进行交互。熟练掌握Git不仅能简化您的生活,还能显著提高生产力。在这篇博文中,我们将探索一组命令,这些命令将大大提高您的生产力。随着您对这些命令的掌握…

Codeforces Round 779 (Div. 2) D2. 388535(思维题 二进制性质/trie树上最大最小异或)

题目 t(t<1e5)组样例&#xff0c;每次给定l,r(0<l<r<2^17) 和r-l1个数ai&#xff0c;新序列是被[l,r]这些数异或上同一个x得到的&#xff0c; 求出x&#xff0c;有多个输出任意一个即可 思路来源 官方题解 洛谷题解 Educational Codeforces Round 157 (Rated…

Linux系统使用超详细(十)~vi/vim命令①

vi/vim命令有很多&#xff0c;其实只有少数的用法对于我们日常工作中起到了很大帮助&#xff0c;但是既然我选择梳理Linux的学习笔记&#xff0c;那么一定全力把自己的理解和学习笔记的内容认真整理汇总&#xff0c;内容或许有错误&#xff0c;还请发现的C友们发现了及时指出。…

CTFhub-phpinfo

CTFhub-Web-信息泄露-“phpinfo” 题目信息 解题过程 ctrlF搜索关键字…

探索数据之美:深入Seaborn的数据可视化艺术与技巧【第26篇—python:Seaborn】

文章目录 1. 引言2. Seaborn基础2.1 安装和环境设置2.2 常用数据可视化函数2.3 设置样式和颜色主题 3. 数据准备与导入3.1 使用Pandas库加载和处理数据3.2 数据清理和缺失值处理 4. Seaborn中的常见图表4.1 折线图和散点图&#xff1a;展示趋势和变量关系4.2 条形图和箱线图&am…

树莓派4B-Python-使用PCA9685控制舵机云台+跟随人脸转动

系列文章 树莓派4B-Python-控制舵机树莓派-Pico控制舵机树莓派4B-Python-使用PCA9685控制舵机云台跟随人脸转动&#xff08;本文章&#xff09; 目录 系列文章前言一、SG90s舵机是什么&#xff1f;二、PCA9685与舵机信号线的接线图三、控制SG90s云台&#xff08;也可用来测试舵…

MongoDB Compass 的教程

第一步&#xff1a;建立连接 点击Save&Connect 增加数据库&#xff1a; 填写数据库名字和文档名字并点击Create Database 删除文档&#xff1a; 创建文档&#xff1a; 插入文档数据 {Id:1001,name:"cyl",age:21} 插入成功&#xff1a; 更改原有数据 删除原有数据…

ACM论文LaTeX模板解析(二)| documentclass设置

本文收录于专栏&#xff1a;ACM 论文 LaTeX模板解析&#xff0c;本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 要使用documentclass类&#xff0c;请在文件的开头中写明&#xff1a; \documentclass[⟨options⟩]{acmart}有几个选项…

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

【Nuxt3】Nuxt3脚手架nuxi安装项目和项目目录介绍

简言 最近学了Nuxt3,并使用它创建了自己的小网站。记录下学习到的nuxt3内容。 Nuxt3官网 Nuxt 是一个免费的开源框架&#xff0c;可通过直观、可扩展的方式使用 Vue.js 创建类型安全、高性能、生产级的全栈 Web 应用程序和网站。 支持SSR、SPA、建立静态网站&#xff0c;也可以…