• [技术干货] 物体检测YOLOv3实践
    物体检测YOLOv3实践物体检测是计算机视觉中的一个重要的研究领域,在人流检测,行人跟踪,自动驾驶,医学影像等领域有着广泛的应用。不同于简单的图像分类,物体检测旨在对图像中的目标进行精确识别,包括物体的位置和分类,因此能够应用于更多高层视觉处理的场景。例如在自动驾驶领域,需要辨识摄像头拍摄的图像中的车辆、行人、交通指示牌及其位置,以便进一步根据这些数据决定驾驶策略。本期学习案例,我们将聚焦于YOLO算法,YOLO(You Only Look Once)是一种one-stage物体检测算法。注意事项:本案例使用框架: TensorFlow-1.13.1本案例使用硬件规格: GPU V100进入运行环境方法:点此链接进入AI Gallery,点击Run in ModelArts按钮进入ModelArts运行环境,如需使用GPU,您可以在ModelArts JupyterLab运行界面右边的工作区进行切换运行代码方法: 点击本页面顶部菜单栏的三角形运行按钮或按Ctrl+Enter键 运行每个方块中的代码JupyterLab的详细用法: 请参考《ModelAtrs JupyterLab使用指导》碰到问题的解决办法: 请参考《ModelAtrs JupyterLab常见问题解决办法》1.数据和代码下载运行下面代码,进行数据和代码的下载和解压本案例使用coco数据,共80个类别。import os from modelarts.session import Session sess = Session() if sess.region_name == 'cn-north-1': bucket_path="modelarts-labs/notebook/DL_object_detection_yolo/yolov3.tar.gz" elif sess.region_name == 'cn-north-4': bucket_path="modelarts-labs-bj4/notebook/DL_object_detection_yolo/yolov3.tar.gz" else: print("请更换地区到北京一或北京四") if not os.path.exists('./yolo3'): sess.download_data(bucket_path=bucket_path, path="./yolov3.tar.gz") if os.path.exists('./yolov3.tar.gz'): # 解压文件 os.system("tar -xf ./yolov3.tar.gz") # 清理压缩包 os.system("rm -r ./yolov3.tar.gz")2.准备数据2.1文件路径定义from train import get_classes, get_anchors # 数据文件路径 data_path = "./coco/coco_data" # coco类型定义文件存储位置 classes_path = './model_data/coco_classes.txt' # coco数据anchor值文件存储位置 anchors_path = './model_data/yolo_anchors.txt' # coco数据标注信息文件存储位置 annotation_path = './coco/coco_train.txt' # 预训练权重文件存储位置 weights_path = "./model_data/yolo.h5" # 模型文件存储位置 save_path = "./result/models/" classes = get_classes(classes_path) anchors = get_anchors(anchors_path) # 获取类型数量和anchor数量变量 num_classes = len(classes) num_anchors = len(anchors)Using TensorFlow backend. /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:526: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. _np_qint8 = np.dtype([("qint8", np.int8, 1)]) /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:527: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. _np_quint8 = np.dtype([("quint8", np.uint8, 1)]) /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:528: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. _np_qint16 = np.dtype([("qint16", np.int16, 1)]) /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:529: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. _np_quint16 = np.dtype([("quint16", np.uint16, 1)]) /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:530: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. _np_qint32 = np.dtype([("qint32", np.int32, 1)]) /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:535: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'. np_resource = np.dtype([("resource", np.ubyte, 1)])2.2读取标注数据import numpy as np # 训练集与验证集划分比例 val_split = 0.1 with open(annotation_path) as f: lines = f.readlines() np.random.seed(10101) np.random.shuffle(lines) np.random.seed(None) num_val = int(len(lines)*val_split) num_train = len(lines) - num_val2.3数据读取函数,构建数据生成器。每次读取一个批次的数据至内存训练,并做数据增强。def data_generator(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes): n = len(annotation_lines) i = 0 while True: image_data = [] box_data = [] for b in range(batch_size): if i==0: np.random.shuffle(annotation_lines) image, box = get_random_data(annotation_lines[i], input_shape, data_path,random=True) # 随机挑选一个批次的数据 image_data.append(image) box_data.append(box) i = (i+1) % n image_data = np.array(image_data) box_data = np.array(box_data) y_true = preprocess_true_boxes(box_data, input_shape, anchors, num_classes) # 对标注框预处理,过滤异常标注框 yield [image_data, *y_true], np.zeros(batch_size) def data_generator_wrapper(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes): n = len(annotation_lines) if n==0 or batch_size<=0: return None return data_generator(annotation_lines, batch_size, input_shape, data_path,anchors, num_classes)3.模型训练本案例使用Keras深度学习框架搭建YOLOv3神经网络。可以进入相应的文件夹路径查看源码实现。3.1构建神经网络可以在./yolo3/model.py文件中查看细节import keras.backend as K from yolo3.model import preprocess_true_boxes, yolo_body, yolo_loss from keras.layers import Input, Lambda from keras.models import Model # 初始化session K.clear_session() # 图像输入尺寸 input_shape = (416, 416) image_input = Input(shape=(None, None, 3)) h, w = input_shape # 设置多尺度检测的下采样尺寸 y_true = [Input(shape=(h//{0:32, 1:16, 2:8}[l], w//{0:32, 1:16, 2:8}[l], num_anchors//3, num_classes+5)) for l in range(3)] # 构建YOLO模型结构 model_body = yolo_body(image_input, num_anchors//3, num_classes) # 将YOLO权重文件加载进来,如果希望不加载预训练权重,从头开始训练的话,可以删除这句代码 model_body.load_weights(weights_path, by_name=True, skip_mismatch=True) # 定义YOLO损失函数 model_loss = Lambda(yolo_loss, output_shape=(1,), name='yolo_loss', arguments={'anchors': anchors, 'num_classes': num_classes, 'ignore_thresh': 0.5})([*model_body.output, *y_true]) # 构建Model,为训练做准备 model = Model([model_body.input, *y_true], model_loss)WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version. Instructions for updating: Colocations handled automatically by placer.# 打印模型各层结构 model.summary()(此处代码执行的输出很长,省略)训练回调函数定义from keras.callbacks import ReduceLROnPlateau, EarlyStopping # 定义回调方法 reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=3, verbose=1) # 学习率衰减策略 early_stopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, verbose=1) # 早停策略3.2开始训练from keras.optimizers import Adam from yolo3.utils import get_random_data # 设置所有的层可训练 for i in range(len(model.layers)): model.layers[i].trainable = True # 选择Adam优化器,设置学习率 learning_rate = 1e-4 model.compile(optimizer=Adam(lr=learning_rate), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # 设置批大小和训练轮数 batch_size = 16 max_epochs = 2 print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size)) # 开始训练 model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, data_path,anchors, num_classes), steps_per_epoch=max(1, num_train//batch_size), validation_data=data_generator_wrapper(lines[num_train:], batch_size, input_shape, data_path,anchors, num_classes), validation_steps=max(1, num_val//batch_size), epochs=max_epochs, initial_epoch=0, callbacks=[reduce_lr, early_stopping])Train on 179 samples, val on 19 samples, with batch size 16. Epoch 1/2 11/11 [==============================] - 25s 2s/step - loss: 46.6694 - val_loss: 39.1381 Epoch 2/2 11/11 [==============================] - 5s 452ms/step - loss: 45.5145 - val_loss: 43.6707 <keras.callbacks.History at 0x7fbff60659e8>3.3保存模型import os if not os.path.exists(save_path): os.makedirs(save_path) # 保存模型 model.save_weights(os.path.join(save_path, 'trained_weights_final.h5'))4.模型测试4.1打开一张测试图片from PIL import Image import numpy as np # 测试文件路径 test_file_path = './test.jpg' # 打开测试文件 image = Image.open(test_file_path) image_ori = np.array(image) image_ori.shape(640, 481, 3)4.2图片预处理from yolo3.utils import letterbox_image new_image_size = (image.width - (image.width % 32), image.height - (image.height % 32)) boxed_image = letterbox_image(image, new_image_size) image_data = np.array(boxed_image, dtype='float32') image_data /= 255. image_data = np.expand_dims(image_data, 0) image_data.shape(1, 640, 480, 3)import keras.backend as K sess = K.get_session()4.3构建模型from yolo3.model import yolo_body from keras.layers import Input # coco数据anchor值文件存储位置 anchor_path = "./model_data/yolo_anchors.txt" with open(anchor_path) as f: anchors = f.readline() anchors = [float(x) for x in anchors.split(',')] anchors = np.array(anchors).reshape(-1, 2) yolo_model = yolo_body(Input(shape=(None,None,3)), len(anchors)//3, num_classes)4.4加载模型权重,或将模型路径替换成上一步训练得出的模型路径# 模型权重存储路径 weights_path = "./model_data/yolo.h5" yolo_model.load_weights(weights_path)4.5定义IOU以及score:IOU: 将交并比大于IOU的边界框作为冗余框去除score:将预测分数大于score的边界框筛选出来iou = 0.45 score = 0.84.6构建输出[boxes, scores, classes]from yolo3.model import yolo_eval input_image_shape = K.placeholder(shape=(2, )) boxes, scores, classes = yolo_eval( yolo_model.output, anchors, num_classes, input_image_shape, score_threshold=score, iou_threshold=iou)4.7进行预测out_boxes, out_scores, out_classes = sess.run( [boxes, scores, classes], feed_dict={ yolo_model.input: image_data, input_image_shape: [image.size[1], image.size[0]], K.learning_phase(): 0 })class_coco = get_classes(classes_path) out_coco = [] for i in out_classes: out_coco.append(class_coco[i])print(out_boxes) print(out_scores) print(out_coco)[[152.69937 166.2726 649.0503 459.9374 ] [ 68.62158 21.843088 465.66208 452.6878 ]] [0.9838943 0.999688 ] ['person', 'umbrella']4.8将预测结果绘制在图片上from PIL import Image, ImageFont, ImageDraw font = ImageFont.truetype(font='font/FiraMono-Medium.otf', size=np.floor(3e-2 * image.size[1] + 0.5).astype('int32')) thickness = (image.size[0] + image.size[1]) // 300 for i, c in reversed(list(enumerate(out_coco))): predicted_class = c box = out_boxes[i] score = out_scores[i] label = '{} {:.2f}'.format(predicted_class, score) draw = ImageDraw.Draw(image) label_size = draw.textsize(label, font) top, left, bottom, right = box top = max(0, np.floor(top + 0.5).astype('int32')) left = max(0, np.floor(left + 0.5).astype('int32')) bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32')) right = min(image.size[0], np.floor(right + 0.5).astype('int32')) print(label, (left, top), (right, bottom)) if top - label_size[1] >= 0: text_origin = np.array([left, top - label_size[1]]) else: text_origin = np.array([left, top + 1]) for i in range(thickness): draw.rectangle( [left + i, top + i, right - i, bottom - i], outline=225) draw.rectangle( [tuple(text_origin), tuple(text_origin + label_size)], fill=225) draw.text(text_origin, label, fill=(0, 0, 0), font=font) del drawumbrella 1.00 (22, 69) (453, 466) person 0.98 (166, 153) (460, 640)image
  • [经验分享] 基于MindStudio的图像中英文文本检测模型en_PP-OCRv3_det实现离线推理的图文案例
    目录一、模型介绍二、获取代码2.1、创建工程... 122.2、添加工程代码... 122.3、添加模型代码... 132.4、添加推理工具代码... 152.5、远程同步代码... 15三、模型转换... 163.1、获取权重... 163.2、安装依赖... 173.3、转onnx. 173.4、转om... 18四、离线推理... 224.1、数据预处理... 224.2、模型推理... 244.3、推理结果展示... 25五、总结... 32一、模型介绍本文主要介绍使用MindStudio开发工具进行英语检测模型 en_PP-OCRv3_det离线推理的开发过程,主要内容包括环境安装配置、模型获取转换以及离线推理三个总分。en_PP-OCRv3_det是基于PP-OCRv3的英文文本检测模型,PP-OCRv3检测模型对PP-OCRv2中的CML协同互学习文本检测蒸馏策略进行了升级,分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML蒸馏策略;在对学生模型优化时,提出了残差注意力机制的FPN结构RSE-FPN。关于PP-OCRv3的详细介绍参考以下链接:cid:link_0二、获取代码... 122.1、创建工程选择ACL Project(Python),点击Next。如下图所示,输入工程名和路径,点击Finish,完成工程创建。如下图所示,进入工程后会有提示信息,点击Close关闭即可。如下图所示,点击File->Project Structure。如下图所示,点击SDKs->+号->Add Python SDK。如下图所示,点击SSH Interpreter,选择Deploy系统会自动识别Python环境,然后点击OK。如下图所示,点击Project->Remote Python 3.7.5,选择Python环境,点击OK。如下图所示,点击Tools->Deployment->Configuration。如下图所示,在Deployment选项下,选中远程服务器,点击Mappings,选择远程映射目录,点击OK。如下图所示,点击Tools->Start SSH session。如下图所示,点击服务器,启动远程终端Remote Terminal窗口。通过以上步骤,工程创建配置完成。2.2、添加工程代码如下图所示,工程所需要开发的代码包括:en_PP-OCRv3_det_ais_infer.py:推理脚本en_PP-OCRv3_det_postprocess.py:数据后处理脚本en_PP-OCRv3_det_preprocess.py:数据前处理脚本requirements.txt:依赖文件2.3、添加模型代码在本地终端窗口中可以通过git命令添加模型代码,相关命令为:git clone -b release/2.6 https://github.com/PaddlePaddle/PaddleOCR.gitcd PaddleOCRgit reset --hard 274c216c6771a94807a34fb94377a1d7d674a69frm .\applications\rm .\doc\imgs_en\img_12.jpgrm .\doc\imgs_en\wandb_ models.pngrm .\doc\imgs_en\model_prod_flow_en.pngcd ..如下图为模型代码结构。如下图所示,将模型配置文件ch_PP-OCRv3_det_cml.yml中的use_gpu设置成false。如下图所示,将目标检测推理文件 infer_det.py中的第53行代码注释掉。2.4、添加推理工具代码推理工具使用的是ais_infer,该工具的获取、编译、安装说明链接为:cid:link_1下载后将ais_infer工具代码放到本地工程路径下。2.5、远程同步代码如下图为工程代码结构,选择工程名,点击Tools->Deployment->Upload to。如下图所示,选中服务器,开始远程同步代码。如下图,代码远程同步完成。三、模型转换3.1、获取权重模型权重链接如下:https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar下载后解压至en_PP-OCRv3_det\ inference目录下,并同步到远程目录,如下图。3.2、安装依赖在远程终端中使用命令远程安装Python依赖,命令如下:pip3 install -r requirements.txt --user然后进入到ais_infer目录下,编译并安装aclruntime,命令如下:cd ais_infer/backend/pip3 wheel ./pip3 install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whlcd ../../3.3、转onnx在远程终端中使用命令转onnx模型,命令如下:paddle2onnx \--model_dir ./inference/en_PP-OCRv3_det_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ../en_PP-OCRv3_det.onnx \--opset_version 11 \--enable_onnx_checker True \--input_shape_dict="{'x':[-1,3,-1,-1]}"其中--model_dir表示模型路径,--model_filename表示模型文件名称,--params_filename表示参数文件名称,--save_file表示onnx保存路径,--opset_version表示onnx算子版本,--enable_onnx_checker表示是否校验onnx模型,--input_shape_dict表示模型输入shape信息列表。如下图所示,onnx模型转换成功。3.4、转om如下图所示,点击Model Converter按钮。如下图所示,点击Model File文件夹图标,选择转出的onnx模型,点击ok。如下图所示,模型转换工具开始解析onnx模型。如下图所示,同步完成后如下图所示,模型解析完成后,填入相关模型转换信息,点击Next。模型转换信息说明:1.Model Name:保存om模型的名称2.Target SoC Version:目标芯片型号,本文使用的是Ascend310P33.Output Path:om模型保存路径4.Input Format:输入数据格式,本文模型使用是NCHW,表示图像数据。5.Input Nodes:模型输入节点:本文模型包括一个x,其Shape为1,3,-1,-1,Type为FP32。由于输入为动态shape,Dynamic Image Size表示指定模型输入图像的大小。6.Output Nodes:模型输出节点,本文没有配置,使用默认输出节点。如下图所示,模型转换工具开始校验参数。参数校验完成后如下图做数据预处理,因为本文模型不需要数据预处理因此关闭Data Preprocessing,点击Next继续。如下图确认命令无误后点击Finish开始进行模型转换。模型转换成功如下图所示,在本地生成om模型:四、离线推理4.1、数据预处理创建可执行命令,如下图所示,点击Add Configuration。如下图所示,点击+号,选择Python。如下图所示,输入命令名称、执行文件、参数、Python解释器,点击OK。如下图所示,点击命令执行按钮,开始执行数据预处理命令。如下图所示,数据预处理保存在pre_data目录下。4.2、模型推理创建推理执行命令如下图所示。创建完成后执行该命令。命令参数如下:--ais_infer=./ais-infer/ais_infer.py --model=./en_PP-OCRv3_det.om --inputs=/home/pre_data/ --batchsize=1参数说明:如下图所示,推理完成后,推理结果保存在results_bs1目录下。​4.3、推理结果展示如下图所示,创建数据后处理命令。并执行该命令,命令参数如下:-c PaddleOCR/configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml -o Global.infer_img="./PaddleOCR/doc/imgs_en/" Global.infer_results=/home/results_bs1/参数说明:-c:模型配置文件-o:可选参数:Global.infer_img表示图片路径,Global.infer_results表示推理结果路径​下图所示,图像检测结果保存在det_results目录下。​如下图所示,通过远程终端使用命令将det_results复制到远程映射目录,并同步到本地。​如下图所示,可以在本地看到推理结果图片。​本地打开图片,可以看出en_PP-OCRv3_det通过离线推理,基本上可以检测出文本单据或者自然场景中的文本位置。检测效果如下:​​五、总结本文通过使用MindStudio工具,完成了en_PP-OCRv3_det模型离线推理以及英文文本检测,​
  • [问题求助] yolov5训练loss比较高
    https://www.hiascend.com/zh/software/modelzoo/models/detail/C/9af06eedaa1b9577d6221a939a31747d/1【Issues Section】/【问题文档片段】**附件如图 loss值比较高,10左右,计算出来的召回率不高,达不到业务要求**原用其它框架准确率能达到要求【Existing Issues】/【存在的问题】【Expected Result】【预期结果】希望能帮忙看看,问题是参数问题,还是其它什么问题?
  • [MindX SDK] MindX SDK -- TSM视频分类参考设计案例
    MindX SDK -- TSM视频分类参考设计案例1 案例概述1.1 概要描述在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端TSM视频分类的参考设计,达到功能要求、离线精度要求和性能要求。1.2 模型介绍本项目主要用到了两个模型,分别是:用于视频分类的TSM模型和用于手势识别的jester 模型。TSM模型相关文件可以在此处下载:cid:link_10jester原始模型文件可以在此处下载:cid:link_61.3 实现流程1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver 2、模型转换:TensorFlow模型转昇腾离线模型:TSM.onnx --> TSM.om 、 jester.onnx --> jester.om 3、视频抽帧:ffmpeg 4、python推理流程代码开发1.4 代码地址本项目的代码地址为:cid:link_72 软件方案介绍2.1 代码目录结构与说明本工程名称为TSM,工程目录如下图所示:├── TSM ├── README.md // 所有模型相关说明 ├── model ├── onnx2om.sh // 转om模型脚本 ├── onnx2om1.sh // 在线模型转om模型脚本 ├── label ├── kinetics_val.csv // label文件 ├── download_data ├── k400_extractor.sh // 解压数据集脚本 ├── offline.png // 离线推理技术实现流程 ├── online.png // 在线推理技术实现流程 ├── online_infer.py // 在线推理精度脚本 ├── offline_infer.py // 离线推理精度脚本 ├── speed.py // 离线单视频推理NPU性能脚本 ├── speed_gpu.py // 离线单视频推理GPU性能脚本3 开发准备3.1 环境依赖说明环境依赖软件和版本如下表:软件名称版本cmake3.5+mxVision5.1RC2Python3.9torch1.10.0ffmpeg4.2.13.2 环境搭建在运行项目前,需要设置环境变量:MindSDK 环境变量:. ${SDK-path}/set_env.shCANN 环境变量:. ${ascend-toolkit-path}/set_env.sh环境变量介绍SDK-path: mxVision SDK 安装路径ascend-toolkit-path: CANN 安装路径。下载ffmpeg,解压进入并执行以下命令安装:./configure --prefix=/usr/local/ffmpeg --enable-shared make -j make install安装完毕后导入环境变量export PATH=/usr/local/ffmpeg/bin:$PATH export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH3.3 模型转换3.3.1 TSM模型转换下载离线模型 TSM.onnx, 将下载好的模型放在“${TSM代码根目录}/model”目录下。将模型转换为om模型,在“model”目录下,执行以下命令生成om模型bash onnx2om.sh3.3.2 jester模型转换下载在线模型 jester.onnx将下载好的模型放在参考设计代码根目录的“model”目录下。将模型转换为om模型,在“model”目录下,运行脚本生成om模型bash onnx2om1.sh模型转换使用了ATC工具,如需更多信息请参考: cid:link_54 离线精度4.1 Kinetics-400数据集下载在 cid:link_2 连接下载download.sh和val_link.list两个脚本,放入/TSM/download_data 目录下,在“/TSM/download_data/”目录下,运行数据集下载脚本,在“/TSM/”目录下新建文件夹data用于存放下载的数据集bash download.sh val_link.list bash k400_extractor.sh4.2 数据集预处理步骤1 Kinetics-400数据集下载参考Kinetics-400 数据准备中的脚本下载操作,在代码根目录的"download_data"目录下准备"download.sh"数据集下载脚本和"val_link.list"验证集链接列表文件。├── TSM ├── download_data ├── download.sh // 下载数据集脚本 ├── k400_extractor.sh // 解压数据集脚本 ├── val_link.list 进入代码根目录的"download_data"目录下,执行以下命令下载数据集压缩包val_part1.tar、val_part2.tar、val_part3.tar:bash download.sh val_link.list然后执行以下命令解压数据集到代码根目录下:bash k400_extractor.sh数据集结构如下:├── TSM ├── data ├── abseiling ├── air_drumming ├── ... ├── zumba步骤2 数据集预处理1、视频抽帧在代码根目录执行以下命令创建所需目录:mkdir tools mkdir ops下载“temporal-shift-module-master.zip”代码包并上传服务器解压,将代码包中"tools"目录下的"vid2img_kinetics.py"、"gen_label_kinetics.py"、"kinetics_label_map.txt"三个文件拷贝至参考设计代码根目录的“tools”目录下。├── TSM ├── tools ├── gen_label_kinetics.py // label生成脚本 ├── vid2img_kinetics.py // 视频抽帧脚本 ├── kinetics_label_map.txt将代码包中"ops"目录下的"basic_ops.py"、"dataset.py"、"dataset_config.py"、"models.py"、"temporal_shift.py"、"transforms.py"六个文件拷贝至参考设计代码根目录的“ops”目录下。 ├── ops ├── basic_ops.py ├── dataset.py // 数据集构建脚本 ├── dataset_config.py // 数据集配置脚本 ├── models.py // 模型搭建脚本 ├── temporal_shift.py ├── transforms.py修改“tools”目录下的 vid2img_kinetics.py 内容,将77、78行注释。77行 #class_name = 'test' 78行 #class_process(dir_path, dst_dir_path, class_name)在参考设计代码根目录下,执行以下命令对数据集视频进行抽帧并生成图片:mkdir dataset cd ./tools python3 vid2img_kinetics.py [video_path] [image_path] e.g. python3 vid2img_kinetics.py ../data ../dataset/修改“tools”目录下gen_label_kinetics.py 内容。# 11行 dataset_path = '../dataset' # 放视频抽帧后的图片路径 # 12行 label_path = '../label' # 存放label路径 # 25行 files_input = ['kinetics_val.csv'] # 26行 files_output = ['val_videofolder.txt'] # 37行 folders.append(items[1]) # 57行 output.append('%s %d %d'%(os.path.join('../dataset/',os.path.join(categories_list[i], curFolder)), len(dir_files), curIDX))在“tools”目录下,执行以下命令生成标签文件:python3 gen_label_kinetics.py4.3 精度测试修改${TSM代码根目录}/ops/dataset_config.py 脚本中参数root_data、filename_imglist_train和filename_imglist_val,若仅进行离线精度测试则可忽略filename_imglist_train设置。import os ROOT_DATASET = './labels/' # 标签文件所在路径 ... def return_kinetics(modality): filename_categories = 400 if modality == 'RGB': root_data = ROOT_DATASET # 训练集根目录 filename_imglist_train = 'train_videofolder.txt' # 训练数据集标签 filename_imglist_val = 'val_videofolder.txt' # 测试数据集标签 prefix = 'img_{:05d}.jpg' else: raise NotImplementedError('no such modality:' + modality) return filename_categories, filename_imglist_train, filename_imglist_val, root_data, prefix在参考设计代码根目录下,运行精度测试脚本python3 offline_infer.py kinetics原模型精度值为71.1%,实测精度值为71.01%,符合精度偏差范围,精度达标。5 离线性能测试将用来测试的单视频放在“/TSM/”目录下,如视频“test.mp4”,运行性能测试脚本修改参数,'./test.mp4'为测试视频def main(): cmd = 'ffmpeg -i \"{}\" -threads 1 -vf scale=-1:331 -q:v 0 \"{}/img_d.jpg\"'.format('./test.mp4', './image') subprocess.call(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) files = os.listdir(r"./image/")5.1 单视频推理性能将用来测试的单视频放在参考设计代码根目录下,如视频“test_speed.mp4”,运行性能测试脚本修改speed_gpu.py与speed.py参数,'./test_speed.mp4'为测试视频,测试视频类别需在Kinetics-400数据集的400个种类内且视频长度至少为3s。def main(): cmd = 'ffmpeg -i \"{}\" -threads 1 -vf scale=-1:331 -q:v 0 \"{}/img_d.jpg\"'.format('./test_speed.mp4', './image') subprocess.call(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) files = os.listdir(r"./image/")GPU性能(Tesla_V100S_PCIE_32GB)在参考设计代码根目录下,运行GPU性能测试脚本python3 speed_gpu.py kinetics --test_segments=8 --test_crops=1 --batch_size=1注:speed_gpu.py脚本需在GPU环境上运行,NPU环境无法运行。得到单视频纯推理性能为0.08sec/videoSDK性能在参考设计代码根目录下,运行SDK性能测试脚本python3 speed.py注:speed.py脚本需在NPU环境上运行。得到单视频纯推理性能为0.189sec/video5.2 GPU与NPU性能对比ModelBatch size310 FPS/CardT4 FPS/CardT4/310TSM16.4819.12.95TSM425.976.42.95TSM851.84153.552.96TSM16103.74310.312.99TSM32207.27627.823.02TSM32207.27627.823.02性能对比评价标准为NPU的最优bs比T4的最优bs:NPU最优性能为bs32,单卡吞吐率:103.74fps/cardGPU最优性能为bs32,单卡吞吐率:310.31fps/cardGPU/ Ascend 310=310.31/103.74=2.99倍6 在线手势识别6.1 安装视频流工具安装视频流工具6.2 生成视频流根据提示当前只支持部分视频格式,并不支持.mp4后缀的文件,但可以通过ffmpeg转换生成ffmpeg安装教程,如下所示为MP4转换为h.264命令:使用ffmpeg工具将带有手势的“jester.mp4”的mp4格式视频转换生成为“jester.264”的264格式视频:ffmpeg -i jester.mp4 -vcodec h264 -bf 0 -g 25 -r 10 -s 1280*720 -an -f h264 jester.264 //-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制 -an关闭音频, -r 指定帧率使用live555生成视频流。6.3 程序测试python3 online_infer.py修改参数,'ip:port/jester.264'为测试视频流,其中ip为起流的机器ip地址,port为起流的机器端口地址,jester.264为测试视频jester.mp4通过ffmpeg转换后的视频。def video2img(): cmd = 'ffmpeg -i \"{}\" -threads 1 -vf scale=-1:331 -q:v 0 \"{}/img_d.jpg\"'.format('rtsp://ip:port/jester.264', './image') subprocess.call(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
  • [硬件整机] 摄像头读取图像格式YUV420转RGB问题
    我的om模型输入图像格式要求是RGB格式,并使用到了resize成指定大小,在使用华为mdc300时,框架提供的HafimageResize接口函数,文档上说明输出图像格式仅支持HAF_IMAGE_YUV420SP_NV12_UINT8。另外提供的Hafimagecvtcolor接口也是输出图像格式仅支持HAF_IMAGE_YUV420SP_NV12_UINT8。请问有解决方法吗,自己想的是:1.经过打印imagetype,摄像头读入的图像格式是RGB_uint8,调用HafimageResize函数,转成自己需要的尺寸大小,但是现在图像格式变为HAF_IMAGE_YUV420SP_NV12_UINT8,所以自己写YUV420转RGB的代码?2.不使用提供的接口,自己写resize的代码3.其他方法
  • [MindX SDK] PraNet分割案例分享
    本案例基于mindxsdk-referenceapps代码仓中的PraNetSegmentation项目(cid:link_2).1 案例概述1.1 概要描述PraNet是一种针对息肉分割任务需求设计的,名为并行反向注意力的深度神经网络。 本项目基于Mind SDK框架实现了PraNet模型的推理。1.2 特性及适用场景在医疗图像处理领域,PraNet针对息肉识别需求而设计。Pranet网络能够对息肉图片进行语义分割,功能正常,且精度达标。但是在以下情况下,分割效果不够理想:1、当息肉相比整张图片面积很小时,分割效果不够理想,边缘会比较模糊。2、当息肉大面具处于整张图片的边缘时,有一定概率分割失败,效果较差。(测试用例3.1.2)轻微的精度损失:该模型相比于原模型精度稍有下降,这是因为mindsdk只提供了jpg格式图片的解码,而原数据集中的图片为png格式,所以为了将模型迁移到mindsdk,需要将数据全部转换为jpg格式。而jpg格式压缩图片是有损失的,所以造成了一定的精度下降。1.3 模型介绍基于并行反向注意力的息肉分割网络(PraNet),利用并行的部分解码器(PPD)在高级层中聚合特征作为初始引导区域,再使用反向注意模块(RA)挖掘边界线索。1.4 实现流程Pranet语义分割流程图如下:(1)输入类型可以是图片数据(jpg图片序列)(2)通过调用MindX SDK提供的图像解码插件mxpi_imagedecoder,解码后获取图像数据。(3)然后进行图像尺寸大小变换,调用MindX SDK提供的图像尺寸大小变换插件mxpi_imageresize。(4)调用MindX_SDK的mxpi_tensorinfer插件,将尺寸变换后的图像数据输入Pranet模型进行推理。(5)使用项目内实现的pranet_postprocess插件对mxpi_tensorinfer插件的输出结果进行后处理,得到语义分割的结果。(6)调用MindX_SDK的mxpi_imageencoder插件,输出结果。2 软件方案介绍2.1 技术原理在SDK框架下使用对模型的推理结果进行可视化,用插件实现种类到颜色的映射,最终可视化为语义分割结果。2.2 项目方案架构介绍语义分割的SDK流程图如下: 序号插件功能描述1解码调用MindX SDK的 mxpi_imagedecoder2缩放调用MindX SDK的mxpi_imageresize3推理使用已经训练好的Pranet模型,对图片进行分割。插件:mxpi_tensorinfer4后处理项目内实现的pranet_postprocess插件。5图像编码调用MindX SDK的mxpi_imageencoder3 开发环境准备3.1 环境依赖说明推荐系统为ubuntu 18.04,环境依赖软件和版本如下表:软件名称版本说明获取方式MindX SDK2.0.4mxVision软件包链接ubuntu18.04.1 LTS操作系统Ubuntu官网获取Ascend-CANN-toolkit5.0.4Ascend-cann-toolkit开发套件包链接python3.9.2numpy1.22.4维度数组运算依赖库服务器中使用pip或conda安装opencv-python4.5.5.64图像处理依赖库服务器中使用pip或conda安装PIL9.0.1图像处理依赖库服务器中使用pip或conda安装onnx1.12.0模型转化库服务器中使用pip或conda安装tabulate0.8.10格式化输出服务器中使用pip或conda安装4 编译与运行4.1 下载数据集数据集下载地址: cid:link_4本模型使用Kvasir的验证集。请用户需自行获取Kvasir数据集,上传数据集到项目根目录并解压。TestDataset ├── Kvasir ├── images ├── masks4.2 获取OM模型文件OM权重文件下载参考华为昇腾社区ModelZoo 获取到PraNet-19.onnx模型后,将其放在model目录下。在model目录键入以下命令bash onnx2om.sh能获得PraNet-19_bs1.om模型文件。注: ModelZoo 中的模型文件PraNet-19_bs1.om不能用于本项目。4.3 编译插件首先进入文件夹plugin/postprocess/,键入bash build.sh,对后处理插件进行编译。4.4 推理在项目根目录下键入python main.py --pipeline_path pipeline/pranet_pipeline.json --data_path ./TestDataset/Kvasir/images/其中参数--pipeline_path为pipeline配置文件的路径,项目中已经给出该文件,所以直接使用相对路径即可; --data_path参数为推理图片的路径。最终用户可以在./infer_result/路径下查看结果。4.5 指标验证在项目根目录下键入python test_metric.py --pipeline_path pipeline/pranet_pipeline.json --data_path ./TestDataset/Kvasir/其中参数--pipeline_path为pipeline配置文件的路径,项目中已经给出该文件,所以直接使用相对路径即可; --data_path参数为数据集的路径。待脚本运行完毕,会输出以下精度信息。dataset meanDic meanIoU --------- --------- --------- res 0.890 0.828原模型的精度为:dataset meanDic meanIoU --------- --------- --------- res 0.895 0.836精度符合要求。5 常见问题5.1 未正确生成om模型文件问题描述: om模型文件未正确生成,或者路径错误。错误信息如图:解决方案:检查模型是否放入./model/文件夹,检查./pipeline/pranet.pipeline中对模型文件的位置是否正确。检查无误后重新生成om模型。5.2 未链接动态库问题描述: 未链接动态库。错误信息如图:解决方案:根据步骤对插件进行编译。
  • [问题求助] 关于在Atlas200DK上部署项目问题
    想要在开发板上部署基于yolov5+deepsort的目标跟踪项目,苦于没有相关教程,想请教一下有没有相关的部署教程,能够实现项目的部署。
  • [技术干货] 好望云服务入门到精通-全景知识地图
    好望云服务具有丰富的介绍材料和用户指导,现整理好望云服务全景知识地图,供给合作伙伴或其他需要人员,以便从入门到精通了解好望云服务。文档分为三部分:①入门--了解产品,了解好望云服务能力②进阶--使用产品,如何使用好望云服务③精通--对接产品,第三方开发对接好望云服务希望在这里,各位不同需求的人可以获取到所需的资料。版本:20221028V2.3 持续更新​​
  • [Atlas200] Paddle 算法模型如何转换到Atlas200 AI部署
    Paddle 算法模型如何转换到Atlas200 AI部署基于Paddle Paddle 框架自研的OCR算法模型如何运行到Atlas200 AI边缘盒子
  • [问题求助] 谁成功的用yolov3-tiny跑了demo的?
    想用yolov3-tiny作为模型,在好望平台转换了模型,按照《华为SDC算法上车一站式开发指南华为SDC算法上车一站式开发指南》折腾了好久都没实现。按照指南的提示修改了inc/sample_comm_svp.h 和 src/sdc_os_api.c 下面的参数,编译好了放上去运行: root@Huawei:/usr/image/app/container/3rdApp/Yolov3# ./bin/main ./bin/main: cd: line 6: can't cd to /usr/app/3rdApp: No such file or directory [src/AppConfig.cpp][0060][AppConfig]Create the app config instance [src/AppConfig.cpp][0060][AppConfig]Create the app config instance [src/main.c][0053][main]main continue!  [src/AppConfig.cpp][0060][AppConfig]Create the app config instance [src/AppConfig.cpp][0060][AppConfig]Create the app config instance [src/AppConfig.cpp][0077][Init]Open the /mnt/srvfs/config.paas.sdc successfully [src/AppConfig.cpp][0238][FillParamList]Open the config file failed, file_path: /usr/app/3rdApp/config/config.dat [src/AppConfig.cpp][0043][ConfigInitSatrt]ConfigInitSatrt Init error [src/yolov3_app.cpp][0092][Yolov3App]Yolov3App constructor [src/sdc_alarm.cpp][0045][AlarmDemo]Alarm Demo init [src/user_app.cpp][0072][ResizableApp]ResizableApp Constructor [src/dogDemoMain.cpp][0079][dogDemoMain]Create the Yolov3 App successfully  [src/AppConfig.cpp][0118][Register]Configure the key-value-pairs successfully, code: 200, config_file: /usr/app/container/3rdApp/Yolov3/config/appweb.ini [src/AppConfig.cpp][0128][Run]Listenning the Web Browser request... [src/AppConfig.cpp][0132][Run]AppConfig*********** fd: 3 [src/yolov3_app.cpp][0176][Init]Create the SDC_OS service successfully [src/yolov3_app.cpp][0183][Init]Get the HardWare Id successfully, channel_id: 5958DD4FCC1B105D53AFC3C7F52EC74D [src/yolov3_app.cpp][0190][Init]Create the Yuv ring queue successfully, buffer size: 50 [src/sdc_alarm.cpp][0098][CreateSource]CreateAlarmSource nret:16, code:200  [src/yolov3_app.cpp][0156][StartWatchDogThread]Create the thread:WatchdogThread() successfully [src/dogDemoMain.cpp][0087][dogDemoMain]Init the Yolov3 resource successfully  Get yuv video chn:2 [src/yolov3_app.cpp][0286][SetYuvChanAttr]Get idle Yuv Channel successfully, channel_id: 2 yuv_channel_set write succeed [src/yolov3_app.cpp][1017][WatchdogThread]total_memory:221MB, sys_used_mem:110MB, sys_mem_usage:49%, cur_used_mem:5MB, cur_mem_usage:2%, cpu_usage:16%  yuv_channel_set read succeed content_length:24 [src/yolov3_app.cpp][0293][SetYuvChanAttr]Set the attribute of Yuv Channel successfully, channel_id: 2 [src/dogDemoMain.cpp][0100][dogDemoMain]Set the attribute for the Yuv channel successfully  [src/dogDemoMain.cpp][0103][dogDemoMain]Load the Yolo3 NNIE model Load model, pucModelFileName:./model/yolov3_cx_3516_yuv_rgb_f02-9class.wk! [src/yolov3_app.cpp][0253][LoadModel]Load the NNIE WK file successfully, file path: ./model/yolov3_cx_3516_yuv_rgb_f02-9class.wk [src/dogDemoMain.cpp][0116][dogDemoMain]Load the Yolo3 NNIE model successfully, model_name: ./model/yolov3_cx_3516_yuv_rgb_f02-9class.wk  SDC_MemAlloc u32TotalSize 1372800, size 1372800[src/yolov3_app.cpp][0275][NNieParamInit]Initalize the NNie parameter successfully [src/dogDemoMain.cpp][0123][dogDemoMain]Init the NNie parameters successfully  [src/sdc_data_src.cpp][0065][IYuvDataSrc]Construct the IYuvDataSrc object [src/sdc_data_src.cpp][0075][VideoStream]Construct the VideoStream object yuv_frame_get:extendheadflag:2 [src/sdc_data_src.cpp][0094][SubscYuvChannel]Subscribe the Yuv data successfully, channel_id: 2 dataSrcValue:[src/yolov3_app.cpp][0112][StartAliveThread]Create the thread:aliveThrd() successfully [src/yolov3_app.cpp][0503][ConstructTLV2KeepAliveDate]ConstructTLV2KeepAliveDate  start [src/yolov3_app.cpp][0127][StartForwardThread]Create the thread:YuvDataProcThrd() successfully sizeof(head) = 16 sizeof(shm_head) = 8 sizeof(shm_event) = 16 event_len = 28 shm_cache.size = 2000056 shm_event.size = 2000056 publish event: name= itgt.saas.sdc, id = 0 [src/yolov3_app.cpp][0145][StartVideoReadThread]Create the thread:VideoSrvReadThrd() successfully [src/yolov3_app.cpp][0343][forwardThrd]SDC_YuvDataProc pthread start [src/AppConfig.cpp][0060][AppConfig]Create the app config instance [src/yolov3_app.cpp][0371][forwardThrd]pts_time_no_1000: 157949751689 Segmentation fault 不知道哪儿没搞对?
  • [问题求助] 好望云的告警可以直接发送到MQ服务器吗?
    好望云的告警,目前是通过SOAP接口发送到我们的业务服务器,有没有办法直接发送到MQ服务器?
  • [问题求助] 检测小狗的demo无法运行
    编译和打包过程中没什么明显错误(见附件中的log),签名后装到设备(D3050-10-LI-PV(2.8mm)软件版本 SDC-D162_10.0.RC11.SPC201_C)上也没报错。没有签名的rpm包我放在链接: https://pan.baidu.com/s/1pGM4BPHZb5yxH3yx9KTU6w 提取码: h71c但是在智能展示里面的 “智能TLV”打开实时收图也没看到检测到的小狗图像。日志里面也没任何记录。但是看cpu占用有60%-70%
  • [MindX SDK] mindx sdk的OpenposeKeypointDetection实例
    以下root@ubuntu:/workspace/mindxsdk-referenceapps/contrib/OpenposeKeypointDetection/python# python main.pyBegin to initialize Log.WARNING: Logging before InitGoogleLogging() is written to STDERRW20221019 03:15:28.441236 59982 ConfigUtil.h:103] [1016][Object, file or other resource doesn't exist] Fail to read (log_prefix) from config, default is: 1W20221019 03:15:28.441282 59982 ConfigUtil.h:103] [1016][Object, file or other resource doesn't exist] Fail to read (colorlogtostderr) from config, default is: 1W20221019 03:15:28.441289 59982 ConfigUtil.h:103] [1016][Object, file or other resource doesn't exist] Fail to read (stop_logging_if_full_disk) from config, default is: 1The output directory of logs file exist.Save logs information to specified directory.E20221019 03:15:28.441785 59982 FileUtils.cpp:391] Check Owner permission failed: Current permission is 7, but required no greater than 6.E20221019 03:15:28.442121 59982 MxStreamManagerDptr.cpp:360] file in GST_PLUGIN_PATH is invalidE20221019 03:15:28.442143 59982 MxStreamManagerDptr.cpp:379] check directories in GST_PLUGIN_PATH failedE20221019 03:15:28.442162 59982 MxStreamManagerDptr.cpp:460] check GST_PLUGIN_PATH failedE20221019 03:15:28.442180 59982 MxStreamManagerDptr.cpp:497] handle environment: GST_PLUGIN_PATH failedE20221019 03:15:28.442198 59982 MxStreamManager.cpp:88] [1001][General Failed] Before creating a pipeline, please set related environment variables.The following two methods are available:(1) Permanent method: set the environment variable in the ~/.bashrc file of the current user, and run the "source ~/.bashrc" command manually in the current window.(2) Temporary method: run the export command to import the required environment variables in the current window.我加了环境变量还是出现这个问题,请大神帮忙解决一下,谢谢
  • [技术干货] 好望云服务部署配置指导
    ↵好望云服务部署配置指导(20230508)1 文档说明好望云服务具有详细的用户指南和视频介绍,本文档结合该两份文档,并汇总了媒体参数配置注意事项,用于指导用户一步到位配置好望云服务。2 引用文档序号名称链接1好望云用户指南点击查看2非开发者玩转好望云服务系列介绍视频点击查看3 操作流程4 操作步骤指引步骤内容指导文件指导视频备注1登录华为云入口2创建华为租户点击查看-3新增访问密匙-访问密匙主要用于步骤6创建企业时的需要信息,请妥善保管4登录好望云服务管理后台(IVM)入口5注册好望云服务账号点击查看点击查看6创建企业点击查看点击查看7-1IVM添加设备(国标)配置平台侧参数点击查看点击查看参数配置参考5.1节配置设备侧参数-参数配置参考5.2节7-2IVM添加设备(好望)配置设备侧参数点击查看-参数配置参考5.3节配置平台侧参数点击查看点击查看可以在IVM添加好望设备外,还支持好望APP扫码快速添加,详见5.3节操作步骤7-3批量添加设备点击查看点击查看8配置设备媒体参数--参数配置参考5.4节9为设备配置用户(可选)点击查看-10购买套餐点击查看点击查看使用企业创建者账号购买套餐注:服务也可以按需收费,若使用按需收费时无需购买套餐11开通服务接入调阅服务点击查看-查看实况播放时需要开通录像存储服务云端录像存储时需要开通行业数据流服务查看告警图片时需要开通12设置云端录像计划动检存储计划配置-点击查看只有开通录像存储服务时候才需要设置;根据自己需求配置对应存储计划和留存期连续存储计划配置-点击查看录像留存期配置-点击查看备注:本操作步骤仅为部署好望云服务的基础功能,更多功能的使用请参考引用文档设备的安装和网络配置等,请参考设备侧相关文档。5 注意事项5.1  IVM添加设备(国标)-配置平台侧参数指导互联编码用于区分设备类型,请注意11-13位与设备类型对应关系如下:摄像机:132NVR:118DVR:111通道/镜头ID:131(用于配置设备侧参数)注册认证算法:选择SHA265,安全性更高。当设备接入无法在线时,可能设备不支持SHA265鉴权,选择MD5再接入。5.2  IVM添加设备(国标)-配置设备侧参数指导5.2.1 华为摄像机华为国标接入参数注意事项:可参考官网指导:cid:link_10,当前protal界面不会校验用户填入的参数,建议参数配置如下:开启媒体流保活功能后,如果在一定时间内SDC没有接收到监控平台发送的媒体保活包,则SDC停止发送媒体流。当前平台不支持保活功能时,建议“不勾选”。媒体保活开关不勾选,当前无保活功能,若勾选会导致视频播放十几秒后停止。华为摄像机国标接入默认是不支持H264,但若有H265选项,说明SDC也支持H265的协议,若有选项建议“勾选”,其他设备国标对接配置中若无H265选项,就是仅支持H264协议。编码不一致可能导致拉流失败。X系列的编码协议可以在“高级配置 > 音视图 > 视频流参数 > 主码流 > 编码协议”中修改。名称可自行设置,但不要配置成非设备ID的其他标准ID格式。错误案例:两个设备AB,A的名称:64062011041320000001,B的设备ID:64062011041320000001,A名称与B设备ID相同,可能会导致后台错误处理。5060端口号是国标默认端口,勾选后需要设置端口号范围,如0~65535,建议不勾选。注册有效期建议设为86400s(一天)。心跳周期建议设为20s。镜头ID是设备通道,必选。重启SDC:取消勾选GB/T28181后保存,再勾选GB/T28181后保存。X系列:高级配置 > 网络 > 平台对接参数 > 第二协议参数 > T28181,参考图如下。5G系列:与X系列配置类似,但多了一个“SIP消息鉴权”选项,应该选择“MD5/SHA256”,因为当前SHA256加密未完全实现,主要还是MD5加密的方式,若选择错误日志中会有“鉴权失败/auth failed”信息。D系列球机(部分不支持好望)界面更精简,无“媒体保活开关”,参考图如下。M系列 界面和X系列类似,多了个“本地端口”配置,是连接SIP服务器时,摄像机端的端口号,设置为1~65535的整数,具体值并无影响。5.2.2 海康海康基本参数配置如下。如果海康上有传输协议选项,请选择UDP传输协议海康摄像机设置H264或者H265、变码率时,会自动开启smart264或smart265。Smart264或smart265会让码率降低,减少存储空间,但是会使得GOP变大,导致国标接入情况下起播变慢、画面有些模糊,影响媒体体验,关闭smart264或smart265。5.2.3 大华路径:网络设置 > 平台接入 > 国标28181,参考图如下。​​​5.2.4 天地伟业       路径:配置 > 网络设置 > GB/T28181设置和平台接入       像华为、海康和大华都会有使能28181的选项,但天地伟业需要另外在“平台接入”中开启。​​​​​​​​​​​​​5.2.5 其他       配置参数及方法都大同小异,主要在SDC的protal页面中找关键字“网络设置”、“T28181”、“平台接入”等字样,具体参数参见华为X系列。需要注意,有些设备默认没有开启T28181的功能,需要找到使能开关或是有28181选择的,开启国标对接功能,样式如图。​​​​​​​​​5.3 好望接入参数配置指导5.3.1 IVM添加设备(好望)前提条件NVR800连接的路由器已经连接Internet网络。NVR800连接的网络中防火墙未屏蔽8443、7010、7050、7070端口。操作步骤在NVR800上操作。步骤1:以admin登录本地人机。步骤2:选择“配置 > 网络配置 > 云服务”。步骤3:启用云服务,如下图所示。勾选使用云服务同步系统时间后,NVR800会自动从云服务同步系统时间。步骤4:此处的二维码为NVR800的二维码,用于手机APP扫码识别设备。在手机APP上操作。步骤5:登录手机APP软件。步骤6:扫描NVR800的二维码,下图所示。步骤7:添加成功即可在手机APP上看到该设备。若需要看设备实况,还需要开通“接入调阅服务”,详细看第3章操作流程第11。相关操作步骤8:APP绑定NVR800成功后,可以在NVR800上看到用户信息,如下图所示。步骤9:如需更换绑定用户,admin用户可以强制解绑,如下图所示。5.3.2 摄像机ONVIF协议接入NVR注意事项(友商摄像机+华为NVR800+好望云组网)友商摄像机通过Onvif协议与NVR800对接,若出现通道离线或实况画面延迟等问题,建议将NVR800 onvif配置中使用Http协议,不使用Https协议。在友商摄像机中,也将Https协议关闭。友商摄像机通过Onvif协议与NVR800对接,若出现无法云台控制问题,可能是友商摄像机Onvif用户非管理员,请修改成管理员即可。5.4 设备媒体参数配置指导5.4.1 摄像机媒体参数建议值通用配置建议:主码流:H264,1080P,2M,帧率25fps,I帧间隔50子码流:H264,D1(720x576),1M,帧率25fps,I帧间隔50省流配置建议:主码流:H264,720P,1M,帧率25fps,I帧间隔50子码流:H264,D1(720x576),256k,帧率25fps,I帧间隔50注意:IVS1800和NVR800,修改摄像机码流分辨率参数之后,建议把IVS1800或者NVR800重启下,避免有些数据问题。IVS1800和NVR800,跟摄像机数据交换,是在建链时候进行对接,后面参数修改可能不会同步,5.4.2 其他注意事项国标设备目前无法进行主子码流切换使用HLS/FLV媒体协议,只能用H264播放使用微信小程序播放,目前只支持HLS播放
  • [问题求助] Ascend910 上运行torch resnet50算法问题
    调试链接中的resnet50算法:https://gitee.com/ascend/ModelZoo-PyTorch/tree/master/PyTorch/built-in/cv/classification/ResNet50_for_PyTorch,输出路径下生成了kernel_meta_33_1665710764432959235、kernel_meta_temp_ebcd0129ecc65a0f66bc3536101ed8f69b2267e6b61475a2d2fd2afdfc00f343等的kernel_meta信息,请问通过什么方式,能将kernel_metaxxx文件夹输出到指定文件夹下,或者不生成kernel_metaxxx文件夹。