• [其他] M+ 一站式园区网络管理,欢迎咨询~
    M+ 一站式园区自管理,欢迎咨询~
  • [技术干货] DTT2022年度收官圆桌π,华为云8位技术专家的年末盘点与2023年技术新规划
    在2022年的年末,华为云DTSE Tech Talk迎来了年度收官圆桌π直播活动(👉 点击回看),8位DTSE技术布道师和开发者们畅谈云上创新应用,回顾盘点了今年的关键技术产品,展望2023年在新产品和技术上的新规划。作为本次圆桌π的主持人,华为云DTSE技术布道师徐毅从π的无限谈起,表达了对开发者们的新年祝福:未来有无限的可能等待着开发者探索,愿大家通过DTT与华为云在云上共成长。1、程泽:更好地支持开发者做SaaS应用构建华为云DTSE技术布道师程泽回顾总结了在前几期直播中,他是如何指导开发者选择合适的开发框架将SaaS应用系统部署在云上,并通过云上运维平台构建SaaS应用运维系统,以及企业要着重注意的SaaS应用构建安全性问题。除了SaaS架构基础设计层面的内容,程泽表示,2023年会重点关注新租户创建升级时,后端资源的平滑创建和自动化部署, 比如通过指令来实现云资源的创建、更新销毁、全生命周期管理等等,为有需要的企业和开发者提供更丰富的的技术资料,支持大家做SaaS应用的构建。2、董鑫武:零代码将释放IT产能,改变软件生产关系围绕当下火热的低代码和零代码,华为云PaaS DTSE技术布道师董鑫武总结了整体的趋势:当前低代码已经进入了组装式应用交付的新范式,零代码在未来则可以让业务人员从事相关应用的构建,让IT的产能得以释放,从而改变当前的软件生产关系。董鑫武透露,在2023年,华为云的低代码平台进行了全新的品牌升级——Astro,并推出5大产品:IOC大屏Astro Canvas、工作流Astro Flow、轻应用Astro Zero、智能助手Astro Bot、复杂应用Astro Pro。“星垂平野阔,月涌大江流,华为云邀开发者一起构建给代码璀璨的星空。”3、金云飞:明年推出数字内容的四大生产线华为云媒体DTSE技术布道师金云飞表示,当前华为云会议为企业和开发者提供服务端和客户端开发能力, 可以满足政企办公市场、行业应用市场以及一些跨界创新产品应用,诸如企业培训、在线教育、应急指挥等等场景。华为云低时延直播产品将时延降低到800ms以内,可满足电商直播、教育直播、赛事直播等时延敏感业务的诉求。从2022年下半年开始,云桌面API也正式对外开放,开发者可以便捷的接入和调用。围绕数字内容生产,华为云在明年将推出四大生产线:数字人生产线、虚拟直播生产线、企业3D空间生产线,虚实融合生产线, 具备数字内容的建模、生产、渲染、资产管理、编辑能力,让开发者得以通过开放的SDK和API来构建数字内容。4、许炳尘:APIG支持每秒50万以上的API并发调用在数字化浪潮的大背景下,API已经成为了关键的数字化转型的推动力。API既是数据交换的通道,也是研发生产的工具,同时还是企业和开发者最核心的资产。华为云PaaS DTSE技术布道师许炳尘讲到,一个API项目是否成功,最关键的还是在于API的运行的情况,这也是整个API全生命周期管理的核心。华为云API Arts通过插件的形式集成了云原生网关APIG,来实现API的运行托管和监控运维, APIG目前单集群已经能够支持每秒50万以上的API并发调用。许炳尘表示,2023年华为云会继续完善和强化API Arts和APIG,提供更完整更丰富的API全生命周期管理能力。并且通过API Arts和APIG,进一步降低API的研发使用门槛,更加契合云原生,从而满足企业和开发者越来越丰富的API管理需求。5、杜奇:提供更多行业专用算法workflow,推动AI应用落地AI的应用落地正在改变一些传统行业,华为云EI DTSE技术布道师杜奇和大家分享了两个有趣的案例:AI养牛、AI抄水表。以AI抄水表为例,为了解决伙伴遇到的人工抄表的痛点,华为云开发了一套水表识别模型的定制化和自主训练工具, 将数据导入、数据集创建、数据标注、数据处理、模型训练、模型管理、模型上线等复杂的步骤,按照业务流程封装成一个格节点,便于后续反复迭代开发,支持识别更多种类的水表。谈及明年的规划,杜奇表示华为云AI产品将会和大数据等产品服务打通,同时提供更多行业专用算法workflow,帮助开发者低门槛高效率完成AI应用开发。6、覃元元:从日志服务领域的追随者成长为领导者华为云PaaS DTSE技术布道师覃元元总结了22年日志服务方面的主要工作内容:补齐各种英文日志来源的接入场景;提供API、SDK、Android及iOS等端测的接入方式和接入场景指导; 完善整体日志管理的界面,在日志搜索页面优化搜索体验;完善仪表盘及日志告警等内容。2023年,华为云LTS日志服务会进一步去完善。在日志采集方面,补齐自研的SA采集器的日志解析能力,提供更多的SDK,完善转储能力;在日志加工方面,提供端到端的控制台面;在搜索方面,将会推出百亿级秒级搜索以及千亿级的迭代搜索,为用户提供更好地搜索体验。覃元元讲到,通过在采集、搜索、日志加工等方面的持续发力,2023年华为云LTS日志服务会成为在日服领域从追随者逐渐的演变为一个领导者。7、刘坤鹏:GaussDB(DWS)让人人都可以用好数据华为云EI DTSE技术布道师刘坤鹏分析了当前各行各业在数据处理分析方面遇到的挑战,华为云GaussDB(DWS)提供的全场景一站式分析能力,让人人可以用好数据。GaussDB(DWS)是基于share-nothing的无共享分布式架构,具有极高的扩展性,刘坤鹏从技术架构、高可用、容灾、备份体系、智能运维、迁移能力等方面,为开发者一一解读了GaussDB(DWS)背后的关键技术,核心优势等。刘坤鹏表示,2023年,华为云将配合产品版本的迭代,围绕应用场景、架构、工具以及生态等,推出更多直播课程。同时,也会分享开发者关注的数据库设计原则、SQL调优技巧、业务典型故障处理案例,让大家用好GaussDB(DWS)。最后提前祝所有开发者们新年快乐!!!在新的一年心想事成,技术更上一层楼。
  • [其他] 12月份干活分享整理合集
    12月份的干活异彩纷呈,现整理如下,欢迎大家实践1.图数据库实践--COVID-19患者轨迹追溯2-电商风控图模板3.利用图数据库研究 COVID-19 论文数据集4.教育知识图谱5.基于ModelArts实现黑白图像上色6.基于ModelArts实现多目标追踪7.基于ModelArts实现小样本学习8.基于ModelArts实现Convmesh 2D图生成3D网格9.An Effective Loss Function for Generating 3D Models from Single 2D Image without Rendering10.RetinaFace(人脸检测/PyTorch)11.人脸到动漫脸的转换与控制12.CenterNet-Hourglass (物体检测/Pytorch)13.CycleGAN图像风格迁移14.电网供电管理15.目标检测算法套件使用Demo
  • [其他] 使用Python+OpenCV+yolov5实现行人目标检测(2)
    实际问题陈述我们的任务是检测零售店闭路电视视频源中的人体边界框,这是跟踪模型的一个基础模型,且其检测所产生的所有误差都会传递到跟踪模型中。以下是在这类视频中检测的一些主要挑战。挑战视角:CCTV是顶装式的,与普通照片的前视图不同,它有一个角度人群:商店/商店有时会有非常拥挤的场景背景杂乱:零售店有更多的分散注意力或杂乱的东西(对于我们的模特来说),比如衣服、架子、人体模型等等,这些都会导致误报。照明条件:店内照明条件与室外摄影不同图像质量:来自CCTVs的视频帧有时会非常差,并且可能会出现运动模糊测试集创建我们创建了一个验证集,其中包含来自零售闭路电视视频的视频帧。我们使用行人边界框对框架进行注释,并使用mAP@0.50 iou阈值在整个训练迭代中测试模型。第一个人体检测模型我们的第一个模型是一个COCO预训练的模型,它将“person”作为其中的一个类。我们在每种方法中列出了2个模型,并基于COCO-mAP-val和推理时间对它们进行了评估。我们选择YOLOv5是因为它的单级特性(快速推理)和在COCO mAP val上的良好性能,它还有YOLOv5m和YOLOv5s等更快的版本。YOLOv5YOLO系列属于单阶段目标探测器,与RCNN不同,它没有单独的区域建议网络(RPN),并且依赖于不同尺度的锚框。架构可分为三个部分:骨架、颈部和头部。利用CSP(Cross-Stage Partial Networks)作为主干,从输入图像中提取特征。PANet被用作收集特征金字塔的主干,头部是最终的检测层,它使用特征上的锚框来检测对象。YOLO架构使用的激活函数是Google Brains在2017年提出的Swish的变体,它看起来与ReLU非常相同,但与ReLU不同,它在x=0附近是平滑的。损失函数是具有Logits损失的二元交叉熵性能0.48 mAP@0.50 IOU(在我们的测试集上)分析这个现成的模型不能很好地执行,因为模型是在COCO数据集上训练的,而COCO数据集包含一些不必要的类,包含人体实例的图像数量较少,人群密度也较小。此外,包含人体实例的图像分布与闭路电视视频帧中的图像分布有很大不同。结论我们需要更多的数据来训练包含更多拥挤场景和摄像机视角介于45⁰-60⁰(类似于CCTV)的模型。收集公共数据我们的下一步是收集包含行人/行人边界框的公共可用数据集。有很多数据集可用于人体检测,但我们需要一些关于数据集的附加信息,如视角、图像质量、人体密度和背景等,以获取数据集的分布信息。我们可以看到,满足我们确切需求的数据集并不多,但我们仍然可以使用这些数据集,因为人体边界框的基本要求已经得到满足。在下载了所有的数据集之后,我们把它转换成一个通用的COCO格式进行检测。
  • [其他] 使用Python+OpenCV+yolov5实现行人目标检测(1)
    介绍目标检测支持许多视觉任务,如实例分割、姿态估计、跟踪和动作识别,这些计算机视觉任务在监控、自动驾驶和视觉答疑等领域有着广泛的应用。随着这种广泛的实际应用,目标检测自然成为一个活跃的研究领域。我们在Fynd的研究团队一直在训练一个行人检测模型来支持我们的目标跟踪模型。在本文中,我们将介绍如何选择一个模型架构,创建一个数据集,并为我们的特定用例进行行人检测模型的训练。什么是目标检测目标检测是一种计算机视觉技术,它允许我们识别和定位图像或视频中的物体。目标检测可以理解为两部分,目标定位和目标分类。定位可以理解为预测对象在图像中的确切位置(边界框),而分类则是定义它属于哪个类(人/车/狗等)。目标检测方法解决目标检测的方法有很多种,可以分为三类。级联检测器:该模型有两种网络类型,一种是RPN网络,另一种是检测网络。一些典型的例子是RCNN系列。带锚框的单级检测器:这类的检测器没有单独的RPN网络,而是依赖于预定义的锚框。YOLO系列就是这种检测器。无锚框的单级检测器:这是一种解决目标检测问题的新方法,这种网络是端到端可微的,不依赖于感兴趣区域(ROI),塑造了新研究的思路。要了解更多,可以阅读CornerNet或CenterNet论文。什么是COCO数据集为了比较这些模型,广泛使用了一个称为COCO(commonobjectsincontext)的公共数据集,这是一个具有挑战性的数据集,有80个类和150多万个对象实例,因此该数据集是初始模型选择的一个非常好的基准。如何评估性能评估性能我们需要评价目标检测任务的各种指标,包括:PASCAL VOC挑战(Everingham等人。2010年)COCO目标检测挑战(Lin等人。2014年)开放图像挑战赛(Kuznetsova 2018)。要理解这些指标,你需要先去理解一些基本概念,如精确度、召回率和IOU。以下是公式的简要定义。平均精度AP可定义为插值精度召回曲线下的面积,可使用以下公式计算:mAPAP的计算只涉及一个类,然而,在目标检测中,通常存在K>1类。平均精度(Mean average precision,mAP)定义为所有K类中AP的平均值:TIDETIDE是一个易于使用的通用工具箱,用于计算和评估对象检测和实例分割对整体性能的影响。TIDE有助于更详细地了解模型错误,仅使用mAP值是不可能找出哪个错误段导致的。TIDE可以绘制简单的图表,使分析变得轻松。https://youtu.be/McYFYU3PXcU
  • [其他] 利用PyTorch训练一个CNN分类器(3)
    在测试集上测试网络我们在整个训练集上训练了两次网络,但是我们还需要检查网络是否从数据集中学习到东西。我们通过预测神经网络输出的类别标签并根据实际情况进行检测,如果预测正确,我们把该样本添加到正确预测列表。第一步,显示测试集中的图片一遍熟悉图片内容。dataiter = iter(testloader) images, labels = dataiter.next() # print images imshow(torchvision.utils.make_grid(images)) print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))接下来,让我们重新加载我们保存的模型(注意:保存和重新加载模型在这里不是必要的,我们只是为了说明如何这样做):net = Net() net.load_state_dict(torch.load(PATH))现在我们来看看神经网络认为以上图片是什么?outputs = net(images)输出是10个标签的概率。一个类别的概率越大,神经网络越认为他是这个类别。所以让我们得到最高概率的标签。_, predicted = torch.max(outputs, 1) print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]                               for j in range(4)))这结果看起来非常的好。接下来让我们看看网络在整个测试集上的结果如何。correct = 0 total = 0 with torch.no_grad():     for data in testloader:         images, labels = data         outputs = net(images)         _, predicted = torch.max(outputs.data, 1)         total += labels.size(0)         correct += (predicted == labels).sum().item() print('Accuracy of the network on the 10000 test images: %d %%' % (     100 * correct / total))结果看起来好于偶然,偶然的正确率为10%,似乎网络学习到了一些东西。那在什么类上预测较好,什么类预测结果不好呢?class_correct = list(0. for i in range(10)) class_total = list(0. for i in range(10)) with torch.no_grad():     for data in testloader:         images, labels = data         outputs = net(images)         _, predicted = torch.max(outputs, 1)         c = (predicted == labels).squeeze()         for i in range(4):             label = labels[i]             class_correct[label] += c[i].item()             class_total[label] += 1 for i in range(10):     print('Accuracy of %5s : - %%' % (         classes[i], 100 * class_correct[i] / class_total[i]))接下来干什么?我们如何在GPU上运行神经网络呢?在GPU上训练你是如何把一个Tensor转换GPU上,你就如何把一个神经网络移动到GPU上训练。这个操作会递归遍历有所模块,并将其参数和缓冲区转换为CUDA张量。device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # Assume that we are on a CUDA machine, then this should print a CUDA device: #假设我们有一台CUDA的机器,这个操作将显示CUDA设备。 print(device)接下来假设我们有一台CUDA的机器,然后这些方法将递归遍历所有模块并将其参数和缓冲区转换为CUDA张量:net.to(device)请记住,你也必须在每一步中把你的输入和目标值转换到GPU上:inputs, labels = inputs.to(device), labels.to(device)为什么我们没注意到GPU的速度提升很多?那是因为网络非常的小。实践:尝试增加你的网络的宽度(第一个nn.Conv2d的第2个参数, 第二个nn.Conv2d的第一个参数,他们需要是相同的数字),看看你得到了什么样的加速。实现的目标:深入了解了PyTorch的张量库和神经网络训练了一个小网络来分类图片在多GPU上训练如果你希望使用所有GPU来更大的加快速度,请查看选读:[数据并行]:(https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html)接下来做什么?训练神经网络玩电子游戏在ImageNet上训练最好的ResNet使用对抗生成网络来训练一个人脸生成器使用LSTM网络训练一个字符级的语言模型更多示例更多教程在论坛上讨论PyTorch在Slack上与其他用户聊天文章摘自:小白学视觉 公众号
  • [其他] 利用PyTorch训练一个CNN分类器(2)
    训练一个图像分类器我们将按照下列顺序进行:使用torchvision加载和归一化CIFAR10训练集和测试集.定义一个卷积神经网络定义损失函数在训练集上训练网络在测试集上测试网络1. 加载和归一化CIFAR10使用torchvision加载CIFAR10是非常容易的。%matplotlib inlineimport torchimport torchvisionimport torchvision.transforms as transformstorchvision的输出是[0,1]的PILImage图像,我们把它转换为归一化范围为[-1, 1]的张量。注意如果在Windows上运行时出现BrokenPipeError,尝试将torch.utils.data.DataLoader()的num_worker设置为0。transform = transforms.Compose( [transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)testloader = torch.utils.data.DataLoader(testset, batch_size=4, shuffle=False, num_workers=2)classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')#这个过程有点慢,会下载大约340mb图片数据。我们展示一些有趣的训练图像。import matplotlib.pyplot as pltimport numpy as np# functions to show an imagedef imshow(img): img = img / 2 + 0.5 # unnormalize npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) plt.show()# get some random training imagesdataiter = iter(trainloader)images, labels = dataiter.next()# show imagesimshow(torchvision.utils.make_grid(images))# print labelsprint(' '.join('%5s' % classes[labels[j]] for j in range(4)))3. 定义损失函数和优化器我们使用交叉熵作为损失函数,使用带动量的随机梯度下降。import torch.optim as optimcriterion = nn.CrossEntropyLoss()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)4. 训练网络这是开始有趣的时刻,我们只需在数据迭代器上循环,把数据输入给网络,并优化。for epoch in range(2): # loop over the dataset multiple times running_loss = 0.0 for i, data in enumerate(trainloader, 0): # get the inputs; data is a list of [inputs, labels] inputs, labels = data # zero the parameter gradients optimizer.zero_grad() # forward + backward + optimize outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # print statistics running_loss += loss.item() if i % 2000 == 1999: # print every 2000 mini-batches print('[%d, ]] loss: %.3f' % (epoch + 1, i + 1, running_loss / 2000)) running_loss = 0.0print('Finished Training')保存一下我们的训练模型PATH = './cifar_net.pth' torch.save(net.state_dict(), PATH)点击这里查看关于保存模型的详细介绍
  • [其他] 利用PyTorch训练一个CNN分类器(1)
    训练一个分类器你已经学会如何去定义一个神经网络,计算损失值和更新网络的权重。你现在可能在思考:数据哪里来呢?关于数据通常,当你处理图像,文本,音频和视频数据时,你可以使用标准的Python包来加载数据到一个numpy数组中.然后把这个数组转换成torch.*Tensor。对于图像,有诸如Pillow,OpenCV包等非常实用对于音频,有诸如scipy和librosa包对于文本,可以用原始Python和Cython来加载,或者使用NLTK和SpaCy          对于视觉,我们创建了一个torchvision包,包含常见数据集的数据加载,比如Imagenet,CIFAR10,MNIST等,和图像转换器,也就是torchvision.datasets和torch.utils.data.DataLoader。这提供了巨大的便利,也避免了代码的重复。在这个教程中,我们使用CIFAR10数据集,它有如下10个类别:’airplane’,’automobile’,’bird’,’cat’,’deer’,’dog’,’frog’,’horse’,’ship’,’truck’。这个数据集中的图像大小为3*32*32,即,3通道,32*32像素。
  • [其他] OpenCV图像拼接改进算法之完美拼接
    图像拼接中使用单应性矩阵实现图像特征对齐,从而为图像拼接特别是无缝拼接打下基础,看一下上一篇我的图像拼接效果如下:经过分析发现:效果不好的原因是像素叠加的时候没有考虑左右两侧图像的位置信息,直接通过手动指定了融合区域跟阈值,而不是根据图像实际位置由图像生成mask层,根据mask层动态生成融合图像重叠区域的阈值,如此可以解决融合不够自然或者看上去拼接效果不好。最终改进之后的两张图像拼接效果如下:是不是一个完美的无缝图像拼接我说了不算,大家说了算,欢迎留言反馈!改进思路想要完美的实现无缝拼接,有两个关键技术点:特征提取与对齐阶段要取得配准对其好的单应性矩阵H,要用好的特征提取,千万别ORB。拼接阶段融合,要有好的图像融合算法支持,别提金字塔融合,速度太感人了,所以最好一层搞定,间隔权重采样是个好方法。之前的实现中图像对齐跟配准做的不错,就是最后的拼接效果不好,所以要改进图像融合,实现无缝融合。这里我观察了右侧图像透视变换的结果,发现一般都是一个不规则的图像,以我老家房屋的图像为例:对齐+透视变换之后如下:生成的mask图像如下:如果想要完美的融合,就不能随便制定区域融合,而是根据右侧透视变换之后的图像,来生成每一行有多少列是跟左侧图像重叠的,然后自动计算重叠区域大小,计算间隔值,完成最终mask权重图像生成,如下图:代码实现与步骤我是一个比较懒的人,代码已经有注释了,这里我就不过多解释,只简单说一下代码执行流程。首先是图像特征提取与求单应性矩阵,这步可以省略了。代码可以参考上一篇文章即可。使用单应性矩阵求得右侧变换之后的图像跟mask根据mask得权重mask层最后跟之前的一致,直接融合即可。特征提取部分代码,参考之前文章,不写废话。融合部分,修改后的代码如下:// 获取全景图大小 2int h = max(left.rows, right.rows); 3int w = left.cols + right.cols; 4Mat panorama_01 = Mat::zeros(Size(w, h), CV_8UC3); 5Rect roi; 6roi.x = 0; 7roi.y = 0; 8roi.width = left.cols; 9roi.height = left.rows;1011// 获取左侧与右侧对齐图像12left.copyTo(panorama_01(roi));13Mat panorama_02;14warpPerspective(right, panorama_02, H, Size(w, h));15imwrite("D:/panorama_02.png", panorama_02);1617// 计算融合重叠区域mask18Mat mask = Mat::zeros(Size(w, h), CV_8UC1);19generate_mask(panorama_02, mask);2021// 创建遮罩层并根据mask完成权重初始化22Mat mask1 = Mat::ones(Size(w, h), CV_32FC1);23Mat mask2 = Mat::ones(Size(w, h), CV_32FC1);2425// left mask26linspace(mask1, 1, 0, left.cols, mask);2728// right mask29linspace(mask2, 0, 1, left.cols, mask);3031// 左侧融合32Mat m1;33vector mv;34mv.push_back(mask1);35mv.push_back(mask1);36mv.push_back(mask1);37merge(mv, m1);38panorama_01.convertTo(panorama_01, CV_32F);39multiply(panorama_01, m1, panorama_01);4041// 右侧融合42mv.clear();43mv.push_back(mask2);44mv.push_back(mask2);45mv.push_back(mask2);46Mat m2;47merge(mv, m2);48panorama_02.convertTo(panorama_02, CV_32F);49multiply(panorama_02, m2, panorama_02);5051// 合并全景图52Mat panorama;53add(panorama_01, panorama_02, panorama);54panorama.convertTo(panorama, CV_8U); 55imwrite("D:/panorama.png", panorama);文章来源:「小白学视觉」公众号
  • [其他] 从0学CV:深度学习图像分类 模型综述(5)
    SVHN数据集SVHN数据集用来检测和识别街景图像中的门牌号,从大量街景图像的剪裁门牌号图像中收集,包含超过600000幅小图像,这些图像以两种格式呈现:一种是完整的数字,即原始的、分辨率可变的、彩色的门牌号图像,每个图像包括检测到的数字的转录以及字符级边界框。一种是剪裁数字,图像尺寸被调整为固定的32×32像素。SVHN数据集分为3个子集,73257幅图像用于训练,26032幅图像用于测试,531131幅难度稍小的图像作为额外的训练数据。
  • [其他] 从0学CV:深度学习图像分类 模型综述(4)
    图像分类数据集MNIST数据集MNIST数据集用来识别手写数字,从NIST数据集的SD-1和SD-3构建的,其中包含手写数字的二进制图像。NIST数据集将SD-3作为训练集,将SD-1作为测试集,但SD-3比SD-1更易识别,原因在于SD-3来源于人口调查局雇员,SD-1来源于高中生。在LeNet-5实验中,训练集为完整的新训练集,共60000幅图像,测试集为新测试集的子集,共10000幅图像。ImageNet数据集ImageNet数据集是具有超过1500万幅带标签的高分辨率图像的数据集,这些图像大约属于22000个类别,这些图像从互联网收集并由人工使用亚马逊的机械土耳其众包工具贴上标签。深度卷积神经网络模型在ImageNet数据集上进行训练和测试,衡量模型优劣的指标为top-5错误率和top-1错误率。ImageNet通常有1000个类别,训练和测试时,对每幅图像同时预测5个标签类别,若预测的5个类别任意之一为该图像的正确标签。CIFAR数据集CIFAR-10数据集有60000幅彩色图像,分辨率大小为32×32像素,共10个类别,每个类别包含6000幅图像。训练集包含50000幅彩色图像,测试集包含10000幅彩色图像。测试集的图像取自10个类别,每个类别分别取1000幅,剩余的图像构成训练集。
  • [其他] 从0学CV:深度学习图像分类 模型综述(3)
    轻量级网络轻量级网络是参数量小、计算复杂度低的网络。典型的轻量级网络有SqueezeNet、Xception、MobileNet系列和ShuffleNet系列等。SqueezeNet网络由fire module组成,分为挤压卷积层和扩展卷积层两部分,前者仅包含1×1卷积,后者包含1×1卷积和3×3卷积操作。MobileNetV1网络使用了深度可分离卷积,除此之外,还提出了两个超参数———宽度乘数α和决议乘数ρ,使得其可根据应用的不同选择不同的模型大小。架构搜索的网络模型NAS方法可分为3类:基于设计不同搜索空间的NAS方法基于模型优化的NAS方法其他改进的NAS方法
  • [其他] 从0学CV:深度学习图像分类 模型综述(2)
    ResNet 家族ResNet由堆叠的残差块组成,残差块结构如图所示,残差块除了包含权重层,还通过越层连接将输入x直接连到输出上。ResNet通过堆叠残差块使网络深度达到152层,残差网络在图像分类任务中获得了较大的成功。ResNet变体可分为4类:深度残差网络优化采用新的训练方法基于增加宽度的变体采用新维度的变体使用注意力机制的网络人眼观看一幅图像,首先看全局,然后将注意力集中在某个细节,将注意力集中在有价值的部分,忽略价值不大的部分。SEblock通过显式地建模通道之间的相互依赖性来重新校准通道的特征响应,即选择性地增强有用的通道特征,抑制无用的通道特征。CBAM模块包括通道注意力模块和空间注意力模块两部分,输入特征图首先输入通道注意力模块,分别使用平均池化和最大池化聚集空间信息生成两个空间内容描述符,随后两个空间内容描述符通过一个共享网络生成通道注意力图。
  • [其他] 从0学CV:深度学习图像分类 模型综述(1)
    图像分类是计算机视觉基本任务之一。顾名思义,图像分类即给定一幅图像,计算机利用算法找出其所属的类别标签。图像分类的过程主要包括图像的预处理、图像的特征提取以及使用分类器对图像进行分类,其中图像的特征提取是至关重要的一步。深度学习作为机器学习的一个分支,将数据的底层特征组合成抽象的高层特征,其在计算机视觉、自然语言处理等人工智能领域发挥了不可替代的作用。深度卷积神经网络模型本文根据近年来基于DCNN的图像分类研究发展过程和方向,将深度卷积神经网络模型分为以下4类:经典的深度卷积神经网络:增加网络深度,提升网络性能为目标;基于注意力机制的深度卷积神经网络模型:采用注意力机制使网络模型更关注感兴趣的区域;轻量级深度卷积神经网络模型:过改进模型结构降低网络参 数量以适应嵌入式、移动式设备的需求;基于神经架构搜索的网络模型:采用神经网络自动设计DCNN 模型结构,与人工设计DCNN相比更省时省力;经典的深度卷积神经网络模型从 LeNet 到 GoogLeNetLeNet模型(LeCun 等,1998)是最早提出的卷积神经网络模型,主要用于MNIST数据集中手写数字识别。LeNet包含3个卷积层、2个池化层和2个全连接层,每个卷积层和全连接层均有可训练的参数,为深度卷积神经网络的发展奠定了基础。AlexNet网络包含5个卷积层和3个全连接层,输入图像经过卷积操作和全连接层的操作,最后输入具有1000个节点的Softmax分类器完成图像分类。该网络通过使用ReLU作为激活函数,引入局部响应归一化缓解梯度消失问题,使用数据增强和Dropout技术大大缓解了过拟合问题。提升网络性能最直接的方法是增加网络深度,但随着网络深度的增加,参数量加大,网络更易产生过拟合,同时对计算资源的需求也显著增加。GoogLeNet采用了Inception-v1模块,该模块采用稀疏连接降低模型参数量的同时,保证了计算资源的使用效率,在深度达到22层的情况下提升了网络的性能。Inception-v1包含4条并行的支路,3×3卷积、5×5卷积之前的1×1卷积和3×3最大池化之后的1×1卷积用来减少参数量。Inception-v2增加了BN层,将5×5卷积分解成两个3×3卷积,从而减少了参数量。Inception-v3在Inception-v2模块基础上进行非对称卷积分解,如将n×n大小的卷积分解成1×n卷积和n×1卷积的串联,且n越大,参数量减少得越多。
  • [其他] 深度学习(RNN、CNN)调参的经验(3)
    1、一上来就自己动手写模型。建议首先用成熟的开源项目及其默认配置(例如 Gluon 对经典模型的各种复现、各个著名模型作者自己放出来的代码仓库)在自己的数据集上跑一遍,在等程序运行结束的时间里仔细研究一下代码里的各种细节,最后再自己写或者改代码。2、训 RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。3、tying input & output embedding(就是词向量层和输出 softmax 前的矩阵共享参数,在语言模型或机器翻译中常用)时学习率需要设置得非常小,不然容易 Nan。4、在数据集很大的情况下,一上来就跑全量数据。建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。5、只喜欢漂亮的模型结构,瞧不起调参数的论文/实验报告,看论文时经常不看超参数设置等细节。举个例子,现在还有相当多的人不知道 BERT 的激活函数是 GELU 而不是 transformer 原论文中的 ReLU。在自己没有太多资源实验的情况下,实验报告类文章简直是业界良心好不好!NLP 领域主要推荐以下几篇:Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧,虽然跟大部分人没啥关系)CV 我不算太熟,不过也可以勉强推荐几篇:Training ImageNet in 1 Hour(大批量训练技巧)Bag of Tricks for Image Classification with Convolutional Neural Networks(各种训练技巧集大成)EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(当前对参数利用最有效的 CNN)6、初始学习率:有时受 batch size、sequence length 各种因素的影响,loss 很大(比如说好几万),对于这种数字人是没有数感的,建议首先计算一下 per token loss(如果是多任务,可以每个任务单独算;类似地,某些 CV 任务可以计算 per pixel loss),心里有点感觉。脱离损失函数的形式谈学习率没有意义(例如单是对 batch size 求和或者取平均这个差异就会使梯度差成百上千倍)。在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。7、Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam, AdamW 啥的)抢救。8、subword 总是会很稳定地涨点,只管用就对了。9、要有耐心!这一条放在最后,是因为很多人不把它当一回事儿。可能是觉得这一条不需要写代码所以不重要?我见过太多人因为这条浪费时间了,所以专门强调一下。有些指标是有滞后性的,需要等训练一段时间才开始动。很多人训练几步看没什么效果就把程序停掉开始 debug 了,但其实代码毫无问题。如此反复好几天甚至一两周都在原地踏步,其实需要做的仅仅是让程序自个儿安安静静地跑上几个小时或者一天……作者:Towserhttps://www.zhihu.com/question/41631631/answer/862075836