APP下载

使用OpenCV、Tensorflow和Fastai 构建实时手动关键点检测器

消息来源:baojiabao.com 作者: 发布时间:2026-05-19

报价宝综合消息使用OpenCV、Tensorflow和Fastai 构建实时手动关键点检测器

点选上方关注,All in AI中国在本文中,我将逐步向您展示如何使用OpenCV、Tensorflow和Fastai(Python 3.7)构建您自己的实时手动关键点检测器。

您可以在此处检视模型:

浅绿色框检测到影象中的手,然后通过连线洋红色点来裁剪影象,然后输入CNN来进行手部关键点检测

动机:

这一切都始于对人工智能核心动力的痴迷。五个月前,我第一次尝试掌握不同概念之间的细微差别时,用Google搜寻了“人工智能、机器学习与深度学习”。

在看了多个视讯和文章之后,我决定从计算机视觉开始,用移动摄像头开发自己的手控关键点检测器。

通过使用移动相机开发自己的手部关键点检测器来开始计算机视觉。

我知道人类的大脑只需要20瓦就能执行,我的目标始终是保持简单,并尽可能缩小任何模型的计算要求。复杂的事情需要复杂的微积分,而这本身就是高能耗的。

关于我的学习曲线:

我有一个土木工程学术背景和一些基本的视觉编码技能。我毕业后一直在金融领域工作。

非常罕见,我通过学习Javascript(ex1,ex2)开始了我的旅程。这帮助我理解了程式码背后的“通用逻辑”,当我稍后开始学习Python和Django时,它确实很有用。

经过三个半月的密集编码后,我开始阅读吴恩达的机器学习课程,同时阅读了数百篇文章。通过从头开始构建我自己的人工神经网络以及编码传播和反向传播来了解引擎盖下的所有机制非常重要。

管道:

我用相机检测手部关键点的过程遵循以下架构:

用于手部关键点检测的pipline

⁃抓住影象的相机;⁃第一个深度学习模型检测影象上的手,并估计其周围框的座标(通过手动检测重新训练tensorflow物件检测API模型完成,您也可以通过构建定制的深度学习模型来实现);⁃第二个深度学习回归模型将影象放在框内并估计所有手部关键点的座标(通过从具有自定义头部的resnet34迁移学习来实现)。手检测:

对于这部分,我决定在手持资料集上重新训练tensorflow的物体检测模型(在COCO资料集上训练)。我选择MobileNet_v2来提高速度。

我不会详细介绍这部分内容。您可以从公共资源中找到许多教程。

如果您使用的是Open Image资料集,我已经编写了一个自定义指令码来将资料转换为所需的格式:

重新训练模型花了我大约6个小时。

关键点检测:

在坚持使用Fastai之前,我尝试了不同的方法:

1-我首先尝试使用Keras和Tensorflow,但在早期阶段就面临资料扩充的挑战。我别无选择,只能使用Tensorpack(一个低阶api)用Python实现我自己的资料增强,因为我必须执行的转换很复杂,所有的影象变换也都会影响以Json或Csv格式储存的座标。

2-第二种方法是在灰度影象上绘制与每只手相关的座标的位置(见下图蒙版),并使用Keras的DataImageGenerator在两个影象及其相应的蒙版上执行资料增强。该模型在指标(损失和准确性)显示的情况下表现良好,但预测是混乱的。我想不出哪里出了什么问题,于是换了一种方法。 Keras是一个很棒的API,但在我的例子中很难除错。

手工关键点掩模(灰度影象)

3-下一步的行动被证明是成功的。看完Fastai之后,我决定尝试一下。 Fastai的第一个优势在于您可以除错所有程式码。第二个优点是座标增强是库核心开发的一部分。

我遵循了第一个教程来适应它,并开始在Jupyter笔记本上立即实现我的程式码。

关于Fastai和Pytorch最有趣的事情是整个程式码总结为以下指令码:

在执行“learn.lr_find()”和“learn.recorder.plot()”之后,为了确定最佳学习速率,我在不同周期(在CPU上)总共运行了3天的程式码。

最后一个循环“learn.fit_one_cycle(36,slice(6e-3))”结果如下:

要进行预测,请使用以下程式码之一:

img = im.open_image(\'path_to / hand_image.png\')

preds = learn.predict(img)

img.show(Y = preds [0])

或者 :

img = im.open_image(\'path_to / hand_image.png\')

preds = learn.predict(img)

preds = preds [1] + torch.ones(21,2)#denormalizing

preds = torch.mm(preds,torch.tensor([[img.size [0] / 2,0],

[0,img.size [1] / 2]],D型细胞= torch.float))

preds = ImagePoints(FlowField(img.size,preds))

img.show(Y = preds)

推理和视觉化:

使用learn.export()汇出模型以进行推理。您应该注意到Fastai汇出Reshape函式和自定义损失类时失败了。在引用模型进行推理之前,应将这些内容合并到您的指令码中。

要绘制关键点,您需要在视觉化程式码中新增以下内容:

第一:

learn = load_learner(\'path_to_export.pkl\')#载入之前使用learn.export()储存的推理模型

然后 :

我从哪里开始?

1-我想用深度学习开发股权交易模型。我过去开发定量模型,它们实施起来既冗长又复杂。现在我很想知道通过DL看市场是什么样子的。

2-此外,我想在计算机视觉和增强现实的交叉点上放下一些有趣的端到端ios应用程序。

2019-12-31 08:50:00

相关文章