【关键点检测】yolov7-pose改造——任意数量关键点检测并训练自己的数据集

YOLOv8-pose关键点检测自制数据集 YOLOv8 已经出来一段时间了,它同时拥有目标检测,实例分割,关键点检测,跟踪和分类的功能,并且效果达到了SOTA,使得 YOLOv8 得到了很多科研人员的青睐。这里我们主要使用了 github 公布的。接下来,我们主要记录一下,如何自己制作关键点检测数据集,并跑通YOLOv8项目。YOLOv8项目中的关键点检测,也就是分支,主要是标注了人体的骨骼部分,来精炼表示人体运动,如下图所示。 阅读详情

一、背景

工作项目需要用到关键点检测,yolo系列在工业视觉领域应用相对广泛,技术积累相对成熟(翻译:出bug方便搜),在检测速度和准确率方面也表现优异,毫无疑问成为首选。作为彼时yolo家族的最新款,本人也想尝尝鲜。

原始的yolov7-pose是针对人体17个关键点的检测模型,因此需要对其改造以适应项目需求(项目的使用场景中只需要3个关键点),开始漫长的改造和调试之路。

源码:GitHub - WongKinYiu/yolov7 at pose

 二、具体工作

1. 准备数据集

数据标注工具使用的是labelme,生成标注文件,由于labelme无法直接生成yolo格式的标签,因此需要将其生成的coco格式的json文件转换为yolo格式的txt文件。

yolo格式的关键点标签文件内容如下:

前五个为目标类别和标注框中心点和长宽,根据图像宽高统一进行归一化,后面即为关键点坐标和关键点可见度,和同样进行了归一化操作,,0表示该点不存在,1表示该点不可见(遮挡),2表示该点可见。

转换代码网上很多,不多做介绍,主要参考[1]。

数据集生成之后,在data/coco_kpts.yaml中修改自己的数据集路径及类别信息。

2. 代码修改

数据集准备好之后就可以进行模型训练了,如果需要预训练权重可以从作者github上下载。由于官方提供的是针对人体关键点的检测代码,且并没有提供一个统一的关键点数量修改入口,在数据集加载、损失函数计算、画图等文件里默认都是1个类别和17个关键点,所以训练之前需要自己修改相关代码文件,将其中与关键点数量相关的部分全都修改为自己需要的关键点数量。

(1)cfg/yolov7-w6-pose.yaml

模型结构和anchor的配置文件,将里面的nc和nkpt修改为自己需要检测的类别数和关键点数量。

 

(2)model/yolo.py

Detect()对应的是yolo的head部分,处理模型最终的预测值,将其转换为我们最终需要的预测坐标和类别信息等。此脚本中作者在yolov5的Detect()中加入了对关键点预测信息的处理方法,并新增了IDetect()和IKeypoint(),三者之间大同小异,用哪个都可以,以下用IKeypoint()为例进行修改。

 Line265-266,坐标种类划分

# 将6改为5+nc
x_det = x[i][..., :5 + self.nc]
x_kpt = x[i][..., 5 + self.nc:]

Line283-284,关键点坐标处理

# 17改为nkpt
x_kpt[..., 0::3] = (x_kpt[..., ::3] * 2. - 0.5 + kpt_grid_x.repeat(1,1,1,1,self.nkpt)) * self.stride[i]  # xy
x_kpt[..., 1::3] = (x_kpt[..., 1::3] * 2. - 0.5 + kpt_grid_y.repeat(1,1,1,1,self.nkpt)) * self.stride[i]  # xy

此部分修改仅在模型推理的后处理阶段有效,训练过程中并不会用到。

(3)utils/datasets.py

在create_dataloader(),LoadImagesAndLabels(),random_perspective()中添加参数nkpt

