• [问题求助] yolov5成功安装算法App,但检测不出来结果,有没有一个嵌入成功并且可检测的模型,需要排查一下问题。
     什么报错的信息都没有,就是检测框不出来。
  • [优秀实践] 基于ModelArts实现目标物体检测
    基于ModelArts实现目标物体检测模型训练和部署。本实验将提供一个“找云宝”样例(“云宝”是华为云的吉祥物),帮助用户快速熟悉ModelArts自动学习的使用过程。通过预置的图像数据集,自动训练并生成检测模型,同时将生成的模型部署为在线服务。部署完成后,用户可通过在线服务识别输入图片是否包含目标物体。实现流程1.准备环境和创建OBS桶2.准备数据3.创建物体检测项目4.数据标注5.自动训练,生成模型6.将模型部署上线为在线服务7.发起检测 1创建OBS桶和目录进入方式,“控制台”->“服务列表”->“存储”->“对象存储服务”,页面右上角点击“创建桶”按钮进入创建页面。什么是OBS?对象存储服务(Object Storage Service,OBS)是一个基于对象的海量存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力,包括:创建、修改、删除桶,上传、下载、删除对象等。1.2 OBS桶设置OBD桶设置参数如下:区域:华北桶名称:自定义(注意:此名称会在后续步骤使用)我将此处的桶名称取为yuntest-modelarts存储类别:标准存储桶策略:私有归档数据直读:开启多AZ:开启点击"立即创建",完成创建1.4创建文件夹点击刚创建的桶名称,进入详情页左侧栏选择“对象”,点击“新建文件夹”,在弹出的新建窗口中:文件夹名称:自定义(此名称会在后续步骤中使用)我将此处的文件夹名称取为dataset-yun点击“确定”完成添加1.5服务授权由于创建自动学习项目需要使用数据管理功能,在开始使用前,需为数据管理模块获取访问OBS权限。在ModelArts管理控制台,进入“数据管理->数据集”页面,单击“服务授权”由具备授权的账号“同意授权”后,即可正常使用:22.1准备数据ModelArts在公共OBS桶中提供了云宝的示例数据集,命名为“Yunbao-Data-Custom”,因此,本文的操作示例使用此数据集进行模型构建。关于数据集的下载您可以在华为云搜索栏,搜索Yunbao-Data-Custom即可获取下载资源:2.2数据解压在本地,将“Yunbao-Data-Custom.zip”压缩包解压。例如,解压至本地“Yunbao-Data-Custom”文件夹下。2.3数据上传按照步骤1操作进入对象存储服务:点击创建的好的桶yuntest-modelarts,进入“对象”页面:再次点击文件夹dataset-yun,在文件夹中选择“上传对象”将步骤2.1下载的本地数据集中的文件夹拖拽至上传对象框中,点击上传即可:点击上传即可完成本地到云端的数据上传:33.1创建物体检测项目进入ModelArts管理控制台主页,单击左侧导航栏“自动学习”添加步骤1保存的访问密钥文件中的密钥:在“物体检测”方框中单击“创建项目”在“创建物体检测项目”页面中,填写“项目名称”、“数据集名称”选择“数据集输入位置”云宝数据集OBS路径为“/yuntest-modelarts/dataset-yun/train/”“数据集输出位置”选择一个空目录如“/yuntest-modelarts/dataset-yun/output/”添加标签集为“yunbao”44.1数据标注数据标注,针对物体检测项目,即在已有数据集图像中,标注出物体位置,并为其打上标签。标注好的数据用于模型训练。云宝数据集中,已标注部分数据,还有部分数据未标注,用户可以选择未标注数据进行手动标注。自动学习项目创建时,会自动执行数据源同步操作。由于数据源同步需要一定时间,如果出现同步失败,可单击“同步数据源”手动执行。在“自动学习->数据标注”页面单击“未标注”页签,此页面展示所有未标注的图片数据。单击任意一张图片,进入图片标注界面。用鼠标框选图片中的云宝所在区域,然后在弹出的对话框中输入标签名称,例如此示例中的“yunbao”,按“Enter”键完成此图片的添加。标注完成后,左侧图片目录中此图片的状态将显示为“已标注”用户可以在下方图片目录中,选择其他图片,重复上述操作继续进行图片标注。如果一张图片有多个云宝,用户可以标注多处。建议将数据集中所有图片都标注完成,这样能得到一个效果比较好的模型。55.1自动训练,生成模型 本次实验由于作者网速问题,只标注了24张图片,建议用户全部标注完成后再选择右侧的开始训练点击开始训练,设置训练参数:单击“确定”开始模型的自动训练。深度学习训练时间相对较长,建议用户耐心等待。如果关闭或退出此页面,系统仍然在执行训练操作。训练完成后,用户可以在界面中查看训练详情,如 “准确率”“评估结果”“训练参数”“分类统计表”等66.1将模型部署上线为在线服务 在“模型训练”页签中,待训练状态变为“已完成”,单击“版本管理”区域中的“部署”。在弹出的部署设置对话框中,选择“计算节点规格”,设置“自动停止”功能,单击“确定”开始将物体检测模型部署上线为在线服务。如果选择免费规格,则不需要设置“自动停止”功能,1小时之后自动停止。启动部署上线后,系统自动跳转至部署上线页面。此页面将呈现模型部署上线的进度和状态。部署上线将耗费较多时间,请您耐心等待。部署完成后,版本管理区域的状态将变更为“运行中”。77.1发起检测模型部署完成后,用户可添加图片进行检测,在“部署上线”界面,选择状态为“运行中”的服务版本,在“服务测试”区域单击“上传”检测图片进行检测。测试1测试2测试3至此实验全部完成。最后大家使用的云端资源记得全部删除如对象存储服务创建的桶,文件夹;ModelArts创建的数据集,部署的模型等都需要删除,并停用访问密钥,以免造成不必要的花费。通过对实验结果的比对,可以看出利用[华为云ModelArts]训练出来的目标物体识别模型是很棒的,六个字总结就是-高效,快捷,省心。
  • [技术干货] opencv消除图像水印
    原本链接cid:link_0问题:原本代码局限:只能处理黑白图片改进方法:将初始水印消除后的图片作为标签,再次进行分割(如果是黑色就保留原图像素,如果没有就消除)import cv2 import numpy as np import matplotlib.pyplot as plt def enable_color(rgb_image,check_image): # h, w = rgb_image.shape[:2] for i in range(0, h - 1): for j in range(0, w - 1): if check_image[i][j] == 255: for k in range(3): rgb_image[i][j][k] = 255 return rgb_image if __name__ =='__main__': img_path = "1.jpg" im = cv2.imread(img_path) gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) background = gray.copy() for i in range(1,5): kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*i+1,2*i+1)) # print('kernel size is ',kernel) background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel) background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel) diff = background - gray # 计算差距 # cv2.namedWindow('diff',cv2.WINDOW_FREERATIO) # 获取图像中前景背景之差 # cv2.imshow('diff',background) # 阈值分割获取黑色字体 _,bw = cv2.threshold(diff,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) # 阈值分割获取黑色区域 # cv2.namedWindow('bw_before', cv2.WINDOW_FREERATIO) # cv2.imshow('bw_before', bw) _,dark = cv2.threshold(background,0,255,cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU) darkpix = cv2.countNonZero(dark)# 获取 dark非0d图像像素个数 darkpix = [0]*darkpix index = 0 # cv2.namedWindow('gray', cv2.WINDOW_FREERATIO) # cv2.imshow('gray', gray) for r in range(dark.shape[0]): for c in range(dark.shape[1]): if(dark[r][c]): darkpix[index] = gray[r][c] index = index +1 # 阈值分割 dark 区域 因此我们在里面得到更深的像素 darkpix = np.array(darkpix) _,darkpix = cv2.threshold(darkpix,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU) # cv2.namedWindow('darkpix', cv2.WINDOW_FREERATIO) # cv2.imshow('darkpix', darkpix) # 把 取到的像素粘贴到 其渠道的 darker pixels # cv2.namedWindow('dark',cv2.WINDOW_FREERATIO) # cv2.imshow('dark',dark) index = 0 for r in range(dark.shape[0]): for c in range(dark.shape[1]): if (dark[r][c]): bw[r][c] = darkpix[index] index = index +1 # cv2.namedWindow('bw',cv2.WINDOW_FREERATIO) # cv2.imshow('bw',bw) out=enable_color(im, bw) # cv2.namedWindow('out',cv2.WINDOW_FREERATIO) # cv2.imshow('out',out) cv2.imwrite(filename="77__.jpg", img=bw) cv2.imwrite(filename="77__5.jpg",img=out) # cv2.waitKey(0)
  • [云实验室] 基于华为云自动学习的垃圾分类图像识别系统
    一、简介本项目主要运用华为云 EI 的 ModelArts 的自动学习以及云对象存储的 OBS,实现简单的垃圾分类系统。二、内容描述本垃圾分类图像识别系统主要通过创建图像分类自动学习项目,进行数据标注,进行自动训练和部署测试,再到最后的结束测试。 三、主要流程四、图像分类任务介绍ModelArts 服务之自动学习图像分类项目,是对图像进行检测分类。添加图片并对图像进行分类标注,每个分类识别一种类型的图像。完成图片标注后开始自动训练,即可快速生成图像分类模型。可应用于商品的自动识别、运输车辆种类识别和残次品的自动检测。例如质量检查的场景,则可以上传产品图片,将图片标注“合格”、“不合格”,通过训练部署模型,实现产品的质检。五、系统创建1、创建项目2、添加图片3、数据标注进行“一次性快餐盒-其他垃圾” 的数据标注。 先将左下角的数字选择为 45, 点击图片选择同类的图片(一次可以选择一张或者多张),在标签名栏填写当前选择图片的标签(已有的标签可以直接选择) , 输入标签名, 点击确定。4、自动训练5、部署测试预测结果:
  • [大赛资讯] 2023华为开发者大赛 北京赛区招募正式打响
    2023华为开发者大赛 随 华为开发者大会北京分会场活动走进北京信息职业技术学院!北京赛区招募正式打响!期待北京赛区的企业及学生团队带来的优秀参赛作品!2023让我们继续实现无限创新,创造无限价值!
  • [问题求助] 固定区域的图像识别
    使用RPA里的图像识别的控件时,它识别的是整个图片中所有的内容,怎么让他只识别图片的固定范围内的内容呢?
  • [调试调优] mindspore.ops.value_and_grad求梯度花费时间很久正常吗?
    Epoch: [2][0/98], Time 62.016607, Data 0.979176 Loss 4.791955 Prec@1 10.742188 Prec@5 49.804688 forward time: 3.8906619548797607forward time: 6.2228193283081055grad time: 56.18103861808777accuracy time: 0.010275602340698242optimizer time: 0.07999753952026367
  • [其他] 新NeRF 场景模型
    ClimateNeRF 将物理模拟与 NeRF 场景模型融合在一起,制作出逼真的气候变化影响视频。下面将举一个简单的例子来说明在该方法中组件如何实现交互:假设现在要建立一个秋天洪水泛滥场景的模型。研究者首先获取图像,应用 Fall 风格,并根据结果构建出 NeRF。然后使用 NeRF 中的几何信息来计算水面。这可以用密度场、颜色场以及法线和 BRDF 表征来表示。最后为了渲染,我们用光线来查询模型。研究者编辑 NeRF 的密度和颜色函数来表示烟雾等效果,并截取光线来表示镜面效应。如果一条光线首先在 NeRF 中遇到高密度,那么会对这条光线使用 NeRF integral;但如果第一次碰撞是在水面,则光线会被反射到水面,然后用反射光线查询 NeRF。人们往往难以从日积月累的小变化中推导出实质性的结果,所以对于大多数人而言,将气候变化所产生的影响具像化也并非易事。减缓二氧化碳排放(比如减少化石燃料的使用)或弱化其环境影响(比如建立防洪措施)等的成本往往是人尽皆知的高昂,而其所能带来的收益却看似虚无缥缈、遥遥无期。如果无法将效果具像化,那么这些措施的投用也将举步维艰。本文中,来自 UIUC、马里兰大学帕克分校的研究者展示了如何将物理模拟(产生很好的天气效果预测,但只有中分辨率图像)与神经辐射场(产生 SOTA 场景模型,但据悉从未与物理模拟一起使用)合并使用。传统物理模拟可以在传统图形 pipeline 中为 3D 场景模拟出真实的天气效果,但这些方法基于传统的多边形模型,而构建能从单个场景的多个图像中产生逼真渲染的多边形模型仍具有挑战性。神经辐射场(NeRFs)可以从少量图像中生成逼真的 3D 场景模型。论文地址:https://arxiv.org/pdf/2211.13226.pdf研究者推出了一个 ClimateNeRF,它可以渲染出真实的天气效果,包括雾霾、雪和洪水。渲染效果和在画面上看到的一致,因此生成的影片往往令人信服。从更高的层面来看,研究者调整了场景图像以反映整体物理效果,并根据调整后的图像构建了场景的 NeRF 模型;接着复原了一个近似的几何表示,并在该几何中应用物理模拟;最后使用全新的光线追踪器进行渲染。调整图像这一步很重要。比方在冬天,树木图像的饱和度往往较低。研究者在一个 NGP 框架中使用一种新颖的风格迁移方法,它可以在不改变场景几何的情况下获得全局效果。光线追踪器通过在渲染过程中仔细考虑光线效果将物理模型和 NeRF 模型相融合,例如一条眼球射线可能首先遇到高密度的 NeRF(因此返回通常的结果)或者它可以击中插入的水面(因此被反射以再次查询模型)。研究者展示了 ClimateNeRF 在 Tanks and Temple、MipNeRF360 和 KITTI-360 数据集中不同 3D 场景的适用性,同时与 stable diffusion inpainting、ClimateGAN 等 SOTA 2D 图像编辑方法以及与 SOTA 3D NeRF stylization 的对比。定性和定量研究结果都表明,ClimateNeRF 的模拟结果明显较同类方法更加真实。此外,本文还展示了这种物理启发方法的可控性,可以改变水位、风力和方向,以及雪和雾霾的厚度和浓度。ClimateNeRF 方法可以做到:让视图保持一致(这也是可以用来制作影片的原因,这在逐帧合成中很难做到)、逼真的超级现实主义(场景是一个 NeRF 表示)、并且是可控的(用户可以在模拟中调整物理参数)。如下图 1 所示,生成的照片逼真、符合常理且具备时间一致性。
  • [分享交流] AI绘画作品《采花》
    一名身穿白色连衣裙的少女正在伸手采花,她动作轻柔,姿态款款,眼眸低垂。
  • [通用服务] 【AI使能】图像识别Image
    图像识别(Image Recognition),基于深度学习技术,可准确识别图像中的视觉内容,提供多种物体、场景和概念标签,具备目标检测和属性识别等能力,帮助客户准确识别和理解图像内容。分类文档链接备注最新动态cid:link_5 应用场景cid:link_2 API参考cid:link_3 FAQcid:link_4 华为云在线课程图像识别服务https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE025+Self-paced/about?isAuth=0&cfrom=hwc图像识别,基于深度学习技术,可准确识别图像中的视觉内容,提供数万种物体、场景和概念标签,具备目标检测和属性识别等能力,帮助客户准确识别和理解图像内容。图像处理理论、应用与实验https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE175+Self-paced/about?isAuth=0&cfrom=hwc计算机视觉是深度学习领域最热门的研究领域之一,它衍生出了一大批快速发展且具有实际作用的应用,包括人脸识别、图像检测、目标监测以及智能驾驶等。这一切本质都是对图像数据进行处理,本课程就图像处理理论及相应技术做了介绍,包括传统特征提取算法和卷积神经网络,学习时注意两者的区别。华为云开发者网图像识别 Image开放能力cid:link_6 
  • [技术干货] pix2pix图像风格迁移
    pix2pix论文链接: cid:link_3图像处理的很多问题都是将一张输入的图片转变为一张对应的输出图片,比如灰度图、梯度图、彩色图之间的转换等。通常每一种问题都使用特定的算法(如:使用CNN来解决图像转换问题时,要根据每个问题设定一个特定的loss function 来让CNN去优化,而一般的方法都是训练CNN去缩小输入跟输出的欧氏距离,但这样通常会得到比较模糊的输出)。这些方法的本质其实都是从像素到像素的映射。于是论文在GAN的基础上提出一个通用的方法:pix2pix 来解决这一类问题。通过pix2pix来完成成对的图像转换(Labels to Street Scene, Aerial to Map,Day to Night等),可以得到比较清晰的结果。注意事项:使用框架**:** PyTorch1.4.0使用硬件**:** 8 vCPU + 64 GiB + 1 x Tesla V100-PCIE-32GB运行代码方法**:** 点击本页面顶部菜单栏的三角形运行按钮或按Ctrl+Enter键 运行每个方块中的代码JupyterLab的详细用法**:** 请参考《ModelAtrs JupyterLab使用指导》碰到问题的解决办法**:** 请参考《ModelAtrs JupyterLab常见问题解决办法》1.下载代码和数据集运行下面代码,进行数据和代码的下载和解压缩使用facades数据集,数据位于pix2pix/datasets/facades/中import os数据代码下载!wget cid:link_0解压缩os.system('unzip pix2pix.zip -d ./') os.chdir('./pix2pix')2.训练2.1安装依赖库!pip install -r requirements.txt2.2开始训练训练参数可以在pix2pix/options/train_options.py中查看和修改 如果使用其他数据集,需要修改数据路径 模型命名为facades_pix2pix!python train.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --direction BtoA----------------- Options --------------- batch_size: 1 beta1: 0.5 checkpoints_dir: ./checkpoints continue_train: False crop_size: 256 dataroot: ./datasets/facades [default: None] dataset_mode: aligned direction: BtoA [default: AtoB] ----------------------------------------------- /home/ma-user/anaconda3/envs/PyTorch-1.4/lib/python3.7/site-packages/torch/optim/lr_scheduler.py:122: UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`. Failure to do this will result in PyTorch skipping the first value of the learning rate schedule. See more details at https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate "https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate", UserWarning) learning rate 0.0002000 -> 0.0002000 (epoch: 1, iters: 100, time: 0.041, data: 0.195) (epoch: 1, iters: 200, time: 0.041, data: 0.001) End of epoch 10 / 10 Time Taken: 14 sec3.测试查看刚才生成的模型facades_pix2pix是否已经生成,如果生成则会在checkpoints文件下!ls checkpoints/facades_label2photo_pretrained facades_pix2pix用训练生成的模型facades_pix2pix进行测试!python test.py --dataroot ./datasets/facades --direction BtoA --model pix2pix --name facades_pix2pix展示测试结果可以在./results/facades_pix2pix/文件下看到测试生成的结果import matplotlib.pyplot as plt img = plt.imread('./results/facades_pix2pix/test_latest/images/100_fake_B.png') plt.imshow(img)<matplotlib.image.AxesImage at 0x7ff680a8cd50>img = plt.imread('./results/facades_pix2pix/test_latest/images/100_real_A.png') plt.imshow(img)<matplotlib.image.AxesImage at 0x7ff680524090>img = plt.imread('./results/facades_pix2pix/test_latest/images/100_real_B.png') plt.imshow(img)<matplotlib.image.AxesImage at 0x7ff6613ceb90>
  • [技术干货] ACGAN-动漫头像自动生成
    ACGAN论文:Conditional Image Synthesis with Auxiliary Classifier GANs使用标签的数据集应用于生成对抗网络可以增强现有的生成模型,并形成两种优化思路。cGAN使用了辅助的标签信息来增强原始GAN,对生成器和判别器都使用标签数据进行训练,从而实现模型具备产生特定条件数据的能力。SGAN的结构来利用辅助标签信息(少量标签),利用判别器或者分类器的末端重建标签信息。 ACGAN则是结合以上两种思路对GAN进行优化。ACGAN目标函数:对于生成器来说有两个输入,一个是标签的分类数据c,另一个是随机数据z,得到生成数据为 ; 对于判别器分别要判断数据源是否为真实数据的概率分布 ,以及数据源对于分类标签的概率分布ACGAN的目标函数包含两部分: 第一部分 是面向数据真实与否的代价函数 第二部分 则是数据分类准确性的代价函数。在优化过程中希望判别器D能否使得 + 尽可能最大,而生成器G使得 - 尽可能最大; 简而言之是希望判别器能够尽可能区分真实数据和生成数据并且能有效对数据进行分类,对生成器来说希望生成数据被尽可能认为是真实数据且数据都能够被有效分类。1.本案例使用框架:TensorFlow 1.13.12.本案例使用硬件:GPU: 1*NVIDIA-V100NV32(32GB) | CPU: 8 核 64GB3.运行代码方法: 点击本页面顶部菜单栏的三角形运行按钮或按Ctrl+Enter键 运行每个方块中的代码4.JupyterLab的详细用法: 请参考《ModelAtrs JupyterLab使用指导》5.碰到问题的解决办法: 请参考《ModelAtrs JupyterLab常见问题解决办法》1.下载模型和代码import os!wget https://obs-aigallery-zc.obs.cn-north-4.myhuaweicloud.com/algorithm/ACGAN.zip# 解压缩os.system('unzip ACGAN.zip -d ./')2.模型训练2.1加载依赖库root_path = './ACGAN/'os.chdir(root_path)import osfrom main import mainfrom ACGAN import ACGANfrom tools import checkFolderimport tensorflow as tfimport argparseimport numpy as np2.2设置参数def parse_args(): note = "ACGAN Frame Constructed With Tensorflow" parser = argparse.ArgumentParser(description=note) parser.add_argument("--epoch",type=int,default=251,help="训练轮数") parser.add_argument("--batchSize",type=int,default=64,help="batch的大小") parser.add_argument("--codeSize",type=int,default=62,help="输入编码向量的维度") parser.add_argument("--checkpointDir",type=str,default="./checkpoint",help="检查点保存目录") parser.add_argument("--resultDir",type=str,default="./result",help="训练过程中,中间生成结果的目录") parser.add_argument("--logDir",type=str,default="./log",help="训练日志目录") parser.add_argument("--mode",type=str,default="train",help="模式: train / infer") parser.add_argument("--hairStyle",type=str,default="orange hair",help="你想要生成的动漫头像的头发颜色") parser.add_argument("--eyeStyle",type=str,default="gray eyes",help="你想要生成的动漫头像的眼睛颜色") parser.add_argument("--dataSource",type=str,default='./extra_data/images/',help="训练集路径") args, unknown= parser.parse_known_args() checkFolder(args.checkpointDir) checkFolder(args.resultDir) checkFolder(args.logDir) assert args.epoch>=1 assert args.batchSize>=1 assert args.codeSize>=1 return argsargs =parse_args()2.3开始训练with tf.Session() as sess : myGAN = ACGAN(sess,args.epoch,args.batchSize,args.codeSize,\ args.dataSource,args.checkpointDir,args.resultDir,args.logDir,args.mode,\ 64,64,3) if myGAN is None: print("创建GAN网络失败") exit(0) if args.mode=='train' : myGAN.buildNet() print("进入训练模式") myGAN.train() print("Done")开始加载数据集!images.shape: (3000, 64, 64, 3)labels.shape: (3000, 23)Loading images to numpy array...Random shuffling images and labels...[Tip 1] Normalize the images between -1 and 1.数据集加载成功!numOfBatches : 46网络实例化:WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/ops/tensor_array_ops.py:162: 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.WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/contrib/layers/python/layers/layers.py:1624: flatten (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.Instructions for updating:Use keras.layers.flatten instead.WARNING:tensorflow:From /home/ma-user/work/ACGAN/ACGAN.py:167: batch_normalization (from tensorflow.python.layers.normalization) is deprecated and will be removed in a future version.Instructions for updating:Use keras.layers.batch_normalization instead.已构建 Loss for Discriminator已构建 Loss for Generator# size of dVars : 55# size of gVars : 148WARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.Instructions for updating:Use tf.cast instead.已构建优化器已构造预测器网络实例化成功!进入训练模式开始配置训练环境!模型将会被加载 : ./checkpoint/ACGANWARNING:tensorflow:From /home/ma-user/anaconda3/envs/TensorFlow-1.13.1/lib/python3.6/site-packages/tensorflow/python/training/saver.py:1266: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.Instructions for updating:Use standard file APIs to check for files with this prefix.INFO:tensorflow:Restoring parameters from ./checkpoint/ACGAN/ACGAN.model-251MODEL NAME : ACGAN.model-251模型加载成功 : ACGAN.model-251加载成功生成模型结果预览训练开始!~~~~~~~~~~~~~~~~~~~~~~~~251 251Done3.测试模型修改参数从训练模式为推理模式args.mode ='infer'从标签里选择你想要生成的头像的头发和眼睛,只能从这两个列表里选择hair_dict = ['orange hair', 'white hair', 'aqua hair', 'gray hair', 'green hair', 'red hair', 'purple hair', 'pink hair', 'blue hair', 'black hair', 'brown hair', 'blonde hair']eye_dict = [ 'gray eyes', 'black eyes', 'orange eyes', 'pink eyes', 'yellow eyes', 'aqua eyes', 'purple eyes', 'green eyes', 'brown eyes', 'red eyes', 'blue eyes']# 选择了黄头发和灰眼睛args.hairStyle = 'orange hair'args.eyeStyle = 'gray eyes'构造预测器tf.reset_default_graph()with tf.Session() as sess : myGAN1 = ACGAN(sess,args.epoch,args.batchSize,args.codeSize,\ args.dataSource,args.checkpointDir,args.resultDir,args.logDir,args.mode,\ 64,64,3) if myGAN1 is None: print("创建GAN网络失败") exit(0) if args.mode=='infer' : myGAN1.buildForInfer() tag_dict = ['orange hair', 'white hair', 'aqua hair', 'gray hair', 'green hair', 'red hair', 'purple hair', 'pink hair', 'blue hair', 'black hair', 'brown hair', 'blonde hair','gray eyes', 'black eyes', 'orange eyes', 'pink eyes', 'yellow eyes','aqua eyes', 'purple eyes', 'green eyes', 'brown eyes', 'red eyes','blue eyes'] tag = np.zeros((64,23)) feature = args.hairStyle+" AND "+ args.eyeStyle for j in range(25): for i in range(len(tag_dict)): if tag_dict[i] in feature: tag[j][i] = 1 myGAN1.infer(tag,feature) print("Generate : "+feature)模型将会被加载 : ./checkpoint/ACGANINFO:tensorflow:Restoring parameters from ./checkpoint/ACGAN/ACGAN.model-251MODEL NAME : ACGAN.model-251模型加载成功 : ACGAN.model-251已构造预测器Generate : orange hair AND gray eyes开始生成黄色头发,灰色眼睛的动漫头像存在生成不了正确头像的情况import matplotlib.pyplot as pltfrom PIL import Imagefeature = args.hairStyle+" AND "+ args.eyeStyleresultPath = './samples/' + feature + '.png' #确定保存路径img = Image.open(resultPath).convert('RGB')plt.figure(1)plt.imshow(img)plt.show()
  • [技术干货] 使用FasterRCNN预置算法训练人车检测模型
    案例内容介绍在自动驾驶方案实现的过程中,物体检测是其中一个重要的技术。本案例基于ModelArts AI Gallery中官方发布的物体检测算法FasterRCNN,训练一个人车检测模型,并部署成在线服务,生成一个人车检测AI应用。ModelArts的AI Gallery有丰富的算法,使用这些算法,无需自己开发训练代码和推理代码,只要准备并标注好数据,就可以轻松快速训练并部署模型。准备工作参考此文档,完成ModelArts准备工作,包括注册华为云账号、ModelArts全局配置和OBS相关操作。准备数据下载训练数据集本案例采用自动驾驶场景的数据集,数据集中有两种物体,人和车。本案例的数据集已经发布在AI Gallery,我们从华为云AI Gallery订阅数据集至ModelArts,然后就可以在ModelArts中使用了。点击此链接进入下载详情页,下载详情页示例如下:下载方式:选择ModelArts数据集目标区域:华北-北京四目标位置:选择一个OBS路径,作为数据集的存储位置。名称:自定义。填写好参数后,点击“下一步”按钮,然后点击“确定”按钮。等待数据集状态变为推送成功,即可在ModelArts数据集列表中查看到下载的数据集。发布数据集点击进入ModelArts数据集列表,找到刚订阅的数据集,点击“发布”按钮,填写训练集比例为0.8,发布数据集。数据集发布之后,才可在训练中使用。等待数据集发布成功。订阅算法本实验中,我们从AI Gallery订阅ModelArts官方发布的物体检测算法FasterRCNN来训练模型。点击进入AI GalleryFasterRCNN算法主页,点击页面右上方的“订阅”按钮。然后点击页面下方的“继续订阅”按钮,再点击“前往控制台”按钮,选择华北-北京四区域,最后点击“确定”按钮进入算法管理页面,可以看到刚刚订阅的算法。点击“同步”按钮,同步算法,可以点击按钮,刷新状态。当状态变成就绪时,表示同步成功。模型训练我们使用创建的人车检测数据集,提交一个人车检测训练作业,训练会生成一个人车检测模型。创建训练作业回到ModelArts训练管理页面,在【训练管理】选择训练作业,点击【创建】,如下图所示:在创建训练作业页面中选择算法:选择算法,(算法列表是按订阅时间显示的,找到名称为物体检测-FasterRCNN_ResNet50的算法,选中它)按照如下提示,填写创建训练作业的参数。计费模式:按需计费名称:自定义算法来源:算法管理算法名称:物体检测-FasterRCNN_ResNet50数据来源:数据集选择数据集和版本:选择刚刚发布的人车数据集及其版本训练输出:选择OBS路径/lftiny/car_and_person_detection/output/(此OBS路径如果不存在,可以使用OBS客户端创建)。训练输出位置用来保存训练生成的模型。调优参数:用于设置算法中的超参。算法会加载默认参数,但是可以更改和添加参数。设置learning_rate_strategy=20:0.001,表示训练20轮,学习率固定为0.001。其他调优参数保持默认。作业日志路径:选择OBS路径/lftiny/car_and_person_detection/log/(此OBS路径如果不存在,可以使用OBS客户端创建)。资源池:公共资源池。规格: [限时免费]GPU: 1*NVIDIA-V100-pcie-32gb(32GB) | CPU: 8 核 64GB,如图所示。计算节点个数:选择1,表示我们运行一个单机训练任务。所有字段填写好之后,确认参数无误,点击“下一步”按钮,然后点击“提交”按钮,开始训练。使用V100 GPU资源,训练时长预计30分钟左右。查看训练结果训练作业完成后,可以查看训练作业的运行结果。在训练作业页面,点击作业名称,进入配置信息页面。可以查看到训练作业的详情。切换到“日志”页签,查看训练作业的训练日志,还可以下载日志到本地查看。训练日志中会打印一些训练的精度和训练速度等信息。训练生成的模型会放到训练输出位置OBS路径下,可以直接下载到本地使用。模型部署导入模型点击“创建模型”按钮,创建模型。按照如下提示,填写导入模型的字段。名称:自定义版本:0.0.1元模型来源:从训练中选择选择训练作业及版本:刚刚的训练作业及版本,会自动加载部署类型:默认推理代码:自动加载其他保持默认。点击“立即创建”按钮,开始导入模型,等待模型导入成功。部署上线等待模型状态为正常,然后点击部署下拉框中的“在线服务”,如下图所示:按照如下指导填写参数:计费模式:按需计费名称:自定义是否自动停止:开启,一小时后。会在1小时后自动停止该在线服务。资源池:公共资源池。如果您购买了专属资源池,也可以选择专属资源池部署。模型来源:我的模型模型:选择刚刚导入美食人车检测的模型和版本,会自动加载。计算节点规格:选择[限时免费]CPU:1 核 4 GiB。计算节点个数:1。如果想要更高的并发数,可以增加计算节点个数,会以多实例的方式部署。填写好所有参数,点击“下一步”按钮,然后点击“提交”按钮,最后点击查看服务详情。状态栏会显示部署进度,大概3分钟左右会部署完成。在线服务测试在线服务的本质是RESTful API,可以通过HTTP请求访问,在本案例中,我们直接在网页上访问在线服务。等待在线服务的状态变成运行中。先点此链接下载测试集,解压,再切换到预测标签,点击上传按钮,进行测试预测结果会出现在右边的输出框:预测结果中的detection_classes字段,表示识别的分类(人与车)预测结果中的detection_boxes字段,表示识别框的四个角坐标预测结果中的detection_scores字段,表示图片为每种类别的置信度关闭在线服务为了避免持续扣费,案例完成后,需要关闭在线服务,点击“停止”按钮即可:当需要使用该在线服务的时候,可以重新启动该在线服务。确认关闭所有计费项点击此链接,进入ModelArts总览页面,如果所有计费中的数字都是0,表示所有计费项都关闭了。案例完成。
  • ModelBox开发案例 - 使用YOLO v3做口罩检测
    ModelBox开发案例 - 使用YOLO v3做口罩检测本案例将使用YOLO v3模型,实现一个简单的口罩检测应用,最终效果如下所示: 本案例所需资源(代码、模型、测试数据等)已做成模板放到华为云上,查看和下载模板可以使用如下命令:Windows PC版本请使用solution.bat工具:PS ███\modelbox>: .\solution.bat -l ... Solutions name: mask_det_yolo3 ...结果中的mask_det_yolo3即为口罩检测模板,可使用如下命令下载模板:PS ███\modelbox>: .\solution.bat -s mask_det_yolo3 ...Linux开发板版本请使用solution.py脚本:rock@rock-3a:~/███/modelbox$ ./solution.py -l ... Solutions name: mask_det_yolo3 ...结果中的mask_det_yolo3即为口罩检测模板,可使用如下命令下载模板:rock@rock-3a:~/███/modelbox$ ./solution.py -s mask_det_yolo3 ...solution.bat/solution.py工具的参数中,-l 代表list,即列出当前已有的模板名称;-s 代表solution-name,即下载对应名称的模板。下载下来的模板资源,将存放在ModelBox核心库的solution目录下。如果对ModelBox AI应用开发还不熟悉,请先阅读ModelBox 端云协同AI开发套件(RK3568)上手指南,或者ModelBox 端云协同AI开发套件(博时特EC02)上手指南。模型准备本案例使用的是YOLOv3_ResNet18模型,在下载的资源包中,已经包含了转换好的rknn模型或者onnx模型,可以在对应的平台上直接使用。 原始模型是通过TensorFlow框架训练得到的,我们可以用AI Gallery中的物体检测YOLOv3_ResNet18算法和口罩检测小数据集,自行训练出该模型。 得到TensorFlow Frozen Graph格式的模型后,如果想体验rknn模型的转换过程,rknpu版本可参考RK1808模型转换验证案例,rknpu2版本可参考RK3568模型转换验证案例。应用开发打开VS Code,连接到ModelBox sdk所在目录或者远程开发板,开始进行口罩检测应用开发。下面以RK3568版本为例进行说明,其他版本与之类似。1)创建工程使用create.py创建mask_det工程(Windows PC版本请使用create.bat):rock@rock-3a:~/███/modelbox$ ./create.py -t server -n mask_det -s mask_det_yolo3 sdk version is modelbox-rk-aarch64 success: create mask_det in /home/rock/███/modelbox/workspace将会用口罩检测模板创建出一个mask_det工程。2)查看推理功能单元AI应用的核心是模型推理部分,mask_det工程的推理功能单元在工程目录下的model/mask_infer文件夹中,目录结构如下(以RK3568开发板版本为例): 其中yolo3_resnet18_mask_det_288x512-rknpu2.rknn是转换好的rknn模型,mask_infer.toml是该模型的ModelBox功能单元配置文件,其内容如下:# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. [base] name = "mask_infer" # 功能单元名称 device = "rknpu" # 功能单元运行的设备类型 version = "1.0.0" # 功能单元版本号 type = "inference" # 功能单元类型,推理功能单元此处为固定值inference virtual_type = "rknpu" # 推理引擎类型,RK3399pro/RK1808设备为rknpu,RK3568设备为rknpu2 group_type = "Inference" # 功能单元分组信息, 推理功能单元默认为Inference is_input_contiguous = "false" # rk芯片推理时的固定属性 description = "yolo3 model for mask detection" # 功能单元的描述信息 entry = "./yolo3_resnet18_mask_det_288x512_rknpu.rknn" # 模型文件路径,默认在当前路径下 # 模型输入节点描述:yolo3模型有1个输入,uint8格式的图片数据 [input] [input.input1] name = "data" type = "uint8" device = "rknpu" # 输入数据位于哪种设备 # 模型输出节点描述:yolo3模型有3个输出,不同大小的float类型特征向量 [output] [output.output1] name = "yolo/output1" type = "float" [output.output2] name = "yolo/output2" type = "float" [output.output3] name = "yolo/output3" type = "float"可以看到该模型有3个输出节点,即YOLO v3模型输出的3个feature map,需要从中解码出检测框。3)其他逻辑功能单元后处理功能单元负责从模型推理结果中解码出检测框,在工程目录下的etc/flowunit/yolo3_post文件夹中: 解码过程的核心逻辑在yolo3_utils.py文件中,可以查阅YOLO v3模型细节阅读代码。画图功能单元在工程目录下的etc/flowunit/draw_mask_bbox文件夹中: 画图的核心逻辑在draw_mask_bbox.py文件的draw_mask_info函数中: def draw_mask_info(self, image, bboxes): '''在图中画出口罩佩戴信息''' thickness = 2 font_scale = 1 text_font = cv2.FONT_HERSHEY_SIMPLEX for bbox in bboxes: label_index = int(bbox[5]) # 以头肩部为处理对象 if self.labels[label_index] != 'head': continue x_min, y_min, x_max, y_max = bbox[0], bbox[1], bbox[2], bbox[3] # 根据头肩部找到匹配的人脸框 face_bbox = self.find_max_cover_bbox( bbox, bboxes, 'face', self.face_cover_ratio) if not face_bbox: # 没找到对应的人脸,输出'unknown' yellow = (255, 255, 0) cv2.rectangle(image, (x_min, y_min), (x_max, y_max), yellow, thickness) cv2.putText(image, 'unknown', (x_min, y_min-20), text_font, font_scale, yellow, thickness) continue # 根据人脸框找到匹配的口罩框 mask_bbox = self.find_max_cover_bbox( face_bbox, bboxes, 'mask', self.mask_cover_ratio) if not mask_bbox: # 没找到对应的口罩框,输出'no mask' red = (0, 0, 255) cv2.putText(image, 'no mask', (x_min, y_min-20), text_font, font_scale, red, thickness) cv2.rectangle(image, (x_min, y_min), (x_max, y_max), red, thickness) else: # 找到对应的口罩框,输出'has mask' green = (0, 255, 0) cv2.putText(image, 'has mask', (x_min, y_min-20), text_font, font_scale, green, thickness) cv2.rectangle(image, (x_min, y_min), (x_max, y_max), green, thickness) cv2.rectangle(image, (mask_bbox[0], mask_bbox[1]), (mask_bbox[2], mask_bbox[3]), green, thickness) return image可以看到,针对每个人,该模型会尝试检测出head(头肩部)、face和mask三个检测框。如果face检测框与mask检测框的重合度大于某个阈值,就判为佩戴口罩;否则,就判为没有佩戴口罩;如果没有检测到face检测框,就会显示Unknown,表示未知。4)查看流程图模型推理和配套的功能单元准备好后,我们就可以串联出流程图进行测试了,口罩检测工程的默认流程图为graph/mask_det.toml(以RK3568开发板版本为例):# Copyright (c) Huawei Technologies Co., Ltd. 2022. All rights reserved. [driver] # 功能单元的扫描路径,包含在[]中,多个路径使用,分隔 # ${HILENS_APP_ROOT} 表示当前应用的实际路径 # ${HILENS_MB_SDK_PATH} 表示ModelBox核心库的实际路径 dir = [ "${HILENS_APP_ROOT}/etc/flowunit", "${HILENS_APP_ROOT}/etc/flowunit/cpp", "${HILENS_APP_ROOT}/model", "${HILENS_MB_SDK_PATH}/flowunit", ] skip-default = true [profile] # 通过配置profile和trace开关启用应用的性能统计 profile = false # 是否记录profile信息,每隔60s记录一次统计信息 trace = false # 是否记录trace信息,在任务执行过程中和结束时,输出统计信息 dir = "${HILENS_DATA_DIR}/mb_profile" # profile/trace信息的保存位置 [flow] desc = "mask detection example using yolo3 for local video or rtsp video stream" # 应用的简单描述 [graph] format = "graphviz" # 流程图的格式,当前仅支持graphviz graphconf = """digraph mask_det { node [shape=Mrecord] queue_size = 4 batch_size = 1 # 定义节点,即功能单元及其属性 input1[type=input, flowunit=input, device=cpu, deviceid=0] data_source_parser[type=flowunit, flowunit=data_source_parser, device=cpu, deviceid=0] video_demuxer[type=flowunit, flowunit=video_demuxer, device=cpu, deviceid=0] video_decoder[type=flowunit, flowunit=video_decoder, device=rknpu, deviceid=0, pix_fmt="bgr"] image_resize[type=flowunit, flowunit=resize, device=rknpu, deviceid=0, image_width=512, image_height=288] mask_detection[type=flowunit, flowunit=mask_infer, device=rknpu, deviceid=0] yolo3_post[type=flowunit, flowunit=yolo3_post, device=cpu, deviceid=0] draw_mask_bbox[type=flowunit, flowunit=draw_mask_bbox, device=cpu, deviceid=0] video_out[type=flowunit, flowunit=video_out, device=rknpu, deviceid=0] # 定义边,即功能间的数据传递关系 input1:input -> data_source_parser:in_data data_source_parser:out_video_url -> video_demuxer:in_video_url video_demuxer:out_video_packet -> video_decoder:in_video_packet video_decoder:out_video_frame -> image_resize:in_image image_resize:out_image -> mask_detection:data mask_detection:"yolo/output1" -> yolo3_post:in_feat3 mask_detection:"yolo/output2" -> yolo3_post:in_feat2 mask_detection:"yolo/output3" -> yolo3_post:in_feat1 video_decoder:out_video_frame -> draw_mask_bbox:in_image yolo3_post:out_data -> draw_mask_bbox:in_bbox draw_mask_bbox:out_image -> video_out:in_video_frame }"""该流程图对于某个视频流,经过视频解码、图像缩放、口罩检测推理、检测框后处理、画图等一系列操作后,将结果保存下来。口罩检测工程的任务配置文件bin/mock_task.toml中设置了输入输出源,内容为:# 任务输入配置,当前支持以下几种输入方式: # 1. rtsp摄像头或rtsp视频流:type="rtsp", url="rtsp://xxx.xxx" # 2. 设备自带摄像头或者USB摄像头:type="url",url="${摄像头编号}" (需配合local_camera功能单元使用) # 3. 本地视频文件:type="url",url="${视频文件路径}" (请使用${HILENS_APP_ROOT}宏,表示当前应用的实际路径) # 4. http服务:type="url", url="http://xxx.xxx"(指的是任务作为http服务启动,此处需填写对外暴露的http服务地址,需配合httpserver类的功能单元使用) [input] type = "url" # url = "0" url = "${HILENS_APP_ROOT}/data/mask_test.mp4" # 任务输出配置,当前支持以下几种输出方式: # 1. rtsp视频流:type="local", url="rtsp://xxx.xxx" # 2. 本地屏幕:type="local", url="0:xxx" (设备需要接显示器,系统需要带桌面) # 3. 本地视频文件:type="local",url="${视频文件路径}"(请使用${HILENS_APP_ROOT}宏,表示当前应用的实际路径) # 4. http服务:type="webhook", url="http://xxx.xxx"(指的是任务产生的数据上报给某个http服务,此处需填写上传的http服务地址) [output] type = "local" # url = "0:mask_det" # "rtsp://192.168.2.2:8554/outstream" url = "${HILENS_APP_ROOT}/hilens_data_dir/mask_test_result.mp4"测试视频为data/mask_test.mp4,该流程图使用这一视频进行口罩检测,检测结果绘制后保存为hilens_data_dir/mask_test_result.mp4文件。5)运行应用在mask_det工程路径下执行build_project.sh进行工程构建(以RK3568开发板版本为例):rock@rock-3a:~/███/modelbox/workspace/mask_det$ ./build_project.sh build success: you can run main.sh in ./bin folder rock@rock-3a:~/███/modelbox/workspace/mask_det$然后执行bin/main.sh(Windows PC版本请使用bin\main.bat)运行应用,运行结束后在hilens_data_dir目录下生成了mask_test_result.mp4文件,可以下载到PC端查看。
  • [技术干货] MindX SDK -- 工业指针型表计读数参考设计案例
    MindX SDK -- 工业指针型表计读数参考设计案例1 案例概述1.1 概要描述在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端工业指针型表计读数的参考设计,实现对传统机械式指针表计的检测与自动读数功能,达到功能要求。点击链接可以下载本项目到本地。注:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。1.2 特性及适用场景在电力能源厂区需要定期监测表计读数,以保证设备正常运行及厂区安全。但厂区分布分散,人工巡检耗时长,无法实时监测表计,且部分工作环境危险导致人工巡检无法触达。针对上述问题,希望通过摄像头拍照后利用计算机智能读数的方式高效地完成此任务。注意事项:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。本系统要求拍摄图片角度正常,尽可能清晰。如果拍摄图片角度不正常,导致图片模糊,则很难正确读出表数。本系统采用opencv进行图片处理,要求输入文件均为opencv可处理文件。1.3 模型介绍本项目主要使用了两个模型,分别是:用于目标检测的YOLOv5模型(PyTorch)和用于检测指针和刻度的语义分割模型DeepLabv3(pdmodel)。YOLOv5模型参考链接:cid:link_8DeepLabv3模型参考链接:cid:link_41.4 实现流程1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver2、模型转换:目标检测模型: PyTorch模型转昇腾离线模型:yolov5.onnx --> yolov5.om语义分割模型: pdmodel模型转onnx模型:model.pdmodel --> DeepLabv3.onnx onnx模型转昇腾离线模型:DeepLabv3.onnx --> DeepLabv3.om3、业务流程编排与配置4、yolov5后处理开发5、mxpi_process3插件的后处理开发6、python推理流程代码开发:(1)YOLOv5的pipeline流程图如下: 图1. YOLOv5的pipeline流程图(2)DeepLabv3的pipeline流程图如下: 图2. DeepLabv3的pipeline流程图2 软件方案介绍2.1 项目方案架构介绍本系统识别的流程是:先将输入的图像送入流中解码和缩放大小,使用YOLOv5目标检测模型去检测图片中的表盘,结束流。将目标框裁剪下来,再送入流中解码和缩放大小,用DeepLabv3语义分割模型去得到工业表中的指针和刻度,对语义分割模型预测的结果进行读数后处理,找到指针指向的刻度,根据刻度的间隔和刻度根数计算表盘的读数。表2.1 系统方案中各模块功能:序号子系统功能描述1图像输入调用MindX SDK的appsrc输入图片2图像解码调用MindX SDK的mxpi_imagedecoder输入图片3图像放缩调用MindX SDK的mxpi_imageresize,放缩到1024*576大小4工业表检测调用MindX SDK的mxpi_tensorinfer,使用YOLOv5的检测模型,检测出图片中车辆5保存工业表的图像将YOLOv5检测到的工业表结果保存图片6图像输入调用MindX SDK的appsrc输入检测到的工业表7图像解码调用MindX SDK的mxpi_imagedecoder输入图片8图像放缩调用MindX SDK的mxpi_imageresize,放缩到512*512大小9指针刻度检测调用MindX SDK的mxpi_tensorinfer,使用DeepLabv3语义分割模型,检测图像中的指针与刻度10模型后处理调用MindX mxpi_semanticsegpostprocessor,得到语义分割的结果11读数后处理开发mxpi_process3插件,读出工业表的数字2.2 代码目录结构与说明本工程名称为工业指针型表计读数,工程目录如下图所示:├── build.sh ├── README.md ├── evaluate ├── deeplabv3_val #deeplabv3模型测试精度 ├── seg_evaluate.py ├── yolov5_val #yolov5模型测试精度 ├── det.py #1.使用om模型检测测试数据,将得到的结果保存成yolo格式的txt文件 ├── match.py #3.检测是否有的图像没有目标 ├── yolo2voc.py #2.将得到的检测结果yolo数据格式转换成voc格式 ├── images ├── README_img ├── DeepLabv3_pipeline.png ├── YOLOv5_pipeline.png ├── infer ├── det.py ├── main.py ├── seg.py ├── models ├── deeplabv3 ├── seg_aipp.cfg #deeplabv3的onnx模型转换成om模型的配置文件 ├── yolov5 ├── det_aipp.cfg #yolov5的onnx模型转换成om模型的配置文件 ├── pipeline #pipeline文件 ├── deeplabv3 ├── deeplabv3.cfg ├── deeplabv3.names ├── seg.pipeline ├── yolov5 ├── det.pipeline ├── plugins #开发读数处理插件代码 ├── process3 ├── build.sh ├── CMakeLists.txt ├── Myplugin.cpp ├── Myplugin.h ├── postprocess.cpp ├── postprocess.h3 开发环境准备3.1 环境依赖软件和版本环境依赖软件和版本如下表:软件名称版本ubuntu18.04.1 LTSMindX SDK2.0.4Python3.9.2CANN5.0.4numpy1.23.4opencv-python4.6.0MindX SDK开发套件部分可参考MindX SDK开发套件安装指导3.2 导入基础环境. /usr/local/Ascend/ascend-toolkit/set_env.sh . ${SDK安装路径}/mxVision/set_env.sh4 编译与运行示例步骤如下:步骤1 执行编译编译插件,在项目目录下执行如下命令cd ${MeterReader代码根目录}/plugins/process3 . build.sh步骤2 修改pipeline文件中的参数地址修改"${MeterReader代码根目录}/pipeline/yolov5/det.pipeline"第40行处文件的绝对路径,将pipeline中所需要用到的模型路径改为存放模型的绝对路径地址:40 "modelPath":"${MeterReader代码根目录}/models/yolov5/det.om"修改"${MeterReader代码根目录}/pipeline/deeplabv3/seg.pipeline"第30、38、39行处文件的绝对路径,将pipeline中所需要用到的模型路径、配置文件地址改为绝对路径地址:30 "modelPath":"${MeterReader代码根目录}/models/deeplabv3/seg.om" 38 "postProcessConfigPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.cfg", 39 "labelPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.names",步骤3 运行及输出结果总体运行。输入带有预测表盘的jpg图片,在指定输出目录下输出得到带有预测表盘计数的png图片。cd ${MeterReader代码根目录}/infer python main.py --ifile ${输入图片路径} --odir ${输出图片目录}执行结束后,可在命令行内得到yolo模型得到的表盘文件路径,以及通过后续模型得到的预测表盘度数。并可在设定的${输出图片路径}中查看带有预测表盘计数的图片结果。最后展示的结果图片上用矩形框框出了图片中的表计并且标出了预测的表盘读数。5 指标验证分别对yolo模型与deeplabv3模型进行精度测试。1、YOLOv5模型精度测试步骤一:执行以下命令创建所需要的文件目录cd ${MeterReader代码根目录}/evaluate/yolov5_val/ mkdir -p det_val_data/det_val_voc mkdir -p det_val_data/meter_det mkdir -p det_val_data/det_val_img mkdir -p det_val_data/det_sdk_txt mkdir -p det_val_data/det_sdk_voc步骤二:准备标签文件及推理图片下载YOLOv5表计检测数据集并解压到任意目录后,将数据集目录中"test"和"train"目录下的所有图片汇总拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下。我们提供了样例的模型验证集标签文件以供下载测试。完成下载并解压后,将"data/yolov5/det_val_voc"目录下的文件拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_voc"目录下。然后根据拷贝后目录下样例的txt标签文件名称(txt命名格式为:文件名.txt)在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下找到对应名称的jpg图片并拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_img"目录下。步骤三:预处理数据集执行以下命令后,将在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_txt"目录下生成当前"det.om"模型检测验证集数据的yolo格式结果,并以图片命名的txt格式保存:cd ${MeterReader代码根目录}/evaluate/yolov5_val python det.py再执行以下命令,将上述得到的yolo数据格式转换成voc数据格式,并保存至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_voc"目录下:python yolo2voc.py最后执行以下命令,检测验证集中的数据是否有无目标文件:python match.py注意事项:运行脚本之前需要把det_sdk_txt和det_sdk_voc文件夹下的文件清空。步骤四:精度推理登录并点击下载mAP-master.zip代码压缩包,上传服务器解压后,将代码包中的"main.py"脚本拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/"目录下,按照以下步骤修改部分代码:修改main.py第47、48、50行处文件路径47 GT_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_voc') 48 DR_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_sdk_voc') 49 # # if there are no images then no animation can be shown 50 IMG_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_img')修改main.py原第64行代码64 show_animation = False 65 if not args.no_animation:在main.py原第243行添加代码242 def draw_plot_func(dictionary, n_classes, window_title, plot_title, x_label, output_path, to_show, plot_color, true_p_bar): 243 to_show = False使用下面命令运行脚本,计算得到det.om在验证集上的mAP。python main.py经过测试,YOLOv5模型的mAP为100%。2、deeplabv3模型精度测试。执行以下命令,创建所需文件目录:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ mkdir seg_val_img cd seg_val_img mkdir seg_test_img mkdir seg_test_img_groundtruth下载语义分割模型验证集voc格式数据,解压至"${MeterReader代码根录}/evaluate/deeplabv3_val/seg_val_img"目录下。然后执行以下命令拷贝数据:cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/images/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img/ cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/annotations/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img_groundtruth/采用Miou指标进行精度评价。使用下面命令运行脚本:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ python seg_evaluate.py输出各个图的Miou指标,并求得平均值作为deeplabv3模型的精度指标。经测试,deeplabv3的模型的Miou为67%。6 常见问题6.1 模型转换问题问题描述当图像进入流后,输出到模型的图像格式为yuv,数据类型unit8,但是om模型的时候yolov5需要输入的图像格式为RGB。解决方案在转换模型时必须要在AIPP做色域转换,否则模型输入不正确。6.2 插件权限问题问题描述运行pipeline调用第三步的数值处理插件时报错,提示Check Owner permission failed: Current permission is 7, but required no greater than 6.解决方案将插件的权限调整为默认440(只读)即可chmod 440 "$MX_SDK_HOME/lib/plugins/libmxpi_sampleplugin.so"
总条数:271 到第
上滑加载中