-
昇腾芯片CANN中国研发的AI平台200DK开发板
-
借用李清照《如梦令》中的一词
-
参数:Field, the happy girl ,the flowers,Fairy tale style, full-color。
-
活动作品222222222222222222222
-
华为云AI绘画创作分享
-
the girl next door
-
哈哈哈哈哈哈哈哈哈哈,第一次玩这种文字AI的,感觉好有趣,虽然刚开始AI出了一个老妖婆,但是最终在本学渣的不懈努力下,嘿嘿,成功喽.
-
从别的日子里飘浮到我的生命里
-
在使用ModelArts的自动学习功能时,标注数据后,发布数据集显示发布失败。
-
sunset chart
-
第一章课后作业1打卡
-
torch模型迁移到mindspore模型的经验分享1、gscnn模型开发背景我参加过一期昇腾众智迁移项目,负责gscnn模型的迁移工作,积累了不少经验和心得,希望可以和小伙伴们一起分享,能帮助到新加入的小伙伴们,也希望昇腾社区越办越好!gscnn模型是执行语义分割任务的,语义分割任务是对图像中的每一个像素进行分类,现今SOTA的方法是直接使用一个网络来处理。但是图像中包括颜色、形状、文本等低级语义信息往往会被忽略掉。由于图像中的信息是多种多样的,所以将这些信息输入一个统一的网络会使得分割结果不是最优的。因此作者提出了一种新的思路,通过两个并行CNN结构来分别进行常规抽取和抽取图像的边界相关信息。作者将他们分别称为regular stream和shape stream。Regular steam的结构与传统的语义分割模型相似。而Shape stream的主要作用是获取图像中的边界信息,最终将两者信息进行融合,从而得到最终的分割结果。2、开发经验我将开发流程分为四大步,分别是读取源码 , 查询算子对应关系 ,代码迁移以及最后一步网络调试调优. 这里我将按照开发流程来逐一介绍每一步的开发经验。读取源码这一步其实是项目的前期准备工作,为了更好的迁移项目,我们必须要熟读源码,将源码的数据预处理,网络构建以及网络训练全部弄懂. 同时我们也要熟读论文,对论文的整体内容有一定的把握,此时要特别注意论文里面对训练配置的描述,这将对我们的迁移有着至关重要的作用.通过前期准备工作,我们可以对网络结构有着更深的了解.gscnn的结果如图所示:查询算子对应关系这一步其实是为了保证这个模型具备可迁移性,我们需要在源码中找到其用到框架中的哪些算子,然后去minspore框架当中找到其对应关系,在这里,有一点我们需要特别注意,就是虽然有对应算子,但是其中的参数有可能不一样,我们在对应的时候需要特别注意相关参数. 在这步过程中,如果我们发现没有相应的算子,这时候需要我们仔细观察没有的算子实现的功能,能否用其他算子进行代替. 如果不能,我们再考虑能够自己使用python语句将算子功能自己实现出来.当上面两步都不行的话,我们这时候需要考虑代码的可迁移性,可以及时和工程师进行沟通,商讨一些办法.在这里我将举个算子对应的例子来简单对比一下.下面这个是minspore框架中的batchnorm2d的源码:class BatchNorm2d(_BatchNorm): r""" Batch Normalization layer over a 4D input. .. math:: y = \frac{x - \mathrm{E}[x]}{\sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta Note: The implementation of BatchNorm is different in graph mode and pynative mode, therefore that mode can not be changed after net was initialized. Note that the formula for updating the :math:`moving\_mean` and :math:`moving\_var` is .. math:: \text{moving_mean}=\text{moving_mean∗momentum}+μ_β\text{∗(1−momentum)}\\ \text{moving_var}=\text{moving_var∗momentum}+σ^2_β\text{∗(1−momentum)} def __init__(self, num_features, eps=1e-5, momentum=0.9, affine=True, gamma_init='ones', beta_init='zeros', moving_mean_init='zeros', moving_var_init='ones', use_batch_statistics=None, data_format='NCHW'): """Initialize BatchNorm2d.""" super(BatchNorm2d, self).__init__(num_features, eps, momentum, affine, gamma_init, beta_init, moving_mean_init, moving_var_init, use_batch_statistics, input_dims='2d', data_format=data_format) def _check_data_dim(self, x): if x.ndim != 4: pass下面这个是torch框架的batchnorm2d的源码:class BatchNorm2d(_BatchNorm): r"""Applies Batch Normalization over a 4D input (a mini-batch of 2D inputs with additional channel dimension) as described in the paper `Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift <https://arxiv.org/abs/1502.03167>`__ . .. math:: y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta The mean and standard-deviation are calculated per-dimension over the mini-batches and :math:`\gamma` and :math:`\beta` are learnable parameter vectors of size `C` (where `C` is the input size). By default, the elements of :math:`\gamma` are set to 1 and the elements of :math:`\beta` are set to 0. The standard-deviation is calculated via the biased estimator, equivalent to `torch.var(input, unbiased=False)`. .. note:: This :attr:`momentum` argument is different from one used in optimizer classes and the conventional notion of momentum. Mathematically, the update rule for running statistics here is :math:`\hat{x}_\text{new} = (1 - \text{momentum}) \times \hat{x} + \text{momentum} \times x_t`, where :math:`\hat{x}` is the estimated statistic and :math:`x_t` is the new observed value. Shape: - Input: :math:`(N, C, H, W)` - Output: :math:`(N, C, H, W)` (same shape as input) def _check_input_dim(self, input): if input.dim() != 4: raise ValueError("expected 4D input (got {}D input)".format(input.dim()))我们仔细观察各自框架的源码,上面注释有公式的介绍,我们可以看出来两个框架的momentum参数是和为1的关系,而不是简单的对应关系,这里要特别注意友情提示: mindspore官网上有与torch框架对应算子的文档介绍, 比较常见的上面都有,我们可以直接去看,如果有什么算子上面没有介绍,欢迎提出.代码迁移代码迁移这一步主要是我们前两步如果做的很好,那么迁移这一步将极其顺利,在这里,我有一些小经验想分享一下.我们迁移的顺序可以先迁移数据预处理, 迁移好之后,我们可以进行测试,确保数据预处理迁移完全正确,这样我们后面出现问题,可以确保不是数据集的问题.接下来迁移网络会更合理一些,迁移网络之后可以拿tensor常量过一遍网络,如果网络迁移的没有问题,并且初始化也一致的话,那么过一遍网络的结果也应该完全一样.这里有个想强调的点,就是初始化,因为初始化具有一定随机性,所以我们不能保证初始化完全一样,这时候有两种方法,一种是固定随机种子,另一种比较麻烦,就是将初始化改成全是one的方法,这样可以看出我们的网络逻辑是否有问题.然后再迁移损失函数部分,如果我们前面都保持一致的话,那么此步得出的损失函数也应该完全一样.最后在迁移训练部分, 注意torch的训练逻辑,这里torch和mindspore的训练是有所不同的,mindspore的训练是封装好的.举个简单例子看一下mindspore的训练步骤:import numpy as np import mindspore.dataset as ds import mindspore.nn as nn import mindspore as ms from mindspore.common.initializer import Normal def get_data(num, w=2.0, b=3.0): """生成样本数据及对应的标签""" for _ in range(num): x = np.random.uniform(-10.0, 10.0) noise = np.random.normal(0, 1) y = x * w + b + noise yield np.array([x]).astype(np.float32), np.array([y]).astype(np.float32) def create_dataset(num_data, batch_size=16): """生成数据集""" dataset = ds.GeneratorDataset(list(get_data(num_data)), column_names=['data', 'label']) dataset = dataset.batch(batch_size) return dataset class LinearNet(nn.Cell): """定义线性回归网络""" def __init__(self): super().__init__() self.fc = nn.Dense(1, 1, Normal(0.02), Normal(0.02)) def construct(self, x): return self.fc(x) train_dataset = create_dataset(num_data=160) net = LinearNet() crit = nn.MSELoss() opt = nn.Momentum(net.trainable_params(), learning_rate=0.005, momentum=0.9) # 使用Model构建训练网络 model = ms.Model(network=net, loss_fn=crit, optimizer=opt, metrics={"mae"})我们可以看出来mindspore的训练网络是封装到mindspore.Model里, 将损失函数, 优化器 以及评价指标全都封装里面了,而不像torch框架当中需要自己写训练,进行for循环迭代,不断读取数据,计算损失和梯度,进行反向传播,对于使用者来说,将更加方便.网络调试调优网络调试调优就是进行调参, 使模型更能达到更低点, 使训练精度更高.min-batchs大小和学习率调整的理想状况是刚开时的时候选取较小的min-batchs(较大的学习率, 这里的较大较小是相对的),目的是让训练速度(收敛)变快, 随着迭代次数的增加,选取较大的min-batchs(较小的学习率)使得收敛速度放慢,避免错过最小值(最大值)。当梯度过大的时候,我们可以使用梯度裁剪, 当梯度过小的时候,我们可以使用loss_scale, 来进行放大梯度.我们还可以更换不同的优化器来观察训练效果, 看哪种优化器的训练效果更好.我们需要仔细观察loss的下降情况,这样我们可以制定对应的动态学习率,动态学习率相比静态学习率效果将达到更好.性能方面:当性能方面差异比较大时,我们可以测试每个算子所用的时间, 排查出究竟是哪个算子的问题, 然后针对这个算子进行仔细研究, 这里有一个小方法,就是可以将foalt32转换成float16,这时候精度不会产生较大影响,但性能会提升很多.mindspore平台正在不断进步, 虽然还有一些不足之处,但我相信随着时间的迁移,他一定会越来越好的,希望更多的小伙伴可以一起参与到mindspore框架的研发之中,加油!
-
图像识别的高级阶段——拥有视觉的机器 目前的图像识别技术是作为一个工具来帮助我们与外部世界进行交互,只为我们自身的视觉提供了一个辅助作用,所有的行动还需我们自己完成。而当机器真正具有了视觉之后,它们完全有可能代替我们去完成这些行动。目前的图像识别应用就像是盲人的导盲犬,在盲人行动时为其指引方向;而未来的图像识别技术将会同其他人工智能技术融合在一起成为盲人的全职管家,不需要盲人进行任何行动,而是由这个管家帮助其完成所有事情。举个例子,如果图像识别是一个工具,就如同我们在驾驶汽车时佩戴谷歌眼镜,它将外部信息进行分析后传递给我们,我们再依据这些信息做出行驶决策;而如果将图像识别利用在机器视觉和人工智能上,这就如同谷歌的无人驾驶汽车,机器不仅可以对外部信息进行获取和分析,还全权负责所有的行驶活动,让我们得到完全解放。 《人工智能:一种现代方法》中提到,在人工智能中,感知是通过解释传感器的响应而为机器提供它们所处的世界的信息,其中它们与人类共有的感知形态包括视觉、听觉和触觉,而视觉最为重要,因为视觉是一切行动的基础。在一次论坛上百度IDL的余凯院长问大家,你觉得哪种感觉最重要?没有人能很快作答,后来余凯院长换了个提问方式,如果要放弃一种感觉,你最不愿意放弃的是那一种?这时大家都回答是视觉。Chris Frith在《心智的构建》中提到,我们对世界的感知不是直接的,而是依赖于“无意识推理”,也就是说在我们能感知物体之前,大脑必须依据到达感官的信息来推断这个物体可能是什么,这构成了人类最重要的预判和处理突发时间的能力。而视觉是这个过程中最及时和准确的信息获取渠道,人类感觉信息中的80%都是视觉信息。机器视觉之于人工智能的意义就是视觉之于人类的意义,而决定着机器视觉的就是图像识别技术。 更重要的是,在某些应用场景,机器视觉比人类的生理视觉更具优势,它更加准确、客观和稳定。人类视觉有着天然的局限,我们看起来能立刻且毫无费力的感知世界,而且似乎也能详细生动的感知整个视觉场景,但这只是一个错觉,只有投射到眼球中心的视觉场景的中间部分,我们才能详细而色彩鲜明的看清楚。偏离中间大约10度的位置,神经细胞更加分散并且智能探知光和阴影。也就是说,在我们视觉世界的边缘是无色、模糊的。因此,我们才会存在“变化盲视”,才会在经历着多样事物发生时,仅仅关注其中一样,而忽视了其他样事物的发生,而且不知道它们的发生。而机器在这方面就有着更多的优势,它们能够发现和记录视力所及范围内发生的所有事情。拿应用最广的视频监控来说,传统监控需要有人在电视墙前时刻保持高度警惕,然后再通过自己对视频的判断来得出结论,但这往往会因为人的疲劳、视觉局限和注意力分散等原因影响监控效果。但有了成熟的图像识别技术之后,再加以人工智能的支持,计算机就可以自行对视频进行分析和判断,发现异常情况直接报警,带来了更高的效率和准确度;在反恐领域,借助机器的人脸识别技术也要远远优于人的主观判断。 许多科技巨头也开始了在图像识别和人工智能领域的布局,Facebook签下的人工智能专家Yann LeCun最重大的成就就是在图像识别领域,其提出的LeNet为代表的卷积神经网络,在应用到各种不同的图像识别任务时都取得了不错效果,被认为是通用图像识别系统的代表之一;Google 借助模拟神经网络“DistBelief”通过对数百万份YouTube 视频的学习自行掌握了猫的关键特征,这是机器在没有人帮助的情况下自己读懂了猫的概念。值得一提的是,负责这个项目的Andrew NG已经转投百度领导百度研究院,其一个重要的研究方向就是人工智能和图像识别。这也能看出国内科技公司对图像识别技术以及人工智能技术的重视程度。
-
图像识别的初级阶段——娱乐化、工具化 在这个阶段,用户主要是借助图像识别技术来满足某些娱乐化需求。例如,百度魔图的“大咖配”功能可以帮助用户找到与其长相最匹配的明星,百度的图片搜索可以找到相似的图片;Facebook研发了根据相片进行人脸匹配的DeepFace;雅虎收购的图像识别公司IQ Engine开发的Glow可以通过图像识别自动生成照片的标签以帮助用户管理手机上的照片;国内专注于图像识别的创业公司旷视科技成立了VisionHacker游戏工作室,借助图形识别技术研发移动端的体感游戏;创视新科技通过图像识别技术研发机器视觉表面检测系统。 这个阶段还有一个非常重要的细分领域——OCR(Optical Character Recognition,光学字符识别),是指光学设备检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程,就是计算机对文字的阅读。语言和文字是我们获取信息最基本、最重要的途径。在比特世界,我们可以借助互联网和计算机轻松的获取和处理文字。但一旦文字以图片的形式表现出来,就对我们获取和处理文字平添了很多麻烦。这一方面表现为数字世界中由于特定原因被存储称图片格式的文字;另一方面是我们在现实生活中看到的所有物理形态的文字。所以我们需要借助OCR技术将这些文字和信息提取出来。在这方面,国内产品包括百度的涂书笔记和百度翻译等;而谷歌借助经过DistBelief 训练的大型分布式神经网络,对于Google 街景图库的上千万门牌号的识别率超过90%,每天可识别百万门牌号。 在这个阶段,图像识别技术仅作为我们的辅助工具存在,为我们自身的人类视觉提供了强有力的辅助和增强,带给了我们一种全新的与外部世界进行交互的方式。我们可以通过搜索找到图片中的关键信息;可以随手拍下一件陌生物体而迅速找到与之相关的各类信息;可以将潜在搭讪对象拍下提前去她的社交网络了解一番;也可以将人脸识别作为主要的身份认证方式……这些应用虽然看起来很普通,但当图像识别技术渗透到我们行为习惯的方方面面时,我们就相当于把一部分视力外包给了机器,就像我们已经把部分记忆外包给了搜索引擎一样。 这将极大改善我们与外部世界的交互方式,此前我们利用科技工具探寻外部世界的流程是这样:人眼捕捉目标信息、大脑将信息进行分析、转化成机器可以理解的关键词、与机器交互获得结果。而当图像识别技术赋予了机器“眼睛”之后,这个过程就可以简化为:人眼借助机器捕捉目标信息、机器和互联网直接对信息进行分析并返回结果。图像识别使摄像头成为解密信息的钥匙,我们仅需把摄像头对准某一未知事物,就能得到预想的答案。就像百度科学家余凯所说,摄像头成为连接人和世界信息的重要入口之一。
-
图像识别技术的背景 移动互联网、智能手机以及社交网络的发展带来了海量图片信息,根据BI五月份的文章,Instagram每天图片上传量约为6000万张;今年2月份WhatsApp每天的图片发送量为5亿张;国内的微信朋友圈也是以图片分享为驱动。不受地域和语言限制的图片逐渐取代了繁琐而微妙的文字,成为了传词达意的主要媒介。图片成为互联网信息交流主要媒介的原因主要在于两点: 第一,从用户读取信息的习惯来看,相比于文字,图片能够为用户提供更加生动、容易理解、有趣及更具艺术感的信息; 第二,从图片来源来看,智能手机为我们带来方便的拍摄和截屏手段,帮助我们更快的用图片来采集和记录信息。 但伴随着图片成为互联网中的主要信息载体,难题随之出现。当信息由文字记载时,我们可以通过关键词搜索轻易找到所需内容并进行任意编辑,而当信息是由图片记载时,我们却无法对图片中的内容进行检索,从而影响了我们从图片中找到关键内容的效率。图片给我们带来了快捷的信息记录和分享方式,却降低了我们的信息检索效率。在这个环境下,计算机的图像识别技术就显得尤为重要。 图像识别是计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。识别过程包括图像预处理、图像分割、特征提取和判断匹配。简单来说,图像识别就是计算机如何像人一样读懂图片的内容。借助图像识别技术,我们不仅可以通过图片搜索更快的获取信息,还可以产生一种新的与外部世界交互的方式,甚至会让外部世界更加智能的运行。百度李彦宏在2011年提到“全新的读图时代已经来临”,现在随着图形识别技术的不断进步,越来越多的科技公司开始涉及图形识别领域,这标志着读图时代正式到来,并且将引领我们进入更加智能的未来。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签