def create_dataloader(path, imgsz, batch_size, stride, opt, hyp=None, augment=False, cache=False, pad=0.0, rect=False,
                      rank=-1, world_size=1, workers=8, image_weights=False, quad=False, prefix='', tidl_load=False,
                      kpt_label=False, nkpt=0):
class LoadImagesAndLabels(Dataset):  # for training/testing
    def __init__(self, path, img_size=640, batch_size=16, augment=False, hyp=None, rect=False, image_weights=False,
                 cache_images=False, single_cls=False, stride=32, pad=0.0, prefix='', square=False, tidl_load=False,
                 kpt_label=True, nkpt=0):
def random_perspective(img, targets=(), segments=(), degrees=10, translate=.1, scale=.1, shear=10, perspective=0.0,
                       border=(0, 0), kpt_label=False, nkpt=0):

处理标签数据,在LoadImagesAndLabels()中添加成员变量nkpt,同时修改操作关键点翻转的flip_index

self.nkpt = nkpt
"""
源文件中flip_index = [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15],分别表示:
[0鼻子,1左眼,2右眼,3左耳,4右耳,5左键,6右肩,7左肘,8右肘,9左腕,10右腕,11左胯,12右胯,13左膝,14右膝,15左踝,16右踝]
除0之外,其它成对关键点两两交换,实现左右翻转效果,可以根据自己的关键点要求进行修改,比如标注三个关键点[0, 1, 2],前两个关键点可以进行翻转,则flip_index=[1, 0, 2]
"""
self.flip_index = [1, 0, 2]

LoadImagesAndLabels()的cache_labels()方法

Line 496

# 56改为5+nkpt*3
assert l.shape[1] == 5 + self.nkpt * 3, 'labels require 14 columns each'

Line 500,505,513,517,39改为5+nkpt*2

Line 592后添加

img, labels = random_perspective(img, labels,
                                 degrees=hyp['degrees'],
                                 translate=hyp['translate'],
                                 scale=hyp['scale'],
                                 shear=hyp['shear'],
                                 perspective=hyp['perspective'],
                                 kpt_label=self.kpt_label,
                                 nkpt=self.nkpt)     # nkpt传参

Line 986-987,random_perspective(),17改为nkpt

Line 989-997,34改为2*nkpt

(4)utils/loss.py

 ComputeLoss添加参数nkpt和nc

class ComputeLoss:
    # Compute losses
    def __init__(self, model, autobalance=False, kpt_label=False, nkpt=17, nc=1):
        super(ComputeLoss, self).__init__()
        self.kpt_label = kpt_label
        self.nkpt = nkpt
        self.nc = nc

Line 119,修改sigmas,长度=nkpt,修改原则参考[2],简单点说sigmas中每个元素值(OKS中的)对应一个关键点的惩罚,值越小惩罚力度越大,相应模型对这些关键点的学习关注度越高,具体值的设定沿用yolo-pose[5],论文中说是从coco验证集中得出的经验值。

原始代码中sigmas=[.26, .25, .25, .35, .35, .79, .79, .72, .72, .62, .62, 1.07, 1.07, .87, .87, .89, .89]/10.0,所以修改也尽量参考这些值。

def __call__(self, p, targets):  # predictions, targets, model
        device = targets.device
        lcls, lbox, lobj, lkpt, lkptv = torch.zeros(1, device=device), torch.zeros(1, device=device), torch.zeros(1, device=device), torch.zeros(1, device=device), torch.zeros(1, device=device)
        # 修改sigmas
        sigmas = torch.tensor([.79, .79, .25], device=device) / 10.0

Line 187,build_targets(),41改为7+2*nkpt

Line 202,40改为6+2*nkpt,19改为2+nkpt

(5)utils/general.py

Line 493,590,56改为3*nkpt+5

non_max_suppression()

non_max_suppression_export()

Line 594,57改为6+3*nkpt

Line 506,540-541,6改为5+nc[3]

(6)utils/common.py 

