利用AWS服务进行计算机视觉任务:从数据标注到模型训练
1. 使用Amazon SageMaker Ground Truth标注图像中的Packt标志
在使用Amazon SageMaker Ground Truth进行图像标注时,当所有提交标注的对象完成标注后,工作人员在其工作门户会看到 “You’re finished with the available tasks” 的消息。在SageMaker控制台中,会看到作业摘要状态为 “Complete”,同时还会显示标注的数据集对象及其周围的边界框。
标注作业完成后,输出数据会被放置在创建作业时指定的S3位置。在该输出位置下,每个提交的作业会有一个子文件夹,例如 “packt-logo-labeling”。该位置包含以下几个子文件夹:
-
annotation-tool
:包含此作业中创建的所有标签信息以及定义的模板,模板类型为liquid(一种开源模板语言)。
-
annotations
:包含几个子目录,可在此找到单个工作人员的响应,以及两个或更多工作人员标注的合并信息。Ground Truth为多个标注任务(包括边界框)提供了内置的标注合并功能。
-
manifests
:这是关键文件夹,服务会将标注作业的输出存储在此。输出数据文件中的每个条目与输入清单文件相同,并带有分配给输入对象的标签的属性和值。
-
temp
:服务使用的临时位置。
2. 将标注数据导入Rekognition Custom Labels
有了标注好的数据后,可以使用它通过SageMaker或Rekognition Custom Labels来训练机器学习模型。以下是将数据导入Rekognition Custom Labels的步骤:
1.
创建项目
:导航到左侧侧边栏的 “Projects” 面板,选择 “Create project”,并为其命名,例如 “logo-detection”。
2.
创建训练和测试数据集
:选择 “Create dataset”,选择 “Start with a single dataset”,然后在 “Training dataset details” 下选择 “Import images labeled by SageMaker Ground Truth”。提供输出清单文件的位置,例如 “s3://cv-on-aws-book-xxxx/chapter_09/output_data/packt-logo-labeling/manifests/output/output.manifest”,然后选择 “Create Dataset”。此时,标注的图像会带着所有标签和边界框信息被导入到项目中。
3.
模型训练
:如果有需要,可以在Rekognition Custom Labels控制台中进一步编辑边界框或标签。若不需要,选择 “Train model” 即可使用数据集开始模型训练。
模型训练完成后,就可以像之前学习的那样开始使用该模型。实际上,无论图像是在控制台中标注的,还是使用SageMaker Ground Truth标注后再导入Custom Labels的,Rekognition Custom Labels的模型训练过程并没有区别。同样,也可以将SageMaker Ground Truth标注的图像导入Lookout for Vision项目。
3. Amazon SageMaker简介
Amazon Rekognition适用于80%的日常计算机视觉用例,但如果需要对剩余的20%有更多的控制和影响,那么可以选择AWS AI分层蛋糕中较低层级的工具,而Amazon SageMaker在这些情况下表现出色。
Amazon SageMaker旨在让每个开发者、业务分析师和数据科学家都能进行机器学习(ML)。它通过一套完全托管的服务和工具来实现这一目标,这些服务和工具涵盖了每个ML模型生命周期管理步骤。可以使用完全托管的Jupyter笔记本开始构建,并使用弹性资源池进行大规模模型训练。如果需要数据标注、数据整理和创建人工参与循环(HITL)工作流的功能,Amazon SageMaker GroundTruth、Data Wrangler和Augmented AI(A2I)可以满足需求。
还可以选择必要的功能子集,以在最苛刻的生产环境中构建、训练、推理、治理和监控ML解决方案。近80%的ML生产成本发生在创建模型之后,这就是为什么Amazon SageMaker包含漂移检测、治理、托管推理和边缘操作等功能。此外,还可以通过AWS Marketplace将自定义模型货币化。
4. 技术要求
- 获取代码 :可以从GitHub仓库(https://github.com/PacktPublishing/Computer-Vision-on-AWS)获取运行本章示例代码的Jupyter笔记本。使用以下命令将仓库克隆到本地机器:
git clone https://github.com/PacktPublishing/Computer-Vision-on-AWS
cd Computer-Vision-on-AWS/10_SageMakerModel
- 配置环境 :需要一个AWS账户和Jupyter Notebook,详细的开发环境配置说明可参考相关资料。
- 获取数据集 :Rafael Uetz和Sven Behnke的LabelMe - 12数据集包含来自十二个类别的50,000张标注图像,可用于学习如何导入使用非标准文件结构和二进制元数据的数据集。更多信息可参考https://www.ais.uni-bonn.de/download/datasets.html。
- 安装先决条件 :可以直接从Jupyter笔记本执行shell命令,使用 “!” 命令语法创建代码块,避免使用单独的终端窗口。例如,安装 “requests” 库:
!pip3 install requests
如果使用终端屏幕,只需去掉 “!” 前缀:
pip3 install requests
- 下载和提取数据集 :下载LabelMe - 12 - 50k.tar.gz文件到项目文件系统:
import requests
import os
download_file = 'https://www.ais.uni-bonn.de/deep_learning/LabelMe-12-50k.tar.gz'
local_file = os.path.join('raw',os.path.basename(download_file))
if not os.path.exists('raw'):
os.mkdir('raw')
r = requests.get(download_file)
with open(local_file, 'wb') as f:
f.write(r.content)
提取tar.gz文件:
import tarfile
with tarfile.open(local_file) as f:
f.extractall('raw')
- 安装TensorFlow 2.0 :在SageMaker笔记本中安装TensorFlow:
!pip3 install tensorflow
确认TensorFlow成功导入:
import tensorflow
- 安装matplotlib :安装matplotlib库用于在Jupyter笔记本中渲染图像:
!pip3 install matplotlib
5. 使用内置图像分类器
Amazon SageMaker的内置算法和预训练模型可解决日常用例,如图像分类、文本摘要和异常检测。下面将使用MXNet重现著名的 “Hot Dog, Not - Hot Dog” 分类器,步骤如下:
1.
将数据集上传到Amazon S3
:使用以下命令将 “hotdog - nothotdog” 图像集上传到Amazon S3存储桶:
aws s3 sync 10_SageMakerModel/hotdog-nothotdog s3://ch10-cv-book-use2/sagemaker/hotdog-nothotdog --region us-east-2
-
准备作业通道
:Amazon SageMaker使用通道将训练、测试和验证数据序列输入到模型和算法中。通道的格式从简单的分隔清单文件(如使用制表符或逗号)到RecordIO管道不等。对于此任务,需要创建一个制表符分隔的文件,包含图像的标识符、标签和相对位置列。具体步骤如下:
- 初始化Amazon S3客户端:
bucket_name='ch10-cv-book-use2'
prefix = 'sagemaker/hotdog-nothotdog'
region_name='us-east-2'
import boto3
s3_client = boto3.client('s3',region_name=region_name)
- 枚举存储桶中的对象:
files=[]
paginator = s3_client.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket=bucket_name, Prefix=prefix)
for page in pages:
for obj in page['Contents']:
files.append(obj['Key'])
- 将对象分类到测试和训练数据集中:
def get_dataset(name):
ds = {'hotdog':[], 'nothotdog':[]}
for file in files:
if not file.endswith('.jpg'):
continue
if not '/%s/' % name in file:
continue
if '/hotdog/' in file:
ds['hotdog'].append(file)
elif '/nothotdog/' in file:
ds['nothotdog'].append(file)
return ds
train_ds = get_dataset('train')
test_ds = get_dataset('test')
- 创建通道文件:
from os import path
def create_channel(ds):
channel=[]
for label in ds.keys():
for obj in ds[label]:
identifier = path.splitext(path.basename(obj))[0]
relpath = '%s/%s.jpg' % (label, identifier)
class_id = 1 if label == 'hotdog' else 0
channel.append('%s\t%s\t%s' %(
identifier,
class_id,
relpath
))
return channel
train_lst = '\n'.join(create_channel(train_ds))
validation_lst = '\n'.join(create_channel(test_ds))
- 将通道文件上传到Amazon S3存储桶:
s3_client.put_object(
Bucket=bucket_name,
Key='sagemaker/hotdog-nothotdog/train.lst',
Body=train_lst)
s3_client.put_object(
Bucket=bucket_name,
Key='sagemaker/hotdog-nothotdog/validation.lst',
Body=validation_lst)
以下是通道文件的列信息:
| Column Name | Format | Description |
| — | — | — |
| identifier | Number | 用于故障排除的文件索引或名称 |
| label | Number | 从0开始的数值,表示文件的标签(0 = nothotdog,1 = hotdog) |
| relative path | String | 到数据集根目录的相对路径(label/identifier.jpg) |
-
启动训练作业
:通过AWS管理控制台启动内置算法或预训练模型是最简单的方法。验证参数按预期工作后,可以使用DescribeTrainingJob API导出训练作业。具体步骤如下:
- 导航到Amazon SageMaker控制台(https://us-east-2.console.aws.amazon.com/sagemaker/home?region=us-east-2#/studio)。
- 展开 “Training” 菜单,选择 “Training jobs” 链接。
- 点击 “Create training job” 按钮。
在创建训练作业时,需要配置以下几个面板:
-
作业设置面板
:指定作业名称、IAM角色和算法选项等一般属性。从下拉菜单中选择内置算法 “Vision – Image Classification (MxNet)”,其余保持默认设置。
-
资源配置面板
:此算法需要GPU进行训练,例如 “ml.g4dn.xlarge” 或 “ml.p2.xlarge” 实例类型。在实验时,应将 “Additional storage volume per instance (GB)” 属性设置为比预期更大的值,以避免训练实例因本地存储不足而崩溃。
-
网络面板
:此内置算法不需要私有VPC,该选项用于需要访问受保护数据源(如Amazon Redshift、Aurora和内部API)的自定义训练作业。
-
超参数面板
:需要配置以下参数,其余保持默认设置:
- 设置 “num_classes” 为2。
- 设置 “num_training_samples” 为3000。
- 设置 “early_stopping” 为1。
以下是图像分类算法的超参数及其含义:
| Parameter Name | Required | Description |
| — | — | — |
| num_classes | Yes | 数据集中标签的总数 |
| num_training_samples | Yes | 用于分配训练数据集的总训练示例数 |
| Augmentation_type | No | 通过裁剪、减少颜色(crop_color)或完成变换(crop_color_transform)操作修改图像 |
| beta_1 | No | adam优化器的第一个指数衰减参数 |
| beta_2 | No | adam优化器的第二个指数衰减参数 |
| checkpoint_frequency | No | 保存model.tar.gz文件之前的总轮数 |
| early_stopping | No | 如果不需要额外的轮数(迭代),则启用提前退出训练的逻辑 |
| early_stop_ping_min_epochs | No | 如果启用early_stopping,要执行的最小轮数(迭代) |
| early_stopping_patience | No | 在early_stopping逻辑退出之前没有改进的总轮数(迭代) |
| early_stopping_tolerance | No | 根据准确率除以最佳准确率指定early_stopping |
| Epochs | No | 总训练迭代次数 |
| Eps | No | adam和rmsprop优化器的epsilon,用于避免除以零 |
| Gamma | No | rmsprop优化器的衰减因子 |
| image_shape | No | 表示图像的通道数、高度和宽度的三个数字元组 |
| kv_store | No | 指定分布式训练是同步(dist_sync)还是异步(dist_async)共享权重 |
| learning_rate | No | 初始学习率 |
| lr_scheduler_factor | No | 与lr_scheduler_step参数结合使用以降低learning_rate的比率 |
| mini_batch_size | No | 每批要处理的总文件数 |
| Momentum | No | sgd和nag优化器的动量 |
| multi_label | No | 启用每个文件多个标签的标志 |
| num_layers | No | ML模型中的总层数 |
| optimizer | No | 训练模型的优化器:sgd(随机梯度下降)、adam(自适应动量估计)、rmsprop(均方根传播)、nag(Nesterov加速梯度) |
| precision_dtype | No | 指定模型权重是单精度(float32)还是半精度(float16)值 |
| Resize | No | 训练数据的图像调整大小 |
| top_k | No | 训练期间报告前k个准确率 |
| use_pretrained_model | No | 使用预训练图像网络并避免调整初始层的标志 |
| use_weighted_loss | No | 用于多标签分类的加权交叉熵损失的标志 |
| weight_decay | No | sgd和nag优化器的系数权重衰减 |
-
输入数据配置面板
:内置图像分类算法需要四个资源通道来训练模型。在准备作业通道部分,已经创建并上传了 “train_lst” 和 “validation_lst” 清单到S3。以下是预期的通道类型:
| Channel Name | Type | Description |
| — | — | — |
| train | S3 prefix | 训练文件的基本前缀 |
| train_lst | Tab - separated manifest file | 包含要包含的训练文件的三列清单 |
| validation | S3 prefix | 验证文件的基本前缀 |
| validation_lst | Tab - separated manifest file | 包含要包含的验证文件的三列清单 |
添加通道时,对于S3前缀通道,设置S3数据类型字段为 “S3Prefix”,S3位置字段为 “s3://
/sagemaker/hotdog - nothotdog/CHANNEL_NAME”,并将 “CHANNEL_NAME” 替换为 “train” 或 “validation”;对于清单通道,设置S3数据类型字段为 “ManifestFile”,S3位置字段为 “s3://
/sagemaker/hotdog - nothotdog/CHANNEL_NAME.lst”,同样替换 “CHANNEL_NAME”。另外,也可以选择使用JSON编码的AugmentedManifest数据类型代替制表符分隔的ManifestFile数据类型。
-
检查点配置面板
:可选择启用检查点功能,将模型序列化为S3存储桶,该功能可加快重启失败模型和故障排除的速度。
-
输出数据配置面板
:在S3输出路径字段中指定SageMaker执行角色将写入训练模型文件的位置。也可以选择AWS密钥管理服务(AWS KMS)加密密钥,而不是默认的S3存储桶密钥,以保护生产模型。
-
托管现货训练面板
:Amazon EC2 Spot Instances可让你利用AWS云中未使用的EC2容量,最多可节省90%的按需实例成本。如果AWS需要收回该容量,EC2实例将收到两分钟的通知以检查点状态并开始终止。此设计适用于分布式训练、无状态工作负载、大数据分析和容器化应用程序。
-
标签面板
:为训练作业关联标签可添加元数据,用于跟踪成本和监控辅助资源的创建。例如,可以用调用者的团队名称和成本中心标记作业,这些信息会显示在AWS成本资源管理器中,简化部门费用分摊。
完成训练作业配置后,选择 “Create training job” 按钮,这将调用SageMaker的CreateTrainingJob API来配置计算资源、处理图像序列,并在S3中输出model.tar.gz文件。训练作业使用 “1 x ml.p2.xlarge” 实例需要6000秒,使用 “1x ml.g4dn.16xlarge” 可在1827秒内完成。由于AWS按秒收取训练时间费用,“p2” 成本为1.50美元,“g4dn” 成本为2.20美元。
也可以通过AWS管理控制台进行实验和快速迭代,确定特定的训练配置后,使用AWS命令行界面(CLI)检索配置。可使用以下命令:
aws sagemaker describe-training-job --training-job-name hotdog-nothotdog --region us-east-2
然后使用boto3与Amazon SageMaker客户端一起使用这些值:
import boto3
region_name = "us-east-2"
sagemaker = boto3.client(
"sagemaker",
region_name=region_name)
sagemaker.create_training_job(...)
通过以上步骤,就可以利用Amazon SageMaker完成从图像标注到模型训练的整个计算机视觉任务流程。
利用AWS服务进行计算机视觉任务:从数据标注到模型训练
6. 训练作业的执行与监控
在提交训练作业后,我们需要对其进行监控,以确保作业顺利执行。可以通过SageMaker控制台查看训练作业的状态,包括作业是否正在运行、已完成还是失败。同时,还可以查看作业的详细信息,如资源使用情况、训练时间等。
在训练过程中,可能会遇到各种问题,如资源不足、数据格式错误等。以下是一些常见问题及解决方法:
-
资源不足
:如果训练作业因资源不足而失败,可能需要调整资源配置。例如,增加实例类型的规格或增加存储容量。在资源配置面板中,可以修改实例类型和 “Additional storage volume per instance (GB)” 属性。
-
数据格式错误
:确保输入数据的格式符合要求。在准备作业通道时,要保证通道文件的格式正确,如制表符分隔的文件列信息准确。
-
超参数设置不合理
:超参数的设置会影响模型的训练效果。如果模型训练效果不佳,可以尝试调整超参数。例如,调整学习率、批量大小等。
7. 模型评估与优化
训练完成后,需要对模型进行评估,以确定其性能。可以使用验证数据集对模型进行评估,计算准确率、召回率等指标。以下是一个简单的示例代码,用于计算模型的准确率:
import numpy as np
# 假设这是模型的预测结果和真实标签
predictions = np.array([1, 0, 1, 0])
labels = np.array([1, 1, 1, 0])
accuracy = np.mean(predictions == labels)
print(f"模型准确率: {accuracy}")
如果模型的性能不理想,可以考虑以下优化方法:
-
增加训练数据
:更多的训练数据可以提高模型的泛化能力。可以收集更多的图像数据,并将其添加到训练数据集中。
-
调整超参数
:尝试不同的超参数组合,找到最优的超参数设置。可以使用网格搜索或随机搜索等方法来寻找最优超参数。
-
使用更复杂的模型
:如果简单的模型无法满足需求,可以尝试使用更复杂的模型。例如,使用更深的卷积神经网络。
8. 模型部署与应用
当模型训练和评估完成后,就可以将其部署到生产环境中使用。SageMaker提供了多种部署方式,如实时推理端点、批量转换作业等。
8.1 实时推理端点部署
实时推理端点可以提供低延迟的推理服务,适用于需要实时响应的应用场景。以下是部署实时推理端点的步骤:
1.
创建模型
:在SageMaker控制台中,选择 “Models”,然后点击 “Create model”。指定模型的名称、执行角色和模型数据的S3位置。
2.
创建端点配置
:选择 “Endpoint configurations”,点击 “Create endpoint configuration”。指定端点配置的名称、实例类型和实例数量。
3.
创建端点
:选择 “Endpoints”,点击 “Create endpoint”。指定端点的名称和端点配置。
创建完成后,就可以使用端点进行实时推理。以下是一个简单的示例代码:
import boto3
# 初始化SageMaker客户端
sagemaker_runtime = boto3.client('sagemaker-runtime', region_name='us-east-2')
# 端点名称
endpoint_name = 'your-endpoint-name'
# 输入数据
input_data = 'your-input-data'
# 调用端点进行推理
response = sagemaker_runtime.invoke_endpoint(
EndpointName=endpoint_name,
ContentType='application/json',
Body=input_data
)
# 获取推理结果
result = response['Body'].read().decode()
print(f"推理结果: {result}")
8.2 批量转换作业部署
批量转换作业适用于处理大量数据的场景。以下是部署批量转换作业的步骤:
1.
准备输入数据
:将需要进行推理的数据存储在S3存储桶中。
2.
创建批量转换作业
:在SageMaker控制台中,选择 “Batch transform jobs”,然后点击 “Create batch transform job”。指定作业的名称、模型名称、输入数据的S3位置和输出数据的S3位置。
3.
启动批量转换作业
:点击 “Create batch transform job” 按钮,启动作业。
作业完成后,可以在指定的输出数据S3位置获取推理结果。
9. 总结
通过本文,我们详细介绍了如何利用AWS的相关服务完成计算机视觉任务,从数据标注到模型训练、评估、部署和应用的整个流程。具体内容如下:
- 使用Amazon SageMaker Ground Truth进行图像标注,标注完成后将输出数据存储在S3中。
- 将标注数据导入Rekognition Custom Labels进行模型训练,也可以使用SageMaker的内置图像分类器进行训练。
- 介绍了使用内置图像分类器重现 “Hot Dog, Not - Hot Dog” 分类器的详细步骤,包括数据集上传、作业通道准备、训练作业启动等。
- 对训练作业的执行与监控、模型评估与优化、模型部署与应用等方面进行了介绍。
通过这些步骤,我们可以利用AWS的强大功能,高效地完成计算机视觉任务,为实际应用提供支持。
以下是整个流程的mermaid流程图:
graph LR
A[数据标注] --> B[导入数据到Rekognition Custom Labels或SageMaker]
B --> C[模型训练]
C --> D[模型评估]
D --> E{模型性能是否达标}
E -- 是 --> F[模型部署]
E -- 否 --> G[模型优化]
G --> C
F --> H[模型应用]
在实际应用中,可以根据具体需求选择合适的服务和方法,不断优化模型,以提高模型的性能和应用效果。
超级会员免费看

被折叠的 条评论
为什么被折叠?



