PyTorch框架的Yolov5移植–寒武纪开发者社区

本文对开源yolov5s模型进行寒武纪平台的移植

整个移植过程分为模型结构转换、添加后处理算子框架代码、模型量化、在线推理和离线推理共五个步骤。

对于原始Yolov5网络的后处理部分的逻辑,Cambricon-PyTorch直接使用一个大的BANGC算子完成后处理的计算,需要对原生的pytorch网络进行修改,将后处理部分的整体计算换成BANGC算子。

具体做法为是将yololayer层替换成了yolov5_detection_output,把三个yololayer的输入传给了yolov5_detection_output。修改部分在yolo.py中,如下:

ifx[0].device.type=='mlu':

foriinrange(self.nl):

x[i]=self.m[i](x[i])#conv

y=x[i].sigmoid()

output.append(y)

detect_out=torch.ops.torch_mlu.yolov5_detection_output(output[0],output[1],output[2],

self.anchors_list,self.nc,self.num_anchors,

self.img_h,self.img_w,self.conf_thres,self.iou_thres,self.maxBoxNum)

returndetect_out

ifx[0].device.type=='cpu':

z=[]

bs,_,ny,nx=x[i].shape#x(bs,255,20,20)tox(bs,3,20,20,85)

x[i]=x[i].view(bs,self.na,self.no,ny,nx).permute(0,1,3,4,2).contiguous()

ifnotself.training:#inference

ifself.grid[i].shape[2:4]!=x[i].shape[2:4]:

self.grid[i]=self._make_grid(nx,ny).to(x[i].device)

y[...,0:2]=(y[...,0:2]*2.-0.5+self.grid[i].to(x[i].device))*self.stride[i]#xy

y[...,2:4]=(y[...,2:4]*2)**2*self.anchor_grid[i]#wh

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

returnxifself.trainingelsetorch.cat(z,1)

在第一步中我们使用了BANGC编写的Yolov5Detection算子替换掉了原始的后处理逻辑。为了保证能够正确调用到这个算子,需要将该Yolov5Detection算子集成到框架中。

共分成两步:先将算子集成到CNPlugin中,然后将CNPlugin算子集成到Cambricon-Pytorch。该算子的实现与集成到CNPlugin会在另一个教程中详细介绍,在这里只介绍将该算子集成到CambriconPytorch这一步骤。

-name:yolov5_detection_output//算子名称

use_mlu_dispatcher:custom//分发类型,unboxed_only为标准化算子,custom为客制化算子

derived_type:cnml//派生类型

schema_string:torch_mlu::yolov5_detection_output//用于算子注册

arguments://参数

-name:alpha_data//参数名称

type:constat::Tensor&//参数类型

-name:beta_data

type:constat::Tensor&

-name:gamma_data

-name:anchor_data

type:torch::List

-name:num_classes

type:int64_t

-name:num_anchors

-name:img_height

-name:img_width

-name:conf_thres

type:double

-name:nms_thres

-name:maxBoxNum

type:int64_treturn_type:at::Tensor//函数返回类型

2)添加OpMethods基类中的CPU实现。

//op_methods.h

virtualat::Tensoryolov5_detection_output(constat::Tensor&alpha_data,constat::Tensor&beta_data,constat::Tensor&gamma_data,torch::Listanchor_data,int64_tnum_classes,int64_tnum_anchors,int64_timg_height,int64_timg_width,doubleconf_thres,doublenms_thres,int64_tmaxBoxNum);

//op_methods.cpp因为在这里并没有添加CPU实现,直接抛出异常

at::TensorOpMethods::yolov5_detection_output(

constat::Tensor&alpha_data,constat::Tensor&beta_data,

constat::Tensor&gamma_data,torch::Listanchor_data,

int64_tnum_classes,int64_tnum_anchors,int64_timg_height,int64_timg_width,

doubleconf_thres,doublenms_thres,int64_tmaxBoxNum){

//Todo:cpukernel

throwstd::invalid_argument("TodoforCPU");

3)添加wrapper

推理算子或训练算子会优先分发到wrapper中。wrapper是对算子kernel的封装,每个算子对应一个wrapper。根据模板生成的wrapper头文件cnml_kernel.h,添加wrapper的实现。