网络组件,根据[2]中作者的解释,如果使用的模型是基于较新版本的yolov5, 模型组件有所变化,SPP替换为SPPF,因此需要在common.py中添加SPPF的实现。但yolov7-pose中作者提供的yolov7-w6-pose.yaml文件中没有使用SPPF模块,所以加不加都可以。

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            y1 = self.m(x)
            y2 = self.m(y1)
            return self.cv2(torch.cat([x, y1, y2, self.m(y2)], 1))

(7)utils/plot.py

Line  97,skeleton,绘制骨架结构,哪两个关键点之间需要连接就添加一组,比如我检测的三个关键点,1和2需要连接,3不需要连接,可以这样写:

skeleton = [[1, 2], [3, 3]]

Line 101,pose_limb_color,绘制连线颜色(猜的);

Line 102,pose_kpt_color,绘制关键点颜色(猜的)

这两处根据自己的关键点数量修改,从palette调色板中选颜色,不改也可以。

Line 219,40改为2*nkpt+6,参考[2]热评

 

(8)train.py

Line 201,211,create_dataloader()传参nkpt

dataloader, dataset = create_dataloader(train_path, imgsz, batch_size, gs, opt,
                                        hyp=hyp, augment=True, cache=opt.cache_images, rect=opt.rect, rank=rank,
                                        world_size=opt.world_size, workers=opt.workers,
                                        image_weights=opt.image_weights,quad=opt.quad, prefix=colorstr('train: '), kpt_label=kpt_label,
                                        nkpt=nkpt)

Line 369,441,test()传参nkpt

results, _, _ = test.test(opt.data,
                          batch_size=batch_size * 2,
                          imgsz=imgsz_test,
                          conf_thres=0.001,
                          iou_thres=0.7,
                          model=attempt_load(m, device).half(),
                          single_cls=opt.single_cls,
                          dataloader=testloader,
                          save_dir=save_dir,
                          save_json=True,
                          plots=False,
                          is_coco=is_coco,
                          kpt_label=kpt_label,
                          nkpt=nkpt)

(9)test.py

Line 22,test()添加参数nkpt

def test(data,
         weights=None,
         batch_size=32,
         imgsz=640,
         conf_thres=0.001,
         iou_thres=0.6,  # for NMS
         save_json=False,
         save_json_kpt=False,
         single_cls=False,
         augment=False,
         verbose=False,
         model=None,
         dataloader=None,
         save_dir=Path(''),  # for saving images
         save_txt=False,  # for auto-labelling
         save_txt_tidl=False,  # for auto-labelling
         save_hybrid=False,  # for hybrid auto-labelling
         save_conf=False,  # save auto-label confidences
         plots=True,
         wandb_logger=None,		 
		 compute_loss=None,
         half_precision=True,
         is_coco=False,
         opt=None,		 		 
         tidl_load=False,
         dump_img=False,
         kpt_label=False,
         flip_test=False,
         nkpt=17):

Line 80,flip_index,与datasets.py中LoadImagesAndLabels()的flip_index相同

Line 99,create_dataloader()传参nkpt

dataloader = create_dataloader(data[task], imgsz, batch_size, gs, opt, pad=0.5, rect=True,
                               prefix=colorstr(f'{task}: '), tidl_load=tidl_load, kpt_label=kpt_label, nkpt=nkpt)[0]

补充(2024-08-07)

Line 266,269,plot_images()传参nkpt

plot_images(img, targets, paths, f, names, kpt_label=kpt_label, orig_shape=shapes[si], nkpt=nkpt)
plot_images(img, output_to_target(out), paths, f, names, kpt_label=kpt_label, steps=3, orig_shape=shapes[si], nkpt=nkpt)

至此,完成所有需要修改的位置,可以训练自己的数据集了。

三、问题

本人在初次使用过程中遇到过各种bug,除去一些低级错误和忘掉的错误,总结一下印象比较深刻的一些问题。

1. 某个关键点预测偏差大

