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.什么是实时数据此外,人工智能(AI)和机器学习算法的进步也为实时数据分析注入了新的活力。它们可以从历史数据中学习模式,预测未来趋势,辅助人类做出更加明智的选择。比如,在线广告投放系统可以根据用户的浏览习惯实时推送个性化的商品推荐;自动驾驶汽车依赖于实时感知周围环境的能力,确保行驶安全。 https://easyv.cloud/c/article/12321.html
2.chatgpt在线和本地部署区别本地部署需要对模型进行配置和优化,以适应不同的硬件和软件环境,对于非专业人员来说可能需要一定的技术能力和经验。本地部署的模型无法享受到线上部署的实时更新和维护,当有新的数据或改进的模型可用时,需要手动更新和部署。 ChatGPT的本地部署在隐私保护、响应速度和离线使用等方面具有优势,但也需要考虑硬件资源和http://chatgpt.cmpy.cn/article/1757675.html
3.QQ中的4G在线标志,技术原理与含义解析五金交电摘要:,,本文探讨了QQ上4G在线的含义及其技术原理。4G在线是QQ状态的一种显示,表示用户当前使用的设备正在通过4G网络连接到QQ。背后的技术原理涉及到移动网络的演进和QQ软件的功能设计。通过了解4G网络的高速数据http://xjxygt.cn/post/15467.html
4.深入理解信号:定义分类特性与应用解析频域时域相位算法在现代社会,信息传播的速度与方式日益多样化,"信号"这一概念的理解与解读也变得日益重要,3dm.aguardiente.net,。无论是在科学研究、经济分析还是日常生活中,"信号"所代表的信息都可能对我们的决策产生重大影响。本文将详细探讨"signal"的含义、用法以及在不同领域的应用,帮助读者更好地理解这一重要概念。 https://www.163.com/dy/article/JJFI1TGC0556A727.html
5.简介实时解决问题 - 技术人员可以在远程位置与专家共享实时视图,以获取所需的帮助。 本功能可减少行程时间和成本,并提高在首次上门期间解决问题的可能性(称为并量化为首次修复率)。 无需到现场即可巡视现场 - 远程检查员可以在不前往现场的情况下评估产品质量。 以视觉方式传达详细而复杂的指令 - 现场工作人员和远程协作https://docs.microsoft.com/zh-cn/training/modules/remote-assist/1-introduction
6.理解实时数据流与离线数据流t+1离线数据是什么意思该数据流一直保持运行状态实时的抽取(pull/push方式)数据源的数据,并在毫秒/秒级别写入存储引擎,在数据使用以及传输上达到实时效果(冲数据产生 -> 数据被使用haoshihenduan)。 3.T + 1: 该含义常用在离线数据流中,代表T日产生的数据,T + 1 日被抽渠道数据仓库/数据库中。 https://blog.csdn.net/u012965373/article/details/96175147
7.实时在线方式和离线方式的含义是什么?【题目】 实时、 在线方式和离线方式的含义是什么? 搜题找答案>08241计算机控制系统试题答案>试题详情 【题目】实时、 在线方式和离线方式的含义是什么? 纠错 查看答案 查找其他问题的答案?https://www.zikaosw.cn/daan/18588476.html
8.实时在线方式和离线方式的含义是什么?参考答案:实时:所谓“实时”,是指信号的输入、计算和输出都是在一定时间范围内完成的,即计算机对输入信息以足 点击查看完整答案 您可能感兴趣的试卷 你可能感兴趣的试题 1.问答题什么是计算机监控系统的操作员工作站、通信工作站和培训工作站? 参考答案:操作员工作站是运行值班人员与监控系统的人机联系设备,全http://www.ppkao.com/tiku/shiti/1963998.html
9.实时,在线方式和离线方式的含义是什么?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
10.智能检测技术复习总结1、计算机控制系统的在线方式和离线方式? 答:在计算机控制系统中,生产过程和计算机直接连接,并受计算机控制的方式称为在线方式;生产过程不和计算机相连,且不受计算机控制,而是靠人进行联系并做相应操作的方式称为离线方式。 2、实时的含义?(名词解释) 答:所谓实时,是指信号的输入、计算和输出都要在一定得时间范围内https://www.360wenmi.com/f/filegeg7w11t.html
11.ApacheDoris实时数据仓库的构建与技术选型方案数据仓库想必每个行业从业者都在以各式各样的方式进行实践和应用,在久远一点叫做离线数仓,后来由被称为数据中台等演化名称,再往后,又衍生到现代化实时数据栈这样的概念中,但说到底,终究还是为了解决数据的接、存、管、算、查这五个要义的,无论是多么具有附加价值的其他能力,也都是围绕这五个基本核心功能延展的。 https://developer.aliyun.com/article/1424133
12.?实时渲染与离线渲染实时渲染和离线渲染都可以成为出色的可视化策略。如果您的目标是创建一个无缝体验,模仿实时画面并带领观众进行沉浸式的三维之旅,选择实时渲染是一个更明智的选择。比如,如果您正在创建互动游览或游戏,选择实时渲染会更为重要,而且它可以让电影制作变得更容易。 http://www.360doc.com/content/23/1227/18/81287379_1108996389.shtml
13.俄语视频字幕翻译软件韩语视频字幕翻译软件(27篇)解码软件价格的真正含义 随着全球化的发展,视频内容的跨国传播日益普遍,而视频字幕翻译软件的需求也随之增长。在选择适合自己的软件时,很多人首先关注的是价格。价格仅仅是冰山一角,背后蕴藏的真正价值远不止于此。 一、功能决定价值 好的视频字幕翻译软件不仅仅是简单的文本转换,更重要的是其丰富的功能。从基础的字幕https://www.shishifanyi.com/tag/?url=1252
14.grub是什么意思或许有些人会觉得它与dig、search、scavenge这些词有些相似,但实际上它们之间还是有着细微的差别。那么,让我们一起来揭开grub的神秘面纱吧!下面将为大家介绍grub的含义及解释、发音及读法以及在翻译行业中常见的使用场景。此外,还会为大家带来grub常见搭配词汇及例句,并与同义词和近义词进行对比。敬请期待!https://www.68jy.net/zixun/mszhishi/185094.html
15.实时翻译软件app哪个好?6款工具帮大家快速掌握题目含义想要快速掌握题目的含义,还是需要一些翻译工具来辅助的。 一款相机实时翻译软件,就能够帮助各位考生轻松获取陌生单词或句子的翻译结果哦~ 大家只要拿手机一拍,就能够很快得到所需的单词含义,再也不用翻厚厚的英语词典了! 下面大家就一起来看看都有什么好用的实时翻译工具吧! https://www.360doc.cn/article/82385981_1118542900.html
16.POS机脱机密码的含义及其作用POS机脱机密码的含义及其作用 POS机脱机密码是一种安全措施,用于在POS机与后台系统之间进行通信时保护数据的安全。当POS机与后台系统断开连接时,脱机密码可以确保只有经过授权的用户才能重新建立连接并访问敏感数据。这种密码的作用是防止未经授权的访问和数据公布,提高POS系统的安全性。脱机密码还可以防止恶意软件和pos机https://www.mepos.cn/newss/972657.html
17.奥鹏作业答案优学网12.下列( )不是高级财务会计概念所包括的含义 A.高级财务会计属于财务会计的范畴 B.高级财务会计处理的是企业面临的特殊事项 C.财务会计处理的是一般会计事项 D.高级财务会计所依据的理论和方法是对原财务会计理论和方法的修正 13.甲股份有限公司2006年12月购入一台设备,原价为3010万元,预计净残值为10万元,税法规http://www.youxue100f.com/xajt/2022-01-10-7166.html
18.《王者荣耀》王者营地营地在线指的是什么营地在线含义详解王者荣耀王者营地的状态分别有游戏在线、离线、营地在线和游戏中,其他状态都比较容易理解,那么营地在线是什么意思?营地在线退出了还可以在线吗?九游网小编接下来就给大家解释一下营地在线状态,大家了解一下就好。 王者荣耀王者营地营地在线是什么意思? 1.玩家登陆了王者营地,并且就在营地上聊天或者看资讯,总之手机界面是https://www.9game.cn/news/3911667.html
19.Steam显示离线的含义及解决方法在使用STeam进行游戏时,有时候会遇到显示离线状态的情况。这可能会给玩家带来一些困扰,因为无法享受到在线游戏的乐趣。本文将介绍Steam显示离线的含义以及解决方法,帮助玩家更好地解决这一问题。 什么是Steam显示离线? 当你在使用Steam时,如果你的账号处于“离线”状态,那意味着你与Steam服务器之间失去了连接。这种情况https://jot.coffee.cn/post/69181.html
20.qq好友离线是什么意思首先,我们需要了解QQ好友的状态。在QQ聊天窗口中,好友的状态通常会显示为“在线”、“离线”、“隐身”等。这些状态可以帮助我们了解好友当前是否在线,是否方便聊天。 二、QQ好友离线状态的含义 当QQ好友的状态显示为“离线”时,表示该好友当前不在线,无法进行实时聊天。离线状态可能是由于好友主动选择了下线,或者由于https://g.pconline.com.cn/x/1728/17280241.html
21.海康威视IVMS4200设备添加和预览怎么配置?监控安装网在线,就代表添加成功,可以直接进入主预览界面查看监控画面 离线,那就注意一下电脑左下角的报错提示是什么,我们可以根据具体报错来找添加失败的原因。 02、实时预览 设备添加成功后,点击左上角图标,然后点击主预览进入软件预览界面 进入主预览界面后,点击监控点下方的分组,可以通过三种方式预览监控点画面 http://www.zdxt.net/show-65-3215.html
22.深入探讨Xbox离线账号的特征与生产技巧OSCHINA一章节:Xbox 离线账号的定义与特点 1.1 Xbox 离线账号的含义 首先我们需要明确的是,Xbox 离线账号是针对在不具备持续在线连接条件下的用户提供的一项功能。通过该系统,您可以在没有互联网接入的环境下使用 Xbox 服务。 1.2 Xbox 离线账号的特点 Xbox 离线账号有以下特点: https://my.oschina.net/emacs_7347337/blog/11426908
23.sql数据源·JimuReport积木报表·看云3、图表映射字段含义 离线地图: 在线地图: 4、注意 动态数据配置说明 选中组件(本文以柱形图为例说明),在操作界面右侧,点击图标,并选择sql数据,如下图 1、配置sql处理集 1.1点击sql处理后面的编辑按钮,如下图 1.2选择数据源,输入sql语句,点击右下角刷新数据,可以在响应数据栏看到返回的数据集信息(目前响应数据只https://www.kancloud.cn/zhangdaiscott/jimureport/2364545
24.淘宝好友显示今日在线什么意思?淘宝在线状态是实时的吗?淘宝在线状态是实时的吗? 摘要: 在淘宝的社交功能中,您可能会留意到好友的在线状态。其中一种常见的提示是“今日在线”。这个提示给人一种印象,即好友在当天活跃于淘宝平台上。但实际上,如何确定这个状态呢?今天在线又意味着什么呢?在本文中,我们将深入讨论淘宝好友显示今日在线的含义以及背后的工作原理。https://www.maitaowang.com/article/45559
25.百度智能云人体分析云服务常见问题汇总该服务预计2020年2月推出离线SDK,可集成到车载硬件设备中,在设备端离线使用,如有需求,可提交工单或者合作咨询联系我们,以便后续及时对接测试。 Q:驾驶行为分析的score和threshold代表什么含义?如何使用? A:score表示属性的置信度,比如抽烟属性的score如果是0.9,说明很大程度上在抽烟;threshold是基于内部测试结果,给出的https://topyun.vip/help/article/2194.html
26.组态控制技术实训教程(MCGS)第1章组态监控软件概述在线免费阅读生成的程序代码可以直接运行在用于组态的计算机上,也可以下装(下载)到其他的计算机(站)上。组态可以分为离线组态和在线组态两种。所谓离线组态,是指在计算机控制系统运行之前完成组态工作,然后将生成的应用程序安装在相应的计算机中。而在线组态则是指在计算机控制系统运行过程中组态。https://fanqienovel.com/reader/7106346907374455812