//cnml_kernel.h

at::Tensorcnml_yolov5_detection_output(constat::Tensor&alpha_data,constat::Tensor&beta_data,constat::Tensor&gamma_data,torch::Listanchor_data,int64_tnum_classes,int64_tnum_anchors,int64_timg_height,int64_timg_width,doubleconf_thres,doublenms_thres,int64_tmaxBoxNum);

//yolov5_detection_output.cpp

at::Tensorcnml_yolov5_detection_output(constat::Tensor&alpha_data,

constat::Tensor&beta_data,

constat::Tensor&gamma_data,

torch::Listanchor_data,

int64_tnum_classes,

int64_tnum_anchors,

int64_timg_height,

int64_timg_width,

doubleconf_thres,

doublenms_thres,

int64_tmaxBoxNum){

autoalpha_new=alpha_data;

autobeta_new=beta_data;

autogamma_new=gamma_data;

boolcast_fp32_fp16=(toCnmlDataType(alpha_data.dtype())==CNML_DATA_FLOAT32);

if(cast_fp32_fp16){

alpha_new=cnml_cast_internal(alpha_new,CNML_CAST_FLOAT32_TO_FLOAT16);

beta_new=cnml_cast_internal(beta_new,CNML_CAST_FLOAT32_TO_FLOAT16);

gamma_new=cnml_cast_internal(gamma_new,CNML_CAST_FLOAT32_TO_FLOAT16);

}

returncnml_yolov5_detection_output_internal(alpha_new,

beta_new,

gamma_new,

anchor_data,

num_classes,

num_anchors,

img_height,

img_width,

conf_thres,

nms_thres,

maxBoxNum);

4)添加kernel

Wrapper中通过调用kernel实现算子功能。算子的具体实现主要通过调用CNML库来完成。以下是CNML库的简要逻辑。

//cnml_internal.h

at::Tensorcnml_yolov5_detection_output_internal(constat::Tensor&alpha_data,

int64_tmaxBoxNum);

//yolov5_detection_output_internal.cpp

intbatch_size=alpha_data.size(0);

intinputNum=3;

intoutput_num=2;

intmaskGroupNum=3;

intclassNum=num_classes;

intmaxbox_num=maxBoxNum;

intnet_w=img_width;

intnet_h=img_height;

floatconfidence_thresh=static_cast(conf_thres);

floatnms_thresh=static_cast(nms_thres);

cnmlTensor_tcnml_input_ptr[3];

cnmlTensor_tcnml_output_ptr[2];

//prepareinputcnmltensor

auto*alpha_impl=getMluTensorImpl(alpha_data);

autoalpha_cnml=alpha_impl->CreateCnmlTensor(CNML_TENSOR,

toCnmlDataType(alpha_data.dtype()));

auto*beta_impl=getMluTensorImpl(beta_data);

autobeta_cnml=beta_impl->CreateCnmlTensor(CNML_TENSOR,

toCnmlDataType(beta_data.dtype()));

auto*gamma_impl=getMluTensorImpl(gamma_data);

autogamma_cnml=gamma_impl->CreateCnmlTensor(CNML_TENSOR,

toCnmlDataType(gamma_data.dtype()));

autooutput=at::empty({batch_size,maxbox_num*7+64,1,1},

alpha_data.options());

auto*output_impl=getMluTensorImpl(output);

autooutput_cnml=output_impl->CreateCnmlTensor(CNML_TENSOR,

toCnmlDataType(output.dtype()));

//prepareinputcnmltensorformulticore

intbuf_size=1024*(alpha_data.size(2)*alpha_data.size(3)+

beta_data.size(2)*beta_data.size(3)+

gamma_data.size(2)*gamma_data.size(3));

autotemp_buf=at::empty({batch_size,buf_size,1,1},alpha_data.options());

auto*temp_buf_impl=getMluTensorImpl(temp_buf);

autotemp_buf_cnml=temp_buf_impl->CreateCnmlTensor(CNML_TENSOR,

toCnmlDataType(temp_buf.dtype()));

