• [技术干货] 海酆防溺水检测系统
    各路大神如何把物联网接入高危行业?
  • [技术干货] ModelArts_AI开发平台之交通信号标志检测与识别
    【任务背景】近年来,随着人工智能和传感器技术的快速进步,自动驾驶汽车技术也取得了长足发展。从最初的辅助驾驶系统到如今可实现完全自主驾驶的汽车,自动驾驶技术正在改变我们的出行方式。其中,交通信号识别技术作为自动驾驶系统的核心功能之一,能够准确感知和识别道路上的各类交通标志、信号灯等,为车辆提供精准的行驶决策依据,确保行车安全性和效率。基于视觉的交通信号标志检测与识别任务旨在开发出精准高效的识别算法,助力自动驾驶汽车技术的进步。任务包含步行、非机动车行驶、环岛行驶、机动车行驶等多种交通信号标志类别,开发者会利用到计算机视觉领域的目标检测、关键点检测、图像分类等基础技术,为提升识别效率,也可以拓展使用剪枝、量化、蒸馏等模型方面的优化技术。ModelArts云平台提供任务相关的数据处理、模型训练、应用部署等技术文档及学习课程材料,助力开发者学习相关技术,了解实践操作。【数据说明】本次任务需要识别以下16种类别的交通标识,类别编号与定义如下表:i1i2i3i4Walk步行Non_motorized vehicles非机动车行驶Round the island 环岛行驶Motor vehicle 机动车行驶i5i6i7i8Keep on the right side of the road靠右侧道路行驶Keep on the left side of the road 靠左侧道路行驶Drive straight and turn right at the grade separation 立体交叉直行和右转弯行驶Drive straight and turn left 立体交叉直行和左转弯行驶i9i10i11i12Honk 鸣喇叭Turn right 向右转弯Turn left and right 向左向右转弯Turn left 向左转弯i13i14i15il50One way, straight 直行Go straight and turn right 直行和向右转弯Go straight and turn left 直行和向左转弯Minimum Speed Limit 最低限速50【任务说明】本任务的测试集为200张图片,这些图片为中国多个城市街景的高分辨率图像,每张图片包含1种交通信号标识。数据集图片示例检测结果以图片为单位输出其中包括交通信号标识的类别、坐标与置信度,每张图片输出一个结果,格式为json字符串,字段说明如下: { "detection_classes": ["i1"], "detection_boxes": [[576, 423, 669, 967]], "detection_scores": [0.4796633720397949] }• detection_classes:指图片中目标的类别,参见上面的数据说明。• detection_boxes:指图片中目标位置的水平矩形框坐标,坐标表示为[ymin,xmin,ymax,xmax]。• detection_scores:指检测结果的置信度。【案例教学】【准备数据集】# 步骤1:从OBS迁移数据集 import moxing as mox mox.file.copy_parallel("obs://trafficbuckets/dataset/update_traffic_sign.zip", "/home/ma-user/work/dataset/update_traffic_sign.zip") # 形参:源文件->指定位置# 步骤2:解压数据集并更改名称为update_traffic_sign import os os.system('unzip /home/ma-user/work/download/update_traffic_sign.zip -d /home/ma-user/work/dataset') os.system('mv /home/ma-user/work/dataset/"update traffic sign" /home/ma-user/work/dataset/update_traffic_sign')# 生成train和val图片名文本文件 from glob import glob import random # hyper parameter train_pic_rate = 0.7 # you can change! # 该目录存储图片数据 patch_fn_list = glob('/home/ma-user/work/dataset/update_traffic_sign/images/*.jpg') # you can change! # 返回存储图片名的列表,不包含图片的后缀 patch_fn_list = [fn for fn in patch_fn_list] # 将图片打乱顺序 random.shuffle(patch_fn_list) # 按照7:3比例划分train和val train_num = int(train_pic_rate * len(patch_fn_list)) train_patch_list = patch_fn_list[:train_num] valid_patch_list = patch_fn_list[train_num:] # produce train/valid/trainval txt file split = ['train', 'val', 'trainval'] # produce train/valid/trainval txt file split = ['train2017', 'val2017', 'trainval2017'] for s in split: # 存储文本文件的地址 save_path = '/home/ma-user/work/dataset/update_traffic_sign/' + s + '.txt' # you can change! if s == 'train2017': with open(save_path, 'w') as f: for fn in train_patch_list: # 将训练图像的地址写入train.txt文件 f.write('%s\n' % fn) elif s == 'val2017': with open(save_path, 'w') as f: for fn in valid_patch_list: # 将验证图像的地址写入val.txt文件 f.write('%s\n' % fn) elif s == 'trainval2017': with open(save_path, 'w') as f: for fn in patch_fn_list: # 将所有图像名的编号写入trainval.txt文件 f.write('%s\n' % fn) print('Finish Producing %s txt file to %s' % (s, save_path))# 按照train.txt和val.txt将images分类 import shutil import os def my_move(trainlistdir,vallistdir,traindir,valdir): # 打开train.txt文件 fopen = open(trainlistdir, 'r') # 读取图片名称 file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') # 图片的路径 traindata = file_name # 把图片复制至traindir路径下 # 如果目标文件夹不存在,则创建它 if not os.path.exists(traindir): os.makedirs(traindir) shutil.move(traindata, traindir) # 同上 fopen = open(vallistdir, 'r') file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') valdata = file_name # 如果目标文件夹不存在,则创建它 if not os.path.exists(valdir): os.makedirs(valdir) shutil.move(valdata, valdir) # 存储训练图片名的txt文件地址 trainlistdir=r'/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 存储验证图片名的txt文件地址 vallistdir=r'/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # coco格式数据集的train2017目录 traindir=r'/home/ma-user/work/dataset/update_traffic_sign/images/train2017' # coco格式数据集的val2017目录 valdir=r'/home/ma-user/work/dataset/update_traffic_sign/images/val2017' my_move(trainlistdir,vallistdir,traindir,valdir)# 按照train.txt和val.txt将labels分类 import shutil import os def my_move(datadir, trainlistdir,vallistdir,traindir,valdir): # 打开train.txt文件 fopen = open(trainlistdir, 'r') # 读取图片名称 file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') # 图片的路径 tmp_list = file_name.split('/') tmp_list[-2] = 'labels' train_sp = os.path.join('/', *tmp_list) traindata = train_sp.split('.jpg')[-2] + '.txt' # 把图片复制至traindir路径下 # 如果目标文件夹不存在,则创建它 if not os.path.exists(traindir): os.makedirs(traindir) shutil.move(traindata, traindir) # 同上 fopen = open(vallistdir, 'r') file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') tmp_list_v = file_name.split('/') tmp_list_v[-2] = 'labels' val_sp = os.path.join('/', *tmp_list_v) valdata = val_sp.split('.jpg')[-2] + '.txt' # 如果目标文件夹不存在,则创建它 if not os.path.exists(valdir): os.makedirs(valdir) shutil.move(valdata, valdir) # labels存储地址 datadir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/' # 存储训练图片名的txt文件地址 trainlistdir=r'/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 存储验证图片名的txt文件地址 vallistdir=r'/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # coco格式数据集的train2017目录 traindir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/train2017' # coco格式数据集的val2017目录 valdir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/val2017' my_move(datadir, trainlistdir,vallistdir,traindir,valdir)# 对images和labels重命名 import os def rename_img_label(images_folder, labels_folder): # 获取文件夹中的文件列表 images = sorted(os.listdir(images_folder)) labels = sorted(os.listdir(labels_folder)) # 重新命名文件 for i, (image_file, label_file) in enumerate(zip(images, labels)): # 生成新的文件名 new_name = f"{i + 1:03d}" # 格式化为三位数 image_ext = os.path.splitext(image_file)[1] # 获取图片扩展名 label_ext = os.path.splitext(label_file)[1] # 获取标签扩展名 # 构建新的完整路径 new_image_path = os.path.join(images_folder, f"{new_name}{image_ext}") new_label_path = os.path.join(labels_folder, f"{new_name}{label_ext}") # 重命名文件 os.rename(os.path.join(images_folder, image_file), new_image_path) os.rename(os.path.join(labels_folder, label_file), new_label_path) print("文件重命名完成。") # 设置train文件夹路径 train_images_folder = '/home/ma-user/work/dataset/update_traffic_sign/images/train2017' train_labels_folder = '/home/ma-user/work/dataset/update_traffic_sign/labels/train2017' # 设置val文件夹路径 val_images_folder = '/home/ma-user/work/dataset/update_traffic_sign/images/val2017' val_labels_folder = '/home/ma-user/work/dataset/update_traffic_sign/labels/val2017' rename_img_label(train_images_folder, train_labels_folder) rename_img_label(val_images_folder, val_labels_folder)import os # 设置文件夹路径 folder_train = '/home/ma-user/work/dataset/update_traffic_sign/images/train2017' folder_val = '/home/ma-user/work/dataset/update_traffic_sign/images/val2017' output_file_train = '/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 输出的 TXT 文件名 output_file_val = '/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # 输出的 TXT 文件名 def writetxt(floder_path, outputfilename): # 获取文件夹中的文件列表 file_names = os.listdir(floder_path) file_names.sort() # 将文件名写入 TXT 文件 with open(outputfilename, 'w') as f: for file_name in file_names: f.write(os.path.join(floder_path, file_name) + '\n') print(f"文件名已写入 {outputfilename}。") writetxt(folder_train, output_file_train) writetxt(folder_val, output_file_val)# 生成json文件(可选) import glob import json import os from PIL import Image def yolo_to_coco_for_subset(yolo_images_folder, yolo_labels_folder, categories): # Initialize COCO dataset structure for the subset coco_format = { "images": [], "annotations": [], "categories": [] } # Add category information for i, category in enumerate(categories): coco_format["categories"].append({ "id": i + 1, "name": category, "supercategory": "none" }) image_id = 0 annotation_id = 0 # image_id = -1 # annotation_id = -1 for image_file in glob.glob(f"{yolo_images_folder}/*.jpg"): print(image_file) # Read image to get width and height with Image.open(image_file) as img: width, height = img.size # Add image information with size coco_format["images"].append({ "id": image_id + 1, "file_name": os.path.basename(image_file), "width": width, "height": height }) # Corresponding annotation file yolo_annotation_file = os.path.join(yolo_labels_folder, os.path.basename(image_file).replace(".jpg", ".txt")) if os.path.exists(yolo_annotation_file): with open(yolo_annotation_file, "r") as file: for line in file: category_id, x_center, y_center, bbox_width, bbox_height = map(float, line.split()) # Convert YOLO format to COCO format x_min = (x_center - bbox_width / 2) * width y_min = (y_center - bbox_height / 2) * height coco_bbox_width = bbox_width * width coco_bbox_height = bbox_height * height # change image_id img_id = int(image_file.split('/')[-1].split('.')[-2]) print(img_id) # Add annotation information coco_format["annotations"].append({ "id": annotation_id + 1, "image_id": img_id, # image_id + 1, "category_id": int(category_id) + 1, "bbox": [x_min, y_min, coco_bbox_width, coco_bbox_height], "area": coco_bbox_width * coco_bbox_height, "segmentation": [], # Optional "iscrowd": 0 }) annotation_id += 1 image_id += 1 return coco_format def save_coco_format(coco_format, output_file): with open(output_file, "w") as file: json.dump(coco_format, file, indent=4) # Example usage yolo_base_folder = "/home/ma-user/work/dataset/update_traffic_sign/" # 父级文件夹 file_path = '/home/ma-user/work/dataset/update_traffic_sign/classes.txt' # 替换为你的txt文件路径 train_json_save_path = '/home/ma-user/work/dataset/update_traffic_sign/annotations/instances_train2017.json' # train json保存路径 val_json_save_path = '/home/ma-user/work/dataset/update_traffic_sign/annotations/instances_val2017.json' # val json保存路径 # 判断文件夹是否存在,若不存在则创建 # 判断文件夹是否存在,若不存在则创建 list_name_train = train_json_save_path.split('/')[:-1] if not os.path.exists(os.path.join(*list_name_train)): os.mkdir(os.path.join('/', *list_name_train)) # 读取txt文件并将每一行转换为列表 categories = [] with open(file_path, 'r') as file: lines = file.readlines() # 读取文件的所有行 for line in lines: categories.append(line.strip()) # 输出结果 print(categories) # Convert train set train_coco_format = yolo_to_coco_for_subset( os.path.join(yolo_base_folder, "images/train2017"), os.path.join(yolo_base_folder, "labels/train2017"), categories ) save_coco_format(train_coco_format, train_json_save_path) # Convert val set val_coco_format = yolo_to_coco_for_subset( os.path.join(yolo_base_folder, "images/val2017"), os.path.join(yolo_base_folder, "labels/val2017"), categories ) save_coco_format(val_coco_format, val_json_save_path)# 查看数据集 import os import random import cv2 import numpy as np from matplotlib import pyplot as plt %matplotlib inline # classes = ["open", "short","mousebite","spur","copper",'pin-hole'] # 类别 classes = ['i1', 'i10', 'i11', 'i12', 'i13', 'i14', 'i15', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9', 'i50'] file_path = "/home/ma-user/work/dataset/update_traffic_sign/images/train2017" file_list = os.listdir(file_path) img_paths = random.sample(file_list, 4) img_lists = [] for img_path in img_paths: img_path = os.path.join(file_path, img_path) img = cv2.imread(img_path) h, w, _ = img.shape tl = round(0.002 * (h + w) / 2) + 1 color = [random.randint(0, 255) for _ in range(3)] if img_path.endswith('.png'): with open(img_path.replace("images", "labels").replace(".png", ".txt")) as f: labels = f.readlines() if img_path.endswith('.jpg'): with open(img_path.replace("images", "labels").replace(".jpg", ".txt")) as f: labels = f.readlines() for label in labels: l, x, y, wc, hc = [float(x) for x in label.strip().split()] x1 = int((x - wc / 2) * w) y1 = int((y - hc / 2) * h) x2 = int((x + wc / 2) * w) y2 = int((y + hc / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), color, thickness=tl, lineType=cv2.LINE_AA) cv2.putText(img,classes[int(l)],(x1,y1-2), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,111,222), 3, cv2.LINE_AA) img_lists.append(cv2.resize(img, (1280, 720))) image = np.concatenate([np.concatenate(img_lists[:2], axis=1), np.concatenate(img_lists[2:], axis=1)], axis=0) plt.rcParams["figure.figsize"] = (20, 10) plt.imshow(image[:,:,::-1]) plt.axis('off') plt.show()【准备mindyolo模型】链接:mindyolo# 步骤1:从OBS迁移数据集 import moxing as mox mox.file.copy_parallel("obs://trafficbuckets/source_code/mindyolo.zip", "/home/ma-user/work/mindyolo.zip") # 形参:源文件->指定位置【修改配置文件】1.yolov8n.yaml以及其继承的coco.yaml,hyp.scratch.low.yaml,yolov8-base.yaml的配置信息coco.yamldata: dataset_name: update_traffic_sign # you can change! train_set: /home/ma-user/work/dataset/update_traffic_sign/train2017.txt # ./coco/train2017.txt # 118287 images # you can change! val_set: /home/ma-user/work/dataset/update_traffic_sign/val2017.txt # ./coco/val2017.txt # 5000 images # you can change! test_set: /home/ma-user/work/dataset/update_traffic_sign/test2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794 # you can change! nc: 16 # class names names: ['i1', 'i10', 'i11', 'i12', 'i13', 'i14', 'i15', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9', 'i50'] # you can change! train_transforms: [] test_transforms: []yolov8-base.yamlepochs: 500 # total train epochs # you can change! per_batch_size: 2 # 16 * 8 = 128 img_size: 2048 iou_thres: 0.7 conf_free: True sync_bn: True opencv_threads_num: 0 # opencv: disable threading optimizations network: model_name: yolov8 nc: 16 # number of classes # you can change! reg_max: 16 stride: [8, 16, 32] ...【执行训练】python train.py --config ./configs/yolov8/yolov8n.yaml --run_eval True
  • [问题求助] 离线开发工具包中pt转wk模型报错
    root@deff0d37ae10:~/trainkit/detect_kit# python pt2wk.py --weights best.pt --out-dir  train --wk_config config/train/cfg_yolo.cfg --nnie 12                    Traceback (most recent call last):   File "pt2wk.py", line 33, in <module>     pt2wk(args.weights, args.out_dir, args.name, args.wk_config, version, args.height, args.width) # add or change by t00503157   File "encry_torch2caffe/api.py", line 31, in encry_torch2caffe.api.pt2wk   File "models/yolo.py", line 717, in models.yolo.attempt_load_encrypt   File "/miniconda3/lib/python3.8/site-packages/torch/serialization.py", line 607, in load     return _load(opened_zipfile, map_location, pickle_module, **pickle_load_args)   File "/miniconda3/lib/python3.8/site-packages/torch/serialization.py", line 882, in _load     result = unpickler.load()   File "/miniconda3/lib/python3.8/site-packages/torch/serialization.py", line 875, in find_class     return super().find_class(mod_name, name) AttributeError: Can't get attribute 'DetectionModel' on <module 'models.yolo' from '/root/trainkit/detect_kit/models/yolo.cpython-38-x86_64-linux-gnu.so'>
  • [问题求助] batch create service failed 如何解决
    将ai应用发布时遇到batch create service failed  错误怎么解决
  • [问题求助] mdc300f - Camera目标检测应用开发没有demo数据
    用mdc在做目标识别算法的时候,发现没有实验指导手册中提及的camera_mini0_11.zip数据,哪位大神有,或者这个数据到底是什么数据,要怎么自己生成呢
  • [问题求助] yolov5成功安装算法App,但检测不出来结果,有没有一个嵌入成功并且可检测的模型,需要排查一下问题。
     什么报错的信息都没有,就是检测框不出来。
  • [课程学习] 【华为云AI实战】【ModelArts零代码】基于华为云ModelArts实现小白版目标检测
    基于华为云ModelArts实现零代码版目标检测【摘要】在基于ModelArts中实现零代码目标检测技术 在这篇学习博客中,我将分享我何使用华为云的ModelArts平台,实现零代码的目标检测技术,文章的最后会分享数据集,大家可以自由尝试。ModelArts是一个面向开发者的一站式AI开发平台,提供了数据处理、模型训练、模型管理和模型部署等全流程的支持。我使用了ModerArts中内置的模型,创建了一个目标检测项目,通过简单的数据标注即可完成模型的训练与部署。什么是ModelArtsModelArts是面向AI开发者的一站式开发平台,提供海量数据预处理及半自动化标注、大规模分布式训练、自动化模型生成及端-边-云模型按需部署能力,帮助用户快速创建和部署模型,管理全周期AI工作流。ModelArts的理念就是让AI开发变得更简单、更方便。面向不同经验的AI开发者,提供便捷易用的使用流程。例如,面向业务开发者,不需关注模型或编码,可使用自动学习流程快速构建AI应用;面向AI初学者,不需关注模型开发,使用预置算法构建AI应用;面向AI工程师,提供多种开发环境,多种操作流程和模式,方便开发者编码扩展,快速构建模型及应用。实验流程基于ModelArts实现目标物体检测模型训练和部署。本实验要检测的目标是云宝,来快速熟悉ModelArts自动学习的使用过程。大致流程可分为:创建OBS,准备数据集通过预置的图像数据集,自动训练并生成检测模型将生成的模型部署为在线服务部署完成后,用通过在线服务识别输入图片检测训练成果准备密钥登录华为云官方网站,击页面的“控制台”切换至控制台界面,在账号名称的下拉菜单中点击“我的凭证”,进入创建管理访问密钥(AK/SK)的界面。如图: 什么是访问密钥: 访问密钥即AK/SK(Access Key ID/Secret Access Key),是通过开发工具(API、CLI、SDK)访问华为云时的身份凭证,不能登录控制台。系统通过AK识别访问用户的身份,通过SK进行签名验证,通过加密签名验证可以确保请求的机密性、完整性和请求者身份的正确性。+选择“访问密钥”,点击“新增访问密钥”。在这里需要通过安全验证,通过验证之后就会自动生成密钥,并获得一个csv文件,妥善保存。创建OBS桶和目录进入方式,控制台->服务列表->存储->对象存储服务,页面右上角点击“创建桶”按钮进入创建页面。 什么是OBS: 对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。这是我创建的参数: OBS创建文件夹点击刚创建的桶名称,进入详情页左侧栏选择“对象”,点击“新建文件夹”,在弹出的新建窗口中:文件夹名称:自定义(此名称会在后续步骤中使用)授权服务由于创建自动学习项目需要使用数据管理功能,在开始使用前,需为数据管理模块获取访问OBS权限。在ModelArts管理控制台,进入数据管理->数据集页面,单击“服务授权”,由具备授权的账号“同意授权”后,即可正常使用。准备数据ModelArts在公共OBS桶中提供了云宝的示例数据集,命名为“Yunbao-Data-Custom”,因此,本文的操作示例使用此数据集进行模型构建。关于数据集的下载,可以在华为云搜索栏,搜索Yunbao-Data-Custom。在本地,将“Yunbao-Data-Custom.zip”压缩包解压。按照之前的步骤进入对象存储服务OBS,点击创建好的桶,进入对象页面,点击创建好的文件夹,选择“上传对象”,即可。 点击上传即可完成本地到云端的数据上传:创建物体检测项目进入ModelArts管理控制台主页,单击左侧导航栏“自动学习”添加步骤1保存的访问密钥文件中的密钥:在“物体检测”方框中单击“创建项目” 在“创建物体检测项目”页面中,填写“项目名称”、“数据集名称”->选择“数据集输入位置”云宝数据集OBS路径为“/object-detection-test/dataset-yun/train/”“数据集输出位置”选择一个空目录如“/object-detection-test/dataset-yun/output/”添加标签集为“yunbao”数据标注数据标注:针对物体检测项目,即在已有数据集图像中,标注出物体位置,并为其打上标签。 标注好的数据用于模型训练。云宝数据集中,已标注部分数据,还有部分数据未标注,我们需要选择未标注数据进行手动标注。 自动学习项目创建时,会自动执行数据源同步操作。由于数据源同步需要一定时间,如果出现同步失败,可单击“同步数据源”手动执行。在 自动学习->数据标注 页面单击“未标注”按钮,此页面展示了所有未标注的图片数据。单击任意一张图片,即可进入图片标注界面。用鼠标框选图片中的云宝所在区域,然后在弹出的对话框中输入标签名称,例如此图片中的“yunbao”,按回车键完成此图片的添加。 标注完成后,左侧图片目录中此图片的状态将显示为“已标注”。自动训练,生成模型建议将图片数据集全部标注,以得到一个比较好的模型。标注完数据之后,便可以进入workflow流中开始工作首先是数据集版本发布,后是数据校验,同时可以查看后台的工作记录,跟进工作流的进度,之后就可以开始训练模型了。点击开始训练,设置训练参数。 单击“确定”开始模型的自动训练。深度学习训练时间相对较长,建议耐心等待。如果关闭或退出此页面,系统仍然在执行训练操作。 训练完成后,我们就可以在界面中查看训练详情,如 “准确率”“评估结果”“训练参数”“分类统计表”等。结果测试模型训练完成之后,点击页面中的“部署”按钮,在弹出的部署设置对话框中,选择“计算节点规格”,设置“自动停止”功能,单击“确定”开始将物体检测模型部署上线为在线服务。如果选择免费规格,则不需要设置“自动停止”功能,1小时之后自动停止。启动部署上线后,系统自动跳转至部署上线页面。此页面将呈现模型部署上线的进度和状态。部署上线将耗费较多时间,还需耐心等待。模型部署完成后,我们就可以添加图片进行检测,在“部署上线”界面,选择状态为“运行中”的服务版本,在“服务测试”区域单击“上传”检测图片进行检测。 资源释放至此实验全部完成。 最后,使用的云端资源记得全部删除如对象存储服务创建的桶,文件夹,创建的数据集,部署的模型等都需要删除,并停用访问密钥,以免造成不必要的花费。实验总结在这篇博客中,我详细介绍了如何使用华为云ModelArts实现目标检测的demo,并部署上线服务的过程。通过这次实践,我深刻地体会到了ModelArts的强大和便捷。在我们提供了一个一站式的AI通用流程框架,让我们可以零代码实现AI项目的训练部署,给AI初学者或者其他行业人员提供了一个通用的零代码工具。
  • [优秀实践] 基于Modelart的YOLOv3物体检测实践
    物体检测YOLOv3实践原理:ModelArts是面向AI开发者的一站式开发平台,支持自动学习的功能,还预置了多种已训练好的模型,ModelArts相对而言降低了AI应用的门槛,是一个高灵活、零代码的定制化模型开发工具,平台根据标注数据自动设计模型、自动调参、自动训练、自动压缩和部署模型。本次实验使用自动学习中的物体检测功能,用于识别图片中车的数量和位置。物体检测是计算机视觉中的一个重要的研究领域,在人流检测,行人跟踪,自动驾驶,医学影像等领域有着广泛的应用。不同于简单的图像分类,物体检测旨在对图像中的目标进行精确识别,包括物体的位置和分类,因此能够应用于更多高层视觉处理的场景。例如在自动驾驶领域,需要辨识摄像头拍摄的图像中的车辆、行人、交通指示牌及其位置,以便进一步根据这些数据决定驾驶策略。本期学习案例,我们将聚焦于YOLO算法,YOLO(You Only Look Once)是一种one-stage物体检测算法。1.数据和代码下载运行下面代码,进行数据和代码的下载和解压本案例使用coco数据,共80个类别。2.准备数据2.1文件路径定义2.2读取标注数据2.3数据读取函数,构建数据生成器。每次读取一个批次的数据至内存训练,并做数据增强。3.模型训练本案例使用Keras深度学习框架搭建YOLOv3神经网络。可以进入相应的文件夹路径查看源码实现。3.1构建神经网络可以在./yolo3/model.py文件中查看细节训练回调函数定义3.2开始训练3.3保存模型4.模型测试4.1打开一张测试图片4.2图片预处理4.3构建模型4.4加载模型权重,或将模型路径替换成上一步训练得出的模型路径4.5定义IOU以及score:IOU: 将交并比大于IOU的边界框作为冗余框去除score:将预测分数大于score的边界框筛选出来4.6构建输出[boxes, scores, classes]4.7进行预测成功预测出图片中含有的内容(人物,雨伞)注意事项:本案例使用框架: TensorFlow-1.13.1本案例使用硬件规格: GPU V100
  • [问题求助] mindx sdk如何实现存储视频流的某一帧?
    我在基于【SDK案例系列 10】基于 Live555 + MindX SDK + Pytorch YoLoV5的视频检测 https://blog.csdn.net/hiascend/article/details/128588487?spm=1001.2014.3001.5502修改了pipeline同时拿到序列化数据以及检测的视频,但是我想获取某一帧的图片该如何实现?pipeline如下:{     "classification": {         "stream_config": {             "deviceId": "0"         },         "mxpi_rtspsrc0": {             "factory": "mxpi_rtspsrc",             "props": {                 "rtspUrl": "rtsp://127.0.0.1:8554/zhanyong",                 "channelId": "0"             },             "next": "mxpi_videodecoder0"         },         "mxpi_videodecoder0": {             "factory": "mxpi_videodecoder",             "props": {                 "inputVideoFormat": "H264",                 "outputImageFormat": "YUV420SP_NV12",                 "vdecChannelId": "0"             },             "next": "tee0"         },         "tee0": {             "factory": "tee",             "next": [                 "queue1",                 "queue2"             ]         },         "queue1": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "mxpi_imageresize0"         },         "queue2": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "mxpi_opencvosd_plugin:0"         },         "mxpi_imageresize0": {             "props": {                 "dataSource": "mxpi_videodecoder0",                 "resizeHeight": "640",                 "resizeWidth": "640",                 "resizeType": "Resizer_KeepAspectRatio_Fit"             },             "factory": "mxpi_imageresize",             "next": "queue3"         },         "queue3": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "mxpi_modelinfer0"         },         "mxpi_modelinfer0": {             "props": {                 "dataSource": "mxpi_imageresize0",                 "modelPath": "data/models/yolov5/yolov5l.om",                 "postProcessConfigPath": "data/models/yolov5/yolov5.cfg",                 "labelPath": "data/models/yolov5/coco2014.names",                 "postProcessLibPath": "libMpYOLOv5PostProcessor.so"             },             "factory": "mxpi_modelinfer",             "next": "queue4"         },         "queue4": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "tee1"         },          "tee1": {             "factory": "tee",             "next": ["mxpi_dataserialize0","mxpi_object2osdinstances0"]         },          "mxpi_dataserialize0": {       "props": {         "outputDataKeys": "mxpi_modelinfer0"       },       "factory": "mxpi_dataserialize",       "next": "appsink1"     },         "mxpi_object2osdinstances0": {             "props": {                 "dataSource": "mxpi_modelinfer0",                 "colorMap":"100,100,100|200,200,200|0,128,255|255,128,0",                 "fontFace":"16",                 "fontScale":"0.5",                 "fontThickness":"2",                 "fontLineType":"16",                 "rectThickness":"2",                 "rectLineType":"16"             },             "factory":"mxpi_object2osdinstances",             "next": "queue5"         },         "queue5": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "mxpi_opencvosd_plugin:1"         },         "mxpi_opencvosd_plugin":{             "factory":"mxpi_opencvosd",             "next":"queue6"         },         "queue6": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "mxpi_videoencoder0"         },         "mxpi_videoencoder0": {             "props": {                 "imageHeight": "1080",                 "imageWidth": "1920",                 "inputFormat": "YUV420SP_NV12",                 "outputFormat": "H264",                 "fps": "1",                 "maxBitRate":"20000",                 "iFrameInterval": "50"             },             "factory": "mxpi_videoencoder",             "next": "queue7"         },         "queue7": {             "props": {                 "max-size-buffers": "100"             },             "factory": "queue",             "next": "appsink0"         },         "appsink0": {             "factory": "appsink"         },            "appsink1": {             "factory": "appsink"         }     } }这种方式存储的图片显示格式有问题,请问有大佬帮忙解决吗
  • [问题求助] Atlas200 ,YOLOv3转YOLOV7后,PCIe发送数据异常
    Atlas200 RC+xinilx FPGA,通过PCIe进行数据交互,采用YOLOv3,功能都正常。最近换成YOLOv7算法,PCIe传输720P图像正常,传输1080P图像,运行一段时间,约10分钟左右,Atlas200读取PCIe正常,驱动写入DMA正常。但FPGA端不能读取数据。arready信号一直为低。并且发现换成YOLOv7后,Atlas200向FPGA传输数据变慢,无法正常传输1080P@30的图像数据。CANN版本:Ascend-cann-amct_5.0.4_linux-aarch64.tar.gz