Nvidia Maxine 精讲
这是我上半年尝试了一下英伟达的几个SDK以及应用,今天补更给大家,当时看的是Nvidia何工的csdn说明,Maxine系列的SDK ,这里分三个系列的SDK(NVIDIA Video Effects SDK\NVIDIA AUDIO Effects SDK\Augment Reality SDK),这些SDK提供了高性能的音视频AI交互式服务(视频会议、AI视频分析等业务) 。因为上手简单,故借此来分享下maxine这个SDK的基础使用,后续omniverse(这个比较复杂的应用)也会慢慢分享,我的理解是这套SDK的意义对于工程或者有直接应用需求的人确实很有帮助,但正是由于它过于简单且高度封装,没有算法源码训练部分不利于研究人员,所以有利就有弊,想要两全其美,对于我个人来说这个可能是一套开发方案:需要对这个SDK进行二次开发,将api标准熟悉后,使用这个框架去自己构建新的模型转成trt完成解析和部署,这样其实难度和工作量倍增,所以还是看你要干什么。。不多废话了,开始!

点击nvidia的maxine下载地址:https://developer.nvidia.com/maxine#ar-sdk
我之前用的是0.7版本,现在已经0.8+了
在下图中点击NVIDIA MAXINE系列中的Augmented Reality SDK, 这篇文章只针对这个SDK进行说明,我们可以在旁边的Key features观看这个SDK实现的算法功能,以及更新的消息。
我们可以从图中看到这个SDK提供了人脸检测追踪,人脸关键点检测和跟踪,人脸的mesh,人体的关键点检测,其中目前这个SDK看来是经历了更新,新增加了视线跟踪,并且关键点支持了3D的landmarks预测,而表情其实貌似加入了blendshape的计算,这里说下之前版本的表情是通过mesh使用3DMM拟合预测了一些表情的demo,这个功能后续我下好新版本的SDK顺便看下。 另外现在应该是支持linux了,大概半年前还是只支持Windows,这里我建议选择 windows,后面会给出原因

(需要在英伟达注册账户才可以下载,填完资料后进入到NGC后就可以点击下载)
具体使用我们可以点击使用文档,这里以windows的sdk为例子,AR SDK的linux版本需要官方填写资料后批准才行,因为早期这三个SDK的系列都是为只支持windows的sdk,其余两个video\audio的sdk是双平台都支持的,今天我们主要是讲ar 这个SDK的使用,故个人建议有条件优先使用windows系统,具体想更深入了解的,使用说明可以点击下方官方文档以及刚才下载的sdk提供的手册进行使用.
https://docs.nvidia.com/deeplearning/maxine/ar-sdk-system-guide/index.html
本机windows10(64bit)配置:(win10以上,ubuntu18以上,Centos7以上即可)
之前我用过0.7的版本 改动不算很大,除了之前添加的eye-contact和表情拟合,其实表情拟合这部分做了一个扩展优化,这部分对比我放在后面的文章讲现在主要说下一些文件目录结构:

这里除了新版本添加的2个demo,0.7版本只有Face和Body两个,然后Face部分的Demo被英伟达在官方版本进行了优化,之前需要做3DMM的拟合(使用工具和下载模型最后去拟合mesh效果,新版本进行了删减和优化 不需要额外去下载模型,你可以在bin\models\下找到所有的引擎模型),这部分是新旧版本的三方库对比,新版本可能用到了更多GUI的功能,额外引进了JSON、OPENGL的库,如图:

其余的就是各个应用源码的微改动,这里做个叙述吧,算是个插曲。
我们下载后的sdk是zip压缩包,需要连续解压到你指定的目录路径下(经过两次解压,第二次解压要指定目录,不要解压当前)。新下载的SDK解压后SDK目录如下图:


打开根目录下的 samples\,我们可以看到几个应用的demo,我们可以点击第一个BodyTrack文件夹,我们找到run_local.bat命令的两个脚本,用哪个都可以的:这个是打开OPENCV的摄像头,只要你链接了摄像头就可以;下面那个带offline的是离线是给视频文件的形式,本质没区别就是参数不同而已,不信 我们打开看下就行:

只是调用windows编译好的程序命令而已,这里示范下offline 文件形式好了,如果你没有摄像头,可以网上下载虚拟摄像头也可以,这里我就用下offline的文件形式就行,双击即可,然后推理的是脚本中的“bodytrack.mp4”,你也可以修改这个换成你想检测的视频文件。
这里我使用离线模型就会是直接输出成MP4了,如下图

等待上面的窗口关闭就是OFFLINE推理结束,生成的MP4会放在你输入文件的路径内,所以最好先把MP4放在当前程序的目录下命名为xxxx_pose.mp4,便于验证,看下效果。

我们可以看到检测结果可视化,但是这里我们发现只能检测一个人,一般这里是内部代码控制的逻辑,且也可以看出大概率这个关键点检测算法是top-down的类型,性能就是实时毕竟N家自制。
细心的朋友可以发现现在新版本支持了3D,这个需要我们在代码里看一下各种参数项,我们打开F:\NVIDIA_AR_SDK_Win_0.8.1.0\samples\BodyTrack\BodyTrack.cpp,可以看到选择的参数功能,如果你想了解的非常深入,这里我简要汇总下!可以直接看官方的文档:nvidia system guide