//EndtheexecutionflowifnotMLUdevice

CHECK_MLU_DEVICE(output);

cnml_input_ptr[0]=alpha_cnml;

cnml_input_ptr[1]=beta_cnml;

cnml_input_ptr[2]=gamma_cnml;

cnml_output_ptr[0]=output_cnml;

cnml_output_ptr[1]=temp_buf_cnml;

//prepareh_arr

std::vectorh_arr_data(64,1);

h_arr_data[0]=alpha_data.size(2);

h_arr_data[1]=beta_data.size(2);

h_arr_data[2]=gamma_data.size(2);

inth_data[]={h_arr_data[0],h_arr_data[1],h_arr_data[2]};

//preparew_arr

std::vectorw_arr_data(64,1);

w_arr_data[0]=alpha_data.size(3);

w_arr_data[1]=beta_data.size(3);

w_arr_data[2]=gamma_data.size(3);

intw_data[]={w_arr_data[0],w_arr_data[1],w_arr_data[2]};

//preparebias_arr

std::vectorbias_arr_data(64,1.0);

floatbias_data[64];

for(inti=0;i

bias_arr_data[i]=(float)anchor_data[i];

bias_data[i]=bias_arr_data[i];

cnmlPluginYolov5DetectionOutputOpParam_tYolov5params;

TORCH_CNML_CHECK(cnmlCreatePluginYolov5DetectionOutputOpParam(&Yolov5params,

batch_size,

inputNum,

classNum,

maskGroupNum,

maxbox_num,

net_w,

net_h,

confidence_thresh,

nms_thresh,

GET_CORE_VERSION,

w_data,

h_data,

bias_data));

cnmlBaseOp_tyolov5_op;

TORCH_CNML_CHECK(cnmlCreatePluginYolov5DetectionOutputOp(&yolov5_op,

Yolov5params,

cnml_input_ptr,

cnml_output_ptr));

//returntoJITifrunningmodeisfuse

CHECK_RETURN_TO_FUSE(yolov5_op,output);

//getqueueandfunc_param

cnrtInvokeFuncParam_tfunc_param;

staticu32_taffinity=0x01;

intdata_parallelism=1;

func_param.affinity=&affinity;

func_param.data_parallelism=&data_parallelism;

func_param.end=CNRT_PARAM_END;

autoqueue=getCurQueue();

//compileallops

TORCH_CNML_CHECK(cnmlCompileBaseOp(yolov5_op,

GET_CORE_NUMBER));

void*input_addrs[3];

void*output_addrs[2];

input_addrs[0]=alpha_impl->raw_mutable_data();

input_addrs[1]=beta_impl->raw_mutable_data();

input_addrs[2]=gamma_impl->raw_mutable_data();

output_addrs[0]=output_impl->raw_mutable_data();

output_addrs[1]=temp_buf_impl->raw_mutable_data();

//computeoperator

TORCH_CNML_CHECK(cnmlComputePluginYolov5DetectionOutputOpForward(yolov5_op,

input_addrs,

3,

output_addrs,

2,

&func_param,

queue));

syncQueue(queue);

TORCH_CNML_CHECK(cnmlDestroyPluginYolov5DetectionOutputOpParam(&Yolov5params));

TORCH_CNML_CHECK(cnmlDestroyBaseOp(&yolov5_op));

returnoutput;

5)重新编译Cambricon-Pytorch

上述步骤操作完,重新编译CambriconPytorch,进入python环境确认是否集成成功,如下:

Python3.5.2(default,Nov122018,13:43:14)

[GCC5.4.020160609]onlinux

Type"help","copyright","credits"or"license"formoreinformation.

>>>importtorch

>>>importtorch_mlu

CNML:7.7.0a414883

CNRT:4.6.0e158c88

>>>torch.ops.torch_mlu.yolov5_detection_output

为什么要量化:量化是将float32的模型转换为int8/int16的模型,可以保证计算精度在目标误差范围内的情况下,显著减少模型占用的存储空间和带宽,加速推理;比如int8模型是指将数值以有符号8位整型数据保存,并提供int8定点数的指数position和缩放因子scale,因此int8模型中每个8位整数i表示的实际值为:value=(i*2^position)/scale。设备在进行在线推理和生成离线模型时仅支持输入量化后的模型。