训练完成后,发现模型的预测结果中三个关键点里总有一个点预测飞了(时隔太久图已经删了),效果类似于这样

试过是否模型没有收敛?标签生成有问题?那个参数设置的不对?模型后处理有问题?修改关键点数量的时候那个地方没改对?最终在这里找到解决方法(大佬牛逼!)

https://github.com/TexasInstruments/edgeai-yolov5/issues/47

修改loss.py中OKS的指数部分的计算方法,论文中OKS的指数的分母是,不知道为啥代码里就变成了

还有一种修改方式,改为,但这种方式没有试过,不知道是否有效

补充(2024-09-06)实测该方法对我预测的飞点问题无效

2. 模型导出

如果需要将模型部署到边缘设备, 比如部署到CPU/NPU/TPU上进行加速,都要把模型转换到特定格式,转换之前要先把权重文件导出为onnx模型,同时修改yolo.py的Detect()部分。

def forward(self, x):
    # x = x.copy()  # for profiling
    z = []  # inference output
    self.training |= self.export
    for i in range(self.nl):
        if self.nkpt is None or self.nkpt==0:
            x[i] = self.m[i](x[i])
        else :
            x[i] = torch.cat((self.m[i](x[i]), self.m_kpt[i](x[i])), axis=1)

        bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
        # 注释掉此行
        # x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
        x_det = x[i][..., :6]
        x_kpt = x[i][..., 6:]

        if not self.training:  # inference
            if self.grid[i].shape[2:4] != x[i].shape[2:4]:
                self.grid[i] = self._make_grid(nx, ny).to(x[i].device)
            kpt_grid_x = self.grid[i][..., 0:1]
            kpt_grid_y = self.grid[i][..., 1:2]

            if self.nkpt == 0:
                y = x[i].sigmoid()
            else:
                y = x_det.sigmoid()

            if self.inplace:
                # 此处的y改为x_det
                xy = (x_det[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
                wh = (x_det[..., 2:4] * 2) ** 2 * self.anchor_grid[i].view(1, self.na, 1, 1, 2) # wh
                if self.nkpt != 0:
                    # 此处的17改为关键点数量
                    x_kpt[..., 0::3] = (x_kpt[..., ::3] * 2. - 0.5 + kpt_grid_x.repeat(1,1,1,1,self.nkpt)) * self.stride[i]  # xy
                    x_kpt[..., 1::3] = (x_kpt[..., 1::3] * 2. - 0.5 + kpt_grid_y.repeat(1,1,1,1,self.nkpt)) * self.stride[i]  # xy
                    #x_kpt[..., 0::3] = ((x_kpt[..., 0::3].tanh() * 2.) ** 3 * self.anchor_grid[i][:,0].repeat(self.nkpt,1).permute(1,0).view(1, self.na, 1, 1, self.nkpt)) + kpt_grid_x.repeat(1,1,1,1,17) * self.stride[i]  # xy
                    #x_kpt[..., 1::3] = ((x_kpt[..., 1::3].tanh() * 2.) ** 3 * self.anchor_grid[i][:,0].repeat(self.nkpt,1).permute(1,0).view(1, self.na, 1, 1, self.nkpt)) + kpt_grid_y.repeat(1,1,1,1,17) * self.stride[i]  # xy
                    x_kpt[..., 2::3] = x_kpt[..., 2::3].sigmoid()
                # 此处的y改为x_det
                y = torch.cat((xy, wh, x_det[..., 4:], x_kpt), dim = -1)

            else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                xy = (y[..., 0:2] * 2. - 0.5 + self.grid[i]) * self.stride[i]  # xy
                wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                if self.nkpt != 0:
                    y[..., 6:] = (y[..., 6:] * 2. - 0.5 + self.grid[i].repeat((1,1,1,1,self.nkpt))) * self.stride[i]  # xy
                y = torch.cat((xy, wh, y[..., 4:]), -1)

            z.append(y.view(bs, -1, self.no))

    return x if self.training else (torch.cat(z, 1), x)

最终输出形状,参考[4]

四、总结

第一次使用关键点检测模型并进行魔改,说实话前期还是费了不少功夫的,在没有人带的情况下只能自己慢慢摸索,最终总算是走通了,也用到了项目里,过程当中也学到了不少东西,总感觉不记下来时间长了就忘记了,比如调过的bug很多已经忘了,绝不止前面两个。所以时隔一年多,又从头捋了一遍,把这个过程尽量详细的记录下来,就当复习了。

yolov7-pose在yolo-pose的基础上改了模型结构,层数更深,多了一个特征图尺度。经过测试,在预训练权重上进行训练比从零训练准确率要高一些,yolov7-pose比yolo-pose的准确率要高,看来增加模型深度和特征图尺度确实有利于模型学习。如果想进一步提升准确率,之前尝试过加入CBAM模块,准确率有微小提升(大概1%),模型参数会增加,训练会变慢,这个根据实际需要来吧。 

本人技术菜鸡,写文章纯属学习记录,大佬勿喷。 

参考资料

[1] Yolov7-pose 训练body+foot关键点-CSDN博客

[2] https://zhuanlan.zhihu.com/p/603799078 

[3] 基于yoloV7-pose添加任意关键点 + 多类别分类网络修改_yolov7s-pose分类代码-CSDN博客 

[4] GitHub - nanmi/yolov7-pose: pose detection base on yolov7

[5] https://arxiv.org/abs/2204.06806

 

Yolopose关键点检测:自己标注数据集,制作数据集(一) labelme2coco_keypoints,json 阅读详情

相关推荐

YOLOPose:除了目标检测,YOLO还能不花代价地估计人体姿态,对实时性能有要求必看!

YOLO,是一种流行的目标检测框架。如果将YOLO引入姿态检测任务中,将取得什么结果呢?这篇文章实现了单向传播路径下的2D人体姿态检测,与自上而下或自下而上的方法不同,该方法将人体检测与关键点估计联合实现,在不采用数据增强如翻转、多尺度等情况下,实现COCO keypoint上领先的性能,并且该方法可以集成中其他目标检测算法中实现姿态估计,而几乎不增加运算量,对实时估计人体姿态非常关键。.........

wqthaha的专栏 2万+

基于YOLOV5 的多分类 + 关键点检测

基于yoloV5 多分类+关键点检测

small_wu的博客 3万+

yolov8-pose关键点检测全过程教学——自定义身份证关键点数据集制作与训练

我的自定义数据集名称为datapose3,包含images和labels两个字文件。这两个子文件分别存储了图片和txt文件。注意:txt文件名称和图片名称一定要对应。

m0_69115733的博客 2757

yolov8-pose关键点检测,从数据集制作到训练测试

关键点检测

qq_39128381的博客 2万+

159基于yolov8的嘴巴lip关键点检测含数据集训练pyqt界面

080python农业病虫害检测pyqt版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResN。089基于深度学习的小样本数据检测_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResN。083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、

vdggrdgrdg的博客 1237

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

【保姆级教程】YOLOv8_Pose多目标+关键点检测:训练自己的数据集

m0_51579041的博客 1万+

基于yoloV7添加关键点训练记录

基于yoloV7添加关键点算法代码训练自己教程。

small_wu的博客 7874

《YOLOv8-Pose关键点检测》专栏介绍 & CSDN独家改进创新实战 & 专栏目录

YOLOv8-Pose关键点检测:1)手把手从数据集标注、训练到模型的教程;2)模型轻量化创新;3)loss优化教程

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 7995