回到SDK根目录的build文件下(F:\NVIDIA_AR_SDK_Win_0.8.1.0\build\ALL_BUILD.vcxproj),使用VS2022打开解决方案ALL_BUILD.vcxproj,可以看到这个SDK下面的4个功能:BodyTrack\eXPRESS\facetrack\GazeRedirect,今天我们主要说整个sdk的基本使用和BodyTrack这个功能

我们可以修改下BodyTranck代码进行二次开发, 把代码修改后可以点击重新生成解决方案即可,此时注意我们生成的新的EXE执行文件是在build\Release\下的exe,然后你可以在这个路径下建一个bat文件去运行,具体就写之前的内容调用即可:
实时在线使用命令
``
SETLOCAL
SET PATH=%PATH%;..\..\samples\external\opencv\bin;..\..\bin;
BodyTrack.exe --model_path=..\..\bin\models // 后面的参数可以根据代码里的参数说明进行自由调整 ,如果不给文件,这个默认是打开摄像头了
离线文件使用:
```cpp
SETLOCAL
SET PATH=%PATH%;..\..\samples\external\opencv\bin;..\..\bin;
BodyTrack.exe --model_path=..\..\bin\models --in=《换成你的文件》 --offline_mode //后面参数自行看代码选
我们直接看Bodytrack的主函数逻辑,这里简单过一下:
int main(int argc, char **argv) {
// Parse the arguments
if (0 != ParseMyArgs(argc, argv)) return -100;
DoApp app;
DoApp::Err doErr = DoApp::Err::errNone;
app.body_ar_engine.setAppMode(BodyEngine::mode(FLAG_appMode)); // --app_mode[=(0 | 1)] App mode. 0: Body detection, 1 : Keypoint detection "
app.body_ar_engine.setMode(FLAG_mode); //选择模式 参考上面参数列表
if (FLAG_verbose) printf("Enable temporal optimizations in detecting body and keypoints = %d\n", FLAG_temporal);
app.body_ar_engine.setBodyStabilization(FLAG_temporal);
if (FLAG_useCudaGraph) printf("Enable capturing cuda graph = %d\n", FLAG_useCudaGraph);
app.body_ar_engine.useCudaGraph(FLAG_useCudaGraph);
#if NV_MULTI_OBJECT_TRACKER
app.body_ar_engine.enablePeopleTracking(FLAG_enablePeopleTracking, FLAG_shadowTrackingAge, FLAG_probationAge, FLAG_maxTargetsTracked);
#endif
doErr = DoApp::errBodyModelInit;
if (FLAG_modelPath.empty()) {
printf("WARNING: Model path not specified. Please set --model_path=/path/to/trt/and/body/models, "
"SDK will attempt to load the models from NVAR_MODEL_DIR environment variable, "
"please restart your application after the SDK Installation. \n");
}
if (!FLAG_bodyModel.empty())
app.body_ar_engine.setBodyModel(FLAG_bodyModel.c_str());
if (FLAG_offlineMode) { //离线文件模型
if (FLAG_inFile.empty()) {
doErr = DoApp::errMissing;
printf("ERROR: %s, please specify input file using --in_file or --in \n", app.errorStringFromCode(doErr));
goto bail;
}
doErr = app.initOfflineMode(FLAG_inFile.c_str(), FLAG_outFile.c_str());
} else {
doErr = app.initCamera(FLAG_camRes.c_str()); //实时相机模式
}
BAIL_IF_ERR(doErr);
doErr = app.initBodyEngine(FLAG_modelPath.c_str()); //读取TRT引擎 加载模型
std::cout << doErr << std::endl;
BAIL_IF_ERR(doErr);
//前面都是写参数和模型建立
//run 是opecv解码然后推理再show的核心逻辑 里面的函数每一步都做了高度封装
doErr = app.run();
BAIL_IF_ERR(doErr);
bail:
if(doErr)
printf("ERROR: %s\n", app.errorStringFromCode(doErr));
app.stop();
return (int)doErr;
}
可能还是有些细节没有补充到,后面会在这部分里加,感谢阅读~
由于BodyTrack这个功能 Nvidia并不会给出算法模型,恰巧我去年做deepstream时候发现英伟达的LAB上开源过一个部署方案(当然也没有算法模型代码,你如果自己训练的话,需要在官网提供的TAO Tooklit 的工具包在线训练,不过这种人脸检测器类型的倒是也没关系。不过我部署后发现和现在这个maxine的算法输出等很相似,然后我追溯到了之前这个模型:BodyPose3Dnet这是早期英伟达训练的一个3D关键点实时检测的模型 恰巧TOP-DOWN算法,那么我好奇心就来了,找到了如下资料和比对信息 )

这是NGC官网中给出的资料,也是当时deepstream使用pose的一些链接才查到的,后面2021年的时候英伟达把该方法发表论文为:
KAMA:3D Keypoint Aware Body Mesh Articulation,据我了解这篇论文是参考Nvidia自家出的CVPR的弱监督通过多视角2D图像 学习的3D人体关键点检测以及HRnet的骨干结合。这里说一下这个论文的贡献:
无需3D的标注,只需要多视角相机的参数,提出了2个LOSS,一个是多时间图像预测的3D位姿可以通过相机外参去比对在同一坐标系下,理论应当是一致的;
另一个LOSS:预测的3D位姿重投影回2D作L2范式的思路。 其次,HRnet的第一个版本就是TOP-down方法。

2. 再让我们看关键点的定义,不论是deepstream中内置的 还是maxine内置的都是一套关键点定义,34个名称一模一样,不过 这仍旧不能证明是一样的算法。

我的个人结论:就是可能使用了类似的思路去构造的模型,不过并不是完全一样的,比如把输入的训练分辨率了一些微改动把,仅个人猜测。。
介绍了基本的使用和关键点检测的功能和代码使用,再细节就是bodytrack.cpp里的各个参数功能,下篇我们讲功能比较多的FaceTrack和Mesh!
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
EC2会在实例停止然后重新启动时为其提供新的IP地址,因此我需要能够自动管理route53记录集,以便我可以一致地访问内容。遗憾的是,sdk的route53部分的文档远不如ec2的文档那么健壮(可以理解),所以我有点卡住了。到目前为止,从我所看到的情况来看,似乎change_resource_record_sets(link)是可行的方法,但我对:chages需要什么感到困惑>因为它提到了一个Change对象,但没有提供指向所述对象描述的链接。这是我的代码目前的样子:r53.client.change_resource_record_sets(:hosted_zone_id=>'MY_
我想强调的是,我正在寻找||=运算符被Ruby1.9.3解释器扩展的实际方式,而不是它出现的方式根据其行为进行扩展。我真正希望的是能够理解实际解释器源代码的人,遗憾的是我可能无法胜任这项任务。我发现似乎可以检查此问题的唯一资源已过时:“Ashort-circuit(||=)edgecase”。我上面提到的资源似乎暗示x||=y到x=x||的“官方”扩展y在1.9之前的解释器版本中要么不准确要么有错误。无论如何,指示的边缘情况似乎已被消除。上面的资源声称x||x=y或x或x=y“更准确”。然而,这些都不正确,因为当x是一个以前未声明的全局变量时它们不起作用:[11:04:18][****
在aws-s3中,有一种方法(AWS::S3::S3Object.stream)可让您将S3上的文件流式传输到本地文件。我无法在aws-sdk中找到类似的方法。即在aws-s3中,我这样做:File.open(to_file,"wb")do|file|AWS::S3::S3Object.stream(key,region)do|chunk|file.writechunkendendAWS::S3:S3Object.read方法确实将block作为参数,但似乎没有对其执行任何操作。 最佳答案 aws-sdkgem现在支持S3中对象的分
我正在尝试从我的文章模型中获取所有ID。我可以通过两种方式做到这一点:Article.select(:id).collect{|a|a.id}ArticleLoad(2.6ms)SELECT"articles"."id"FROM"articles"或2.2.1:006>Article.pluck(:id)(4.3ms)SELECT"articles"."id"FROM"articles"什么给了?为什么AR比Ruby版本慢?即使我对Ruby方法进行基准测试,它似乎也更快:Benchmark.measure{Article.select(:id).collect{|a|a.id}}Art
我正在尝试找出使用rubyawssdk获取带有特定标签(例如“测试”)的ec2实例列表的最佳方法。ec2=AWS::EC2.new(:access_key_id=>"XXXXXXXXXXXXX",:secret_access_key=>"YYYYYYYYY")ec2list=ec2.instances.filter("Name","testing)由于某些原因,这似乎不起作用。它认为它会过滤掉集合,只给我带有标签测试的实例。有没有办法使用rubysdk来做到这一点?谢谢。 最佳答案 如果您想要标签“Name”的值为“test
我可以使用以下方法删除AmazonS3上“文件夹”中的单个文件:s3=AWS::S3.new(:access_key_id=>ENV['AWS_ACCESS_KEY_ID'],:secret_access_key=>ENV['AWS_ACCESS_KEY'])folder_path='uploads/'+@image.s3_filenames3.buckets[ENV['AWS_BUCKET']].objects.with_prefix(folder_path).delete_all但这会留下一个空文件夹。我怎样才能完全删除文件夹(folder_path)?
外部SPIFLASH:MicronN25Q128A13ESE40G(128Mbit(16MByte))FPGA:XC7A100T CPU:Microblaze第一种情况:Microblaze在简单的应用,比如运行LED,IIC,SPI,UART之类的低俗接口驱动,或做一些简单的辅助型工作时,一般生成的applicationelf文件都不大,在10几KB或者几十,百几KB,此时使用FPGA内部的BRAM资源已经足够。XC7A100T本身就有600几KB的BRAM资源。这种情况下直接将硬件流文件和elf文件合并为download.bit文件,在直接烧录到外部SPIFLAH即可。1.Xilinx--