参数含义:

其中qconfig_spec包括:{‘iteration’:1,‘use_avg’:False,‘data_scale’:1.0,‘mean’:[0,0,0],‘std’:[1,1,1],‘firstconv’:True,‘per_channel’:False}

参考代码:

parser=argparse.ArgumentParser()

parser.add_argument('--cfg',type=str,default='yolov5s.yaml',help='model.yaml')

parser.add_argument('--device',default='cpu',help='cudadevice,i.e.0or0,1,2,3orcpu')

opt=parser.parse_args()

#获取yolov5网络文件

net=yolo.get_model(opt)

#在这里设置firstconv参数为False,因为该模型首层为focus算子,非卷积,无法开启first_conv

qconfig={'iteration':1,'use_avg':False,'data_scale':1.0,'firstconv':False,'per_channel':False}

#调用量化接口

quantized_net=mlu_quantize.quantize_dynamic_mlu(net.float(),qconfig_spec=qconfig,dtype='int8',gen_quant=True)

#设置为推理模式

quantized_net=quantized_net.eval().float()

#读取图片做预处理

img_mat=Image.open("./images/image.jpg")

ifimg_mat.mode!='RGB':

img_mat=img_mat.convert('RGB')

crop=640

resize=640

transform=transforms.Compose([

transforms.Resize(resize),

transforms.CenterCrop(crop),

transforms.ToTensor(),

])

img=transform(img_mat)

im_tensor=torch.unsqueeze(img,0)

im_tensor=im_tensor.float()

#推理生成量化值

quantized_net(im_tensor)

#保存量化后的模型

torch.save(quantized_net.state_dict(),'./yolov5s_int8.pt')

操作步骤:对步骤2生成的量化后的yolov5s_int8.pt进行在线推理测试。对图片进行推理,画出目标框和标注置信度。在yolov5_pytorch_demo/quantize_online目录中,示例如下:

1)逐层模式pythondetect.py

推理后的图片存储在./results目录下

推理过程:

融合模式:被融合的多个层作为单独的运算(单个Kernel)在MLU上运。根据络中的层是否可以被融合,络被拆分为若个络段。MLU与CPU间的数据拷只在各个络之间发。

逐层模式:逐层模式中,每层的操作都作为单独的运算(单个Kernel)在MLU上运,可以将每层结果导出到CPU上,便进调试。

一般来说,在线逐层模式更适用于调试环节,在线融合模式可以查看网络融合情况;

主要步骤:

1)设置:torch.set_grad_enabled(False)#注意:在运行MLU推理融合模式时,这个条件是必须要设置的。

2)获取模型加载权重:

4)如果要运行在线融合模式,需要在运行前向过程前调用jit.trace()接口生成静态图。首先会对整个网络运行一遍逐层模式,同时构建一个静态图;然后对静态图进行优化(包括去除冗余算子、小算子融、数据块复用等)得到一个优化后的静态图;之后会根据输入数据的设备类型进行基于设备的优化,生成针对当前设备的指令:

5)最后根据推理结果为图片加框和标记置信度

parser.add_argument('--jit',type=bool,help='fusion',default=False)

parser.add_argument('--save',type=bool,default=False,help='selectionofsave*.cambrcion')

#获取yolov5网络并加载量化后的权重

net=yolo.get_empty_model(opt)

quantized_net=torch_mlu.core.mlu_quantize.quantize_dynamic_mlu(net)

state_dict=torch.load('yolov5s_int8.pt')

quantized_net.load_state_dict(state_dict,strict=False)

#转移到MLU上进行推理

device=ct.mlu_device()

quantized_net.to(ct.mlu_device())

#读取图片

img_mat=cv2.imread('images/image.jpg')

#调用预处理函数做预处理

img=letter_box(img_mat)

#设置融合模式,save选项表示是否生成离线模型,因为在进行在线融合推理时,可以生成离线模型

ifopt.jit:

ifopt.save:

ct.save_as_cambricon('yolov5s')

torch.set_grad_enabled(False)

