使用 AWS SDK for Java 2.x 玩转 Amazon Lookout for Vision:工业缺陷检测全生命周期示例解析
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本篇技术指南以 javav2/example_code/lookoutvision 下的官方示例为基础系统讲解如何用 AWS SDK for Java 2.x 驱动 Amazon Lookout for Vision覆盖「项目创建 → 数据集管理 → 模型训练 → 模型托管 → 实时异常检测 → 边缘打包 → 标签管理」的完整调用链。读完本文你将掌握每个 API 对应的 Java 客户端方法、参数含义、长时任务的轮询状态机写法以及如何配置 config.properties 与 JSON 配置文件把整套示例跑起来。Amazon Lookout for Vision 是什么Amazon Lookout for Vision 是 AWS 面向工业质检场景的机器学习服务能够在工业产品中大规模、准确地发现视觉缺陷划痕、污渍、异物、装配错误等无需具备机器学习经验即可通过上传少量正常/异常图像训练出可用的视觉异常检测模型。在 AWS 官方代码仓库中javav2/example_code/lookoutvision目录提供了用 SDK for Java 2.x 操作该服务的完整示例集合所有示例通过同步LookoutVisionClient调用服务 API是理解 Lookout for Vision 各项操作的入口级参考实现。前置条件与重要提示运行环境示例的运行前提与javav2目录下的所有 Java 示例一致详见 javav2 目录 README本地可访问本仓库clone、fork 或下载 zip安装 Apache Maven3.0示例假设 Java SDK 可以通过**默认凭证链default credentials provider chain**获取 AWS 凭证在~/.aws/config中配置 IAM Identity Center SSO 设置或在~/.aws/credentials中配置临时凭证配置默认 Region未显式设置时默认使用us-east-1。⚠ 成本与安全提示原 README 明确警告以下几点实际运行时务必注意运行示例代码会产生 AWS 账户费用运行测试同样可能产生费用模型训练与托管按时间计费建议为代码授予最小权限least privilege仅授予完成任务所需的最小权限示例未在所有 AWS 区域经过测试使用前请确认目标区域可用。代码结构总览目录内包含 5 个工具类utility classes与 20 个可直接运行的示例类工具类管理资源的静态函数集合文件职责Projects.java管理 Lookout for Vision 项目ProjectDatasets.java管理数据集DatasetModels.java管理模型ModelHosting.java管理模型托管HostingEdgePackages.java管理边缘打包任务Edge Packaging Jobs示例类与对应 API示例使用的 APICreateProject.javaCreateProjectCreateDataset.javaCreateDatasetCreateModel.javaCreateModelDeleteDataset.javaDeleteDatasetDeleteModel.javaDeleteModelDeleteProject.javaDeleteProjectDescribeDataset.javaDescribeDatasetDescribeModel.javaDescribeModelDescribeModelPackagingJob.javaDescribeModelPackagingJobDescribeProject.javaDescribeProjectDetectAnomalies.javaDetectAnomaliesListDatasetEntries.javaListDatasetEntriesListModelPackagingJobs.javaListModelPackagingJobsListModelTags.javaListTagsForResourceListModels.javaListModelsListProjects.javaListProjectsShowAnomalies.javaDetectAnomalies分类与分割信息展示StartModel.javaStartModelStartModelPackagingJob.javaStartModelPackagingJobStopModel.javaStopModelTagModel.javaTagResourceUntagModel.javaUntagResourceUpdateDatasetEntries.javaUpdateDatasetEntries此外目录内的 metadata.yaml 标记了DetectAnomalies.java与测试类LookoutVisionTest.java与lookoutvision服务的关联关系供文档自动化的示例索引使用。项目Project管理一切资源的容器Lookout for Vision 中项目Project是模型、数据集、托管等资源的逻辑容器。示例 CreateProject.java 演示了如何创建项目LookoutVisionClient lfvClient LookoutVisionClient.builder().build(); ProjectMetadata project Projects.createProject(lfvClient, projectName); System.out.printf(Name: %s%n, project.projectName()); System.out.printf(ARN: %s%n, project.projectArn());其底层实现在 Projects.java 中核心是构造CreateProjectRequest并调用客户端CreateProjectRequest createProjectRequest CreateProjectRequest.builder() .projectName(projectName) .build(); CreateProjectResponse response lfvClient.createProject(createProjectRequest); return response.projectMetadata();ProjectMetadata返回项目的名称、ARN 与创建时间戳创建完成后即可基于项目创建数据集与模型。项目级操作还包含列出项目Projects.listProjects()使用listProjectsPaginator()分页迭代maxResults(100)把所有ProjectMetadata收集到List中返回Projects.java#L62-L84描述项目describeProject返回ProjectDescription其中hasDatasets()可用于判断项目是否已包含数据集删除项目deleteProject返回被删除项目的 ARN。命令行运行方式java -cp target/Lookout-for-VisionV2-1.0-SNAPSHOT.jar com.example.lookoutvision.CreateProject project_name数据集Dataset管理训练数据从哪里来Lookout for Vision 的数据集分为train与test两类。示例 Datasets.java 提供了一整套数据集操作。创建数据集带 manifest 或空数据集训练模型必须有manifest 文件Ground Truth 清单。README 提示可以使用 AWS 官方提供的脚本从.csv文件生成 manifest。Datasets.createDataset接受bucket与manifestFile两个参数若两者为 null 则创建空数据集后续用UpdateDatasetEntries填充InputS3Object s3Object InputS3Object.builder() .bucket(bucket) .key(manifestFile) .build(); DatasetGroundTruthManifest groundTruthManifest DatasetGroundTruthManifest.builder() .s3Object(s3Object) .build(); DatasetSource datasetSource DatasetSource.builder() .groundTruthManifest(groundTruthManifest) .build(); CreateDatasetRequest request CreateDatasetRequest.builder() .projectName(projectName) .datasetType(datasetType) // train 或 test .datasetSource(datasetSource) .build(); lfvClient.createDataset(request);创建是异步过程示例通过轮询describeDataset的状态字段判断是否完成Datasets.java#L100-L133CREATE_COMPLETE→ 完成CREATE_IN_PROGRESS→ 每 5 秒轮询一次CREATE_FAILED或其它 → 记录错误并结束。列出数据集条目JSON LineslistDatasetEntries用于分页拉取数据集中的 JSON Lines支持按多个字段过滤Datasets.java#L164-L191ListDatasetEntriesRequest request ListDatasetEntriesRequest.builder() .projectName(projectName) .datasetType(datasetType) .sourceRefContains(sourceRef) // 按 source-ref 字段过滤 .labeled(labeled) // 是否只返回已标注图像 .anomalyClass(classification) // 按异常分类过滤 .afterCreationDate(afterCreationDate) .beforeCreationDate(beforeCreationDate) .maxResults(100) .build();更新数据集条目updateDatasetEntries从本地 manifest 文件读取 JSON Lines 并通过UpdateDatasetEntries写入数据集Datasets.java#L283-L361InputStream sourceStream new FileInputStream(updateFile); SdkBytes sourceBytes SdkBytes.fromInputStream(sourceStream); UpdateDatasetEntriesRequest request UpdateDatasetEntriesRequest.builder() .projectName(projectName) .datasetType(datasetType) .changes(sourceBytes) .build(); lfvClient.updateDatasetEntries(request);更新同样是异步任务轮询状态机包含UPDATE_COMPLETE、UPDATE_IN_PROGRESS每 5 秒轮询、UPDATE_FAILED_ROLLBACK_IN_PROGRESS、UPDATE_FAILED_ROLLBACK_COMPLETE等分支。描述与删除数据集describeDataset返回DatasetDescription其中的imageStats()给出total图像总数、labeled已标注数、normal正常数、anomaly异常数四项统计deleteDataset按projectName datasetType删除对应数据集。模型Model训练从数据集到可用模型模型训练由 Models.java 中的createModel完成Models.java#L56-L131S3Location s3Location S3Location.builder() .bucket(bucket) // 训练结果输出 S3 桶 .prefix(folder) // 输出文件夹前缀 .build(); OutputConfig config OutputConfig.builder() .s3Location(s3Location) .build(); CreateModelRequest request CreateModelRequest.builder() .projectName(projectName) .description(description) .outputConfig(config) .build(); CreateModelResponse response lfvClient.createModel(request); String modelVersion response.modelMetadata().modelVersion();⚠重要训练完成后按训练成功所花费的时间计费。训练可能耗时数小时示例通过do/while循环每 60 秒轮询DescribeModel的状态TRAINED→ 训练完成TRAINING→ 每 60 秒继续等待TRAINING_FAILED→ 记录失败。第一个训练成功的模型版本号固定为1这一点在测试代码LookoutVisionTest.setUp()中也有体现测试将modelVersion硬编码为1。模型管理的其它操作包括describeModel返回 ARN、版本、状态、listModels列出项目下所有模型、deleteModel删除后通过listModels轮询确认模型从列表中消失见 Models.java#L342-L381。模型托管Hosting把模型跑起来做推断训练好的模型默认不提供推断服务必须启动托管hosting。Hosting.java 中的startModel核心调用如下Hosting.java#L37-L105StartModelRequest startModelRequest StartModelRequest.builder() .projectName(projectName) .modelVersion(modelVersion) .minInferenceUnits(minInferenceUnits) // 托管所需的推理单元数量 .build(); lfvClient.startModel(startModelRequest);⚠计费模型处于托管状态的时间即为计费时长。启动同样是异步过程轮询DescribeModel的状态HOSTED→ 托管成功STARTING_HOSTING→ 每 60 秒轮询HOSTING_FAILED→ 托管失败。停止托管使用stopModel轮询目标状态为TRAINED回到未托管状态中间态为STOPPING_HOSTING。停止后不再产生托管费用。异常检测DetectAnomalies推断图像是否有缺陷模型托管后即可用 DetectAnomalies.java 分析图像。核心流程DetectAnomalies.java#L44-L104InputStream sourceStream new FileInputStream(new File(photo)); SdkBytes imageSDKBytes SdkBytes.fromInputStream(sourceStream); byte[] imageBytes imageSDKBytes.asByteArray(); // 获取图像类型支持 image/jpeg 与 image/png String contentType getImageType(imageBytes); DetectAnomaliesRequest request DetectAnomaliesRequest.builder() .projectName(projectName) .modelVersion(modelVersion) .contentType(contentType) .build(); DetectAnomaliesResponse response lfvClient.detectAnomalies(request, RequestBody.fromBytes(imageBytes)); DetectAnomalyResult result response.detectAnomalyResult();DetectAnomalyResult的关键字段包括isAnomalous()是否异常与confidence()置信度。代码中还用NumberFormat.getPercentInstance()把置信度转为百分比输出。getImageType通过URLConnection.guessContentTypeFromStream识别 MIME 类型非image/jpeg/image/png会抛出IOException。分析配置analysis-config.jsonREADME 指出运行DetectAnomalies主程序时需要resources 文件夹中的 analysis-config.json配置文件。该文件的模板位于 analysis-config.json各字段含义如下{ project : 要使用的项目名称。, model_version : 要使用的模型版本。, confidence_limit : 置信度下限float 0-1 coverage_limit : 覆盖率上限float 0-1 anomaly_labels_limit : 允许的异常标签数量上限integer anomaly_label : 要查找的异常标签。 }主程序的main方法读取该 JSON 后调用analyzeImage依次执行三类判定DetectAnomalies.java#L250-L289rejectOnClassificationisAnomalous() true且confidence() confidence_limit→ 判定“Classification: An anomaly was found”rejectOnCoverage按anomalyLabel匹配prediction.anomalies()中的Anomaly当pixelAnomaly().totalPercentageArea() coverage_limit时判定“Coverage: Anomaly coverage too high”rejectOnAnomalyTypeCount统计异常类型集合大小扣除background类型后超过anomaly_labels_limit时判定“Anomaly type count: Too many anomaly types found”。运行方式java -cp target/Lookout-for-VisionV2-1.0-SNAPSHOT.jar com.example.lookoutvision.DetectAnomalies image config关于在图像上可视化分类与分割信息图像掩码与异常标签可参考ShowAnomalies示例及 AWS 官方文档中的“Showing classification and segmentation”。模型边缘打包Edge Packaging把模型部署到边缘设备Lookout for Vision 支持将模型打包为 AWS IoT Greengrass 组件运行在 Jetson Xavier 等边缘设备上。EdgePackages.java 演示了完整流程。从 JSON 模板构造请求buildPackagingJobRequest使用 JacksonObjectMapper读取 JSON 文件并映射为StartModelPackagingJobRequestEdgePackages.java#L133-L231。JSON 中Configuration.Greengrass字段支持两类目标目标设备模板Jetson Xavier——packaging-job-request-device-template.json{ Configuration: { Greengrass: { ComponentDescription: Greengrass 组件描述, ComponentName: Greengrass 组件名, ComponentVersion: Greengrass 组件版本n.n.n 格式, S3OutputLocation: { Bucket: S3 输出桶, Prefix: 桶内输出文件夹 }, Tags: [ { Key: 你的 Key, Value: 你的 Key 值 } ], TargetDevice: jetson_xavier } }, Description: 任务描述, JobName: 打包任务名, ModelVersion: 要打包的模型版本。单元测试要求此值为 1 }目标平台模板——packaging-job-request-hardware-template.json通过TargetPlatform指定硬件平台并支持CompilerOptions编译选项{ Configuration: { Greengrass: { CompilerOptions: {\gpu-code\: \sm_75\, \trt-ver\: \7.1.3\, \cuda-ver\: \10.2\}, ComponentName: Greengrass 组件名, ComponentVersion: Greengrass 组件版本, S3OutputLocation: { Bucket: 输出桶, Prefix: 输出文件夹 }, Tags: [ { Key: 你的 Key, Value: 你的 Key 值 } ], TargetPlatform: { Accelerator: NVIDIA, Arch: X86_64, Os: LINUX } } }, Description: 任务描述, JobName: 打包任务名, ModelVersion: 要打包的模型版本。单元测试要求此值为 1 }从源码可以看出映射逻辑若Greengrass配置包含TargetDevice键则用targetDevice(...)构造若包含TargetPlatform键则解析出TargetPlatformaccelerator、arch、os并用targetPlatform(...)compilerOptions(...)构造Tags存在时逐条构建Tag列表。启动打包任务startModelPackagingJob提交任务后通过DescribeModelPackagingJob轮询状态直至完成EdgePackages.java#L245-L314CREATED/RUNNING→ 每 60 秒轮询SUCCEEDED→ 打包成功FAILED→ 打包失败。配套的listModelPackagingJobs与describeModelPackagingJob分别用于列出项目下的打包任务与查询单个任务详情。更多打包设置项说明参见 AWS 官方文档“Packaging your model (SDK)”。模型标签管理Tagging模型支持用标签Key/Value 对做资源组织与成本归因相关示例TagModel.java→Models.tagModel先通过DescribeModel拿到模型 ARN再调用TagResource附加标签Models.java#L295-L330UntagModel.java→Models.untagModel同样先取 ARN再调用UntagResource移除指定 Key 的标签ListModelTags.java→Models.listTagsForModel调用ListTagsForResource列出模型上的全部标签无标签时输出“No tags found.”。构建与运行示例示例使用 Maven 构建pom.xml 的关键配置如下Java 版本要求21java.version/maven.compiler.source/target均为 21依赖管理通过 AWS SDK BOMsoftware.amazon.awssdk:bom:2.35.10统一版本核心依赖software.amazon.awssdk:lookoutvision服务客户端、software.amazon.awssdk:s3训练结果输出、org.json:json与jackson-databindJSON 解析、commons-cli命令行解析、junit-jupiter5.11.4测试构建插件maven-compiler-plugin3.1 与maven-surefire-plugin3.5.2。在示例目录下执行mvn package # 编译打包 mvn test # 运行 JUnit 测试打包后可类似如下方式运行以CreateProject为例java -cp target/Lookout-for-VisionV2-1.0-SNAPSHOT.jar com.example.lookoutvision.CreateProject project_name单元测试与 config.properties测试类 LookoutVisionTest.java 使用 JUnit 5TestMethodOrder(MethodOrderer.OrderAnnotation.class)保证按序执行覆盖了从创建项目、列出项目、创建空数据集、列出数据集条目、描述数据集、列出模型到删除资源的完整流程并通过Tag(IntegrationTest)标注为集成测试。⚠ 运行测试会操作真实 AWS 资源并可能产生费用。必须配置的 config.properties运行测试前必须在 resources 文件夹中的 config.properties 里定义全部必需值模板见 config.properties任何一项缺失都会导致 JUnit 测试失败配置项用途projectName测试中要创建的项目名称modelDescription模型的描述modelTrainingOutputBucket存放训练结果的 S3 桶modelTrainingOutputFolder桶内存放训练结果的文件夹photo用于分析的一张正常图像位置anomalousPhoto用于分析的一张异常图像位置anomalyLabel项目中的异常标签manifestFile用于填充训练数据集的本地 manifest 文件位置modelPackageJobJsonFile边缘打包任务请求 JSON 文件位置关于边缘打包测试modelPackageJobJsonFileREADME 特别强调三点使用上方两个模板 JSON 之一ModelVersion的值必须为 1模型版本号由 Lookout for Vision 自动分配第一个模型为 1每次运行测试都必须修改ComponentVersion与JobName否则会因重名冲突而失败。保留测试产物的技巧如果希望复用测试创建的项目、数据集与模型请禁用以下三个删除型测试deleteDataset_thenNotFound()deleteModel_thenNotFound()deleteProject_thenNotFound()这样测试结束后资源不会被清理便于后续实验复用。相关资源与延伸阅读Lookout for Vision 开发者指南Lookout for Vision API 参考SDK for Java 2.x Lookout for Vision 客户端参考本仓库 javav2 目录 README凭证配置、Maven 构建与测试通用说明项目级元数据 metadata.yaml服务与代码文件的关联索引Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐如何使用Python SDK实现Amazon Lookout for Vision工业视觉检测从零开始的完整指南如何使用Python SDK实现Amazon Lookout for Vision工业视觉检测从零开始的完整指南 Amazon Lookout for Vis示例工程教程后端aws-doc-sdk-examples使用 AWS SDK for Java 2.x 操作 Amazon Timestream 的完整示例与测试指南aws doc sdk examples使用 AWS SDK for Java 2.x 操作 Amazon Timestream 的完整示例与测试指南 Ama示例工程教程后端aws-doc-sdk-examplesAWS SDK for Java 2.x 使用 Amazon SQS 的官方代码示例全解javav2 版aws doc sdk examplesAWS SDK for Java 2.x 使用 Amazon SQS 的官方代码示例全解javav2 版 本文基于示例工程教程后端上一篇AutoRAG OpenVINO Reranker 实战指南在 CPU 与 Intel GPU 上加速 BGE 重排序下一篇RapidOCR C核心库开发指南跨平台移植实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考