基于yoloV7-pose添加任意关键点 + 多类别分类网络修改

基于yoloV7-pose 修改任意关键点+多分类模型

small_wu的博客 1万+

深度学习项目十七:YOLOv8关键点pose训练自己的数据集

1.先标注检测框(单类别)→ 填写类别名称 → 填写类别名称ground-id(用于匹配后续标注的关键点,以当前画面中出现的顺序标注即可),标注检测框的ground-id为1,同一张图片下一个标注检测框的ground-id为2,以此类推。1.先标注检测框(单类别)→ 填写类别名称 → 填写类别名称ground-id(用于匹配后续标注的关键点,以当前画面中出现的顺序标注即可),标注检测框的ground-id为1,同一张图片下一个标注检测框的ground-id为2,以此类推。

m0_60890175的博客 1338

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。 python实现人体关键点检测,python实现人体检测,2D Pose

AI吃大瓜的博客 1万+

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集;Pytorch手部关节点检测,手指关节点检测,手指关键点检测,手部关键点检测,手势检测,指尖检测

AI吃大瓜的博客 1万+

YOLOv7-Pose姿态估计代码+权重

YOLOv7-Pose姿态估计代码+权重

YOLOv11n-pose手部关键点检测实战

本文基于YOLOv11n-pose模型实现了一种高精度实时手部关键点检测方法。针对手部检测的特殊挑战,采用改进的CSPDarknet53作为主干网络,结合PANet进行多尺度特征融合。通过精心设计的数据增强策略和训练参数,在包含44,000张标注图像的数据集上训练得到模型。实验结果显示,该方法在测试集上达到0.934的mAP@0.5,关键点精度为0.823,同时保持45FPS的实时性能。该方法成功集成到目标检测平台,可准确检测21个手部关键点并形成完整的手部骨架,为人机交互等应用提供了有效解决方案。

