Advertisement

Real-time Hand-Detection using Neural Networks (SSD) on Tensorflow

阅读量:

在计算机视觉领域中存在多种追踪方法。其中许多方法均建立在规则基础之上(如基于纹理特征提取背景并利用色彩直方图和HOG分类器区分目标与背景等),然而由于其鲁棒性有限(尤其是在复杂背景或光照突变导致肤色变化显著的情况下),这些算法往往难以达到理想效果。(如所述综述所述)相比之下,在深度学习框架下(例如tensorflow Object Detection API),模型训练流程得以简化(使该领域研究工作更加便捷)。此外,在神经网络领域中(如ssd、faster r-cnn及rfcn等快速神经网络模型)出现了诸多实时检测技术(及其追踪应用),这些技术使得神经网络成为实时检测与追踪的有效工具之一。在 HCI 领域中(如输入设备相关应用),已有多种鲁棒性强的手部追踪系统得以实现。构建训练模型通常涉及多个步骤:首先汇总并清洗数据集;其次分割出训练集与测试集并构建推理架构;最后生成推理图完成整个流程。(如有兴趣深入了解如何使用tensorflow Object Detection API进行定制化检测,请参阅相关教程)

Tensorflow的数据预备和网络训练

Egohands数据集

该模型采用了Egohands数据集作为其训练基础。该数据集之所以具有良好的效果源于以下几个方面:首先,在像素级别进行了高度精确的标注工作(共超过1.5万份抠图样本),其中约有4800幅图片包含了手部特征。其次,在拍摄方式上采用了第一人称视角进行拍摄(基于Google Glass设备),这些图片来自共48个不同的采集场景(室内与室外环境)以及多种具体的活动类型(如玩纸牌、下国际象棋、搭建积木以及解决谜题等)。此外,在构建该数据集时还特别引入了多边形轮廓来精确标识每一双手部区域。整个数据集由包含标注信息的压缩包构成共有48个子目录,在每个目录中都对应着同一个采集位置下的100幅图片。

将数据转换为Tensorflow格式

Firstly, it is necessary to complete the initial preparation work for the Egohands dataset and convert it into the tfrecord format required for Tensorflow model training. This GitHub repository offers the egohands_dataset_clean.py script, which can be used to generate the required CSV files.

1、获取egohands数据集
2、对所有文件及目录进行重命名以确保每个名称唯一
3、将数据集划分为占80%的训练集、10%的验证集和10%的测试集
4、导入polygons.mat文件,并针对每个目录执行操作:提取边界框并进行可视化验证(如图所示)
5、完成上述操作后,在images目录下会生成三个子目录:train、test和eval;其中train和test目录下各有一个csv标签文件:train_labels.csv和test_labels.csv;这些标签可被用于生成tfrecords格式的数据记录。通过运行python egohands_dataset_clean.py命令完成数据处理。

请仔细阅读以下内容并确认是否符合要求

下一步:请将您的数据集及其CSV文件转换为TFRecord格式。您可以在下面找到一份非常实用的指南。对于每个文件夹,请确保在训练期间能够生成相应的train.recordtest.record

训练手部检测模型

目前数据集(包括您提供的tfrecords)已备好,请开始模型训练。借助神经网络技术,在迁移学习框架下可显著缩短全模型训练所需时间。这意味着我们可以利用现有经过相关领域(如图像分类)良好训练的基础模型,并仅需微调顶层层以便于我们对特定手进行识别。值得注意的是,在实际应用中由于神经网络参数庞大(通常包含数百万甚至上千万个参数),完成一次完整的全模型训练往往需要几周到几个月的时间。而通过迁移学习这一高效方法,则能在几小时内完成相似目标的学习任务。为了满足研究需求并提高效率,在我的MacBook Pro上(从源代码编译Tensorflow并充分利用其CPU架构),单步运算速度达到每秒5秒;而在采用GPU加速的情况下,则能将速度提升至每秒0.5秒左右。

