-
CNN-VIT 视频动态手势识别人工智能的发展日新月异,也深刻的影响到人机交互领域的发展。手势动作作为一种自然、快捷的交互方式,在智能驾驶、虚拟现实等领域有着广泛的应用。手势识别的任务是,当操作者做出某个手势动作后,计算机能够快速准确的判断出该手势的类型。本文将使用ModelArts开发训练一个视频动态手势识别的算法模型,对上滑、下滑、左滑、右滑、打开、关闭等动态手势类别进行检测,实现类似华为手机隔空手势的功能。算法简介CNN-VIT 视频动态手势识别算法首先使用预训练网络InceptionResNetV2逐帧提取视频动作片段特征,然后输入Transformer Encoder进行分类。我们使用动态手势识别样例数据集对算法进行测试,总共包含108段视频,数据集包含无效手势、上滑、下滑、左滑、右滑、打开、关闭等7种手势的视频,具体操作流程如下:首先我们将采集的视频文件解码抽取关键帧,每隔4帧保存一次,然后对图像进行中心裁剪和预处理,代码如下:def load_video(file_name): cap = cv2.VideoCapture(file_name) # 每隔多少帧抽取一次 frame_interval = 4 frames = [] count = 0 while True: ret, frame = cap.read() if not ret: break # 每隔frame_interval帧保存一次 if count % frame_interval == 0: # 中心裁剪 frame = crop_center_square(frame) # 缩放 frame = cv2.resize(frame, (IMG_SIZE, IMG_SIZE)) # BGR -> RGB [0,1,2] -> [2,1,0] frame = frame[:, :, [2, 1, 0]] frames.append(frame) count += 1 return np.array(frames) 然后我们创建图像特征提取器,使用预训练模型InceptionResNetV2提取图像特征,代码如下:def get_feature_extractor(): feature_extractor = keras.applications.inception_resnet_v2.InceptionResNetV2( weights = 'imagenet', include_top = False, pooling = 'avg', input_shape = (IMG_SIZE, IMG_SIZE, 3) ) preprocess_input = keras.applications.inception_resnet_v2.preprocess_input inputs = keras.Input((IMG_SIZE, IMG_SIZE, 3)) preprocessed = preprocess_input(inputs) outputs = feature_extractor(preprocessed) model = keras.Model(inputs, outputs, name = 'feature_extractor') return model接着提取视频特征向量,如果视频不足40帧就创建全0数组进行补白:def load_data(videos, labels): video_features = [] for video in tqdm(videos): frames = load_video(video) counts = len(frames) # 如果帧数小于MAX_SEQUENCE_LENGTH if counts < MAX_SEQUENCE_LENGTH: # 补白 diff = MAX_SEQUENCE_LENGTH - counts # 创建全0的numpy数组 padding = np.zeros((diff, IMG_SIZE, IMG_SIZE, 3)) # 数组拼接 frames = np.concatenate((frames, padding)) # 获取前MAX_SEQUENCE_LENGTH帧画面 frames = frames[:MAX_SEQUENCE_LENGTH, :] # 批量提取特征 video_feature = feature_extractor.predict(frames) video_features.append(video_feature) return np.array(video_features), np.array(labels)最后创建VIT Model,代码如下:# 位置编码 class PositionalEmbedding(layers.Layer): def __init__(self, seq_length, output_dim): super().__init__() # 构造从0~MAX_SEQUENCE_LENGTH的列表 self.positions = tf.range(0, limit=MAX_SEQUENCE_LENGTH) self.positional_embedding = layers.Embedding(input_dim=seq_length, output_dim=output_dim) def call(self,x): # 位置编码 positions_embedding = self.positional_embedding(self.positions) # 输入相加 return x + positions_embedding # 编码器 class TransformerEncoder(layers.Layer): def __init__(self, num_heads, embed_dim): super().__init__() self.p_embedding = PositionalEmbedding(MAX_SEQUENCE_LENGTH, NUM_FEATURES) self.attention = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, dropout=0.1) self.layernorm = layers.LayerNormalization() def call(self,x): # positional embedding positional_embedding = self.p_embedding(x) # self attention attention_out = self.attention( query = positional_embedding, value = positional_embedding, key = positional_embedding, attention_mask = None ) # layer norm with residual connection output = self.layernorm(positional_embedding + attention_out) return output def video_cls_model(class_vocab): # 类别数量 classes_num = len(class_vocab) # 定义模型 model = keras.Sequential([ layers.InputLayer(input_shape=(MAX_SEQUENCE_LENGTH, NUM_FEATURES)), TransformerEncoder(2, NUM_FEATURES), layers.GlobalMaxPooling1D(), layers.Dropout(0.1), layers.Dense(classes_num, activation="softmax") ]) # 编译模型 model.compile(optimizer = keras.optimizers.Adam(1e-5), loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics = ['accuracy'] ) return model模型训练完整体验可以点击Run in ModelArts一键运行我发布的Notebook:最终模型在整个数据集上的准确率达到87%,即在小数据集上训练取得了较为不错的结果。视频推理首先加载VIT Model,获取视频类别索引标签:import random # 加载模型 model = tf.keras.models.load_model('saved_model') # 类别标签 label_to_name = {0:'无效手势', 1:'上滑', 2:'下滑', 3:'左滑', 4:'右滑', 5:'打开', 6:'关闭', 7:'放大', 8:'缩小'}然后使用图像特征提取器InceptionResNetV2提取视频特征:# 获取视频特征 def getVideoFeat(frames): frames_count = len(frames) # 如果帧数小于MAX_SEQUENCE_LENGTH if frames_count < MAX_SEQUENCE_LENGTH: # 补白 diff = MAX_SEQUENCE_LENGTH - frames_count # 创建全0的numpy数组 padding = np.zeros((diff, IMG_SIZE, IMG_SIZE, 3)) # 数组拼接 frames = np.concatenate((frames, padding)) # 取前MAX_SEQ_LENGTH帧 frames = frames[:MAX_SEQUENCE_LENGTH,:] # 计算视频特征 N, 1536 video_feat = feature_extractor.predict(frames) return video_feat最后将视频序列的特征向量输入Transformer Encoder进行预测:# 视频预测 def testVideo(): test_file = random.sample(videos, 1)[0] label = test_file.split('_')[-2] print('文件名:{}'.format(test_file) ) print('真实类别:{}'.format(label_to_name.get(int(label))) ) # 读取视频每一帧 frames = load_video(test_file) # 挑选前帧MAX_SEQUENCE_LENGTH显示 frames = frames[:MAX_SEQUENCE_LENGTH].astype(np.uint8) # 保存为GIF imageio.mimsave('animation.gif', frames, duration=10) # 获取特征 feat = getVideoFeat(frames) # 模型推理 prob = model.predict(tf.expand_dims(feat, axis=0))[0] print('预测类别:') for i in np.argsort(prob)[::-1][:5]: print('{}: {}%'.format(label_to_name[i], round(prob[i]*100, 2))) return display(Image(open('animation.gif', 'rb').read()))模型预测结果:文件名:hand_gesture/woman_014_0_7.mp4 真实类别:无效手势 预测类别: 无效手势: 99.82% 下滑: 0.12% 关闭: 0.04% 左滑: 0.01% 打开: 0.01%
-
如图所示,如果保存的Notebook镜像有多个Python环境,那么在创建训练作业时该如何进行切换呢?
-
训练模型后,获得ckpt文件后,接下来该如何做呢
-
4月20日, HCDG城市行·天津站——“极快至简 灵活部署”我想象中的AI高效开发ModelArts技术工作坊圆满举办。活动特邀来自华为云DTSE、华为云云享专家、以及天津软件技术协会的伙伴企业专家们为与会开发者带来一场别开生面的技术交流及动手实践活动。活动伊始,天津市软件行业协会技术专委会主任赵文毅欢迎各位专家和嘉宾莅临本次技术分享活动。他表示,随着各企业的数字化转型和人工智能的迅猛发展,AIGC正逐渐成为企业数字化转型的重要工具,ModelArts作为华为云面向开发者的一站式AI开发平台,对于天津各传统企业,工业制造业的数智化转型提供技术支撑,这次动手工作坊也是让大家以开发者的第一视角来深入体验开发者的日常,同时欢迎大家继续关注和参与接下来的更多活动。天津市软件行业协会技术专委会主任 赵文毅分享环节华为云开发者联盟DTSE专家 陈立龙华为云开发者联盟DTSE(Developer Technical Service Engineer)专家陈立龙,分享了ModelArts主题的相关内容,从技术和业务两个角度,深入介绍ModelArts的技术原理、特点、优势和应用案例。展示ModelArts如何帮助开发者和企业实现全栈全生命周期的模型开发工具链,通过全面的AI工具和服务,为业务智能快速创新赋能,助力企业数字化转型,即使是面向AI开发零基础的用户,也可以使用ModelArts在AI Gallery中预置的模型、算法、数据、Notebook等资产,零代码完成AI建模和应用,与大家共同探讨AI的发展趋势和挑战。ModelArts 是华为云全栈全场景AI 解决方案面向用户和开发者的门户,作为一站式 AI开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成,及端 - 边 - 云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期 AI工作流。ModelArts提供端到端模型生产线,高效开发、调试和调优大模型应用和场景化应用,助力千行百业智能升级。接下来是由华为云HCDG核心组织者姚圣伟,给大家带来的动手实验《基于ModelArts JupyterLab在线调优钢筋检测》。他先是对比了国内外云厂商在对开发者提供的AI云开发平台。并重点指出了在日常开发过程中的痛点问题,开发者对于开发环境的搭建,应用的部署和运维环节都担负着极高的压力和困扰。而通过使用华为云的ModelArts平台提供的模型开发、训练、推理端到端工具链,DataOps+MLOps+DevOps无缝协同,开发效率大幅提升。在与各位嘉宾的交流过程中,他也为大家解答了,当前AI大模型开发,和企业实际需要的AI应用之间的区别,带领大家在华为云开发者学堂的云端实验室,手把手通过动手实践的方式来体验企业真实需要的应用开发及调优流程。实验链接:https://lab.huaweicloud.com/experiment-detail_484关于接下来华为云ModelArts技术的发展,我们已经看到了人工智能计算中心在全国各地落地开花,端到端一体化的开发平台也是开发者和企业喜闻乐见的利器。在到场嘉宾和专家们热烈探讨AI在生活中,给我们带来诸多便利的话题中,将整个活动的氛围推向了高潮。我们经常去多问一句为什么,多想一步类似的场景在我们生活中还能解决什么实际的问题,相信困惑我们很久的谜题就会揭晓。接下来,HCDG天津开发者社区将致力于构建一个更加开放和协作的环境,让开发者们能够更容易地分享知识、资源和经验。社区将组织定期的技术研讨会和工作坊,以激发创新思维和促进技术交流。此外,社区还将提供专业的华为技术培训,帮助开发者掌握最新的华为云平台服务,从而在华为云生态中找到更多的机会和可能性。通过这些举措,HCDG天津开发者社区希望能够帮助华为云开发者们实现个人成长,并为华为云生态的繁荣做出贡献。
-
我先来一个,微信聊天用语音输入文字,会比较经常的用的
-
借助数据特征分析功能,可以看出数据集整体上的统计信息,对模型的调优提供了重要的诊断建议。然而,进行细粒度数据珍断和优化则会发现每个数据的问题,粒度更细。并且,可以将每个数据的重要性或者难例程度标记出来,然后给出相应的诊断和优化建议。ModelArts可自动提供基于图像语义、数据特征及数据增强的细粒度数据诊断分析,并提供对应的指导建议,以帮助开发者聚焦难例数据的数据增强,从而更有效率地提高模型的精度。典型的诊断优化建议见下表,开发者根据诊断建议可以做进一步针对性的数据增强。
-
为了开发好人工智能应用,在数据准备阶段,通常还需要对数据进行整体的统计分析及对单个数据进行细粒度分析珍断,之样才可以更深入地了解数据,及时发现更深层次的问题并进行优化。数据集特征分析和优化特征分析的主要作用在于帮助开发者快速方便地了解数据集的特点,然后制订后续的优化和处理方案。数据集的特征分析可以融入项目开发的各个流程,如数据清洗、数据增强、模型训练、模型评估等。在前面提到的数据清洗过程中,就用到了基于特征分析的方法去除少量异常数据。以目标检测任务为例,ModelArts特征分析模块支持的主要特征涵盖了分辨率、图像高宽比、图像亮度、图像饱和度、图像清晰度、图像色彩丰富度等常规图像特征及目标框个数、面积标准差、堆叠度等标注相关的特征。用户可以自行选择数据集版本。除可以查看单个数据集的特征统计外,ModelArts还支持对比功能,如数据集不同版本之间的对比、训练集与验证集之间的对比等。数据集特征分析是数据分析诊断的有效工具。如果训练集和验证集之间分布差异较大,说明训练数据集上训练的模型在验证集上效果可能较差。通过追踪每个特征上2个数据集之间的差异,开发者可以对数据集差异情况有更好的理解并做出优化改进。例如,可以利用迁移学习来优化算法,使得模型可以自适应不同的数据分布情况。在遥感影像识别领域,不同卫星、不同时间、不同季节拍摄的同一地点遥感图像会有很大区别。如果原图是中午拍摄的,目标图是傍晚拍摄的,原图的整体亮度要高于目标图。假设模型是基于类似目标图的数据集训练的,当使用原图进行评估或测试时,模型就会产生失准现象,如果在评估前对原图进行直方图规定化操作,将其RGB分布转换成类似目标图的形状和分布,模型的精度就会大幅提升。上述是对一些显而易见的特征做的分析和归纳,我们还可以对高阶的特征做分析。可以先用深度神经网络模型提取特征,然后再降维展示,在特征的分布上,有一类数据(深灰色部分)实际包括了两个子类,因此模型训练时,被强行要求两种类别的数据归为同一类。实际上可能把一类拆分为两类来训练会比较合适。
-
ModelArts平台,现在能不能体验到华为云的盘古大模型?
-
Open-Sora(Gradio版本)文生视频不久前,OpenAI Sora以其惊人的视频生成效果迅速走红,在众多文本转视频模型中脱颖而出,成为全球关注的焦点。继两周前推出用于训练和推理过程的Sora Replication,成本降低46%。之后,Colossal-AI团队又推出了新的开源解决方案“Open-Sora 1.0”,涵盖了整个训练过程,包括数据处理、所有训练细节和模型检查点,与世界各地的AI爱好者携手推进视频创作的新时代。详细内容请参考:https://hpc-ai.com/blog/open-sora-v1.0可以点击我发布的Notebook在AI Gallery中一键运行!
-
# 可以从root进程,广播一个变量到所有进程 # 这里如果其它进程运行到这里,则会等待来自root进程的广播 # 注意,变量本身越大,广播耗时越长,请注意耗时。尤其是玩大模型的时候,不要动不动就广播特别大的矩阵,很耗时的。 b = comm.bcast(a, root=0)
-
数据标注之后,通常会有一些标注文件用于存储标注信息。对于数据集来说,标注信息本身是非常重要的元信息。此外,整个标注过程都会留下一系列元信息,如标注过程的完成方式(人工标注或智能标注)、标注时间、标注人员、标注用途(训练或评估等)。为了提供统一的数据标注元信息管理和更高效的数据存储,ModelArts提供了Manifest文件,该文件支持图像、视频、声频等相关标注的元信息管理。一般情况下,每个数据集版本都对应一个Manifest文件。如果用户在用ModelArts标注之前就己经准备好数据及其标注文件,并且上传到ModelArts上做训练。那么有2种选择方式:根据已有数据和标注文件生成Manifest文件便于ModelArts统一管理直接创建训练作业,仅需保证算法读取和解析数据格式的功能正常。由于模型训练会涉及多轮迭代和调参,期间需要不停对数据进行进一步分析和处理,因此建议采用第一种方式,便于后续版本迭代和维护。除Manifest之外,开发者也经常用到其他几种数据和标注组织格式来准备数据。在ModelArts中,这些格式统称为RawData。
-
交互式智能标注。基于主动学习的智能标注服务可以选择出最有价值的数据让人标注,从而降低需要标注的数据量。另外,ModelArts还提供了交互式智能标注服务来提高每个数据样本的标注效率和体验。交互式目标检测标注在目标检测任务中,标注目标是在图像中感兴趣的物体上画一个矩形框将目标物体框出来。常见的标注方法需要从物体的左上角开始拉一个矩形框到物体的右下角,得到一个较准确的矩形框,平均需要花费的时间为3—5s为了提高标注效率,ModelArts可以自动为图像上的目标物体推荐一些候选矩形框。当标注者将鼠标移动到感兴趣的目标物体上时,标注页面会弹出对应的候选矩形框供标注者确认。交互式分割标注在图像分割任务中,标注目标是在图像中感兴趣的目标物体边界上画一个多边形框来得到物体的轮廓。常用的标注方法是人工在物体轮廓上单击生成十几到几十个点,并将这些点连接成闭合的多边形。与目标检测任务相比,在图像分割任务中,需要花费更多的时间来标注一个目标物体。为了加速标注过程,ModelArts提供了一种快速简单的极点标注功能。具体来说,对于每个目标物体,标注者只需要单击目标物体轮廓的四个极点(上、下、左、右四个点),平台就会自动标注该物体的轮廓,这样可以极大地简化标注的操作。交互式视频标注在视频目标检测标注任务中,标注目标是在每帧图像中的目标物体上标注矩形框。传统的标注方法是将视频的每帧作为单独的图像,然后进行图像目标检测标注。对于帧率较大的视频,很短的一段视频中包含大量的视频帧,这会给视频标注方法带来很大的挑战。由于视频帧之间是高度连续的,因此与图像相比,视频具有非常大的冗余性。ModelArts的交互式视频标注功能为标注者提供了高效的视频标注服务。当上传视频时,只需要标注第一帧图像,平台可以自动标注后续帧图像。如果用户在视频播放过程中发现某一帧的标注框不准确,可以单击“暂停”按钮来人为地修改这一帧的标注框,然后继续播放。此时标注系统会接收到这一反馈,并使得后续的智能标注更加精准。与逐帧标注的方法相比,交互式视频标注服务可以极大地降低视频标注的成本。其他交互式智能标注在自然语言处理等方向,都可以采用基于实时人机交互的方式进行智能标注。数据在标注后还需要进行半自动化或自动化审核验证,以及时评估标注质量。如果涉及多人协同标注,就需要利用概率统计等方法将多人标注结果进行融合。
-
在Notebook实例中运行训练代码,如果数据量太大或者训练层数太多,亦或者其他原因,导致出现“内存不够”问题,最终导致该容器实例崩溃。出现此问题后,系统将自动重启Notebook,来修复实例崩溃的问题。此时只是解决了崩溃问题,如果重新运行训练代码仍将失败。如果您需要解决“内存不够”的问题,建议您创建一个新的Notebook,使用更高规格的资源池,比如GPU或专属资源池来运行此训练代码。已经创建成功的Notebook不支持选用更高规格的资源规格进行扩容。
-
问题现象当在Notebook中使用Windows下生成的文本文件时,文本内容无法正确读取,可能报错找不到路径。原因分析Notebook是Linux环境,和Windows环境下的换行格式不同,Windows下是CRLF,而Linux下是LF。解决方法可以在Notebook中转换文件格式为Linux格式。shell语言:dos2unix 文件名
-
问题现象当在Notebook中使用opencv.imshow后,会造成Notebook崩溃。原因分析opencv的cv2.imshow在jupyter这样的client/server环境下存在问题。 而matplotlib不存在这个问题。解决方法参考如下示例进行图片显示。注意opencv加载的是BGR格式, 而matplotlib显示的是RGB格式。Python语言:from matplotlib import pyplot as plt import cv2 img = cv2.imread('图片路径') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title('my picture') plt.show()
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
去报名 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签