ct.set_core_number(4)

trace_input=torch.randn(1,3,640,640,dtype=torch.float)

trace_input=trace_input.to(ct.mlu_device())

quantized_net=torch.jit.trace(quantized_net,trace_input,check_trace=False)

#推理

detect_out=quantized_net(img.to(ct.mlu_device()))

#关闭生成离线模型

ct.save_as_cambricon("")

detect_out=detect_out.to(torch.device('cpu'))

#为原图添加框、检测类别和置信度

box_result=get_boxes(detect_out)

draw_boxes(box_result)

注意:原始的yolov5网络可以对输入的图片做自适应的预处理,使预处理后的图片可以有不同的大小。而在当前demo中,为了能够满足在线融合推理和离线推理必须是固定大小的要求,将预处理都改成了固定大小为640*640。

1)生成离线模型

操作步骤:

生成离线模型与在线推理代码相似,在yolov5_pytorch_demo/quantize_online目录中,示例如下:

pythondetect.py--jitTrue--saveTrue

会在当前目录生成离线模型yolov5s.cambricon和离线模型信息文件yolov5s.cambricon_twins

2)离线推理

对一张图片进行离线推理,画出目标框和置信度。

示例图片放置在yolov5_pytorch_demo/offline/yolov5_offline_simple_demo/data目录下,离线模型放置在model目录下。执行make.sh在src目录下生成可执行文件,执行run.sh对一张图片进行推理,在result目录下生成推理后的图片。

