• [行业动态] CMU提出首个快速知识蒸馏的视觉框架:ResNet50 80.1%精度,训练加速30%
        介绍一篇来自卡耐基梅隆大学等单位 ECCV 2022 的一篇关于快速知识蒸馏的文章,用基本的训练参数配置就可以把 ResNet-50 在 ImageNet-1K 从头开始 (from scratch) 训练到 80.1% (不使用 mixup,cutmix 等数据增强),训练速度(尤其是数据读取开销)相比传统分类框架节省 16% 以上,比之前 SOTA 算法快 30% 以上,是目前精度和速度双双最优的知识蒸馏策略之一,代码和模型已全部开源!    论文和项目网址:http://zhiqiangshen.com/projects/FKD/index.html    代码:https://github.com/szq0214/FKD知识蒸馏(KD)自从 2015 年由 Geoffrey Hinton 等人提出之后,在模型压缩,视觉分类检测等领域产生了巨大影响,后续产生了无数相关变种和扩展版本,但是大体上可以分为以下几类:vanilla KD,online KD,teacher-free KD 等。最近不少研究表明,一个最简单、朴素的知识蒸馏策略就可以获得巨大的性能提升,精度甚至高于很多复杂的 KD 算法。但是 vanilla KD 有一个不可避免的缺点:每次 iteration 都需要把训练样本输入 teacher 前向传播产生软标签 (soft label),这样就导致很大一部分计算开销花费在了遍历 teacher 模型上面,然而 teacher 的规模通常会比 student 大很多,同时 teacher 的权重在训练过程中都是固定的,这样就导致整个知识蒸馏框架学习效率很低。针对这个问题,本文首先分析了为何没法直接为每张输入图片产生单个软标签向量然后在不同 iterations 训练过程中复用这个标签,其根本原因在于视觉领域模型训练过程数据增强的使用,尤其是 random-resize-cropping 这个图像增强策略,导致不同 iteration 产生的输入样本即使来源于同一张图片也可能来自不同区域的采样,导致该样本跟单个软标签向量在不同 iterations 没法很好的匹配。本文基于此,提出了一个快速知识蒸馏的设计,通过特定的编码方式来处理需要的参数,继而进一步存储复用软标签(soft label),与此同时,使用分配区域坐标的策略来训练目标网络。通过这种策略,整个训练过程可以做到显式的 teacher-free,该方法的特点是既快(16%/30% 以上训练加速,对于集群上数据读取缓慢的缺点尤其友好),又好(使用 ResNet-50 在 ImageNet-1K 上不使用额外数据增强可以达到 80.1% 的精度)。
  • [其他] 使用OpenCV实现偏斜文档校正
    使用OpenCV实现偏斜文档校正纸质文档扫描中经常会发生扫描出来的图像有一定角度的偏斜,对后期的文档信息化OCR提取造成很大的干扰,导致OCR识别准确率下降从而影响文档信息化的结果。这个时候可以使用OpenCV对文档进行纠偏,最常见的文本纠偏算法有两种,分别是基于FFT变换以后频率域梯度基于离散点求最小外接轮廓这两种方法各有千秋,相对来说,第二种方法得到的结果更加准确,第一种基于离散傅立叶变换求振幅的方法有时候各种阈值选择在实际项目中会有很大问题。基于FFT变换以后频率域梯度主要思路是先把图像转换为灰度图像,然后使用离散傅立叶变换得到图像在频率域空间的振幅,对其二值化之后,使用霍夫直线检测得到角度,然后根据角度完成旋转校正。代码实现如下:Mat src = imread("D:/vcprojects/images/rotate_text.png"); Mat gray, binary; cvtColor(src, gray, COLOR_BGR2GRAY); //expand input image to optimal size Mat padded; int m = getOptimalDFTSize(gray.rows); int n = getOptimalDFTSize(gray.cols); // on the border add zero values copyMakeBorder(gray, padded, 0, m - gray.rows, 0, n - gray.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = { Mat_(padded), Mat::zeros(padded.size(), CV_32F) }; Mat complexI; // Add to the expanded another plane with zeros merge(planes, 2, complexI); // 离散傅立叶变换 dft(complexI, complexI); // 实部与虚部得到梯度图像 // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I)) split(complexI, planes); magnitude(planes[0], planes[1], planes[0]); Mat magI = planes[0]; magI += Scalar::all(1); log(magI, magI); // crop the spectrum, if it has an odd number of rows or columns magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2)); // rearrange the quadrants of Fourier image so that the origin is at the image center int cx = magI.cols / 2; int cy = magI.rows / 2; Mat q0(magI, Rect(0, 0, cx, cy)); // Top-Left - Create a ROI per quadrant Mat q1(magI, Rect(cx, 0, cx, cy)); // Top-Right Mat q2(magI, Rect(0, cy, cx, cy)); // Bottom-Left Mat q3(magI, Rect(cx, cy, cx, cy)); // Bottom-Right Mat tmp; // swap quadrants (Top-Left with Bottom-Right) q0.copyTo(tmp); q3.copyTo(q0); tmp.copyTo(q3); q1.copyTo(tmp); q2.copyTo(q1); tmp.copyTo(q2); // 归一化与阈值化显示 normalize(magI, magI, 0, 1.0, NORM_MINMAX); Mat dst; magI.convertTo(dst, CV_8UC1, 255, 0); threshold(dst, binary, 160, 255, THRESH_BINARY); // 霍夫直线 vector lines; Mat linImg = Mat::zeros(binary.size(), CV_8UC3); HoughLines(binary, lines, 1, (float)CV_PI / 180, 30, 0, 0); int numLines = lines.size(); float degree = 0.0; for (int l = 0; l { float rho = lines[l][0], theta = lines[l][1]; float offset = CV_PI / 12.0; if (abs(theta) > offset && abs(theta)< (CV_PI / 2.0- offset)) { printf("theta : %.2f ", theta); degree = (theta)*180-90; } Point pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000 * (-b)); pt1.y = cvRound(y0 + 1000 * (a)); pt2.x = cvRound(x0 - 1000 * (-b)); pt2.y = cvRound(y0 - 1000 * (a)); line(linImg, pt1, pt2, Scalar(0, 255, 0), 3, 8, 0); } imshow("lines", linImg); // 旋转调整 Mat rot_mat = getRotationMatrix2D(Point(binary.cols/2, binary.rows/2), degree, 1); Mat rotated; warpAffine(src, rotated, rot_mat, src.size(), cv::INTER_CUBIC, 0, Scalar(255, 255, 255)); imshow("input", src); imshow("deskew-demo", rotated); imwrite("D:/deskew_text.png", rotated);基于离散点求最小外接轮廓其主要思路是先把图像二值化,得到一系列离散的前景像素点集合,然后利用轮廓的最小外接矩形函数,得到偏斜的矩形大小与角度,通过仿射变换完成校正。代码实现如下:Mat src = imread("D:/vcprojects/images/rotate_text.png"); Mat gray, binary; cvtColor(src, gray, COLOR_BGR2GRAY); threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU); imshow("binary", binary); imwrite("D:/binary_text.png", binary); vector points; findNonZero(binary, points); RotatedRect box = minAreaRect(points); double angle = box.angle; if (angle < -45.) angle += 90.; printf("angle : %.2f ", angle); Point2f vertices[4]; box.points(vertices); for (int i = 0; i < 4; ++i) line(src, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 2); imshow("box", src); imwrite("D:/box_text.png", src); Mat rot_mat = getRotationMatrix2D(box.center, angle, 1); Mat rotated; warpAffine(src, rotated, rot_mat, src.size(), cv::INTER_CUBIC, 0, Scalar(255, 255, 255)); //bitwise_not(rotated, rotated); imshow("deskew-demo", rotated);运行结果原图最小外接矩形校正之后转自公众号:小白学视觉
  • [高校开发者专区] 【HCSD-DevCloud训练营学习笔记】飞机大战游戏上云实践
    学习目标:目录DEvOps的五要素DEvOps的生命周期
  • [知识分享] AI全流程开发难题破解之钥
    【摘要】 将通过对ModelArts、盘古大模型、ModelBox产品技术的解读,帮助开发者更好的了解AI开发生产线。本文分享自华为云社区《【大厂内参】第16期:华为云AI开发生产线,破解AI全流程开发难题》,作者:华为云社区精选 。近日,华为云对AI开发生产线进行服务升级,帮助各行各业的软件开发更简单快速地完成SaaS化,在云上创造更大价值。AI开发生产线,通过 ModelArts 和 AI Gallery , 支持AI开发运维的DevOps全流程。通过预集成盘古大模型和丰富的AI资产,让开发者实现从数据标注、数据处理、模型训练、到部署上线、模型调优等环节全流水线自动衔接,大幅提升效率。1.基于行业算法套件的ModelArts云原生AI开发最佳实践在AI开发的探索阶段,选择合适的环境、便利的工具、按需的算力、一键可运行的算法资源是我们最重要的因素。在环境和算力方面,使用ModelArts提供云化Notebook,配合弹性按需算力资源能力,可以快速地让我们拿到一个带AI计算资源的环境。在算法方面,面向特定领域问题的算法解法集合、AI算法套件,可以让我们快速的在算法间切换,找到合适的并且具备实际应用的自研及开源算法,通过订阅和选择的方式,可以在ModelArts上一键式的运行。在工具方面,我们基于云化的Notebook提供了参数化的开发模式,让你的探索变得更便捷高效。1.1选择合适的AI开发套件,让你的开发事半功倍1.1.1云原生Notebook华为云会选择Notebook作为线上AI开发与探索的首选工具,其优势在于可贯穿整个AI开发探索生命周期,从数据的处理到模型的开发以及验证和调测,都是能够全部覆盖的。Notebook可提供交互式的编程体验,探索过程中的可视化要求,可以快速地进行结果的分享与重现。如上图“Kaggle在2021年机器学习开发者调研数据”所示,可以看到在IDE的流行度里面,Notebook占据很重要的位置。纵观整体业界趋势,各个云化AI开发厂商还是以JupyterLab底座+插件的方式演进,主打资源免费、协作、社交化。ModelArts云化Notebook也是基于此趋势进行演进,并且提供丰富的差异化场景能力。资源切换、CodeLab、云上云下插件等,贴近用户使用习惯,提升AI开发效率。1.1.2算法开发套件我们知道,在AI的算法方面,需要去寻找匹配我们业务场景的合适算法,并且需要进行环境和算法之间的适配开发,以及算法相关参数的调优。ModelArts提供的算法套件是面向一类算法问题解的集合,是针对特定的行业、领域预训练模型、算法实现及数据集。以简单易用为基础正对云边端场景的不同需求,提供相应的内容支持。目前,华为云AI算法套件是通过自研+社区两个方面,确保算法的丰富度。自研方面,结合丰富的真实AI开发经验,提供领域预训练模型、算法实现及数据集。目前已经在图像分类、目标检测、视觉分类、姿态预估等多个领域提供相关的内容,并且后续会持续丰富。用户可以在AI Gallery上一键订阅,在ModelArts上一键运行,提升用户的AI开发和探索效率。社区方面,对于社区的主流算法套件完成了非侵入式的适配,例如MMDetection、MMOCR、MMSegmentation等算法套件,可以像加载自研算法套件一样,在ModelArts中快速加载一键运行。1.1.3算法调优有了工具和算法,接下来就是算法开发的探索和调优。华为云基于ModelArts提供的基于Notebook的参数化、图形化、交互式的能力加速开发过程,帮助开发者在数据处理、模型调优以及模型预测方面进行可视化的操作,低门槛完成多种场景的AI算法开发与应用,配套提供的算法套件可以更加高效进行AI开发。上图是Notebook的Excel,用户可以进行参数化的定义数据处理过程和训练过程,可以图形化查看训练结果,有表格,而不是之前的大篇幅的日志,还可以进行交互式的进行结果调测。不仅如此,Notebook还提供了丰富的基础组件和组件定义能力,用户可以根据自己的使用需求和习惯定义个性化的插件。在开发的资源和算力方面,ModelArts云原生AI开发资源与算力构建在开放的华为云云原生平台之上,基于底层应用、开放自主的相关基础云原生能力,方便开发者按需,低成本,灵活获取到可用的资源和算力。1.2标准化的开发工具,云上云下协同从前面的介绍大家可以了解到,对于华为云AI开发工程师,在AI开发的实验原型和探索阶段是基于ModelArts提供的serverless化的Notebook的交互式参数化能力,配合弹性按需算力、资源和环境,以及丰富的算法套件,帮助我们加速实验原型的探索及开发。面对具体AI团队开发及应用落地时,需要涉及多人和多阶段配合完成从数据处理、算法开发和调优,到模型训练、推理开发及测试,并且在后续运行中涉及反复的迭代,怎么样可以高效地完成这项工作。借鉴传统软件开发经验和实践,华为云通过工程化的AI开发模式,从工具到开发标准,再到代码化工程管理能力,助力开发团队协同完成AI开发及应用落地。在工具方面,为了更加匹配通用的IDE工具使用习惯,使用ModelArts提供VSCode\PyCharm插件,就可以在自己的本地VSCode\PyCharm上进行代码开发,使用插件远程连接云上资源进行远程开发调测,并且可以调用模型训练、模型部署等能力。通过定义AI工程框架,来让AI开发标准化,这个标准化的工程框架是实践的总结和积累。使用ModelArts提供的标准化AI开发工程模板在模板中对于数据、算法、推理等各个环节的结构进行定义,并且还提供了CLI工程脚手架,通过代码与命令的方式与平台功能相结合,全流程完成工程化的AI开发。用户可以基于我们提供的工程结构定义,分工协同,完成不同内容的开发。上图为ModelArts提供的标准化工程结构,可以通过代码化方式完成AI过程、步骤、行为、资源等定义,并且通过代码仓统一管理。例如:用户可以定义workflow、镜像、训练、作业、应用部署等,并且配合统一的资产管理进行工程化的AI开发。前面介绍了云上开发工具的能力,云上的IDE与传统的IDE在能力上还是存在差距的,所以为了更加匹配开发者通用IDE工具的使用习惯,ModelArts使用了基于VSCode\PyCharm+ModelArts插件,满足本地化开发及调测诉求。面对稀缺的GPU资源的诉求,通过远程连接云上资源的能力,打造本地开发远程资源按需使用的能力,插件提供一键式的安装配置等能力,方便我们开发者的使用。后续ModelArts也会提供更加沉浸式的AI开发能力,包含AI计算资源、云上存储预置AI镜像,让用户体验到云上资源便利的同时,也带来本地开发的顺畅感。在远程插件上,可以调用云上的开发、数据、训练、推理等能力,以及提供的工程相关的所有AI开发能力,真正满足一个团队不同用户的诉求。1.3AI Gallery构建丰富活跃的AI生态在正式的AI开发项目中,我们会面临更多的困难和问题。AI Gallery是在ModelArts的基础上构建了开发者生态社区,丰富及活跃的生态是AI开发的基础和推动力。在AI Gallery中,不仅提供了Notebook代码样例、数据集、算法套件、模型等AI数字资产;而且还有学习、实践、交流等板块,方便不同诉求的用户交流。并且在资产方面提供分享和订阅能力,方便AI资产持续更新和迭代。我们希望开发者沉淀更多的资产,帮助更多的AI开发者,提升大家的开发效率,加速AI产业的发展。传统软件开发完成后就是交付运维,AI的软件开发交付后不仅仅是交付运维,还有面临持续的数据更新、模型迭代、难例挖掘,这些流程应该是标准化可信的,并且与开发流程解偶,所以ModelArts提供了工作流的能力。工作流是基于实际业务场景开发的,用于部署AI应用流水线工具,把已经完成好的AI开发业务场景,通过ModelArts Python SDK进行编排和开发,将数据处理、模型训练、模型部署等能力进行编码,然后把流水线发布给业务应用人员。对于应用者来说不一定需要了解整个开发实现细节,他们只需要了解流水线的机制,以及需要存在变化的内容即可。例如:数据的增强、更新或者模型的参数变化,就可以方便地进行模型迭代、上线,这样让开发和运行分离,提高后续业务迭代的效率。综上我们可以看出,ModelArts 致力打造一站式的AI开发平台,让AI开发变得简单、高效。华为云从AI开发全流程出发,在分析设计算法模型探索和实验模型集成与开发以及AI应用运维上提供高效、便捷的能力,并且结合华为云丰富的实践经验,沉淀更多的标准化AI开发流水线,为AI开发者提供更多更好的服务。2.华为云盘古大模型,开启AI工业化开发2025年,企业对AI的采用率将达到86%。所以,AI走进企业的生产核心系统创造更大价值是大势所趋。但与之相对的是,封闭的作坊式AI开发已经无法满足行业高效、高质量的数字化转型需求。因为当企业有了AI需求以后,就需要独立的创建一个场景。在这个场景中,企业要投入专家和开发人员,来针对这个场景去进行专门的研发。这会导致AI应用的开发效率低下,并且它的开发经验,包括产生的一些资产也是无法得到有效积累。针对这样的情况,华为提出了 盘古大模型 。2.1什么是华为盘古大模型华为云盘古大模型,是把海量的数据知识存储在超大型的神经网络中,针对定制化的需求,只需要将这些需求固化成一些流水线。在这个过程中,由于不同的流水线之间大部分的流程都是一样的,仅仅只有小部分的操作或者场景专有的知识是有所不同的,所以就可以把这些知识或者操作像搭积木一样,放在在这个流水线上面进行开发。这样的开发模式比起作坊式的开发模式,就会更加的节省时间和人力。在实际测试当中,盘古大模型进入企业生产系统以后,效率提升是非常明显的。原来需要十个人所做的事情,现在只要一个人就可以把它做完,效率的提升达到十倍以上。2.2五大盘古大模型应用在千行百业为了更好地针对不同领域方面,在盘古大模型中,有视觉、NLP(自然语言处理)、多模态、Graph和科学计算等五个领域的大模型。在不同的行业。场景下,如金融风控、工业质检、时尚设计、案件审核和智慧育种等场景下,设置场景化模型。这些场景化模型都可以适配盘古大模型,最后应用在不同的行业案例中,如违规风险识别、布料质检、流行元素标注等等应用。盘古大模型是通过把算力、研发成本前置到华为云侧,如华为云每年会消耗英伟达V100GPU超过4000张、使用相当于4TB清洗后纯文本数据和10亿张图片去进行训练,配备大量的工程师,经过多年的积累研发了大模型系统,这个大模型系统及可以帮助业界把成本大大减少和降低,不用在耗时耗力重复性的开发算法及模型,应用大模型从而快速的进行AI开发为了让大家更好的认识和熟悉大模型,接下来将为大家展示大模型在不同行业中的应用。2.2.1CV大模型在铁路TFDS进行未知的故障预测的场景中:一辆列车行驶路途中,有个摄像头架设在一个固定地点,通过拍摄列车上各种不同视角不同位置的图像后,快速的去判断列车是否有故障。由于这些故障出现次数较少,故障类型多、拍摄图片质量差等原因,因此很多情况下小模型无法取得很好的应用。很多情况下,工程师要针对每个故障去适配一个小模型,成本就非常高,更不要说未知故障的预测了。通过盘古大模型,可以用一个或者少数几个大模型去适配铁路TFDS中的100多种不同的故障场景。最终保证故障的召回率达到90%,未知故障预测发现率提升1倍以上,同时还能保证单张图片的识别时间小于4ms。2.2.2NLP大模型关于NLP大模型,为大家介绍的是最高检应用项目。在这个项目当中,从最高检获取文本,对法律文书文本进行分析,去理解其中所代表的内容。比如,某一项法律为什么应用在这个判决的这个地方,这中间包含了哪些原因等等。如果是传统小模型,需要适配数据再去适配不同的案例,这就导致时间较长。盘古大模型已经在预训练过程中积累了大量NLP方面的知识,所以基于盘古大模型就可以在很短的时间内,把测试结果不断地从开始的73%提升到最后的测试结果92%,也是高效地完成了项目。除了在最高检的项目应用以外,盘古NLP大模型还在反电炸等场景上得到应用。NLP大模型的迁移性强,对人工的依赖程度小,少量样本、简单调参即可。2.2.3科学计算大模型所谓科学计算就是把AI的能力辐射到其他领域。在科学计算领域,比如气象、医药、航天航空、海洋、工业、地质等不同场景,在这些场景当中所面临的共同问题就是解偏微分方程。在偏微分方程解的过程当中,盘古大模型可以发挥出它自己得天独厚的优势。比如说神经网络体量很大,所以在解方程的时候,科学计算大模型可以捕捉到小模型无法捕捉到的特征,从而得到更精确的解答。相比于传统方法,用数值模拟的方法求解偏微分方程,求解效率会比较高。在一些极端的场景下,求解效率能够从2天缩短到0.1秒,提升4~5个数量级的程度。在这种情况下,就可以用实时预测能力为科学计算应用提供实时预警,比如在海量预测问题上,可使用实时预警能力提供实时预警,从而提升在各个方面应对突发海事情况的能力。接下来位大家展示盘古科学计算大模型的演示demo。该demo主要是进行全球海浪的实时预测,模拟一个地球的形状,包含全球的陆地和海洋数据。通过模拟给定风速后,全球海洋的海浪高度是可以实时地显示在屏幕上,这也是得益于推理速度的加快。因为盘古大模型使用0.1秒就完成预测,因此可以实时把结果显示出来。同时还可以模拟海洋上的突发情况,比如海洋上可能出现的风暴和台风。在demo当中给大家展示实时生成台风的路径,并且调整这台风的强度、风速、生命周期等参数,就能发现台风对海浪的高度等造成的影响。因此就可以去模拟台风对海洋的海浪造成的影响。所以该模型就可以有效的帮助我们去指导海洋上的生产生活,比如指导渔船去避险,发挥它自己所特有的价值。对于大部分海上作业来说,精确的海浪预报具有重要的价值。与基于超级计算机的传统预报模式相比,Al全球海浪预报模型可以以较低的计算成本,灵活的结合短期气象预报更新结果,快速提供相关海域未来数小时的海况。该预报系统可以为航运公司提供服务,通过海浪数据结合航速航向来优化航行路径,减少航行过程中的碳排放,同时避免遭遇极端海况造成人员和财产损失。2.2.4多模态大模型多模态,是指把图像和文本两种不同的模态结合在一起,它们之间可以进行交互,从而可以帮助我们完成各种各样的应用。比如像趋势预测、辅助设计等,这些在时装行业比较重要的应用。都是得益于多模态大模型,把人类所希望做的事情以文本形式表示出来,然后把它体现成图像的形式,让设计师能够以图像生成设计图的方法,交付到生产线,加速最后的生产过程。在这个过程当中,利用大模型这样的思路,使得图像和文本之间能够高效地进行交互,从而最后完成这样的过程。2.2.5Graph大模型盘古Graph大模型,主要是用来处理结构化数据。以企业报表数据为例,华为与广发证券合作中发现,有些广发证券客户会存在这个财务造假的情况。广发证券通过使用盘古大模型,利用数据可以帮助他们高效分析出哪些企业可能存在造假的情况,从而帮助广发证券更好的去完成业务情况。2019年有496家企业被监管处罚、问询或被ST处理和利用。得益于大模型当中所具备的特征抽取及预测的能力,盘古多模态大模型能构建定制化、高效的产业链条,并在企业的生产、生活当中是可以发挥出更加重大的作用。如果大家对盘古大模型感兴趣,包括对前面所展示的这个demo比较感兴趣的话,请与华为商务部门联系。3.ModelBox加速跨平台高性能AI应用开发和落地随着新基建的推进,以及5G通信、云计算、大数据和物联网的快速发展,人工智能应用的场景越来越多,AI正从极具想象力的概念成为具有超大发展前景的商业赛道,并逐渐渗透到各行各业,催生了技术产业新的发展。在深耕行业AI落地的过程中,我们发现AI的大规模应用落地并非一帆风顺,面临着比传统软件更复杂的难题:部署场景、复杂系统架构涉及端边云多种组合。易购计算平台多样,给应用性能优化带来了更高的技能要求。AI基础推理框架的API不统一,带来繁琐的适配工作。为解决这些难题,在今年的这次大会上,我们对AI开发生产线ModelArts进行了重磅升级,发布了ModelBox端边云统一AI应用开发框架。ModelBox是让模型以统一的格式和接口更高效地运行。通过ModelBox开发者无需过多关注底层技术也能开发出跨平台高性能的AI应用,提升开发效率。开发者在华为云AI开发生产线ModelArtes上完成模型的训练和优化之后,均可以将模型通过ModelBox完成应用的开发和集成,并一键部署到端边云场景的不同设备中运行,打通行业AI应用落地最后一公里。为了帮助开发者快速完成AI应用的开发和部署,ModelBox集成了三大核心技术:高性能并发调度引擎。可实现数据计算和资源管理的精细化智能调度,集成了特别优化过的硬件加速单元。译制的应用编排异构计算组件。丰富的组件覆盖了主流芯片、多数操作系统和主流的推理框架,可屏蔽这三个层次的平台差异。框架中提供了端边云AI系统单元,让开发者快速写出格式一致的AI应用,并结合场景需求,一键部署到端边云不同的设备上运行。基于高性能并发调度引擎,开发者无需掌握底层调度机制,也能保证高性能应用优化效果。ModelBox中将所有的任务都以功能单元的形式封装,一个完整的应用就是由多个功能单元构成。华为云自研一套灵活调度策略,在执行过程中,功能单元的计算将统一由线程池并发调度,确保计算单元被分配到对应的一个硬件中执行。同时计算中数据和执行单元绑定,保证数据处理的合理分配和高吞吐量。根据引擎在实际应用案例中,让典型的图片检测场景的数据吞吐量从54QPS提升到了442QPS,处理时延从0.5亿毫秒降到了0.2毫秒。为了带给开发者更好的开发体验,提供了图编排的开发模式,所有API以功能单元的方式提供,应用开发可以做到像搭积木一样方便。同时针对常用的AI推理场景提供了丰富的译制功能单元,做到低代码/零代码就能完成应用开发。一次开发无需改动代码就能实现端边云不同设备的一致部署运行。三大核心技术带来的收益也是明显的,在节约80%左右的开发成本的情况下,还带来2-10倍的推理性能提升。3.1应用编排异构计算组件,缩短跨平台开发和部署成本ModelBox作为AI应用开发框架,华为云始终关注开发者体验。依据ModelBox的技术内核,华为云提供了完整的开发工具链,可以让开发者能够以自己喜欢的IDE上手ModelBox。ModelBox的丰富工程模板可降低开发门槛,对应用的AI开发部分包含功能单元开发和图编排,可以实现对Python、C++等多种语言的灵活支持和可视化编排的低门槛开发模式。同时还提供完整的调试机制以应对开发中的问题。开发完成以后,ModelBox以RPN或者容器镜像的打包方式,一键发布应用。并且,ModelBox格式的应用支持多种部署方式,可以一键发布成ModelArts云上在线推理服务,也可以通过HiLens端云协同服务,远程部署到端边侧运行。为了实际场景需要,ModelBox还提供灵活的插件,帮助开发者实现模型的权限管理和配置等。3.2ModelBox助力智慧出行应用实现高性能提升和快速落地从去年开始,已经陆续有伙伴开始将AI应用牵引到ModelBox框架上来。以智慧出行场景为例,我们与伙伴全面重构了安全出行方案中的AI推理业务。在重构前,其中的疲劳和分神驾驶检测任务是根据传统的方式,进行AI应用开发和部署。由于业务量的增加,AI运算的性能已经满足不了要求,并且基础平台将带来扩容成本的增加。同时,切换品牌代码需要重新开发,难度就随之增加。在双方团队配合中选择了ModelBox重构现有业务,数据吞吐量提升了2-10倍。以抽烟识别为例,从15QPS提升到了150QPS,在不扩容的情况下,业务能力大幅提高,节约了非常高的硬件成本。由于性能提升,我们也可以大胆尝试更强大的算法,使得识别准确率也有超过10%的提升,同时耗时降低78%。3.3华为云助力ModelBox开发者实现商业成功华为云开源ModelBox,是希望通过开源能够与广大伙伴共同构建端边云协同的AI应用生态。2021年,华为云依托旗帜社区平台完成了源码发布,这也是社区中第一个应用框架类项目。经过半年的开源社区化开发,我们的项目更加完善和强大。今年晚些时候,我们将在下一个版本推出更多的用户体验,优化工具。未来,我们计划提供越来越多的ModelBox开源解决方案,让大家可以结合更多的参考样例和项目做到开箱即用。华为云诚挚邀请广大开发者朋友参与到ModelBox的开源项目中来。希望北向的AI算法应用开发者可以贡献自己的能力,来丰富ModelBox的功能单元和应用场景,同时让自己的应用可以被更多硬件高效运行。也希望南向设备厂商把自己的硬件通过开源项目对接到ModelBox项目中来,这样具有丰富的AI应用,可以补充和扩展硬件的AI使用场景。为降低开发者上手门槛,华为云与国办合作推出了ModelBox生态入门级开发板。开发者可以从开发板套件开始体验ModelBox结合硬件和端游协同带来的便利,将自己的IDEA快速变成现实。同时还为开发者准备了丰富的上手课程,包含入门、进阶和高阶课。通过系列课程掌握ModelBox的基础开发概念,上手体验功能单元和图形化编排的开发模式。正是由于ModelBox天生对平台操作系统和推理框架的适配开放能力,结合统一的应用打包格式,让应用不管是云上还是端边侧,可复制性都大大提高,这就给开发者的商业变现提供了更多可能。为了更好的帮助开发者实现商业成功,华为云AI开发生产线ModelArts和华为云应用商店,帮助开发者打通从开发到落地的变现通路。ModelBox开发的AI应用,可以通过云上平台和销售网络以及集成商伙伴,触达更多的行业客户,带来更多的商业机会。最后华为云AI开发生产线已通过中国信通院评测,是中国信通院认证的首批全能力域领先级AI开发平台。通过不断创新,在国内率先支持MLOps,让更多企业上好云、用好云,进而推动AI进入更多核心生产环节,产生更高价值。
  • [技术干货] 使用 Fastai 构建食物图像分类器【转载】
    背景社交媒体平台是分享有趣的图像的常用方式。食物图像,尤其是与不同的美食和文化相关的图像,是一个似乎经常流行的话题。Instagram 等社交媒体平台拥有大量属于不同类别的图像。我们都可能使用谷歌图片或 Instagram 上的搜索选项来浏览看起来很美味的蛋糕图片来寻找灵感。但是为了让这些图片可以通过搜索获得,我们需要为每张图片设置一些相关的标签。这使得搜索关键字并将其与标签匹配成为可能。由于手动标记每张图像极具挑战性,因此公司使用 ML (机器学习)和 DL (深度学习)技术为图像生成正确的标签。这可以使用基于一些标记数据识别和标记图像的图像分类器来实现。在本文中,让我们使用 fastai 构建一个图像分类器,并使用一个名为“ fastai”的库来识别一些食物图像。Fastai 简介Fastai 是一个开源深度学习库,它为从业者提供高级组件,可以快速轻松地在传统深度学习领域产生最先进的结果。它使研究人员可以混合和组合低级组件以创建新技术。它旨在在不影响可用性、灵活性或性能的情况下实现这两个目标。由于 fastai 是用 Python 编写的,并且基于 PyTorch,因此需要 Python 知识才能理解本文。我们将在 Google Colab 中运行此代码。除了 fastai,我们将使用图形处理单元 (GPU) 以尽可能快地获得结果。使用 Fastai 构建图像分类器让我们从安装 fastai 库开始:!pip install -Uqq fastai如果你使用的是 Anaconda,请运行以下命令:conda install -c fastchan fastai anaconda让我们导入分类任务所需的包。该库分为模块,其中最常见的是表格、文本和视觉。因为我们手头的任务包括视觉,所以我们从vision库中导入我们需要的所有功能。from fastai.vision.all import *通过 fastai 库可以获得许多学术数据集。其中之一是 FOOD,它是 URL 下的URLs. FOOD第一步是获取并提取我们需要的数据。我们将使用 untar_data 函数,它会自动下载数据集并解压它。foodPath = untar_data(URLs.FOOD)该数据集包含 101,000 张图像,分为 101 个食物类别,每个类别有 250 个测试图像和 750 个训练图像。训练中的图像没有被清理。所有图像的大小都调整为每边最大 512 像素。下一个命令将告诉我们必须处理多少图像。len(get_image_files(foodPath))此外,使用以下命令,我们将打印 Food 数据集的元目录的内容。print(os.listdir(foodPath))meta文件夹包含八个文件,其中四个是文本文件:train.txt、test.txt、classes.txt和labels.txt。train.txt 和 test.txt 文件分别包含训练集和测试集的图像列表。classes.txt 文件包含所有食品类别和标签的列表。txt 提供了所有食品图像标签的列表。该目录还包含一个带有预训练模型的 .h5 文件和一个包含 101,000 张 JPG 格式图像的图像文件夹。最后,训练集和测试集以 JSON 格式提供。要查看所有图像类别,我们将运行以下命令:image_dir_path = foodPath/'images'image_categories = os.listdir(image_dir_path)print(image_categories)然后,我们将执行以下命令以查看 101,000 张图像集合中的示例图像。img = PILImage.create('/root/.fastai/data/food-101/images/frozen_yogurt/1942235.jpg')img.show();我们将使用 pandas 函数读取 JSON 格式的训练和测试文件。JSON 是一种以人类可读的形式存储信息的数据格式。以下代码从目录中读取 train.json 文件并将结果保存在 df_train 数据帧中。df_train=pd.read_json('/root/.fastai/data/food-101/train.json')然后可以使用 head() 函数打印数据帧的标题,如下所示。df_train.head()同样,通过使用 pandas 函数,我们将读取 test.json 文件并将其存储在 df_test 数据帧中。df_test=pd.read_json('/root/.fastai/data/food-101/test.json')df_test.head()我们正在创建三个带有我们选择的食物名称的标签来对食物图像进行分类。labelA = 'cheesecake'labelB = 'donuts'labelC= 'panna_cotta'现在我们将创建一个 for 循环,它将遍历我们下载的所有图像。在此循环的帮助下,我们将删除没有标签 A、B 或 C 的图像。此外,我们使用以下函数重命名具有各自标签的图像。for img in get_image_files(foodPath): if labelA in str(img):  img.rename(f"{img.parent}/{labelA}-{img.name}") elif labelB in str(img):   img.rename(f"{img.parent}/{labelB}-{img.name}") elif labelC in str(img):   img.rename(f"{img.parent}/{labelC}-{img.name}") else: os.remove(img)让我们使用以下命令检查运行循环后获得的图像数量:len(get_image_files(foodPath))让我们在三个选择的食物中尝试一个示例标签,看看重命名是否正确。def GetLabel(fileName):return fileName.split('-')[0]GetLabel("cheesecake-1092082.jpg")以下代码生成一个 DataLoaders 对象,该对象表示训练和验证数据的混合。dls = ImageDataLoaders.from_name_func(   foodPath, get_image_files(foodPath), valid_pct=0.2, seed=42,   label_func=GetLabel, item_tfms=Resize(224))dls.train.show_batch()在这种情况下,我们将:· 使用路径选项指定下载和提取数据的位置。· 使用 get_image_ files 函数从指定位置收集所有文件名。· 对数据集使用 80–20 拆分。· 使用 GetLabel 函数从文件名中提取标签。· 将所有图像调整为相同大小,即 224 像素。· 使用 show_batch 函数生成一个输出窗口,显示带有指定标签的训练图像网格。是时候将模型放置到位了。使用 ResNet34 架构,我们将通过专注于称为 vision_learner () 的单个函数调用来构建卷积神经网络。vision_learner 函数(也称为 cnn_learner)有利于训练计算机视觉模型。它包括你的原始图像数据集、预训练模型 resnet34 和一个度量错误率,它决定了在验证数据中错误识别的图像的比例。resnet34 中的 34 指的是这种架构类型中的层数(其他选项有 18、50、101 和 152)。使用更多层的模型需要更长的训练时间并且更容易过度拟合。Fastai 提供了一个“fine_tune”函数,用于调整预训练模型,以使用我们选择的数据解决我们的特定问题。为了训练模型,我们将 epoch 数设置为 10。learn = vision_learner(dls, resnet34, metrics=error_rate, pretrained=True)learn.fine_tune(epochs=10)也可以通过将指标替换为“accuracy”来检查相同模型的准确性。从上面的结果,我们可以说,即使只有 10 个 epoch,预训练的 ResNet34 模型在多标签分类任务中表现出 > 85% 的良好准确率。如果我们增加 epoch 的数量,模型的准确性可能会提高。现在,让我们测试一些示例图像来检查我们的模型的性能。示例图片 #1示例图片 #2示例图片 #3从上面的结果,我们可以说我们的模型能够正确识别样本图像。训练模型后,我们可以将其部署为 Web 应用程序供其他人使用。尽管 fastai 主要用于模型训练,但你可以使用“learn.export”函数快速导出 PyTorch 模型以用于生产。结论在本教程中,我们学习了如何使用基于 PyTorch 的 fastai 构建食物图像分类器。可以使用 Heroku 或 Netlify 等服务部署此模型,以使此模型可用作 Web 应用程序。以下是本文的一些主要内容:我们可以使用 fastai 以最少的代码建立深度学习模型。因此,fastai 使得使用 PyTorch 进行深度学习任务变得更加容易。食品分类对于计算机视觉应用来说是一项具有挑战性的任务,因为根据装饰和供应方式的不同,同一种食品在不同地方看起来可能会有很大差异。尽管如此,通过利用迁移学习的力量,我们可以使用预训练模型来识别食品并对其进行正确分类。我们为此分类器使用了预训练模型 ResNet34。但是,你可以使用其他预训练模型,如 VGG、Inception、DenseNet 等,来构建你自己的模型。转载自https://iot.ofweek.com/2022-08/ART-132200-11000-30570049.html
  • [EI企业智能] 基于马尔科夫边界发现的因果特征选择算法综述
    摘要    因果特征选择算法(也称为马尔科夫边界发现)学习目标变量的马尔科夫边界,选择与目标存在因果关系的特征,具有比传统方法更好的可解释性和鲁棒性.文中对现有因果特征选择算法进行全面综述,分为单重马尔科夫边界发现算法和多重马尔科夫边界发现算法.基于每类算法的发展历程,详细介绍每类的经典算法和研究进展,对比它们在准确性、效率、数据依赖性等方面的优劣.此外,进一步总结因果特征选择在特殊数据(半监督数据、多标签数据、多源数据、流数据等)中的改进和应用.最后,分析该领域的当前研究热点和未来发展趋势,并建立因果特征选择资料库(http://home.ustc.edu.cn/~xingyuwu/MB.html),汇总该领域常用的算法包和数据集.    高维数据为真实世界的机器学习任务带来诸多挑战, 如计算资源和存储资源的消耗、数据的过拟合, 学习算法的性能退化[1], 而最具判别性的信息仅被一部分相关特征携带[2].为了降低数据维度, 避免维度灾难, 特征选择研究受到广泛关注.大量的实证研究[3, 4, 5]表明, 对于多数涉及数据拟合或统计分类的机器学习算法, 在去除不相关特征和冗余特征的特征子集上, 通常能获得比在原始特征集合上更好的拟合度或分类精度.此外, 选择更小的特征子集有助于更好地理解底层的数据生成流程[6].  传统的特征选择算法主要分为封装法、过滤法和嵌入法三类[7].封装法[8]为不同的特征子集训练一个学习器, 评估其在该特征子集上的表现, 决定所选特征子集.过滤法[9]使用一个评估函数, 为特征评分并选择分数较高的特征, 因此不依赖额外的分类器, 更高效.嵌入法[10]将特征选择过程嵌入学习过程中, 同时搜索特征选择空间和学习器参数空间, 获得特征子集.  传统的特征选择算法根据特征和目标变量之间的相关性寻找相关特征子集[11].然而, 相关关系只能反映目标变量和特征之间的共存关系, 而无法解释决定目标变量取值的潜在机制[12, 13].一些研究表明[12, 13], 因果关系具有更好的可解释性和鲁棒性.例如, 将吸烟与肺癌患者数据集上“ 肺癌” (例子中变量取值均为“ 是” 、“ 否” )作为目标变量, “ 黄手指” 和“ 吸烟” 作为特征变量.由于“ 吸烟” 可用来解释“ 肺癌” , 而长期吸烟手指会受到焦油的污染, 因此“ 黄手指” 和“ 吸烟” 与“ 肺癌” 之间存在相关关系, 而只有“ 吸烟” 与“ 肺癌” 之间存在因果关系.当一些吸烟者为了隐藏吸烟习惯而去除手指上的黄渍时, 基于“ 黄手指” 的预测模型将失效, 而基于“ 吸烟” 的预测模型更鲁棒.  为了寻找更鲁棒的因果特征, 近年来, 因果特征选择算法被广泛研究.该类算法通过学习目标变量的马尔科夫边界(Markov Boundary, MB)[14]以寻找关键特征, 因此又被称为MB发现算法.具体地, MB的概念来源于因果贝叶斯网络, 在满足忠实性假设的贝叶斯网络中, 一个变量的MB集合是唯一的, 包含该目标变量的父节点、子节点及配偶节点(子节点的其它父节点)[14].因此, MB反映目标变量周围的局部因果关系, 给定目标变量的MB作为条件集合, 其它特征条件独立于目标变量[14].基于此属性:Tsamardinos等[15]证明在分类问题中, 类别变量的MB是具有最大预测性的最小特征子集; Pellet等[16]证明类别变量的MB集合是特征选择的最优解.因此, 因果特征选择算法通常具有可靠的理论保证.作为一种算法思路, 基于因果关系的特征选择算法促进特征选择的可解释性和鲁棒性.近年来, 因果特征选择算法不断发展, 不仅提升单/多重马尔科夫边界发现算法的搜索精度和计算效率, 在半监督数据、流数据、多源数据、多标签数据等特殊场景下也不断发展.这些算法无需学习包含所有特征的完整贝叶斯网络结构, 即可挖掘目标变量周围的因果特征.本文对现有因果特征选择方法进行较全面的研究和综述.基于原理与现有方法分类1.问题定义与基础理论本节介绍MB相关的基本定义和基础理论.本文使用U表示特征集合, T表示目标变量(标签).MB的概念来源于人工智能基础模型之一的贝叶斯网络.定义 1 贝叶斯网络[14] 对于三元组< U, G, P> , U表示变量集合, G表示U上的有向无环图(Directed Acyclic Graph, DAG), P表示U上的概率分布.对于∀ X∈ U, 将X在G中的父变量作为条件集合, 如果任意X的非后代变量在P中都条件独立于X, 那么< U, G, P> 为贝叶斯网络.贝叶斯网络表征一个变量集合中的因果关系.在有向无环图中, 对于一对直接相连的父子变量, 父变量是子变量的直接原因, 子变量是父变量的直接结果[14].忠实性是贝叶斯网络的基础假设之一, 定义如下.定义 2 忠实性[14] 给定贝叶斯网络< U, G, P> , G忠实于P当且仅当P中的每个条件独立性关系都是由G和马尔科夫条件决定的.P忠实于G当且仅当存在一个G的子图忠实于P.MB的概念是基于忠实的贝叶斯网络而提出的, 定义如下.定义 3 马尔科夫边界[14] 在满足忠实性的贝叶斯网络中, 一个节点的马尔科夫边界包含该节点的父节点、子节点和配偶节点(子节点的其它父节点)[14].根据定义3, 一个节点的MB可直接从忠实的贝叶斯网络中“ 读” 出来.如图1所示, 节点T的MB为{A, B, G, H, F}, 包含父节点A、B, 子节点G、H, 配偶节点F.从因果图的角度分析, MB提供变量周围的局部因果结构, 父节点、子节点、配偶节点分别对应目标变量的直接原因、直接结果、直接结果的其它原因.MB发现算法通过挖掘变量的局部因果结构, 无需学习完整的贝叶斯网络即可找到变量的MB.而变量的MB集合有一个特殊的统计特性, 见定理1.图1 马尔科夫边界的例子Fig.1 An example of Markov boundary定理 1 对于变量X∈ U, X的马尔科夫边界MB⊆U, 满足:∀ Y∈ U-MB-{X}, X⊥Y| MB, 且MB为满足该统计特性的最小变量集.定理1 中阐述MB的最小性, MB的超集通常称为马尔科夫毯(Markov Blanket).根据定理1, 以MB集合为条件, 目标变量会条件独立于其它特征.因此, MB中的特征携带所有关于目标变量的预测信息, 并且其“ 最小性” 保证MB可作为特征选择问题的最优解, 见定理2.定理 2 在满足忠实性假设的数据中, 目标变量的MB是唯一的, 并且为特征选择的最优解[15, 16].定理2 为MB发现算法解决特征选择问题提供理论保证, 由于MB发现算法根据数据中的因果关系选择特征, 并且特征包含目标变量的因果信息, 因此使用MB发现算法选择特征的过程称为因果特征选择.2.现有马尔科夫边界学习方法分类及其基本原理图2给出本文对现有MB发现算法的分类.常规数据中的MB发现算法主要分为单重MB发现算法和多重MB发现算法, 这两类算法的应用场景取决于训练数据是否满足忠实性假设.根据定理2, 在满足忠实性的条件下, 目标变量的MB是唯一的, 当真实数据并不完全满足忠实性条件时, 目标变量可能存在多个等价的MB.因此, 一部分现有算法假设数据满足忠实性, 并且试图寻找目标变量的唯一MB, 该类算法称为单重MB发现算法.另一部分算法考虑忠实性假设被违反的情况, 这些算法可挖掘目标变量的多个等价MB, 该类算法称为多重MB发现算法.特殊数据中的MB发现算法作为一类单独介绍, 其中包括半监督数据MB发现算法、流数据MB发现算法、多源数据MB发现算法、多标签数据MB发现算法.本文按照上述分类介绍现有算法的特点.  图2 现有MB发现算法的分类Fig.2 Categories of existing MB discovery algorithms单重MB发现算法假设目标变量有唯一的MB, 输出的MB集合可直接作为特征选择的结果.该类算法主要分为两类:直接的MB发现算法(直接法)和分治的MB发现算法(分治法).主要区别是:直接法根据MB的性质(定理1)直接学习MB变量, 而分治法分别学习父子变量和配偶变量.主要理论依据为定理3和定理4.定理 3 在U上的贝叶斯网络中, 如果节点X和Y满足:任意变量子集Z⊆U-{X, Y}, X⊥Y|Z不成立, 那么X和Y是一对父子变量[17].定理 4 在U上的贝叶斯网络中, 如果不相连的节点X和Y均与T相连, 如果存在变量子集Z⊆U-{X, Y, T}, 使得X⊥Y|Z成立但X⊥Y|Z∪ {T}不成立, 那么X和Y是一对配偶变量[17].定理3和定理4分别给出父子变量和配偶变量的判别条件, 基于上述定理, 分治的MB发现算法可通过条件独立性测试分别搜索父子和配偶变量.如图3所示, 单重MB发现算法通常使用增长阶段和收缩阶段搜索MB变量或父子变量.增长阶段用于识别并添加可能的真变量, 而收缩阶段检测并删除增长步骤中找到的假变量.基于这一框架, 分治法需要进一步搜索配偶变量.直接法通常在时间效率上更优.但由于分治法在条件独立性测试中使用规模更小的条件集合, 因此通常分治法可达到比直接法更高的准确性.图3 直接法和分治法的区别Fig.3 Difference between direct methods and divide-and-conquer methods    可用于MB发现算法的通用条件独立性测试方法有5种:1)λ 2测试、G2测试、互信息计算, 可用于离散数据[18]; 2)菲尔逊Z检验[19], 可用于带有高斯误差的线性关系的连续数据; 3)基于核的条件独立性测试方法[20], 可用于非线性、非高斯噪声的连续数据.多重MB发现算法研究忠实性假设被违反的情况下一个变量的多个等价MB.理论上来说, 目标变量的多重MB携带等价的信息且具有相似的预测能力[21], 该类算法存在的意义是:1)由于实际应用中多个等价的MB适应的特定学习模型是不同的, 多重MB可用于解释学习模型的多样性现象; 2)实际应用中可能存在多个等价的MB, 但并非所有MB都适合作为特征子集建立学习模型.例如, 当不同变量的获取成本可能不同时, 多重MB算法可用于探索较低获取成本但具有相似预测性的替代解决方案(特征子集).根据Statnikov等[21]的研究, 多重MB的本质原因是等价信息现象, 定义4和定理5如下.定义 4 等价信息[21] 对变量集合X⊆U, Y⊆U及目标变量T∈ U, X和Y包含T的等价信息当且仅当X和Y与T相关且满足X⊥T|Y, Y⊥T|X.定理 5 当且仅当没有发生信息等价时, 目标变量有一个唯一的MB集合[21].根据定理5, 多重MB与等价信息现象是共存的, 因此寻找多个MB的过程也就是识别等价信息的过程[21].现有的多重MB发现算法通常遵循如下步骤:1)使用单重MB发现算法找到一个初始的MB; 2)在当前MB中选择特征子集, 将其从源数据分布中移除, 再在新的数据分布中找到新的MB; 3)测试新MB是否正确.特殊数据的MB发现算法主要是面向近年来逐渐流行的一些特殊学习场景, 根据本文的调研, 目前主要包括但不限于:半监督数据MB发现算法、多标签数据MB发现算法、多源数据MB发现算法和流数据MB发现算法.这些算法大多对应某个单重MB发现算法, 考虑对应场景的特点, 将单重MB算法扩展应用到特殊数据中.
  • [其他] 浅谈深度学习(非监督学习与监督学习)
    深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多成果。深度学习使机器模仿视听和思考等人类的活动,解决了很多复杂的模式识别难题,使得人工智能相关技术取得了很大进步。自下上升的非监督学习就是从底层开始,一层一层地往顶层训练。采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,这也是和传统神经网络区别最大的部分,可以看作是特征学习过程。具体的,先用无标定数据训练第一层,训练时先学习第一层的参数,这层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层,由于模型容量的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到n-l层后,将n-l层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数。自顶向下的监督学习就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调。基于第一步得到的各层参数进一步优调整个多层模型的参数,这一步是一个有监督训练过程。第一步类似神经网络的随机初始化初值过程,由于第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果。所以深度学习的良好效果在很大程度上归功于第一步的特征学习的过程。
  • [参赛经验分享] 2022年船海数据智能应用创新大赛-大赛选手对话① | 赋予目标识别一双“火眼金睛”
    船海数据智能应用创新大赛/选手对话/为了促进现代信息技术和新一代人工智能技术与船舶技术融合发展,深海技术科学太湖实验室(以下简称太湖实验室)联合无锡市委人才工作领导小组办公室、无锡市科学技术局、华为技术有限公司共同主办了首届“船海数据智能应用创新大赛”。在初赛第一赛道“水面/水下典型目标识别”中,来自华中科技大学张钧杰团队、南京理工大学沈飞团队、浙江大学许可团队获得了前三名。比赛地址:https://competition.huaweicloud.com/information/1000041661/introduction赛题解读提高典型目标检测识别能力面向日益增长的智能化水上交通、海洋环境探测、水下探测等场景需求,提高水面/水下针对船只、渔网、浮标、漂浮物、礁石、水生物等典型目标的检测识别能力成为船舶领域人工智能应用亟需解决的难题。科研的道路上永远不会一帆风顺,在提交解决方案的过程中,三组参赛选手都或多或少的遇到了一些难题;而通过专业资料检索、选手平台交流,以及赛事主办方专业指引,最终都迎刃而解。张钧杰华中科技大学张钧杰是华中科技大学研一学生,曾参加过目标检测相关的赛事,如城市红绿灯视觉检测与识别比赛、雨雪雾行驶场景下交通参与者视觉检测与识别以及阿里天池的小样本商标检测挑战赛。对于初赛提交的方案,张钧杰用中规中矩来形容。训练阶段用的都是一些常见的数据增强手段,然后对学习率、优化器等参数进行精细调整。谈到比赛过程中的难点,他表示:“赛题中对于FPS的要求是一个比较难的点,这要求我们在精度与速度之间进行平衡。如何保证速度达标的情况下仍然能够展现出良好的性能是这个比赛的关键所在。”沈飞南京理工大学沈飞主攻人工智能目标检测方向。在比赛过程中,他们遇到了两个比较大的挑战:第一个挑战是来自数据,如:背景复杂导致的目标物体虚化、光照和角度变化、样本稀少不均衡、样本标注误差较大等问题。针对数据问题,团队使用了丰富的数据增强技术、中值滤波进行噪声抑制、mixup混合图像增加抗拟合性以及图卷积来增强局部特征提取能力。第二个挑战是来自比赛限时30FPS,让他们面临速度和精度的平衡挑战。初赛的模型暂时能满足要求,后续会考虑使用知识蒸馏、模型剪枝量化、TensorRT等技术进行模型加速。许可浙江大学在初赛中,许可介绍说,团队主要用的都是很成熟的技术,其中有4点提分比较高。一是多尺度训练和测试时增强(tta),多尺度训练能让模型适应不同尺寸的目标,而tta对于一张测试图像,将不同尺度下所得到的bbox放在一起做nms,能够有效提高mAP。二是multi-lable,因为他们观察到很多船只十分的模糊,人眼都无法分辩。三是merge-nms,对于置信度比较低的bbox,不直接删除,而是通过iou对最终的bbox坐标进行加权,这是针对数据集中bbox的标注不够精确,并且计算量也不大。四是Swa(模型参数平均), 能让模型更具泛化性,有着ensemble的效果但不增加计算量。硬核创新赛事排行榜实时刷新 公开透明张钧杰对此次参赛感受比较深刻的有两点:一是排行榜实时刷新,比赛更透明,也让选手更有冲劲;二是这次比赛因为对速度有要求,所以对于显卡的要求不是很高,用的baseline也是比较熟悉的yolov5,三是智慧船海的应用背景,使这个比赛也非常具有实际意义。科研立项是比赛最大的奖励比赛很透明,公平性好,而且影响力大。此外,这个比赛最特殊、也是吸引沈飞的地方就是“科研立项”——太湖实验室给出了按照国家自然科学基金重大项目立项标准,为获奖团队在赛题方向提供不少于100万元科研立项支持!促进传统方法到深度学习的跨越初赛第三名来自浙江大学的许可曾参加过诸如图像分析类竞赛,但是目标检测类的还是首次。作为人工智能专业日常主要学习传统视觉优化。此次参赛,团队不仅冲着大赛诱人的奖金,也是想借着比赛实现从传统方法到深度学习的跨越,达到以赛促学的目的。营造创新生态  带动产业发展“未来我们将致力于营造船海和数字化结合的创新生态环境、搭建鼓励更多科技人才参与交流的平台,并带动上下游产业链的协同发展。”本次赛事不仅吸引了众多科技人才的参与、带动相关产业发展,太湖实验室也希望以此为起点,营造创新生态环境、孵化更多智能应用项目,进一步促进我国船海探索软硬件的不断升级。太湖实验室与华为在各自专业领域的“强强联手”,也将推动更多科技研究成果转化为船海中的实际应用,为走向深远海、建设海洋强国的国家战略需求进一步助力。本文转自:https://mp.weixin.qq.com/s/SfbI5n18m_U-lxQcUT5mCQ
  • [云动向] 云天视通携手华为云 让农场牛羊照看“更有AI”
    中国自古就有“民以食为天”的说法,甚至在日常交流中,连问候都离不开吃饭这件大事——“吃了吗?您呐。”而肉类是百姓饮食结构中的重要组成部分。当下,随着生活水平逐步提升,人们对肉类的消耗也越来越多,这对畜牧养殖业而言带来了一些挑战。虽然畜牧养殖业在我国已经有上千年的经验积累,但对于养殖户自身来说,一直以来都是一个极耗心力的劳动密集型行业。比如品种识别、数据管理、健康监护等,都需要精细化管理。对于动辄上千头牲畜的养殖场来说,假设需要依靠人工进行全盘管理,养殖场工作效率将难以得到有效提升。早前在诸多中小型养殖场里,要准确无误地统计出有多少头牲畜是一件极其困难的事情。特别是出售装车清点数量的过程中,经常出现农场方和客户统计数量不一致的情况,供需双方纠纷频发。是否有智能化的方式,能帮助养殖户在实现无接触式的智能看护的同时,降低管理成本、提高人工监管的准确率?“边打麻将边在手机APP上看猪圈”,这又是怎样的体验?天视通携手华为云,帮助养殖户开启智慧养殖的全新路径。传统硬件厂商的AI转型只需一套工作流基于摄像头帮助养殖户做好精细化畜牧养殖管理,是非常重要的一环。作为专业的摄像头模组供应商,天视通累计年出货超过1000万台,并在畜牧养殖业沉淀了大量的客户与项目经验。随着数字化在畜牧养殖业的深入,天视通面临着新的挑战。单一的业务模式已经无法适应当下环境。以养牛为例。在牛场里,养殖户需要亲自到牛场里进行观察,现场拿纸记录每一只牛的健康状况、育种条件等等。这导致他们需要无数次往返牛场和家,每天行走10000步以上。此外,由于牛群视人类为捕食者,看见养殖专家时会产生紧张情绪,这加大了牲畜精细化管理的工作难度。面对零散的养殖管理需求,天视通需要借助算法供应商的能力,定制不同的AI技能。但算法供应商常常由于成本、开发周期以及隐私泄漏等问题,无法快速提供解决方案。加上算法定制依赖算法供应商,天视通的研发和试错成本在不断增加,间接地导致了天视通的业务流失情况。为寻求突破,天视通联系到在算法定制领域有合作项目的华为云,希望运用华为云的AI能力满足畜牧养殖户的需求。华为云针对天视通的零散化定制AI需求,基于华为云AI开发生产线ModelArts和端边云统一AI应用开发框架ModelBox,提供了“智能摄像头自定义算法定制部署一体工作流”解决方案,不需要高阶AI能力即可覆盖大部分的零散AI定制需求,并能零代码迭代部署AI算法到端侧设备。以上文提到的牲畜健康监管为例,天视通利用摄像头从养殖场实际采集到的健康牛只和生病牛只的体态及日常行为特征图片数据,通过ModelArts对视频中的牛进行标注,接着再启动模型训练。确认模型的效果后,可将牛只生病行为检测技能一键发布到华为云AI Gallery上,接着部署到天视通技能管理App及牛场的端侧设备里,在家即可实时关注每一头牛的状态。华为云提供的解决方案不仅提高了天视通的算法开发效率,而且帮助养殖畜牧业解决了人力资源短缺和牲畜质量管理的难题。“畜牧业是一个智能化启动较晚的行业,但实际上却非常重要,关系到每个家庭的日常生活。这些年食品安全收到社会的广泛关注,产业的规模化和IT技术的应用让精准管理成为可能,养殖过程自动化管理和全流程溯源就是大家看到的热点应用”,天视通技术负责人分享了AI赋能智慧养殖的趋势与应用效果。 定制化算法+端侧一键部署打通AI全流程 得益于华为云AI技术所积累的场景化行业工作流能力,天视通能够快速完成面向特殊场景的算法开发和一键式远程部署:数据标注:通过收集摄像头场景需求和少量数据,华为云利用ModelArts标注工具完成对图片标注;算法训练:工作流内置行业主流标准算法,一键启动即可进行训练,生成算法并能直接查看模型性能;算法优化:训练完之后在平台上就能生成针对具体摄像头硬件的优化过的高性能算法。针对客户的硬件平台,优化适配模型与技能,实现一键技能发布;算法部署:生成的算法部署到实际应用的摄像头中,再结合ModelBox的端云部署能力,完成对算法授权管理,上架到手机端的算法市场App。 华为云EI工作流,实际上是把共通性的场景单独抽象出来,形成一个相对固定的开发模式,提供给研发团队使用。在这个过程中,华为云降低了对算法工程师的能力要求,只需要让软件开发人员聚焦工程。华为云研发专家表示,作为解决方案的核心,华为云EI工作流以业务场景为中心,以“定义场景→分布实施→持续迭代→形成闭环”的模式,通过聚焦各行业可落地的AI开发方式,为服务客户提供基于场景化的工作流,完成全流程的AI开发及迭代。携手伙伴,谋全局,争当弄潮儿天视通始终专注在图像处理和通讯的技术领域前沿,通过技术和产品的不断创新,为广大客户提供技术更先进、更贴近客户需求的远程视频设备和开发方案,提供高品质的视频产品和专业的图像处理服务。凭借自身的技术优势,天视通的产品已广泛应用到养殖场、鱼塘、餐馆、商店等社会的众多行业。天视通在应用华为云EI工作流之后发现,和传统的线下开发环境相比,华为云平台整合了多种开发工具,同时提供可视化界面、大幅度减少通用环境的配置工作,大大提高用户的使用体验。基于算法后装的方式,很大程度上减轻了天视通对摄像头硬件本身的库存规划,让库存周转变得更加灵活。在算法定制方面,华为云EI工作流为天视通节省30%的支出;算法云端部署方面,节省硬件库存运营成本20%。基于华为云提供的能力,天视通从传统硬件厂商转型成为了具备AI能力的解决方案提供商,实现无缝转型升级;同时提升了产品竞争力和业务定制需求的承接能力,能够向客户提供更多服务。当前,华为云工作流积累了大量的场景化行业工作流,助力客户零代码、高灵活的实现全流程AI开发应用。华为云在AI、音视频、IoT领域方面的技术深耕,也让天视通与华为云未来在不同的领域场景有了更多的合作可能。在智能化发展的道路上,华为云用技术加持、应用赋能的方式,给正在智能化转型的企业猛“踩油门”,降低企业智能化发展门槛,助力前行。 
  • [交流吐槽] 华为云14天鸿蒙设备开发实战训练营 打卡
    开发板子还没到 按照教程做到这一步 下面的试验版子到了再继续
  • [技术干货] 更新版yolov5_deepsort_pytorch实现目标检测和跟踪[转载]
    由于mikel-brostrom在github上发布的Yolov5_DeepSort_Pytorch更新,使整个代码封装性更好,进而允许采用多种REID特征识别模型,完善了deepsort在检测跟踪方面的性能。本博文记录如何使用此版本Yolov5_DeepSort_Pytorch的过程,同时给出ZQPei REID模型的修改方法,以适应mikel-brostrom更新版本。使用Yolov5_DeepSort_Pytorch默认的osnet REID实现跟踪track.pyYolov5_DeepSort_Pytorch中包含了两个链接目录yolov5和reid,不能一次性把github中的代码克隆下来,因此,需分别将三个github代码克隆到本地。Yolov5_DeepSort_Pytorch: git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_PytorchYolov5: git clone https://github.com/ultralytics/yolov5REID: git clone https://github.com/KaiyangZhou/deep-person-reid假定你的deepsort目录为your_dir,是第一个克隆下来的目录。第二个克隆目录是yolov5,将yolov5目录放在your_dir目录下,即your_dir/yolov5。第三个克隆目录是reid,放到your_dir/deep_sort/deep目录下,your_dir/deep_sort/deep/reid。假定已经安装了conda和虚拟环境,且安装好运行Yolov5_DeepSort_Pytorch所需的模块。进入reid目录,运行python setup.py develop1如此,即安装好KaiyangZhou的REID环境。下载yolov5模型权重,放入目录your_dir/yolov5/weights从KaiyangZhou的github中,Model zoo里下载权重文件,例如osnet_x1_0.pth,放到checkpoint目录:your_dir/deep_sort/deep/checkpoint。(1)修改deep_sort/configs/deep_sort.yamlDEEPSORT:  MODEL_TYPE: "osnet_x1_0"      REID_CKPT:  '~/your_dir/deep_sort/deep/checkpoint/osnet_x1_0_imagenet.pth'  MAX_DIST: 0.1 # 0.2 The matching threshold. Samples with larger distance are considered an invalid match  MAX_IOU_DISTANCE: 0.7 # 0.7 Gating threshold. Associations with cost larger than this value are disregarded.  MAX_AGE: 90 # 30 Maximum number of missed misses before a track is deleted  N_INIT: 3 # 3  Number of frames that a track remains in initialization phase  NN_BUDGET: 100 # 100 Maximum size of the appearance descriptors gallery  MIN_CONFIDENCE: 0.75  NMS_MAX_OVERLAP: 1.0这里,增加REID_CKPT,把某些参数设置放到yaml文件中,尽可能减少track.py命令行中的输入参数。(2)修改track.py中DeepSort类实例的参数定义deepsort = DeepSort(    cfg.DEEPSORT.MODEL_TYPE,                        cfg.DEEPSORT.REID_CKPT,   # 添加checkpoint路径                        device,                        max_dist=cfg.DEEPSORT.MAX_DIST,                        max_iou_distance=cfg.DEEPSORT.MAX_IOU_DISTANCE,                        max_age=cfg.DEEPSORT.MAX_AGE,                         n_init=cfg.DEEPSORT.N_INIT,                         nn_budget=cfg.DEEPSORT.NN_BUDGET,                        )此处增加了一个reid权重文件路径参数,故也需在DeepSort类定义中增加该参数model_path,修改deep_sort/deep_sort.py,__init__():class DeepSort(object):    def __init__(self, model_type, model_path, device, max_dist=0.2, min_confidence=0.3, nms_max_overlap=1.0, max_iou_distance=0.7, max_age=70, n_init=3, nn_budget=100, use_cuda=True):        self.min_confidence = min_confidence        self.nms_max_overlap = nms_max_overlap        self.extractor = FeatureExtractor(            model_name=model_type,            model_path = model_path,            device=str(device)        )        max_cosine_distance = max_dist        metric = NearestNeighborDistanceMetric(            "cosine", max_cosine_distance, nn_budget)        self.tracker = Tracker(            metric, max_iou_distance=max_iou_distance, max_age=max_age, n_init=n_init)注:mikel好像又改了有关model_path的引入方法,我感觉太复杂,故还是用以上的修改办法,其目的就是从deep_sort/deep/checkpoint中找到权重文件路径,避免从网上下载权重文件,或者从本地缓存.torch中去找权重。(3)运行deepsort跟踪程序,命令行选项中给出一种比较全的选项python track.py --yolo_model ~/your_dir/yolov5/weights/yolov5s.pt \   // yolov5权文件                --source  ~/your_dir/video_demo.mp4 \           // 输入视频文件                --show-vid \            // 显示跟踪视频                --classes 0 2   \           // 0 = 行人类别, 2=小汽车类别。                --save-txt    \           // 输出兼容MOT16格式文件                --save-vid  \           // 保存跟踪视频其中,classes 0 表示yolov5检测对象为行人,类型号0。更改ZQPei REID模型文件此模型文件命名为model_ZQP.py,放入目录 deep_sort/deep/reid/torchreid/models模型更改只需添加一个定义函数 def ZQP()import torchimport torch.nn as nnimport torch.nn.functional as Fclass BasicBlock(nn.Module):    def __init__(self, c_in, c_out, is_downsample=False):        super(BasicBlock, self).__init__()        self.is_downsample = is_downsample        if is_downsample:            self.conv1 = nn.Conv2d(                c_in, c_out, 3, stride=2, padding=1, bias=False)        else:            self.conv1 = nn.Conv2d(                c_in, c_out, 3, stride=1, padding=1, bias=False)        self.bn1 = nn.BatchNorm2d(c_out)        self.relu = nn.ReLU(True)        self.conv2 = nn.Conv2d(c_out, c_out, 3, stride=1,                               padding=1, bias=False)        self.bn2 = nn.BatchNorm2d(c_out)        if is_downsample:            self.downsample = nn.Sequential(                nn.Conv2d(c_in, c_out, 1, stride=2, bias=False),                nn.BatchNorm2d(c_out)            )        elif c_in != c_out:            self.downsample = nn.Sequential(                nn.Conv2d(c_in, c_out, 1, stride=1, bias=False),                nn.BatchNorm2d(c_out)            )            self.is_downsample = True    def forward(self, x):        y = self.conv1(x)        y = self.bn1(y)        y = self.relu(y)        y = self.conv2(y)        y = self.bn2(y)        if self.is_downsample:            x = self.downsample(x)        return F.relu(x.add(y), True)def make_layers(c_in, c_out, repeat_times, is_downsample=False):    blocks = []    for i in range(repeat_times):        if i == 0:            blocks += [BasicBlock(c_in, c_out, is_downsample=is_downsample), ]        else:            blocks += [BasicBlock(c_out, c_out), ]    return nn.Sequential(*blocks)class Net(nn.Module):                 def __init__(self, num_classes=751, pretrained=True, loss = 'softmax', **kwargs):   # market1501=751, dukemtmcreid=702        super(Net, self).__init__()   # Net        # 3 128 64        self.conv = nn.Sequential(            nn.Conv2d(3, 64, 3, stride=1, padding=1),            nn.BatchNorm2d(64),            nn.ELU(inplace=True),        )        self.layer1 = make_layers(64, 64, 2, False)        self.layer2 = make_layers(64, 128, 2, True)        self.layer3 = make_layers(128, 256, 2, True)        self.layer4 = make_layers(256, 512, 2, True)        #self.avgpool = nn.AvgPool2d((8,4),1)        self.adaptiveavgpool = nn.AdaptiveAvgPool2d(1)        self.classifier = nn.Sequential(            nn.Linear(512, 256),            nn.BatchNorm1d(256),            nn.ReLU(inplace=True),            nn.Dropout(),            nn.Linear(256, num_classes),        )    def forward(self, x):        x = self.conv(x)        x = self.layer1(x)        x = self.layer2(x)        x = self.layer3(x)        x = self.layer4(x)        #x = self.avgpool(x)        x = self.adaptiveavgpool(x)   #        x = x.view(x.size(0),-1)        # B x 128        if not self.training:            x = x.div(x.norm(p=2,dim=1,keepdim=True))               return x        # classifier        x = self.classifier(x)        return xdef ZQP(num_classes=751, pretrained=True, loss='softmax', **kwargs):    model = Net(        num_classes=num_classes,         pretrained = pretrained,        loss = 'softmax',        **kwargs    )    return modelif __name__ == '__main__':    net = Net(pretrained=True)  # Net    x = torch.randn(4, 3, 256, 256)  # 128, 64    y = net(x)下面将模型ZQP添加到REID的定义文件中deep_sort/deep/reid/torchreid/models/__init__.py中引入ZQP模型文件,添加:from .model_ZQP import *1在字典__model_factory中添加模型名称ZQP:__model_factory = {# image classification models    'resnet18': resnet18,    'resnet34': resnet34,    'resnet50': resnet50,......    'ZQP': ZQP现在,只要修改deep_sort/configs/deep_sort.yaml中的MODEL_TYPE和REID_CKPT路径,就可运行ZQPei的reid模型ckpt.t7。  MODEL_TYPE: "ZQP"      REID_CKPT:  '~/your_dir/deep_sort/deep/checkpoint/ckpt.t7'另外,由于ZQPei reid模型训练中resize为128x64(hxw),故需修改deep_sort/deep/reid/torchreid/utils/feature_extractor.py中的image_sizedef __init__(        self,        model_name='',        model_path='',        image_size=(128, 64),           #(256, 128)  (h, w)        pixel_mean=[0.485, 0.456, 0.406],        pixel_std=[0.229, 0.224, 0.225],        pixel_norm=True,        device='cuda',        verbose=True    ):至此,我们完成了添加ZQP reid模型到KaiyangZhou REID模型中的整个过程,并可以用同样的命令行参数,运行track.pyreid模型训练deepsort中有两个神经网络模型,一个是目标检测模型yolov5,另一个是特征识别模型reid。yolov5模型训练有很多文章可参考,省略,此处侧重谈谈reid模型的训练。KaiyangZhou给出识别行人特征的reid模型训练方法,训练程序deep_sort/deep/reid/scripts/main.py。训练可分别采用两个数据集:Market-1501和DukeMTMC-reID。Market-1501数据集:训练数据集”bounding_box_train“有751个行人ID,包含 12,936 张图像,平均每人有17.2张训练数据;测试集“bounding_box_test”有750个行人ID,包含19,732张图像,平均每人有26.3张测试数据。查询集gally从测试集中挑选出750个行人在6个摄像头下的图片,共3368 张查询图像。dukemtmc-reid数据集:“bounding_box_test”——用于测试集的 702 人,包含 17,661 张图像(随机采样,702 ID + 408 distractor ID)“bounding_box_train”——用于训练集的 702 人,包含 16,522 张图像(随机采样)“query”——为测试集中的 702 人在每个摄像头中随机选择一张图像作为 query,共有 2,228 张图像只要从网上下载这两个数据集,使用其安排好的目录结构无需更改,只要指出数据集的根目录。以下给出ZQPei模型在dukemtmc-reid数据集的训练方法构造配置文件:deep_sort/deep/reid/configs/ZQP_128x64.yamlmodel:  name: 'ZQP'  pretrained: True #Truedata:  type: 'image'  sources: ['dukemtmcreid']  targets: ['dukemtmcreid']       # market1501,  dukemtmcreid  height: 128  width: 64  combineall: False  transforms: ['random_flip']    #random_flip random_erase  color_jitter  save_dir: 'deep_sort/deep/reid/log/ZQP'loss:  name: 'softmax'  softmax:    label_smooth: Truetrain:  optim: 'amsgrad'  lr: 0.0015  max_epoch: 40  #150  batch_size: 64  fixbase_epoch: 10   #10  open_layers: ['classifier']  #'classifier'  lr_scheduler: 'cosine'# stepsize: [60]test:  batch_size: 300  dist_metric: 'euclidean'  normalize_feature: False  evaluate:  False  #test only  eval_freq: -1  rerank: False运行训练程序main.pypython main.py \    --config-file  deep_sort/deep/reid/configs/ZQP_128x64.yaml   \    --root  ~/your_datasets/dukemtmc_reid   \    model.load_weights ~/your_dir/deep_sort/deep/checkpoint/ckpt.t7这里,在配置文件ZQP_128x64.yaml中pretrained = True,表示需加载预先训练的权重ckpt.t7。如果从头开始训练,则pretrained = False,并在命令行中删除model.load_weights项。命令行指定配置文件ZQP_128x64.yaml,数据集根目录dukemtmc_reid。此外,采用dukemtmc训练数据集行人ID数为702,所以,需更改特征类型为702, 即模型文件model_ZQP.py中num_classes=702。数据集目录组成应为:~/your_datasets/dukemtmc_reid/dukemtmc-reid/DukeMTMC-reID/bounding_box_test, bounding_box_train, query用逗号分开的项目表示在DukeMTMC-reID目录下有三个子目录bounding_box_test、bounding_box_train和query。用自己的数据集训练reid要利用KaiyangZhou reid训练程序,需要将数据集构造成market-1501的结构形式,即bounding_box_train, bounding_box_test, guery。下面是一个例子,用veri-wild提供的小汽车数据集来构造符合market-1501构成形式的数据集。veri-wild提供了包含40多万张4万辆汽车的id图片,每个汽车ID目录下有多张不同摄像机和不同时刻获取的汽车图片。假定选择800个汽车ID组成训练集,另外800个汽车ID组成测试集,从测试集中取出每个汽车ID在每个摄像头下的图片,组成query。(1)从veri-wild中分别抽取800个ID放入train_800和test_800,每个ID的图片在20-30张之间。(2)对train_800和test_800图片进行resize,压缩数据集容量。(3)按照market-1501文件命名规则更改数据集图片名称,并从test数据集挑选图片放入query。由此,仿照market-1501构成训练reid的小汽车数据集,进行汽车特征的reid特征识别模型。参考程序如下:import osfrom shutil import copyfile, copytree, rmtreefrom torch.functional import broadcast_shapesfrom PIL import Imageimport matplotlib.pyplot as pltimport randomimport shutildef get_cam_n(f_list):      # 构造列表[file_name, camera_ID],列表抽取,每个camera_ID只取一项。    A = []    for cam_n in range(1,7):        for j in range(len(f_list)):            B = f_list[j][1]             if (f_list[j][1] == cam_n):                A.append(f_list[j])                break    return Adef make_fileprefix(src_dir, tar_dir, gallary_dir):   # src_dir 带ID子目录的数据集目录,ID子目录下是同一ID的图片。    for subdir in os.listdir( src_dir ):   # ID子目录名称        src=src_dir+"/"+subdir        f_list = []        for file_name in os.listdir(src):  # 提取ID子目录内文件名称            fileprefix= os.path.splitext(file_name)[0]            cam_n = random.randint(1,6)            A1=[fileprefix, cam_n]            f_list.append(A1)            file_name1 = subdir+ "_c"+str( cam_n) +"_f" +    fileprefix + ".jpg"            copyfile(src+"/"+file_name, tar_dir+"/"+file_name1)  #将各子目录文件添加prefix,拷贝到一个目标文件夹tar_dir            print("copyfile: ", file_name1)        f_cam=get_cam_n(f_list)           # 列表[file_name, camera_ID],每个camera_ID只有一张图片。        for i in range(len(f_cam)):       # 从 test中抽取图片到query            file_prefix = f_cam[i][0]            cam_n = f_cam[i][1]            file_name1 = subdir+ "_c"+str( cam_n) +"_f" +    file_prefix + ".jpg"            file_name0 = src+"/"+file_prefix+'.jpg'            copyfile(file_name0, gallary_dir+"/"+file_name1)  #将各子目录文件添加prefix,拷贝到一个目标文件夹tar_dir    returndef image_resize(src_dir, tar_dir):    for subdir in os.listdir( src_dir ):   # ID子目录名称        src=src_dir+"/"+subdir        tar_ID_dir=tar_dir+"/"+subdir        if  os.path.isdir(tar_ID_dir):            rmtree(tar_ID_dir)        os.mkdir(tar_ID_dir)            for file_name in os.listdir(src):  # 提取ID子目录中文件名称            img=Image.open(src+"/"+file_name)            w, h =img.size        #img.show()            imax = max(h,w)            if imax < 280:                copyfile(src+"/"+file_name, tar_ID_dir+"/"+file_name)            else:                rate_hw = 280/imax                w,h = int(rate_hw*w), int(rate_hw*h)                new_img = img.resize((w, h),Image.BILINEAR)            #new_img.show()                new_img.save(tar_ID_dir+"/"+file_name)            print(tar_ID_dir+"/"+file_name)        returnif __name__ == '__main__':    src_dir = "~/your_datasets/resize/train_800"    tar_dir = "~/your_datasets/train_box"    if  os.path.isdir(tar_dir):        rmtree(tar_dir)    os.mkdir(tar_dir)    gallary_dir = "your_datasets/resize/gallary"    if  os.path.isdir(gallary_dir):        rmtree(gallary_dir)    os.mkdir(gallary_dir)    make_fileprefix(src_dir, tar_dir, gallary_dir)    ————————————————版权声明:本文为CSDN博主「王定邦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44238733/article/details/123805195
  • [热门活动] 华为数字机器人7天训练营完美收官
    2022年5月,华为数字机器人7天训练营于线上成功举办,由华为一线人员亲授数字机器人理论及开发技能,助力开发者创新智能自动化办公模式。此次训练营一经上线就广受好评,吸引近1000名开发者、IT技术爱好者踊跃参与报名学习。 -4.7w人观看开营直播课-训练营伊始,华为RPA院校合作总监韩江老师带来精彩的开营直播课,社媒观看人次高达4.7w。他生动介绍了华为RPA产品构成、各产品关键特性及能力等,并通过演示数据抓取、发票抓取的场景操作加深用户对RPA的认识。此外,他还谈到华为RPA人才培养计划、训练营精品课程设置及活动关键亮点等,获得用户对课程质量的高度认可。【点击回放开营直播】 -954名开发者踊跃学习-活动期间,共954名开发者齐聚线上学习训练营7天课程,其中293人完成了全部学习打卡。7天课程内容设置由浅入深,循序渐进,促使新手也能轻松上手。学员在每堂课上不仅学到扎实的理论基础,还有开发实战演示操作,如UI录制操作、网页数据抓取操作场景等,形成教学-实践-反馈闭环模式,助力学员全方面成长。 为高效辅助学员学习,训练营共设置6个社群,每个社群配置4名技术老师+2名督学助手,及时响应学员的各类问题,社群活跃度极高,互动量达1w+。与此同时,社区论坛互动也尤为热烈,专家坐堂答疑,并引导学员输出心得体会巩固学习成果。据统计,社区阅读量高达5.8万+,互动量达2753,收集心得体会共计73份。在专家的谆谆教导下,开发者们积极踊跃尝试,拓宽了产品使用场景,从而反向推动了产品更好的升级。 -9个优秀毕业设计作品成功入围-值得一提的是,为验证学习成果、引导学员们深入使用产品,训练营开展了毕业设计活动。在活动期内共收到25份毕业设计作品,其中9人入围最终线上答辩环节。经过3个小时激烈比拼,最终决出获奖名次。学员之间互相切磋,均给予很高评价。他们开发的数字机器人涵盖电商价格获取、物流订单导入、股票缴费、变更文档检查等诸多实际应用场景,充分体现了华为数字机器人的自动化能力及价值。 -用户好评率高-依托华为数字机器人产品的强大智能,团队精心打造的课程体系及精细运营,开发者们对本次训练营的好评甚高: 本次华为数字机器人7天训练营已完美收官,感谢各位开发者的积极参与、创新突破,同时也感激各位在学习开发的过程中提供的宝贵建议,对产品日后的优化具有极大的价值。数字化转型的步伐在加快,让我们期待下一次的课程训练营,共同探索华为数字机器人更多的可能性,在快速迭代的技术浪潮中站稳脚跟。
  • [其他] 浅谈深度学习常用术语
    深度学习常用术语· 样本(sample)或输入(input)或数据点(data point):训练集中特定的实例。我们在上一章中看到的图像分类问题,每个图像都可以被称为样本、输入或数据点。· 预测(prediction)或输出(output):由算法生成的值称为输出。例如,在先前的例子中,我们的算法对特定图像预测的结果为0,而0是给定的猫的标签,所以数字0就是我们的预测或输出。· 目标(target)或标签(label):图像实际标注的标签。· 损失值(loss value)或预测误差(prediction error):预测值与实际值之间的差距。数值越小,准确率越高。· 类别(classes):给定数据集的一组可能的值或标签。在前一章的例子中有猫和狗两种类别。· 二分类(binary classification):将输入实例归类为两个互斥类别中的其中一个的分类任务。· 多类别分类(multi-class classification):将输入实例归类为两个以上的不同类别的分类任务。· 多标签分类(multi-label classification):一个输入实例可以用多个标签来标记。例如根据提供的食物不同来标记餐馆,如意大利菜、墨西哥菜和印度菜。另一个常见的例子是图片中的对象检测,它使用算法识别出图片中的不同对象。· 标量回归(scalar regression):每个输入数据点都与一个标量质量(scalar quality)相关联,该标量质量是数值型的。这样的例子有预测房价、股票价格和板球得分等。· 向量回归(vector regression):算法需要预测不止一个标量质量。一个很好的例子当你试图识别图片中鱼的位置边界框时。为了预测边界框,您的算法需要预测表示正方形边缘的4个标量。· 批(batch):大多数情况下,我们在称为批的输入样本集上训练我们的算法。取决于GPU的内存,批尺寸一般从2~256不等,权重也在每个批次上进行更新,因此算法往往比在单个样例上训练时学习的更快。· 轮数:在整个数据集上运行一遍算法称为一个Epoch。通常要训练(更新权重)几个Epoch。
  • [技术干货] 【YOLOv5-6.x】设置可学习权重结合BiFPN(Add操作)[转载]
    前言在之前的这篇博客中,简要介绍了BiFPN的原理,以及YOLOv5作者如何结合BiFPN:【魔改YOLOv5-6.x(中)】:加入ACON激活函数、CBAM和CA注意力机制、加权双向特征金字塔BiFPN本文将尝试进一步结合BiFPN,主要参考自:YOLOv5结合BiFPN 修改yaml文件(以yolov5s为例)只修改一处本文以yolov5s.yaml为例进行修改,修改模型配置文件时要注意以下几点:这里的yaml文件只修改了一处,也就是将19层的Concat换成了BiFPN_Add,要想修改其他层的Concat,可以类比进行修改BiFPN_Add本质是add操作,不是concat操作,因此,BiFPN_Add的各个输入层要求大小完全一致(通道数、feature map大小等),因此,这里要修改之前的参数[-1, 13, 6],来满足这个要求:-1层就是上一层的输出,原来上一层的输出channel数为256,这里改成51213层就是这里[-1, 3, C3, [512, False]], # 13这样修改后,BiFPN_Add各个输入大小都是[bs,256,40,40]最后BiFPN_Add后面的参数层设置为[256, 256]也就是输入输出channel数都是256# YOLOv5 by Ultralytics, GPL-3.0 license# Parametersnc: 80  # number of classesdepth_multiple: 0.33  # model depth multiplewidth_multiple: 0.50  # layer channel multipleanchors:  - [10,13, 16,30, 33,23]  # P3/8  - [30,61, 62,45, 59,119]  # P4/16  - [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbonebackbone:  # [from, number, module, args]  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4   [-1, 3, C3, [128]],   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8   [-1, 6, C3, [256]],   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16   [-1, 9, C3, [512]],   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32   [-1, 3, C3, [1024]],   [-1, 1, SPPF, [1024, 5]],  # 9  ]# YOLOv5 v6.0 BiFPN headhead:  [[-1, 1, Conv, [512, 1, 1]],   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   [[-1, 6], 1, Concat, [1]],  # cat backbone P4   [-1, 3, C3, [512, False]],  # 13   [-1, 1, Conv, [256, 1, 1]],   [-1, 1, nn.Upsample, [None, 2, 'nearest']],   [[-1, 4], 1, Concat, [1]],  # cat backbone P3   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)   [-1, 1, Conv, [512, 3, 2]],  # 为了BiFPN正确add,调整channel数   [[-1, 13, 6], 1, BiFPN_Add3, [256, 256]],  # cat P4 <--- BiFPN change 注意v5s通道数是默认参数的一半   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)   [-1, 1, Conv, [512, 3, 2]],   [[-1, 10], 1, Concat, [1]],  # cat head P5   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)  ]修改common.py复制粘贴一下代码:# 结合BiFPN 设置可学习参数 学习不同分支的权重# 两个分支add操作class BiFPN_Add2(nn.Module):    def __init__(self, c1, c2):        super(BiFPN_Add2, self).__init__()        # 设置可学习参数 nn.Parameter的作用是:将一个不可训练的类型Tensor转换成可以训练的类型parameter        # 并且会向宿主模型注册该参数 成为其一部分 即model.parameters()会包含这个parameter        # 从而在参数优化的时候可以自动一起优化        self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)        self.epsilon = 0.0001        self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)        self.silu = nn.SiLU()    def forward(self, x):        w = self.w        weight = w / (torch.sum(w, dim=0) + self.epsilon)        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1]))# 三个分支add操作class BiFPN_Add3(nn.Module):    def __init__(self, c1, c2):        super(BiFPN_Add3, self).__init__()        self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)        self.epsilon = 0.0001        self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)        self.silu = nn.SiLU()    def forward(self, x):        w = self.w        weight = w / (torch.sum(w, dim=0) + self.epsilon)  # 将权重进行归一化        # Fast normalized fusion        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2])) 修改yolo.py在parse_model函数中找到elif m is Concat:语句,在其后面加上BiFPN_Add相关语句:elif m is Concat:    c2 = sum(ch[x] for x in f)# 添加bifpn_add结构elif m in [BiFPN_Add2, BiFPN_Add3]:    c2 = max([ch[x] for x in f]) 修改train.py1. 向优化器中添加BiFPN的权重参数将BiFPN_Add2和BiFPN_Add3函数中定义的w参数,加入g1    g0, g1, g2 = [], [], []  # optimizer parameter groups    for v in model.modules():        # hasattr: 测试指定的对象是否具有给定的属性,返回一个布尔值        if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter):  # bias            g2.append(v.bias)  # biases        if isinstance(v, nn.BatchNorm2d):  # weight (no decay)            g0.append(v.weight)        elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter):  # weight (with decay)            g1.append(v.weight)        # BiFPN_Concat        elif isinstance(v, BiFPN_Add2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):            g1.append(v.w)        elif isinstance(v, BiFPN_Add3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):            g1.append(v.w) 2. 查看BiFPN_Add层参数更新情况想要查看BiFPN_Add层的参数更新情况,可以参考这篇博客【Pytorch】查看模型某一层的参数数值(自用),直接定位到w参数,随着模型训练输出对应的值。 ————————————————版权声明:本文为CSDN博主「嗜睡的篠龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_43799388/article/details/124091648
  • [热门活动] 【CANN训练营】新手班第三章
    本章学习目标:1. 了解异构计算架构CANN在神经网络训练中发挥的主要作用。2. 掌握如何基于CANN将TensorFlow模型迁移到昇腾AI处理器上。3. 掌握如何在昇腾AI处理器上进行模型训练,感受昇腾AI的极致性能。4. 掌握如何查看训练日志和训练结果,具备基本的问题定界、定位能力。第二节 AI模型开发基础知识入门1、具备Python基础编程知识(这些内容都是比较简单的)a. 使用位置和关键字参数定义和调用函数b. 字典、 列表、 集合(创建、访问和迭代)c. for循环, for具有多个迭代器变量的循环(例如,for a, b in [(1,2), (3,4)])d. if/else条件块和条件表达式e. 字符串格式 (例如,'%.2f' % 3.14)f. 变量、赋值、基本数据类型 (int, float, bool, str等)2、深度学习和神经网络3、了解TensorFlow AI框架4、了解基于CANN的模型开发流程昇腾910 AI处理器是华为在2019年发布的人工智能(AI)专用的神经网络处理器。当前业界大多数训练脚本基于TensorFlow的Python API开发,默认运行在CPU/GPU/TPU上,为了使其能够利用昇腾910 AI处理器的澎湃算力执行训练,提升训练性能,我们需要基于CANN对TensorFlow模型进行适配和训练,5、了解遇到问题如何求助模型调试和调优过程中,不知道该怎么解决,或者有优化建议要反馈,您可以借助以下渠道:1. 在华为方集中组织培训的场景下,可求助培训或对应课程的接口人。2. 开发者自学的场景下:    a. 可在ModelZoo仓上提Issue,该仓的接口人会定期处理问题。    b. 可在昇腾社区论坛中查阅经验贴、或者发帖,论坛的接口人会定期处理问题。第三节 TensorFlow AI模型迁移详解本节学习目标:1. 了解为什么要做模型迁移2. 了解模型迁移的两种迁移方式3. 掌握如何进行模型迁移学习内容:1、要做模型迁移的原因:目前人工智能领域内,AI算法模型搭建方面的技艺已经是炉火纯青,市面上用于AI模型搭建的深度学习框架,除了华为开源的昇思MindSpore,还有Google的TensorFlow、Facebook的PyTorch、Caffe等。但是AI模型训练却是一个漫长的过程,随着模型参数量、样本的增多,训练一个模型动辄以月为单位,此时一款高性能AI处理器简直是雪中送炭。昇腾910 AI处理器是华为在2019年发布的人工智能(AI)专用的神经网络处理器,其算力高达256T,最新款算力高达310T,是业界主流处理器算力的2倍,基于昇腾910 AI处理器的昇腾系列硬件,比如Atlas 800训练服务器,算力更是大到惊人,此时你一定跃跃欲试了。除了昇思MindSpore外,TensorFlow等其他深度学习框架下的模型并不能直接在昇腾910 AI处理器上训练,为了使其充分利用昇腾910 AI处理器的澎湃算力来提升训练性能,我们需要借助异构计算架构CANN的Plugin适配层转换,使转换后的模型能够高效运行在昇腾910 AI处理器上。值得庆幸的是,目前,CANN已经能够支持多种主流AI框架,包括昇思MindSpore、TensorFlow、PyTorch、飞浆、ONNX等,并且开发者只需要非常少的改动,即可快速搞定算法移植,大大减少切换平台的代价。2、了解两种模型迁移方式:将TensorFlow网络模型迁移到昇腾AI处理器执行训练,主要有两种方式:a. 一种是自动迁移方式。通过迁移工具对原始脚本进行AST语法树扫描,可自动分析原生的TensorFlow API在昇腾AI处理器上的支持度,并将原始的TensorFlow训练脚本自动迁移成昇腾AI处理器支持的脚本,对于无法自动迁移的API,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。b. 一种是手工迁移方式。算法工程师需要人工分析TensorFlow训练脚本中的API支持度情况,并且参照文档逐一手工修改不支持的API,以便在昇腾AI处理器上训练,该种方式较为复杂,我们建议大家优先使用自动迁移方式。3、TensorFlow AI模型自动迁移详解:自动迁移是通过工具对原始脚本进行AST语法树扫描,可自动分析原生的TensorFlow API在昇腾AI处理器上的支持度,并将原始的TensorFlow训练脚本自动迁移成昇腾AI处理器支持的脚本,对于无法自动迁移的API,可以参考工具输出的迁移报告,对训练脚本进行相应的适配修改。迁移流程:自动迁移学习截图:
总条数:5192 到第
上滑加载中