• [分享交流] 人工智能-01 AI基础
    人工智能-01 AI基础持续更新,欢迎批评指正。本文旨在抛砖引玉,更详细的介绍仍然需要大家参考其他专业资料。AI初识人工智能、机器学习是一个大的研究领域,涉及计算机、软件、数理统计、概率论、模式识别等多个学科,应用范围也非常广泛,如图像分类、人脸识别、物体检测、语音识别、自然语言处理、计算机视觉等。首先大概了解一下人工智能、机器学习、深度学习的概念和相互关系。人工智能:希望机器能够像人类的大脑一样思考,并作出反应。机器学习:从大量的数据中找出规律,自动地学习出算法所需的参数。深度学习:机器学习的技术分支之一,主要是通过搭建深层的人工神经网络来进行知识的学习,输入数据通常较为复杂、计算量大。参考:cid:link_17AI发展历程人工智能发展简史:cid:link_38cid:link_12cid:link_19cid:link_25浅谈人工智能的下一个十年:cid:link_6什么是机器学习:cid:link_20AI工程应用:cid:link_21AI技术业界洞察分析:https://linstar.huawei.com/TI/report/details/529362f318cf4bfba1e75c1641b2060fAI应用开发流程AI应用生命周期参考华为云的软件全生命周期管理,软件生命周期经历了需求/规划、开发、测试、发布、运维、运营6个主要阶段,和传统产品的生命周期基本能一一对应起来。AI应用的开发也属于软件开发范畴,所以这里主要看一下AI应用的开发上线阶段。机器学习需要大量的数据做训练,并持续去迭代模型,所以AI应用和其他应用的开发略有差异,参考华为云的Modelarts一站式AI开发平台介绍,看看AI应用的开发有哪些流程。 从上图可以看出,首先需要训练数据,然后根据网络设计模型结构,把数据送给设计的网络去训练得到模型,训练过程中不断迭代优化模型,最终将模型部署上线提供服务,最后进入运维环节。Modelarts还提供了市场功能,可以把你的数据集、算法、模型等资产发布出去供其他人订阅使用,这样对于类似的应用场景(如车牌识别、人脸检测、花卉识别等)就增大了资产的复用性。Modelarts官方文档:cid:link_14数据集准备机器学习开发首先需要准备数据集,数据尽可能来源于真实场景。模型的质量越高,对数据集的需求量就越大、数据质量要求也就越高,比如物体识别场景就需要尽可能收集不同角度、背景、光照的样本数据。当数据采集和接入之后,数据一般是不能直接满足训练要求的。为了保障数据质量,数据准备工作还包括收集数据、标注数据、清洗数据、提取特征、存储数据等。数据集可以是业界共用的(比如手写数字识别数据集),也可以是自己采集、制作的,也可以是网络爬虫获取的,等等。注意一点,数据收集需要保证合法性,满足隐私保护等相关法律条例,不泄露用户数据和隐私,保证数据的安全性,境外收集数据还有其他法律法规需要关注。参考:cid:link_3模型训练AI模型的本质是一个函数,函数包含大量的参数,凭借我们熟悉的知道自变量和因变量,逻辑推导y=f(x)的表达式这种方式是不可行的,因为数据量太大了,这时只能通过训练的方式来拟合一个比较接近的函数。所以,模型训练也称模型开发,简单点说就是从数据中找算法,这个算法和传统的贪心、穷举算法不同,不是人为设计的,而是从数据中来的。模型开发过程实际就是构建一种模型结构,基于种深度学习框架搭建模型,接着在计算资源上训练模型,得到模型后对其测试比较不同模型的性能。性能指标除正确率、错误率、准确率、召回率这些基本指标外,还有训练时间、预测时间、CPU/GPU资源效率等。模型结构:贝叶斯、线性模型、支持向量机、全连接神经网络、卷积神经网络等。深度学习框架(引擎):pytorch、tensflow、caffe、mindspore、keras等计算资源:CPU/GPU/Ascend、单机/分布式除上面基本模型训练操作,模型开发过程中对模型的版本管理、增量训练、模型评估、元数据管理、可视化这些都属于训练的工作。推理预测AI模型开发完成后,可以将模型创建为AI应用,将AI应用快速部署为推理/预测服务,通过web应用或者API的形式对外提供服务。其他产品可以调用API的方式把AI推理能力集成到自己的IT平台中。部署方式常用在线服务、批量服务、边缘服务。简单理解,在线服务就是把服务部署在云端,大家都去云端请求服务;批量服务就是可以对批量数据进行推理;边缘服务就是把服务部署到带有计算能力的边缘设备上,在靠近用户侧提供算力把数据处理了,如手机设备。例如智能音箱,可以在设备端部署一个简单模型来接收唤醒指令,而将后续复杂的语音交互发送到云端的复杂模型进行处理。服务部署后还需要运维监控,通常可以部署在自己的服务器上,也可以部署到华为云、阿里云、AWS等云平台上,将环境的维护交给第三方云厂商托管。(欧洲电信标准协会(ETSI)对边缘计算的定义:在移动网络边缘提供IT服务环境和计算能力,强调靠近移动用户,以减少网络操作和服务交付的时延,提高用户体验。)边缘服务:cid:link_24华为modelarts技术架构:cid:link_29IEF边缘部署平台:cid:link_9MLOps从AI开发流程看,从零开始到上线一个模型,主要经历了系统设计、数据集准备、模型训练、模型评估、服务部署、运维监控等阶段。这几个阶段都需要专业的工具和知识,业界基于不同AI开发阶段,整合了人工智能一站式开发平台,将设计、开发、运维有机结合起来,你可以在一个平台上完成这一系列动作。MLOps,机器学习操作,就是机器学习时代的DevOps。主要作用就是建立一个标注化的模型开发、部署、运维流程,通过缩短开发部署的时间来更快的软件迭代。MLOps的迭代开发模式和上面modelarts平台提供的的开发流程是不是很相似呢。现在谷歌、亚马逊、阿里、华为等都有自己的AI开发平台,如华为modelarts平台提供的内置模块workflow。AI开发平台提供的关键作用有:数据处理:实现数据集的特征组合、筛选和转换,从数据集中提取关键特征,供模型训练使用。模型训练:提供AI算法框架,提交训练任务,提供GPU、CPU训练计算供开发者选择。模型管理:查看模型包的详细信息、删除模型、下载模型等管理。推理服务:模型发布到推理框架上,开始对外提供AI服务。 MLOps介绍:cid:link_15MLOps平台对比:cid:link_28ML开发流程:cid:link_0ML涉及的模块:cid:link_1AI开发基本过程:cid:link_26AIOps业界洞察:cid:link_7从听云科技看AIOps: cid:link_8ModelOps行业洞察与模型开发流水线AI Factory介绍:cid:link_4AI应用类型AI模型分为判别式AI(Discriminative AI)和生成式AI(Generative AI)。判别式AI关注的是对数据进行分类或建立模式识别的任务。它的目标是学习输入数据与其对应的标签或类别之间的关系。判别式模型直接对条件概率分布进行建模,例如给定输入x,预测输出y的条件概率P(y|x)。常见的判别式模型包括逻辑回归、支持向量机(SVM)、神经网络等,常见的应用如图像分类、物体检测、房间预测、物体跟踪等。生成式AI关注的是对数据进行建模,以便能够生成新的具有相似分布的数据样本。生成式AI(生成式人工智能)是指使用AI 来创作新内容,例如文本、图片、音乐、音频和视频。生成式模型的目标是学习联合概率分布P(x, y),其中x是输入数据,y是对应的标签或类别。生成式模型可以通过学习数据的分布特征来生成新的数据样本,例如生成对抗网络(GAN)、变分自编码器(VAE)等,常见的应用如ChatGPT、Sora等。随着ChatGPT、Sora的迅猛发展,生成式AI逐渐成为研究新热点。AI开发平台架构以Modelarts的架构为例理解AI平台架构,如下图所示,从底层往上次看,依次是硬件提供计算、网络、存储等基础资源;异构计算架构提供分布式调度能力;AI计算框架支持多种引擎,如常用的pytorch、tensflow、mindspore等;上层是数据管理、训练、推理等微服务。基于这些微服务就可以开发各种各样的行业应用。 硬件基础硬件基础资源包括计算、存储、网络等,这里重点介绍一下计算资源。深度学习最重要的就是数据和运算。数据越多,理论上模型就越精确;运算更快,模型迭代就越快,服务上线周期越短。人工神经网络就是通过构建具有很多隐层的模型,通过海量的训练数据,来确定模型参数,最终提升模型性能。这种算法的特点决定了对训练数据量和计算能力的要求。算力方面,当前流行的X86和ARM的传统CPU处理器架构往往需要数百甚至上千条指令才能完成一个神经元的处理,但对于并不需要太多的程序指令,却需要海量数据运算的深度学习的计算需求,这种CPU结构就略显吃力,因此GPU处理器在这种特殊的计算模式下就显示出了优势。图形处理器GPU最初是运行绘图运算工作的微处理器,可以快速地处理图像数据。后来科学家发现,其海量数据并行运算的能力与深度学习需求不谋而合,因此,被最先引入深度学习。如同线性代数,只需要基本的加减乘除方法即可快速的解决线性方程求解问题。分布式计算能力也应用于处理海量数据,提升计算速度。分布式训练:cid:link_10CPU/GPU/NP:http://3ms.huawei.com/km/groups/3823811/blogs/details/9090571?l=zh-cn&ctype=nullcid:link_22深度学习框架什么是深度学习框架?百度百科介绍:在深度学习初始阶段,每个深度学习研究者都需要写大量的重复代码。为了提高工作效率,这些研究者就将这些代码写成了一个框架放到网上让所有研究者一起使用。接着,网上就出现了不同的框架。随着时间的推移,最为好用的几个框架被大量的人使用从而流行了起来。简单来说就是工具、库、算法,作一个简单的比喻,一套深度学习框架就是一套积木,各个组件就是某个模型或算法的一部分,你可以自己设计如何使用积木去堆积符合你的工程。常用的深度学习框架有pytorch 、tensorflow、caffe、spark、mxnet等,不同框架有其自身的优缺点,选择一个合适的框架能起到事半功倍的作用,开发者可以根据业务和自身对框架的熟悉程度选择,用户可以在各个框架的官网上了解框架的详细信息。明确这些流行的框架都支持在不同计算资源上训练、推理。 深度学习框架:cid:link_11上层服务AI开发流程主要包括数据集准备、训练和推理,其实这三个大类细分还有很多地方可以深入研究。比如在数据管理里面涉及数据集标记、数据处理、团队标注等;在训练里面包括算法开发管理、分布式训练、训练版本/实验对比、模型评估等;在推理里面包括在线部署、边缘部署、模型管理、模型转换、模型压缩等。这些服务可以独立提供使用,也可以有机地组合起来,提升了通用场景的开发效率。再加上AI应用市场gallery,把算法、模型、数据集等作为资产发布到市场,让他人可以订阅使用,提升资产的复用性。其他参考资料机器学习首先是数学问题,或者说是概率问题。了解甚至掌握一些数学基础对学习和理解AI是十分必要的。基础教程Pytorch深度学习实践:cid:link_27AI基本概念:cid:link_18孙健老师课程(数据推导过程居多) cid:link_37机器学习笔记:cid:link_23重要理论马尔可夫链:cid:link_30神经网络:cid:link_33BP算法:cid:link_34卷积:cid:link_31傅里叶变换:cid:link_16cid:link_32小波变换:cid:link_35cid:link_36
  • [问题求助] gitee库授权 mdc pointpillar
    您好,我们近期正在对华为mdc610进行pointpillar开发,麻烦您提供一下https://gitee.com/huawei_mdc/centerpoint-pointpillars-mdc的授权,谢谢! 
  • 梯度弥散、梯度爆炸和模型退化
    在ResNet之前,简单粗暴的增加卷积层网络深度时,存在梯度弥散、梯度爆炸和模型退化等问题,简述如下:梯度弥散(梯度消失)发生原因 :在深度神经网络(尤其是深度卷积神经网络)中,增加卷积层导致网络变深。当使用激活函数(如 Sigmoid 或 Tanh )时,其导数可能较小。在反向传播过程中,梯度通过链式法则依次乘以各层的导数。当卷积层较多时,梯度在向前传递到前面各层时会随着层数增加而不断乘以这些小值,导致梯度变得越来越小,甚至趋近于零。具体表现 :在训练时,前面较浅层的权重更新几乎停滞,训练速度极慢,网络难以学到有用的特征。梯度爆炸(梯度膨胀)发生原因 :同样在模型加深的情况下,如果权重的初始化不恰当,或者所用激活函数在某些区域导数较大,那么在反向传播时,梯度可能会随着层数增加而逐渐变大,产生指数级增长。例如在训练时,如果权重初始化为较大的数值,可能会导致每一层的导数较大,从而在计算梯度时产生较大的数值,随着层数增加累积起来。具体影响 :这会使模型参数的更新幅度变得非常大,造成网络参数的不稳定变化,如参数可能发散到很大或很小,导致训练过程崩溃,模型性能变差。模型可能会出现振荡现象,难以收敛到较好的结果。模型退化(性能下降)产生原因 :随着卷积层的叠加,网络深度增加,模型不仅面临梯度问题,而且还可能导致模型的表达能力或泛化能力在训练过程中出现退化问题。比如,在模型深度增加而不恰当的情况下,虽然理论上更深的网络应该能学习到更抽象、更复杂的特征,但在实际训练中可能因为难以优化等问题,反而导致模型在训练集和测试集上的表现不如较浅层的网络。它的出现可能与之前的梯度问题有关,也可能与网络架构设计不合理、优化算法不适应深层网络等因素有关。具体表现 :模型在测试集上的准确率下降,泛化能力变差,未能有效学习到数据中潜在的复杂模式和特征。
  • [其他] 检测精度mAP介绍
    以如faster RCNN的以下检测数据:检测精度(mAP 59.9% 和 73.2%)42.1% 的 mAP@0.5 和 21.5% 的 mAP@[.5, .95]在学术研究中,不同的数据集和任务有不同的标准。例如,在PASCAL VOC数据集上,mAP达到50%以上通常被认为是较好的结果,而70%以上则被认为是优秀的。在MS COCO数据集上,由于其更具挑战性,mAP达到40%以上通常被认为是较好的结果。在实际应用中,合格标准可能会根据具体的应用场景和需求而有所不同。例如,对于一些对准确性要求极高的应用场景,如医疗图像分析或自动驾驶,可能需要更高的mAP值才能满足要求。但对于一些对实时性要求较高、对准确性要求相对较低的应用场景,如视频监控中的简单物体检测,较低的mAP值可能也足够。这些mAP值没有达到80%(平均未达到,但在某些类型对象是达到的,比如bus/car等),这可能是由于以下几个原因:数据集的难度:PASCAL VOC和MS COCO数据集包含了许多具有挑战性的图像,例如,物体可能被遮挡、截断或具有不同的尺度和姿态。这些困难因素会降低模型的检测精度。模型的复杂度:尽管Faster R-CNN是一个强大的模型,但它仍然有可能无法捕获所有可能的物体特征。训练数据量:如果训练数据量不足,模型可能无法充分学习到物体的特征,从而影响检测精度。使用更大的数据集(如COCO)进行预训练可以提高在PASCAL VOC数据集上的检测精度。评估标准:mAP@[.5, .95]是一个更严格的评估标准,因为它考虑了不同IoU阈值下的平均精度。这使得模型需要在各种情况下都能准确检测物体,而不仅仅是对某个特定的IoU阈值。论文中提到的mAP值在当时被认为是相当不错的,尤其是在实时性方面,Faster R-CNN实现了近实时的检测速度,这对于许多实际应用来说是一个重要的优势。随着技术的发展,后续的研究可能会进一步提高mAP值,但这也需要在准确性和计算效率之间找到平衡。mAP(mean Average Precision):定义:mAP 是目标检测任务中常用的评估指标,表示平均精度(Average Precision, AP)的均值。AP 是针对每个类别计算的,表示在不同召回率(Recall)下的精度(Precision)的平均值。AP 是针对每个类别的平均精度,而 mAP 是对所有类别的 AP 取均值,从而得到一个整体的性能指标。使用 mAP 可以更全面地评估模型在所有类别上的性能,而不仅仅是单个类别。(Recall:召回率,表示模型检测到的正样本占所有实际正样本的比例。mAP 不带 @:默认 IoU 阈值为 0.5。)59.9% 和 73.2%:59.9%:在 PASCAL VOC 2007 数据集上,使用 RPN 和 Fast R-CNN 结合的方法,平均精度为 59.9%。73.2%:在 PASCAL VOC 2012 数据集上,使用 RPN 和 Fast R-CNN 结合的方法,平均精度为 73.2%。mAP@0.5 和 mAP@[.5, .95]:mAP@0.5:表示在 IoU(Intersection over Union)阈值为 0.5 时的平均精度。IoU 是衡量预测框和真实框重叠程度的指标,取值范围为 0 到 1。IoU = 0.5 表示预测框和真实框的重叠面积占两者并集面积的 50%。42.1%:在 MS COCO 数据集上,使用 RPN 和 Fast R-CNN 结合的方法,在 IoU 阈值为 0.5 时的平均精度为 42.1%。mAP@[.5, .95]:表示在 IoU 阈值从 0.5 到 0.95(步长为 0.05)时的平均精度。这表示模型在不同 IoU 阈值下的综合表现。21.5%:在 MS COCO 数据集上,使用 RPN 和 Fast R-CNN 结合的方法,在 IoU 阈值从 0.5 到 0.95 时的平均精度为 21.5%。
  • [其他] Warp 操作和R-CNN
    Warp 操作在计算机视觉和图像处理领域中指对图像进行几何变换的过程,它通过数学函数将图像中的像素从一个位置映射到另一个位置,从而实现图像的变形、扭曲或变换。这种操作可以用于多种目的,如图像配准、数据增强、视角变换等。例如,在图像配准中,可能会使用 warp 操作将一幅图像变形以与另一幅图像对齐。在语言中,warp可做名称和动词,含义是变形、扭曲 :引申义,指事物的变形、扭曲或偏离正常状态。例如:“The heat caused the metal to warp.”(高温使金属变形。)Warp 操作的应用图像配准 :在医学图像配准中,Warp 操作用于将浮动图像(moving image)根据变形场(deformation field)映射到固定图像(fixed image)的坐标系中,从而实现两幅图像的对齐。例如,在医学成像中,将不同时间或不同模态的图像进行配准,以便医生可以更准确地比较和分析病变区域。数据增强 :在深度学习中,Warp 操作常用于数据增强,通过对训练图像进行旋转、平移、缩放等变换,增加训练数据的多样性,提高模型的泛化能力。例如,在图像分类任务中,对训练图像进行轻微的旋转和平移,生成新的训练样本,使模型能够更好地适应不同的输入条件。视角变换 :在计算机视觉中,Warp 操作可以用于模拟摄像头的移动或视角的变化。例如,在 SLAM(Simultaneous Localization and Mapping)中,通过光流(optical flow)计算得到的 Warp 操作,可以将前一帧图像中的像素映射到下一帧图像的对应位置,从而实现视角的变换。对抗性攻击与训练 :Warp 技术可以用来生成对抗性样本,使得模型在这些样本上产生错误的预测。为了提高模型对对抗性攻击的鲁棒性,可以使用 Warp 对训练数据进行扰动,让模型在训练过程中就接触到这些对抗性样本。Warp 操作的计算Warp 操作的计算通常涉及以下步骤:定义变换函数 :根据具体的应用需求,定义一个数学函数来描述图像中每个像素的映射关系。这个函数可以是仿射变换、透视变换、非刚性变换等。例如,仿射变换可以用一个 2×3 的矩阵来表示,通过矩阵乘法将图像中的像素坐标映射到新的位置。生成映射网格 :根据变换函数,生成一个映射网格,该网格描述了图像中每个像素在变换后的位置。这个网格可以是一个二维数组,其中每个元素表示一个像素的坐标。重采样 :使用映射网格对原始图像进行重采样,得到变换后的图像。重采样方法可以是最近邻插值、双线性插值等。例如,双线性插值可以根据周围像素的值来计算变换后像素的值,从而实现平滑的变换效果。Warp 操作在 R-CNN 中的应用在 R-CNN 中,Warp 操作用于将每个 proposal(候选区域)调整为固定的大小,以便输入到后续的网络中进行分类和回归。具体来说,R-CNN 会对每个 proposal 进行 Warp 操作,将其调整为 227×227 的大小,然后送入卷积神经网络进行特征提取和分类。然而,这种 Warp 操作会导致图像的变形和扭曲,特别是对于非正方形的目标,可能会丢失重要的空间信息。此外,每个 proposal 都需要单独进行特征提取,导致了大量的重复计算。
  • [问题求助] HiLens支持从SD卡启动吗?
    SD卡烧录好欧拉系统,HiLens能够设置SD卡为启动首选项,使用SD卡烧录的系统吗?备注:HiLens根目录只有2GB,空间太少了,安装几个库就没有空间了,总计32GB的空间,分成了很多个区,不敢贸然合并,所以想搞个大容量SD卡,烧录系统使用
  • [技术干货] 算法的学习笔记—丑数(牛客JZ49)
    😀前言在程序设计和算法竞赛中,丑数问题是一个经典的动态规划题目。丑数(Ugly Number)定义为只包含质因子 2、3 和 5 的数。举例来说,数字 6(因子为 2 和 3)、数字 8(因子为 2)都是丑数,而数字 14 不是丑数,因为它包含质因子 7。在这种定义下,1 通常被视为第一个丑数。🥰丑数NowCoder😊题目描述把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。例子输入:N = 10输出:12解释:前10个丑数依次是 [1, 2, 3, 4, 5, 6, 8, 9, 10, 12],因此第10个丑数为12。😄解题思路解决该问题的常见方法是动态规划。动态规划的基本思想是从第一个丑数开始,逐步生成下一个丑数,直到得到第 N 个。核心思想定义状态:使用一个长度为 N 的数组 dp,其中 dp[i] 表示从小到大第 i+1 个丑数。初始化 dp[0] = 1,即第一个丑数是 1。生成丑数:由于丑数的定义,新的丑数可以通过已知的丑数乘以 2、3 或 5 来生成。因此,我们在每一步都计算下一个可以生成的丑数。三个指针:维护三个指针 i2, i3, i5,分别表示当前丑数数组中,乘以 2、3、5 后最小值的索引。每次选择这三个数中的最小值作为下一个丑数,并更新相应的指针。避免重复:如果当前生成的丑数等于多个最小值中的某个,我们需要将对应的指针后移,避免重复计算。例如,如果 dp[i] 既是 dp[i2] * 2,又是 dp[i3] * 3,我们需要同时更新 i2 和 i3。💖代码实现public int GetUglyNumber_Solution(int N) { if (N <= 6) return N; // 特殊情况:如果 N 小于等于6,直接返回 N,因为前6个丑数为 [1, 2, 3, 4, 5, 6] int i2 = 0, i3 = 0, i5 = 0; // 初始化三个指针,分别指向当前乘以2、3、5的丑数索引 int[] dp = new int[N]; // 创建数组存储前N个丑数 dp[0] = 1; // 第一个丑数是1 for (int i = 1; i < N; i++) { // 计算下一个可能的丑数,分别为2、3、5的倍数 int next2 = dp[i2] * 2, next3 = dp[i3] * 3, next5 = dp[i5] * 5; // 当前丑数是这三个数中的最小值 dp[i] = Math.min(next2, Math.min(next3, next5)); // 如果当前最小值是乘以2得到的,更新指针i2 if (dp[i] == next2) i2++; // 如果当前最小值是乘以3得到的,更新指针i3 if (dp[i] == next3) i3++; // 如果当前最小值是乘以5得到的,更新指针i5 if (dp[i] == next5) i5++; } // 返回第N个丑数 return dp[N - 1]; } 详解代码特殊处理:首先判断 N 是否小于等于 6,因为前 6 个丑数就是 [1, 2, 3, 4, 5, 6],直接返回即可。初始化指针和数组:i2, i3, i5 分别指向乘以 2、3、5 后可以得到的最小丑数索引。数组 dp 用于存储从小到大生成的丑数,初始值为 dp[0] = 1。计算最小值:每次循环中,分别计算 next2 = dp[i2] * 2,next3 = dp[i3] * 3,next5 = dp[i5] * 5,然后取这三个值的最小值作为下一个丑数。更新指针:如果当前生成的丑数是乘以 2 得到的,则指针 i2 向后移动,以便下次循环使用更新的丑数;如果是乘以 3 或 5 得到的,也分别移动指针 i3 和 i5。复杂度分析时间复杂度:O(N),因为我们只需要生成 N 个丑数,每次生成一个丑数的操作时间是常数。空间复杂度:O(N),因为我们使用了一个长度为 N 的数组来存储丑数。😄总结丑数问题通过动态规划的方式,巧妙地利用三个指针生成新的丑数,并且保证了每个丑数都是按顺序生成的。通过这种方式,我们可以在 O(N) 的时间内得到第 N 个丑数,是一种高效的解决方案。
  • StoryDiffusion漫画创作节活动分享-VOD/创意
    进入活动链接:https://pangu.huaweicloud.com/gallery/asset-detail.html?id=c1cf0774-59ce-44fc-a4a8-8fcf026d2fec1、切换规格为64GB的限时免费规格2、点击执行3、然后执行:4、继续执行5、切换python版本,这个很重要!!!!,6、安装和启动运行7、最后生成了一个链接:Running on public URL: https://0dfb450b322dd89a40.gradio.live8、点击该URL,就可以开始使用了角色:man  活动: play basketball,选择风格类型使用效果1,这个是“线条艺术”这个是“油画”效果这个是“日本动画”风格该模型部署起来很方便,模型很强大,伙伴们可以多多探索,多少挖掘
  • [问题求助] 提取CMU- Mosei数据集的特征
    再使用CMU-Multimodal SDK Version 1.2.0提取CMU- Mosei数据集的特征时,程序运行到一半叫我“Please input dimension namescomputational sequence version for computational sequence: ” 该输入什么?
  • [技术干货] 算法的学习笔记之—最长不含重复字符的子字符串(牛客JZ48)
    😀前言 在编程问题中,处理字符串是一个常见的挑战,其中有一个经典问题就是寻找字符串中最长不含重复字符的子字符串。该问题的目的是在给定的字符串中,找到一个没有重复字符的子字符串,并返回其长度。🥰最长不含重复字符的子字符串牛客网😊题目描述我们需要解决的是:给定一个只包含小写字母(a~z)的字符串,找出其最长的不含重复字符的子字符串的长度。例如,对于输入字符串 arabcacfr,其中最长的不含重复字符的子字符串是 acfr,其长度为4。😉解题思路解决这个问题最简单的思路是使用暴力法:遍历字符串的所有子字符串,检查每个子字符串是否包含重复字符,记录没有重复字符的最长子字符串的长度。然而,这种方法效率较低,尤其是在处理大规模字符串时,时间复杂度可能会达到 O(n²),因此我们需要一种更高效的方案。高效的方法可以通过滑动窗口和哈希表来优化,我们只需线性遍历字符串一次即可解决问题,时间复杂度为 O(n)。下面的 Java 代码实现了这个思路。😁Java代码实现public int longestSubStringWithoutDuplication(String str) { int curLen = 0; // 当前不含重复字符的子字符串长度 int maxLen = 0; // 目前找到的最长子字符串长度 int[] preIndexs = new int[26]; // 记录字符上一次出现的位置 Arrays.fill(preIndexs, -1); // 初始化字符的上次出现位置为 -1 for (int curI = 0; curI < str.length(); curI++) { int c = str.charAt(curI) - 'a'; // 将字符映射到 0 ~ 25 的整数 int preI = preIndexs[c]; // 获取该字符上次出现的位置 if (preI == -1 || curI - preI > curLen) { // 如果字符第一次出现或者在当前子字符串之外,更新当前长度 curLen++; } else { // 如果字符在当前子字符串内出现过,更新最长长度,并从重复字符之后开始新子字符串 maxLen = Math.max(maxLen, curLen); curLen = curI - preI; } preIndexs[c] = curI; // 更新字符上次出现的位置 } maxLen = Math.max(maxLen, curLen); // 确保结束时记录到最长长度 return maxLen; }代码详解变量定义:curLen: 当前不含重复字符的子字符串长度。maxLen: 记录到目前为止,最长的不含重复字符子字符串的长度。preIndexs: 一个大小为26的数组,用来存储每个字符上次出现在字符串中的位置。由于字符串只包含a~z的字符,因此数组长度为26,preIndexs[i]对应第i个字母(a对应0,b对应1,以此类推)。初始化:将 preIndexs 数组的所有元素初始化为 -1,表示每个字符一开始都没有出现过。遍历字符串:遍历字符串的每个字符,获取其在 preIndexs 中记录的上一次出现的位置 preI。如果该字符第一次出现,或者它的上一次出现位置在当前子字符串之外(即 curI - preI > curLen),说明当前字符没有重复,当前子字符串的长度 curLen 增加1。如果该字符在当前子字符串内出现过(即 curI - preI <= curLen),则更新 maxLen,并将当前子字符串重新设置为从重复字符的下一个位置开始,长度为 curI - preI。更新位置:每次遍历字符时,将其在 preIndexs 中的位置更新为当前下标。返回结果:遍历完字符串后,再次更新 maxLen,确保返回值是最终的最长子字符串长度。解题思路总结这个算法的核心思想是用滑动窗口的方法动态维护一个不含重复字符的子字符串,并通过记录每个字符的上一次出现位置,避免了重复字符的出现。这样我们就能在一次遍历中找到最长的不含重复字符的子字符串,时间复杂度为 O(n),空间复杂度为 O(1)。💝算法复杂度分析时间复杂度:每个字符只会被访问两次(一次是进入窗口,一次是离开窗口),因此时间复杂度为 O(n),其中 n 是字符串的长度。空间复杂度:由于只需要一个长度为 26 的数组来存储字符出现的位置,空间复杂度为 O(1)。💖实际应用场景这种问题在实际开发中非常常见。例如:在文本处理系统中,我们可能需要查找一段不含重复字符的文本片段,以进行进一步的分析。在数据分析中,类似的思路可以用来寻找交易记录中的最长不重复行为序列。在爬虫等系统中,处理不同网页路径的去重问题时,字符串处理的高效算法也至关重要。😄总结求解最长不含重复字符的子字符串的问题,关键在于使用滑动窗口技术和哈希表来跟踪字符的最近出现位置,避免重复字符的出现,从而实现高效的解决方案。通过一次遍历,我们能够找到字符串中最长的不含重复字符的子字符串,并返回其长度。这种方法不仅减少了时间复杂度到 O(n),而且代码结构简洁,易于理解和实现。滑动窗口的思想广泛应用于各种字符串处理问题中,不仅限于这道题目,还可以拓展到其他场景。在实际应用中,处理字符串、文本或序列中的重复字符问题非常常见,无论是数据清理、爬虫去重还是用户行为分析,掌握这类高效的算法对于开发和优化系统具有重要意义。通过这道题,我们也可以更好地理解如何通过空间换时间的技巧来优化算法的性能,并学会利用数组或哈希表等工具来记录状态信息,使得问题可以在线性时间内高效解决。
  • [问题求助] yolo检测
    ImportError: cannot import name 'weight_init' from 'timm.models.layers' (F:\anaconda\envs\zkyolov8\lib\site-packages\timm\models\layers\__init__.py)这种报错怎么解决呀?谢谢
  • [问题求助] rpmbuild打包时候strip出错
    大佬们这是为啥呢,意思还得重新手动编译opencv库吗?
  • [问题求助] IVR以GSL的方式开发,只放音不收号的cell需要使用哪个cell怎么配置
    【问题来源】            重庆银行(易云)【问题简要】            IVR以GSL的方式开发,只放音不收号的cell需要使用哪个cell怎么配置【问题类别】【必填】    IVR-GSL【AICC解决方案版本】【必填】      AICC可选择版本:AICC 23.200    【UAP可选择版本:V300R001C02SPC109】    【CTI可选择版本:V300R008C25SPC019】【期望解决时间】      尽快【问题现象描述】【必填】         IVR以GSL的方式开发,只放音不收号(也就是放音的时候不被打断)的cell需要使用哪个cell怎么配置
  • [计算类] trans_cast算子转换失败
    系统为ubuntu18.04.6 arm架构、版卡为atlas200,芯片为310,cann版本已升级为最新版本6.0.1、驱动为21.0.2,RC模式npu-smi infopytorch的模型转onnx,用atc工具将onnx转成om模型,atc --model=./model.onnx --framework=5 --output=./model --soc_version=Ascend310报错trans_cast算子转换失败,如下:​​​​​​​
  • [应用开发] SegFormer-B0 OM模型在MDC300F上推理时间为1000ms
    在将segformer-b0算法模型转OM后,在MDC300F MINI上推理耗时1000ms。ONNX中MatMul算子的输入数据的shape带batch维度,将算子的type类型更改为 BatchMatMul后,转OM时,发现MatMul算子前后各出现一个trans_TransData算子。通过profiling计算算子耗时,发现TransposeD、ArgMaxD、TransData、SoftmaxV2、BatchMatMul占用大量的推理时间。请问如何避免带batch维度的MatMul产生TransData算子?针对现在算子耗时,有什么优化的方法吗?