weixin_45070882的博客 1786

终端运行脚本报: 因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fw link/?LinkID=135170 中的 about_Execution_

PowerShell 执行策略是一种安全机制,用于控制哪些脚本可以在系统上运行。默认情况下,Windows 系统会设置较为严格的执行策略,以防止恶意脚本的执行。执行策略有以下几种常见级别:Restricted(限制):不允许运行任何脚本。AllSigned(全部签名):仅允许运行经过数字签名的脚本。RemoteSigned(远程签名):允许运行本地脚本,但远程下载的脚本需要数字签名。Unrestricted(无限制):允许运行所有脚本,但会警告未签名的脚本。

欢迎来到我的技术博客!这里是一个专注于软件开发的地方,我将分享关于 Java、Python、C++ 和易语言等多种编程语言的教程、技巧、最佳实践以及开发经验。 5046

解决Word中英文混排的5个常见排版问题(含单词换行、间距调整等)

本文详细解析Word中英文混排的5大常见排版问题,包括单词换行、间距调整、标点混用等,提供专业解决方案。通过设置段落格式、调整兼容性选项和使用字体组合等技巧,帮助用户轻松解决文档排版难题,提升专业性和阅读体验。

vim8coder的博客 1308

YOLOv13-pose关键点检测:训练实战手把手教程篇| 自己数据集从labelme标注到生成yolo格式的关键点数据以及训练教程

Pose mAP50 为0.893,相较于YOLO11的Pose mAP50 为 0.871 ,大幅提升

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1587

【2024-06-21】网易互娱秋招实习笔试三道编程题解

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。作者@TechGuide【全网同名】

试问道几许 1053

【亲测免费】 YOLOv7-pose_Npoint_Ncla: 实现多关键点及多类别检测的YoloV7拓展

YOLOv7-pose_Npoint_Ncla: 实现多关键点及多类别检测的YoloV7拓展 项目介绍 本项目基于YOLOv7进一步开发,特别专注于实现对任意数量的关键点估计以及同时进行多类别目标检测的能力。它以YoloV7-pose为基础,通过增加灵活的关键点配置和多类别分类功能,提升了模型的适用性和泛化能力。该项目适合那些需要在实时对象检测中同时精准定位目标并识别其类别和关键点的应用场景,例...