THE END
1.上传模式与实时模式详解,操作与应用指南(适用于初学者与进阶用户亲爱的读者们,本文将为您详细解释什么是上传模式和实时模式,并引导初学者和进阶用户如何操作这两种模式,无论您是刚开始接触这一领域的萌新,还是已经有一定基础的用户,本文都将助您一臂之力,请跟随我们的步骤,轻松掌握这一技能。 了解上传模式和实时模式 https://www.shuguo168.com/post/11417.html
2.chatgpt在线和本地部署区别本地部署需要对模型进行配置和优化,以适应不同的硬件和软件环境,对于非专业人员来说可能需要一定的技术能力和经验。本地部署的模型无法享受到线上部署的实时更新和维护,当有新的数据或改进的模型可用时,需要手动更新和部署。 ChatGPT的本地部署在隐私保护、响应速度和离线使用等方面具有优势,但也需要考虑硬件资源和http://chatgpt.cmpy.cn/article/1757675.html
3.IM小程序能否支持离线消息功能?微信、支付宝等小程序平台对小程序的存储和网络请求有一定的限制,这给离线消息的实现带来了挑战。例如,微信小程序的本地存储空间有限,难以缓存大量离线消息。 2. 网络依赖 小程序的运行高度依赖网络环境,离线状态下无法进行实时通信,这增加了离线消息管理的复杂性。 https://www.huanxin.com/news/13323
4.QQ中的4G在线标志,技术原理与含义解析五金交电摘要:,,本文探讨了QQ上4G在线的含义及其技术原理。4G在线是QQ状态的一种显示,表示用户当前使用的设备正在通过4G网络连接到QQ。背后的技术原理涉及到移动网络的演进和QQ软件的功能设计。通过了解4G网络的高速数据http://xjxygt.cn/post/15467.html
5.实时在线方式和离线方式的含义是什么?【题目】 实时、 在线方式和离线方式的含义是什么? 搜题找答案>08241计算机控制系统试题答案>试题详情 【题目】实时、 在线方式和离线方式的含义是什么? 纠错 查看答案 查找其他问题的答案?https://www.zikaosw.cn/daan/18588476.html
6.实时在线方式和离线方式的含义是什么?参考答案:实时:所谓“实时”,是指信号的输入、计算和输出都是在一定时间范围内完成的,即计算机对输入信息以足 点击查看完整答案 您可能感兴趣的试卷 你可能感兴趣的试题 1.问答题什么是计算机监控系统的操作员工作站、通信工作站和培训工作站? 参考答案:操作员工作站是运行值班人员与监控系统的人机联系设备,全http://www.ppkao.com/tiku/shiti/1963998.html
7.实时,在线方式和离线方式的含义是什么?20岁,女性,人院前2周间歇性发热并有寒战,夜间体温39℃。发热期间左腹股沟有疼痛、肿胀。伴食欲缺乏,恶心、呕吐,时有咳嗽。体检左腹股沟有3cm×5cm肿块,肝、脾略肿大,腹部见玫瑰疹。血白细胞1.5×109 /L,中性粒细胞0.70×109/L,淋巴细胞0.36×109 /L,单核细胞0.04×109 /L。肝功正常,腹股沟https://www.shuashuati.com/ti/1d46a43729e74fce9d6abaf97383d863.html
8.智能检测技术复习总结1、计算机控制系统的在线方式和离线方式? 答:在计算机控制系统中,生产过程和计算机直接连接,并受计算机控制的方式称为在线方式;生产过程不和计算机相连,且不受计算机控制,而是靠人进行联系并做相应操作的方式称为离线方式。 2、实时的含义?(名词解释) 答:所谓实时,是指信号的输入、计算和输出都要在一定得时间范围内https://www.360wenmi.com/f/filegeg7w11t.html
9.ApacheDoris实时数据仓库的构建与技术选型方案数据仓库想必每个行业从业者都在以各式各样的方式进行实践和应用,在久远一点叫做离线数仓,后来由被称为数据中台等演化名称,再往后,又衍生到现代化实时数据栈这样的概念中,但说到底,终究还是为了解决数据的接、存、管、算、查这五个要义的,无论是多么具有附加价值的其他能力,也都是围绕这五个基本核心功能延展的。 https://developer.aliyun.com/article/1424133
10.俄语视频字幕翻译软件韩语视频字幕翻译软件(27篇)它拥有智能识别功能,能够快速准确地识别视频中的俄语字幕,并进行实时翻译。无论您是在学习俄语,还是只是想纯粹地欣赏俄语视频,这款软件都能够为您提供便利。 除了在学习俄语方面发挥作用外,这款软件还是一座连接中俄文化交流的桥梁。通过观看俄语视频并了解其中的文化内涵,我们可以更深入地了解俄罗斯这个神秘而又迷人的https://www.shishifanyi.com/tag/?url=1252
11.grub是什么意思在翻译过程中,往往会遇到一些难以理解或者歧义的内容。grub提供了实时反馈和修正功能,在翻译过程中即可发现并及时调整错误的部分,确保最终翻译结果的准确性。 7. 离线使用 在一些网络环境不稳定或无网络连接的情况下,grub也可以支持离线使用。这对于需要出差或者在偏远地区工作的翻译工作者来说非常方便 https://www.68jy.net/zixun/mszhishi/185094.html
12.《王者荣耀》王者营地营地在线指的是什么营地在线含义详解王者荣耀王者营地的状态分别有游戏在线、离线、营地在线和游戏中,其他状态都比较容易理解,那么营地在线是什么意思?营地在线退出了还可以在线吗?九游网小编接下来就给大家解释一下营地在线状态,大家了解一下就好。 王者荣耀王者营地营地在线是什么意思? 1.玩家登陆了王者营地,并且就在营地上聊天或者看资讯,总之手机界面是https://www.9game.cn/news/3911667.html
13.奥鹏作业答案优学网奥鹏作业答案、国开形考作业答案、在线作业、离线作业、毕业论文,答案联系 微信:wxxygzs 西交21秋《高级财务会计》在线作业【标准答案】 试卷总分:100 得分:100 一、单选题 (共 30 道试题,共 60 分) 1.利率互换指交易双方在( )一样的情况下,互相交换不同形式利率。 http://www.youxue100f.com/xajt/2022-01-10-7166.html
14.POS机脱机密码的含义及其作用POS机脱机密码的含义及其作用 POS机脱机密码是一种安全措施,用于在POS机与后台系统之间进行通信时保护数据的安全。当POS机与后台系统断开连接时,脱机密码可以确保只有经过授权的用户才能重新建立连接并访问敏感数据。这种密码的作用是防止未经授权的访问和数据公布,提高POS系统的安全性。脱机密码还可以防止恶意软件和pos机https://www.mepos.cn/newss/972657.html
15.qq好友离线是什么意思首先,我们需要了解QQ好友的状态。在QQ聊天窗口中,好友的状态通常会显示为“在线”、“离线”、“隐身”等。这些状态可以帮助我们了解好友当前是否在线,是否方便聊天。 二、QQ好友离线状态的含义 当QQ好友的状态显示为“离线”时,表示该好友当前不在线,无法进行实时聊天。离线状态可能是由于好友主动选择了下线,或者由于https://g.pconline.com.cn/x/1728/17280241.html
16.图像可视化技术论文8篇(全文)然而,离线方式检测过程复杂,取样周期长,发动机台架试验从出现异常磨损到发生故障的时间间隔一般小于离线取样周期,使其无法及时发现异常磨损信号。在线实时监测发动机的磨损可在早期发现发动机异常磨损,避免因磨损故障带来的损失。 OLVF是一种获得润滑油磨粒在线铁谱的技术,可以用于装备磨损和健康状况的实时监测[8]。文献[https://www.99xueshu.com/w/ikey91iino2q.html
17.海康威视IVMS4200设备添加和预览怎么配置?监控安装网在线,就代表添加成功,可以直接进入主预览界面查看监控画面 离线,那就注意一下电脑左下角的报错提示是什么,我们可以根据具体报错来找添加失败的原因。 02、实时预览 设备添加成功后,点击左上角图标,然后点击主预览进入软件预览界面 进入主预览界面后,点击监控点下方的分组,可以通过三种方式预览监控点画面 http://www.zdxt.net/show-65-3215.html
18.数仓分层设计架构贴源层数据实时离线 离线方面:每日定时任务型:跑批任务,业务库,比如我们典型的日计算任务,这里经常会使用 Sqoop 来抽取,比如我们每天定时抽取一次。每天凌晨算前一天的数据,早上起来看报表。这种任务经常使用 Hive、Spark 来计算,最终结果写入 Hive、Hbase、Mysql、Es 或者Redis中。 https://blog.csdn.net/qq_25647841/article/details/127634706
19.sql数据源·JimuReport积木报表·看云3、图表映射字段含义 离线地图: 在线地图: 4、注意 动态数据配置说明 选中组件(本文以柱形图为例说明),在操作界面右侧,点击图标,并选择sql数据,如下图 1、配置sql处理集 1.1点击sql处理后面的编辑按钮,如下图 1.2选择数据源,输入sql语句,点击右下角刷新数据,可以在响应数据栏看到返回的数据集信息(目前响应数据只http://report.jeecg.com/2364545
20.深入探讨Xbox离线账号的特征与生产技巧OSCHINA一章节:Xbox 离线账号的定义与特点 1.1 Xbox 离线账号的含义 首先我们需要明确的是,Xbox 离线账号是针对在不具备持续在线连接条件下的用户提供的一项功能。通过该系统,您可以在没有互联网接入的环境下使用 Xbox 服务。 1.2 Xbox 离线账号的特点 Xbox 离线账号有以下特点: https://my.oschina.net/emacs_7347337/blog/11426908
21.百度智能云人体分析云服务常见问题汇总A:目前除危险行为识别接口外,其余在线接口仅支持对静态图片进行识别分析,即将陆续开放离线SDK、软硬一体方案,以满足视频流的处理分析需求。 Q:人体分析对摄像头有要求么?图片质量会影响识别效果吗? A:人体分析服务对摄像头选型无特殊要求,市面上主流枪机、球机、IPC、USB摄像头拍摄的图像均支持。 https://topyun.vip/help/article/2194.html
22.组态控制技术实训教程(MCGS)第1章组态监控软件概述在线免费阅读系统开发环境由若干个组态程序组成,如图形界面组态程序、实时数据库组态程序等。 (2)系统运行环境 在系统运行环境下,目标应用程序被装入计算机内存并投入实时运行。系统运行环境由若干个运行程序组成,如图形界面运行程序、实时数据库运行程序等。 组态软件支持在线组态技术,即在不退出系统运行环境的情况下可以直接进入组态https://fanqienovel.com/reader/7106346907374455812