按照由Harrison编写的Python编程教程Python Programming Tutorials中的指导方针来学习如何基于你的label CSV文件和图像创建TFRecord文件。此外,在本地启动训练过程也包含在其中。有关在云端使用像Google Cloud Platform(GCP)这样的服务进行培训的信息,请参考[GCP培训指南](https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/running_on_cloud.md "GCP培训指南)。

在训练过程中,在将总损失降低至最低水平(约1左右)的过程中表现出色。通过查看TensorBoard中的总损失曲线图(见下图),我们可以清楚地确定模型完成训练的时间点(即当总损失停止下降时)。经过20万次迭代(约需5小时),我们完成了这一任务,并观察到如果在5万次迭代时就发现损失不再下降,则可以在较早阶段终止训练以节省资源。使用TensorFlow框架后,在并行运行评估任务的同时还可以进行模型推理部署工作:即评估您的模型以查看其在测试数据集上的执行情况。一个常用的性能指标是mean Average Precision(mAP),它是一个单一的数字指标用于总结精度召回曲线下的面积。mAP度量的是模型生成边界框与测试数据集中ground truth边界框至少有50%重叠程度的能力。对于这里的手探测器而言,mAP值达到了令人满意的高分值0.9686@0.5IOU(其中IOU表示交并比)。该分数范围为[来源:前面提到的技术指南] 0-1之间数值越大越好表现越佳。当模型训练完成后,请将导出的推理图文件frozen_inference_graph.pb保存于hand_inference_graph文件夹中以便后续使用

使用探测器探测/跟踪手

如果您尚未采取此类步骤,请参考官方指南进行安装:TensorFlow及其对象检测API。这将帮助您快速搭建完整的TensorFlow框架,并指导您完成对GitHub上TensorFlow源代码仓库的克隆以及下载相关官方文档。操作步骤如下:首先导入在hands数据集中获取的预训练模型中所使用的标记映射信息获取到的frozen_inference_graph.pb文件;然后,在这个代码库中完成上述操作会涉及到以下步骤:请按照代码库中的指引依次执行各项操作以实现目标功能。

2、检测工具。在此项目中,在utils/detector_utils.py文件中的detect_objects方法实现了相应的功能。

通过可视化技术检测到的包裹detection_boxes,在此项目的utils/detector_utils.py文件中被通过draw_box_on_image函数实现。

这个repo包含两个脚本,将所有这些步骤联系在一起。

该Python脚本名为'detect_multi_thread.py',负责从摄像头捕获并处理实时视频流中的多线程检测任务。该脚本提供了一系列命令行选项用于配置系统参数。例如显示选项(用于可视化检测)、图像尺寸包括宽度和高度。此外还允许指定视频源可指定(例如通过索引号0表示连接到相机)。

detect_single_thread.py:与上文相同,但仅支持单线程运行。 该脚本通过设置视频源参数video——source(视频文件的路径)来进行操作。

对优化的想法。

有几中方法可以显著提高性能。

该系统采用多线程架构以优化视频流处理效率,在主程序线程中执行耗时操作可能导致性能瓶颈。我借鉴了Adrian Rosebuck在多线程并行图像捕获方面的创新思路,并在此基础上实现了高效的资源分配机制。其结果是帧率提升了约5%。

面向OpenCV的新初学者而言,在调用cv2.read()方法所得的图像均为BGR格式。建议在执行检测前将其转换为RGB格式(若未进行此操作,在某些情况下检测的准确性可能会显著下降)。

复制代码

通过缩小输入图像尺寸来提升帧率(fps)不会带来明显的性能损失。(我使用的是320×240分辨率的设备,而我的网络摄像头支持1280×720分辨率)

将当前的32位转换为8位可以在加载和存储模型时实现内存减少4倍。进一步加速该模型的方法之一是探索8-bit fixed point quantization的技术应用。

性能同样可以借助一些已经有良好检测效果的跟踪算法巧妙地结合起来提高。目前还在进行测试中。如果你们有更好优化的想法,请分享!

注意:该检测器在一定程度上反映了与训练数据相关的局限性。具体而言,它主要体现在以下几个方面:首先是非自我中心的角度;其次是在复杂或嘈杂环境中(如周围堆满物体)的表现;最后是肤色不均的问题。若有机会,可以通过引入额外的数据集来进一步优化效果。

集成多深度神经网络

一种使事情更加有趣的方法是整合我们的新知识与现有的物体识别探测器。遗憾的是尽管我们的手探测器确实能够检测出手的存在但它无法检测到除手之外的对象(这可能是一个限制因素)。创建能够对多个不同对象进行分类的数据集意味着我们需要为每个类别装配庞大的数据集并投入长时间的训练过程

总体而言, 一种潜在的策略就是深入研究结构, 并通过巧妙地将多个预训练模型的输出交错应用于不同的目标类别, 从而使得它们能够在同一个图像中同时检测到多个目标

Projects that use this Repo

(Alphabot)[https://github.com/drewgillson/alphabot]: a screen-free interactive learning tool for spelling, powered by computer vision

(Wall Z the Robot)[Projects - Wall-Z the Robot | NVIDIA Jetson Robotics Competition | ChallengeRocket.com]

用于预测手部姿态(来自GitHub上的项目):Victor Meunier开发了一种方法来利用手检测器的输出进行预测。

(Hand-Tracking Ping-Pong)[https://github.com/alvinwan/hand-tracking-pong]: A game combining hand tracking with the classic game of ping pong.

This program, known as (AiryDraw!)[https://github.com/amirhossein-ahmadian/airydraw], is an intuitive AR-based application that lets you experience drawing in mid-air simply by utilizing your hand.

The Gesture Recognition project (https://github.com/zzeitt/Gesture-Recognition) makes use of this repository to acquire hand boundary boxes and applies a classifier over the extracted hands to identify various hand gestures, including fist, two-finger wave, and open palm gestures (Neat!).

(VideGesture Recognition)[https://github.com/ashwatc/Video_Gesture_Overlay] and its overlay (incorporating Machine Learning and Computer Vision). This project incorporates handtracking models to create efficient control mechanisms for video conferencing scenarios such as agreeing, affirming, or stepping away from the call. Check it out and see how it works in action!

If you’ve crafted an exciting creation, please share a message (or tweet) with me, and I look forward to including it here!

全部评论 (0)

还没有任何评论哟~