gitblog_00740的博客 674

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

【MT7628】固件开发-SDK4320添加MT7612E WiFi驱动操作说明

wgl307293845的博客 2077

从数据到行动:客服运营必分析的8大核心维度

服务运营正从被动响应升级为数据驱动型战略体系。客服中心的海量交互数据能精准反映服务效能、客户体验及运营短板,关键在于实现数据的可视化与可操作化。本文系统剖析了八类核心数据指标:1)客户行为数据(CSAT/NPS/投诉内容);2)通话效率指标(AHT/接通率);3)服务质量(质检体系/情绪识别);4)坐席绩效(FCR/客户评价);5)流程与知识库(转接率/工单时效);6)渠道流量分析;7)异常预警机制;8)成本收益模型。通过构建多维数据分析体系,企业可在客户全生命周期管理中实现服务升级、风险防控与资源

2202_75469062的博客 1395

如何通过训练关键点检测数据集 通过训练跌倒关键点检测数据集的权重 推理检测跌倒检测识别 构建基于YOLOv8 pose 的摔倒关键点检测系统

如何通过训练关键点检测数据集 通过训练跌倒关键点检测数据集的权重 推理检测跌倒检测识别 构建基于YOLOv8 pose 的摔倒关键点检测系统

2401_86822270的博客 1077

031、速度前馈与加速度前馈

摘要: 本文通过追剪机调试案例,阐述了速度前馈和加速度前馈在运动控制中的关键作用。前馈不是高级技巧,而是解决动态响应问题的必要手段:速度前馈通过预测速度变化提前补偿,加速度前馈则针对惯量变化提供力矩补偿。实现时需注意信号平滑处理,避免噪声放大。前馈与PID分工明确,前馈承担主要动态响应,PID处理残余误差。调试应先调前馈再微调PID,前馈增益需计算而非仅凭参数调整,并允许适当残余误差。前馈作为开环补偿不会影响系统稳定性,但需配合平滑的指令生成器使用。(149字)

m0_50546716的博客 266

YOLOv8-Pose 关键点检测实战:杂草根茎关键点标注与训练全流程指南

YOLOv8-Pose 关键点检测实战:杂草根茎关键点标注与训练全流程指南

qq1309399183的博客 1600

60、磁悬浮主动隔振系统的LQR控制研究

本研究针对磁悬浮主动隔振系统,提出了一种结合ANN建模、LQR控制与MPGA优化的综合控制方案。通过建立系统的动力学与状态空间模型,利用混合训练算法的ANN精确描述MSVI的非线性和滞后特性,并设计基于最小力传递率的LQR控制器。为优化LQR的Q和R矩阵,引入多群体遗传算法(MPGA),有效克服传统GA的早熟收敛问题,提升搜索效率与控制性能。仿真结果表明,在单频、扫频、随机及冲击激励下,该方法显著降低传递力幅值,隔振效果远优于被动系统。研究验证了所提方法的有效性,为磁悬浮隔振技术的实际应用奠定了基础,并展望

linux6sysadmin的博客 118

华为OD机试真题 新系统 2026-07-22 Java&Go&C 实现【最小代价完成论文评审】

某校有 n 篇论文需要分配给教师评审。 每篇论文 i 可由 files[i] 对应的教师列表中任一教师评审。 每篇论文至少需要一名教师评审。 每位教师 t 不论被分配多少篇论文,其评审费用固定为 cost[t]。 请给出参与评审教师数量最少时的总费用。 如果存在多种方案满足教师数量最少,则选择总费用最小的方案。

MISAYAONE的博客 137
上一篇: 【标注工具】labelme5.0.1自定义功能——添加水平线标注及显示信息
下一篇: 【图像处理】基于传统图像处理的圆环检测及宽度估算
西瓜和拾月
博客等级 码龄9年 695粉丝 23原创
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值