使用卓越的 AI 系列和 NVIDIA TAO 工具包创建高质量的计算机视觉应用程序
数据标签和模型训练一直被认为是团队在构建 AI/ML 基础架构时面临的最重要挑战。两者都是 ML 应用程序开发过程中的一个重要步骤,如果操作不当,可能会导致不准确的结果和性能下降。有关详细信息,请参阅 AI 基础设施联盟的 2022 年 AI 基础设施生态系统报告。 数据标签对于完全标记整个数据集的任何形式的地图学习都至关重要。它还是准地图学习的关键因素,它结合了一组小部分标记数据,这些算法旨在以编程方式自动标记其余数据集。标签对于机器学习最发达的领域之一的计算机视觉至关重要。尽管标签很重要,但标签速度很慢,因为需要扩大分散的员工队伍。
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
数据标签和模型训练一直被认为是团队在构建 AI/ML 基础架构时面临的最重要挑战。两者都是 ML 应用程序开发过程中的一个重要步骤,如果操作不当,可能会导致不准确的结果和性能下降。有关详细信息,请参阅 AI 基础设施联盟的 2022 年 AI 基础设施生态系统报告。
数据标签对于完全标记整个数据集的任何形式的地图学习都至关重要。它还是准地图学习的关键因素,它结合了一组小部分标记数据,这些算法旨在以编程方式自动标记其余数据集。标签对于机器学习最发达的领域之一的计算机视觉至关重要。尽管标签很重要,但标签速度很慢,因为需要扩大分散的员工队伍。
模型训练与标签一起是机器学习的另一个主要瓶颈。训练速度很慢,因为机器必须等待完成复杂的计算。因此,团队成员必须熟悉网络、分布式系统、存储、专用处理器(GPU 或 TPU)和云管理系统(Kubernetes 和 Docker)。
超级 AI 系列,带 NVIDIA TAO 工具包
Superb AI 引入了一种新方法,可显著缩短计算机视觉团队交付高质量训练数据集所需的时间。现在,团队可以使用 Superb AI 套件实现更耗时且更具成本效益的管道,而不是将大部分数据准备工作流依赖于人工标签器。
NVIDIA TAO 工具包基于 TensorFlow 和 PyTorch 构建,是 TAO 框架的低代码版本,它通过抽象框架复杂性来加快模型开发过程。TAO 工具包使用转移训练的强大功能,允许您使用自己的数据微调 NVIDIA 预训练模型,并针对推理进行优化。
计算机视觉工程师可以将超级 AI 套件和 TAO 工具包结合使用,以应对数据标签和模型训练的挑战。更具体地说,您可以在套件中快速生成标记数据,并使用 TAO 训练模型,以执行特定的计算机视觉任务,例如分类、检测或细分。
准备计算机视觉数据集
本文介绍如何使用超级 AI 套件准备与 TAO 工具包兼容的高质量计算机视觉数据集。引导您完成以下过程:下载数据集、在套件中创建新项目、通过套件 SDK 将数据上传到项目、使用 Superb AI 的自动标签功能快速标记数据集、导出标记数据集以及设置用于数据的 TAO 工具包配置。
第 1 步:启动套件 SDK
首先,转到 superb-ai.com 并创建一个帐户。然后,按照快速入门指南安装和认证套件 CLI。您必须能够安装最新版本的 spb-cli 并检索套件帐户名称/访问密钥进行身份验证。
第 2 步:下载数据集
本教程使用 COCO 数据集,这是计算机视觉研究社区中广泛使用的大型对象检测、分区和字幕数据集。
您可以使用此代码段下载数据集。将其保存到名为“下载-coco.sh”的文件中,并在终端上运行 bash download-coco.sh这将创建存储 COCO 数据集的数据/目录。
下一步是将 COCO 转换为套件 SDK 格式,以便对 COCO 验证 2017 数据集中最常用的五个类进行采样。本教程仅处理绑定框注释,而套件还可以处理多边形和关键点。
您可以使用此代码段执行转换(地址:https://github.com/Superb-AI-Suite/spb-example/blob/main/create-coco-project/convert.py)。convert.py 保存到名为“convert.py”的文件中,并在终端上运行 python convert.py。这将生成一个 upload-info.json 文件,该文件存储有关图像名称和注释的信息。
第 3 步:从套件 SDK 创建项目
通过套件 SDK 创建项目是一项正在进行的工作。在本教程中,您将使用 Superb AI 指南在 Web 上创建项目。请按照下面提供的配置操作。
- 选择图像数据类型。
- 将项目名称设置为 CocoTest
- 选择注释类型作为“注释框”
- 创建与 COCO 类名称匹配的五个对象类:[“人”、“car”、“chair”、“book”、“bottle”]。
完成本课程后,您将看到主项目页面,如图 5 所示。
第 4 步:使用套件 SDK 上传数据
完成项目创建后,开始上传数据。您可以使用此代码段上传数据。保存到名为 的文件,并在终端上运行 。 upload.pypython upload.py --project CocoTest --dataset coco-dataset
也就是说, 是项目名称,coco-dataset 是数据集名称。这将启动上传过程,可能需要几个小时才能完成,具体取决于设备的处理能力。CocoTest
上传的数据集可通过套件网页实时查看,如图 6 所示。
步骤 5:标记数据集
下一步是标记 COCO 数据集。要快速做到这一点,只需使用套件强大的自动标记功能即可。特别是,自动标签和自定义自动标签是自动检测和标记对象以提高标签效率的强大工具。
自动标签是 Superb AI 开发的预训练模型,用于检测和标记 100 多个常见对象,而自定义自动标签则使用自己的数据来检测和标记利基对象。
本教程中的 COCO 数据由五个常用对象组成,自动标记可以对其进行标记。 按照指南配置自动标签。需要记住的要点是,您必须选择 MSCOCO Box CAL 作为自动标记 AI,并将对象名称映射到每个应用的对象。处理 COCO 数据集的所有 5,3 个标签可能需要大约一个小时。
自动标签运行完成后,每个自动标记操作的难度可以检查为红色和中等,绿色是容易的。难度越高,自动标记就越有可能错误地标记图像。
此难度或预期不确定性是根据小物体大小、恶劣照明条件、复杂场景等因素计算的。在实际情况下,您可以轻松按难度对标签进行排序和筛选,以便优先查看可能出错的标签。
第 6 步:从套件导出标记的数据集
获取标记数据集后,导出并下载标签。标签上不只是注释信息。若要在 ML 模型训练中完全使用标签,必须了解其他信息,例如有关项目配置和原始数据的元信息。若要将所有这些信息与注释文件一起下载,请先请求导出,以便 Suite 系统可以生成 zip 文件以供下载。要从套件导出和下载标签,请按照说明操作。
导出标签时,将创建压缩的 zip 文件以供下载。“导出结果”文件夹包含有关整个项目的一般信息、每个标签的注释信息以及每个数据资产的元数据。有关详细信息,请参阅导出结果格式文档。
第 7 步:将输出转换为 COCO 格式
接下来,您将创建一个脚本,将标记的数据转换为可在 TAO 工具包中输入的格式,例如 COCO 格式。在本教程中,您将使用 COCO 数据集,因此数据已采用 COCO 格式。例如,您可以在下方找到随机导出标签的 JSON 文件:
{
"objects": [
{
"id": "7e9fe8ee-50c7-4d4f-9e2c-145d894a8a26",
"class_id": "7b8205ef-b251-450c-b628-e6b9cac1a457",
"class_name": "person",
"annotation_type": "box",
"annotation": {
"multiple": false,
"coord": {
"x": 275.47,
"y": 49.27,
"width": 86.39999999999998,
"height": 102.25
},
"meta": {},
"difficulty": 0,
"uncertainty": 0.0045
},
"properties": []
},
{
"id": "70257635-801f-4cad-856a-ef0fdbfdf613",
"class_id": "7b8205ef-b251-450c-b628-e6b9cac1a457",
"class_name": "person",
"annotation_type": "box",
"annotation": {
"multiple": false,
"coord": {
"x": 155.64,
"y": 40.61,
"width": 98.34,
"height": 113.05
},
"meta": {},
"difficulty": 0,
"uncertainty": 0.0127
},
"properties": []
}
],
"categories": {
"properties": []
},
"difficulty": 1
}
第 8 步:准备标记数据以训练模型
接下来,使用套件数据集将套件中的 COCO 数据导入模型开发。套件数据集允许您通过 PyTorch 数据管道访问从套件中导出的数据集。下面的代码段实例化训练集的套件数据集对象类。
class SuiteDataset(Dataset):
"""
Instantiate the SuiteDataset object class for training set
"""
def __init__(
self,
team_name: str,
access_key: str,
project_name: str,
export_name: str,
train: bool,
caching_image: bool = True,
transforms: Optional[List[Callable]] = None,
category_names: Optional[List[str]] = None,
):
"""Function to initialize the object class"""
super().__init__()
# Get project setting and export information through the SDK
# Initialize the Python Client
client = spb.sdk.Client(team_name=team_name, access_key=access_key, project_name=project_name)
# Use get_export
export_info = call_with_retry(client.get_export, name=export_name)
# Download the export compressed file through download_url in Export
export_data = call_with_retry(urlopen, export_info.download_url).read()
# Load the export compressed file into memory
with ZipFile(BytesIO(export_data), 'r') as export:
label_files = [f for f in export.namelist() if f.startswith('labels/')]
label_interface = json.loads(export.open('project.json', 'r').read())
category_infos = label_interface.get('object_detection', {}).get('object_classes', [])
cache_dir = None
if caching_image:
cache_dir = f'/tmp/{team_name}/{project_name}'
os.makedirs(cache_dir, exist_ok=True)
self.client = client
self.export_data = export_data
self.categories = [
{'id': i + 1, 'name': cat['name'], 'type': cat['annotation_type']}
for i, cat in enumerate(category_infos)
]
self.category_id_map = {cat['id']: i + 1 for i, cat in enumerate(category_infos)}
self.transforms = build_transforms(train, self.categories, transforms, category_names)
self.cache_dir = cache_dir
# Convert label_files to numpy array and use
self.label_files = np.array(label_files).astype(np.string_)
def __len__(self):
"""Function to return the number of label files"""
return len(self.label_files)
def __getitem__(self, idx):
"""Function to get an item"""
idx = idx if idx >= 0 else len(self) + idx
if idx < 0 or idx >= len(self):
raise IndexError(f'index out of range')
image_id = idx + 1
label_file = self.label_files[idx].decode('ascii')
# Load label information corresponding to idx from the export compressed file into memory
with ZipFile(BytesIO(self.export_data), 'r') as export:
label = load_label(export, label_file, self.category_id_map, image_id)
# Download the image through the Suite sdk based on label_id
try:
image = load_image(self.client, label['label_id'], self.cache_dir)
# Download data in real time using get_data from Suite sdk
except Exception as e:
print(f'Failed to load the {idx}-th image due to {repr(e)}, getting {idx + 1}-th data instead')
return self.__getitem__(idx + 1)
target = {
'image_id': image_id,
'label_id': label['label_id'],
'annotations': label['annotations'],
}
if self.transforms is not None:
image, target = self.transforms(image, target)
return image, target
测试集也以类似的方式处理。下面的代码段实例化测试集的套件Coco数据集对象类,以包装套件数据集,使其与Torchvision COCOEvaluator兼容。
class SuiteCocoDataset(C.CocoDetection):
"""
Instantiate the SuiteCocoDataset object class for test set
(by wrapping SuiteDataset to make compatible with torchvision's official COCOEvaluator)
"""
def __init__(
self,
team_name: str,
access_key: str,
project_name: str,
export_name: str,
train: bool,
caching_image: bool = True,
transforms: Optional[List[Callable]] = None,
category_names: Optional[List[str]] = None,
num_init_workers: int = 20,
):
"""Function to initialize the object class"""
super().__init__(img_folder='', ann_file=None, transforms=None)
# Call the SuiteDataset class
dataset = SuiteDataset(
team_name, access_key, project_name, export_name,
train=False, transforms=[],
caching_image=caching_image, category_names=category_names,
)
self.client = dataset.client
self.cache_dir = dataset.cache_dir
self.coco = build_coco_dataset(dataset, num_init_workers)
self.ids = list(sorted(self.coco.imgs.keys()))
self._transforms = build_transforms(train, dataset.categories, transforms, category_names)
def _load_image(self, id: int):
"""Function to load an image"""
label_id = self.coco.loadImgs(id)[0]['label_id']
image = load_image(self.client, label_id, self.cache_dir)
return image
def __getitem__(self, idx):
"""Function to get an item"""
try:
return super().__getitem__(idx)
except Exception as e:
print(f'Failed to load the {idx}-th image due to {repr(e)}, getting {idx + 1}-th data instead')
return self.__getitem__(idx + 1)
然后,您可以将套件数据集和套件Coco数据集用于训练代码。下面的代码段演示如何使用它。在模型开发期间,对其进行训练并评估为 。train_loadertest_loader
train_dataset = SuiteDataset(
team_name=args.team_name,
access_key=args.access_key,
project_name=args.project_name,
export_name=args.train_export_name,
caching_image=args.caching_image,
train=True,
)
test_dataset = SuiteCocoDataset(
team_name=args.team_name,
access_key=args.access_key,
project_name=args.project_name,
export_name=args.test_export_name,
caching_image=args.caching_image,
train=False,
num_init_workers=args.workers,
)
train_loader = DataLoader(
train_dataset, num_workers=args.workers,
batch_sampler=G.GroupedBatchSampler(
RandomSampler(train_dataset),
G.create_aspect_ratio_groups(train_dataset, k=3),
args.batch_size,
),
collate_fn=collate_fn,
)
test_loader = DataLoader(
test_dataset, num_workers=args.workers,
sampler=SequentialSampler(test_dataset), batch_size=1,
collate_fn=collate_fn,
)
第 9 步:使用 NVIDIA TAO 工具包训练模型
现在,您可以使用使用套件注释的数据训练对象检测模型。借助 TAO 工具包,您可以根据数据定制流行的网络架构和骨干网,以训练、微调、清理和导出高度优化和准确的计算机视觉模型,以便进行部署。在本教程中,您可以选择 YOLO v4,这是 TAO 中包含的对象检测模型。
首先,从 TAO 工具包快速入门(https://catalog.ngc.nvidia.com/orgs/nvidia/teams/tao/resources/tao-getting-started)下载笔记本示例。
pip3 install nvidia-tao
wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/tao/tao-getting-started/versions/4.0.1/zip -O getting_started_v4.0.1.zip
$ unzip -u getting_started_v4.0.1.zip -d ./getting_started_v4.0.1 && rm -rf getting_started_v4.0.1.zip && cd ./getting_started_v4.0.1
然后,使用下面的代码启动笔记本电脑:
$ jupyter notebook --ip 0.0.0.0 --port 8888 --allow-root
在本地主机上,打开互联网浏览器并转到 URL:
http://0.0.0.0:8888
要创建 YOLOv4 模型,请打开 并按照笔记本说明训练模型。notebooks/tao_launcher_starter_kit/yolo_v4/yolo_v4.ipynb
根据结果微调模型,直到达到指标目标。如果需要,可以在此步骤中创建自己的主动学习循环。在实际方案中,您可以查询失败预测的样本,指定可注释新样本数据放置的标签器,并使用新标记的训练数据补充模型。当您反复改进模型性能时,Superb AI 套件可以帮助您在后续的模型开发回合中收集数据并添加注释。
助最近发布的 TAO 工具包 4.0,无需 AI 专业知识即可更轻松地启动和创建高精度模型。使用 AutoML 自动微调超参数,以交钥匙方式将 TAO 工具包部署到各种云服务,将 TAO 工具包与第三方 MLOP 服务集成,并探索新的基于变形金刚的视觉模型(基于变压器的视觉模型)。
结论
计算机视觉中的数据标记可能会产生许多独特的问题。由于需要标记的数据量很大,因此该过程可能很困难且成本高昂。此外,此过程可能是主观的,因此很难在大型数据集中获得一致的高质量标记交付项。
训练模型也很困难,因为许多算法和超参数都需要调整和优化。此过程需要深入了解数据和模型,并进行大量实验以获得最佳结果。此外,计算机视觉模型往往需要大量的计算能力进行训练,因此很难在有限的预算和时间表下进行训练。
借助 Superb AI 套件,您可以收集和标记高质量的计算机视觉数据集。NVIDIA TAO 工具包可帮助您优化预先训练的计算机视觉模型。两者结合使用可显著缩短计算机视觉应用程序的开发时间,而不会降低质量。
由3D建模学习工作室 翻译整理,转载请注明出处!