생성 데이터 인텔리전스

Amazon SageMaker Ground Truth를 사용한 뼈대 기반 포즈 주석 라벨링 | 아마존 웹 서비스

시간

자세 추정은 이미지나 비디오 내의 물체(예: 사람 또는 차량)에서 일련의 점을 감지하는 컴퓨터 비전 기술입니다. 자세 추정은 스포츠, 로봇 공학, 보안, 증강 현실, 미디어 및 엔터테인먼트, 의료 응용 분야 등의 실제 응용 분야에 적용됩니다. 자세 추정 모델은 리그에 의해 정의된 일관된 점(좌표) 세트로 주석이 달린 이미지 또는 비디오에 대해 훈련됩니다. 정확한 자세 추정 모델을 훈련하려면 먼저 주석이 달린 이미지의 대규모 데이터 세트를 획득해야 합니다. 많은 데이터 세트에는 수만 또는 수십만 개의 주석이 달린 이미지가 있으며 구축하는 데 상당한 리소스가 필요합니다. 자세 추정 모델의 모델 성능은 레이블이 지정된 데이터 품질과 데이터 양에 크게 영향을 받기 때문에 레이블 지정 실수를 식별하고 예방하는 것이 중요합니다.

이 게시물에서는 사용자 정의 라벨 작업 흐름을 사용하는 방법을 보여줍니다. 아마존 세이지 메이커 그라운드 진실 키포인트 라벨링을 위해 특별히 설계되었습니다. 이 사용자 정의 워크플로우는 라벨링 프로세스를 간소화하고 라벨링 오류를 최소화하여 고품질 포즈 라벨을 얻는 데 드는 비용을 줄이는 데 도움이 됩니다.

고품질 데이터의 중요성 및 라벨링 오류 감소

고품질 데이터는 강력하고 안정적인 자세 추정 모델을 훈련하는 데 필수적입니다. 이러한 모델의 정확도는 각 포즈 키포인트에 할당된 레이블의 정확성 및 정밀도와 직접적으로 연관되어 있으며, 이는 주석 프로세스의 효율성에 따라 달라집니다. 또한 상당한 양의 다양하고 주석이 잘 달린 데이터를 보유하면 모델이 광범위한 포즈, 변형 및 시나리오를 학습할 수 있으므로 다양한 실제 응용 프로그램에서 일반화 및 성능이 향상됩니다. 이렇게 주석이 달린 대규모 데이터세트를 획득하려면 포즈 정보로 이미지에 주의 깊게 라벨을 붙이는 인간 주석자가 필요합니다. 이미지 내의 관심 지점에 라벨을 지정하는 동안 주석 작성자에게 시각적 지침을 제공하기 위해 라벨을 지정하는 동안 개체의 골격 구조를 확인하는 것이 유용합니다. 이는 왼쪽-오른쪽 교체 또는 잘못된 라벨(예: 발을 어깨로 표시)과 같은 데이터 세트에 통합되기 전에 라벨 오류를 식별하는 데 도움이 됩니다. 예를 들어, 다음 예에서 발생한 좌우 교체와 같은 라벨링 오류는 뼈대 리그 라인의 교차 및 색상 불일치로 쉽게 식별할 수 있습니다. 이러한 시각적 신호는 라벨링 담당자가 실수를 인식하는 데 도움이 되며 라벨 세트가 더 깔끔해집니다.

라벨링의 수동 특성으로 인해 크고 정확한 라벨링된 데이터 세트를 얻는 것은 비용이 많이 들 수 있으며 비효율적인 라벨링 시스템에서는 더욱 그렇습니다. 따라서 라벨링 작업 흐름을 설계할 때 라벨링 효율성과 정확성이 중요합니다. 이 게시물에서는 사용자 지정 SageMaker Ground Truth 라벨링 워크플로를 사용하여 이미지에 빠르고 정확하게 주석을 달고 자세 추정 워크플로를 위한 대규모 데이터 세트를 개발하는 부담을 줄이는 방법을 보여줍니다.

솔루션 개요

이 솔루션은 라벨링 작업자가 웹 브라우저를 사용하여 로그인하고, 라벨링 작업에 액세스하고, Crowd-2D-skeleton 사용자 인터페이스(UI)를 사용하여 이미지에 주석을 달 수 있는 온라인 웹 포털을 제공합니다. SageMaker Ground Truth. 라벨링 작업 인력이 생성한 주석이나 라벨은 다음으로 내보내집니다. 아마존 단순 스토리지 서비스 (Amazon S3) 버킷은 딥 러닝 컴퓨터 비전 모델 교육과 같은 다운스트림 프로세스에 사용할 수 있습니다. 이 솔루션은 웹 포털을 생성하는 데 필요한 구성 요소를 설정 및 배포하는 방법과 이 레이블 지정 워크플로에 대한 레이블 지정 작업을 만드는 방법을 안내합니다.

다음은 전체 아키텍처의 다이어그램입니다.

이 아키텍처는 여러 주요 구성 요소로 구성되어 있으며 각 구성 요소에 대해서는 다음 섹션에서 자세히 설명합니다. 이 아키텍처는 라벨링 작업 인력에게 SageMaker Ground Truth가 호스팅하는 온라인 웹 포털을 제공합니다. 이 포털을 통해 각 라벨러는 로그인하여 라벨링 작업을 볼 수 있습니다. 로그인한 후 라벨러는 라벨링 작업을 선택하고 호스팅되는 사용자 정의 UI를 사용하여 이미지에 주석을 달기 시작할 수 있습니다. 아마존 CloudFront를. 우리는 사용 AWS 람다 주석 전 및 주석 후 데이터 처리를 위한 함수입니다.

다음 스크린샷은 UI의 예입니다.

라벨러는 UI를 사용하여 이미지의 특정 키포인트를 표시할 수 있습니다. 키포인트 사이의 선은 UI가 사용하는 뼈대 리그 정의를 기반으로 사용자를 위해 자동으로 그려집니다. UI에서는 다음과 같은 다양한 사용자 정의가 가능합니다.

  • 사용자 정의 키포인트 이름
  • 구성 가능한 키포인트 색상
  • 구성 가능한 리그 라인 색상
  • 구성 가능한 뼈대 및 장비 구조

이들 각각은 라벨링의 용이성과 유연성을 향상시키기 위한 기능입니다. 구체적인 UI 사용자 정의 세부정보는 다음에서 확인할 수 있습니다. GitHub 레포 이 게시물의 뒷부분에 요약되어 있습니다. 이 게시물에서는 인간의 자세 추정을 기본 작업으로 사용하지만 동물이나 차량과 같은 다른 개체에 대한 사전 정의된 리그를 사용하여 개체 포즈에 라벨을 지정하도록 확장할 수도 있습니다. 다음 예에서는 이것이 박스 트럭의 지점에 라벨을 지정하는 데 어떻게 적용되는지 보여줍니다.

SageMaker 지상 진실

이 솔루션에서는 SageMaker Ground Truth를 사용하여 라벨링 인력에게 온라인 포털과 라벨링 작업을 관리하는 방법을 제공합니다. 이 게시물에서는 귀하가 SageMaker Ground Truth에 익숙하다고 가정합니다. 자세한 내용은 다음을 참조하세요. 아마존 세이지 메이커 그라운드 진실.

CloudFront 배포

이 솔루션의 경우 레이블 지정 UI에는 Crowd-2d-skeleton 구성 요소라는 맞춤형 JavaScript 구성 요소가 필요합니다. 이 구성 요소는 다음에서 찾을 수 있습니다. GitHub의 Amazon의 오픈 소스 이니셔티브의 일환으로. CloudFront 배포판은 다음을 호스팅하는 데 사용됩니다. 군중-2d-skeleton.js, 이는 SageMaker Ground Truth UI에 필요합니다. CloudFront 배포판에는 원본 액세스 ID가 할당되며, 이를 통해 CloudFront 배포판은 S2 버킷에 있는 Crowd-3d-skeleton.js에 액세스할 수 있습니다. S3 버킷은 비공개로 유지되며 버킷 정책을 통해 원본 액세스 ID에 적용한 제한으로 인해 이 버킷의 다른 객체는 CloudFront 배포를 통해 사용할 수 없습니다. 이는 최소 권한 원칙을 따르는 데 권장되는 방식입니다.

아마존 S3 버킷

S3 버킷을 사용하여 SageMaker Ground Truth 입력 및 출력 매니페스트 파일, 사용자 지정 UI 템플릿, 레이블 지정 작업용 이미지, 사용자 지정 UI에 필요한 JavaScript 코드를 저장합니다. 이 버킷은 비공개이며 공개적으로 액세스할 수 없습니다. 버킷에는 CloudFront 배포가 UI에 필요한 JavaScript 코드에만 액세스할 수 있도록 제한하는 버킷 정책도 있습니다. 이렇게 하면 CloudFront 배포가 S3 버킷의 다른 객체를 호스팅하지 못하게 됩니다.

사전 주석 Lambda 함수

SageMaker Ground Truth 레이블 지정 작업은 일반적으로 JSON Lines 형식의 입력 매니페스트 파일을 사용합니다. 이 입력 매니페스트 파일에는 레이블 지정 작업에 대한 메타데이터가 포함되어 있으며 레이블을 지정해야 하는 데이터에 대한 참조 역할을 하며 데이터가 주석자에게 표시되는 방식을 구성하는 데 도움이 됩니다. 사전 주석 Lambda 함수는 매니페스트 데이터가 사용자 지정 UI 템플릿에 입력되기 전에 입력 매니페스트 파일의 항목을 처리합니다. UI의 주석 작성자에게 데이터를 표시하기 전에 항목에 대한 서식 지정이나 특별 수정을 수행할 수 있는 곳입니다. 사전 주석 Lambda 함수에 대한 자세한 내용은 다음을 참조하십시오. 사전 주석 람다.

주석 후 Lambda 함수

주석 사전 Lambda 함수와 유사하게 주석 사후 함수는 모든 레이블 지정자가 레이블 지정을 마친 후 최종 주석 출력 결과를 작성하기 전에 수행할 수 있는 추가 데이터 처리를 처리합니다. 이 처리는 레이블 지정 작업 출력 결과에 대한 데이터 형식을 지정하는 Lambda 함수에 의해 수행됩니다. 이 솔루션에서는 이를 사용하여 원하는 출력 형식으로 데이터를 반환합니다. 주석 후 Lambda 함수에 대한 자세한 내용은 다음을 참조하십시오. 주석 후 람다.

주석 후 Lambda 함수 역할

우리는 AWS 자격 증명 및 액세스 관리 (IAM) 역할은 주석 후 Lambda 함수에 S3 버킷에 대한 액세스 권한을 부여합니다. 이는 출력 매니페스트 파일에 최종 결과를 쓰기 전에 주석 결과를 읽고 수정하는 데 필요합니다.

SageMaker Ground Truth 역할

우리는 이 IAM 역할을 사용하여 SageMaker Ground Truth 레이블 지정 작업에 Lambda 함수를 호출하고 S3 버킷의 이미지, 매니페스트 파일 및 사용자 정의 UI 템플릿을 읽을 수 있는 기능을 제공합니다.

사전 조건

이 연습에서는 다음과 같은 전제 조건이 있어야합니다.

이 솔루션에서는 AWS CDK를 사용하여 아키텍처를 배포합니다. 그런 다음 샘플 라벨링 작업을 생성하고, 주석 포털을 사용하여 라벨링 작업의 이미지에 라벨을 지정하고, 라벨링 결과를 검사합니다.

AWS CDK 스택 생성

모든 사전 요구 사항을 완료하면 솔루션을 배포할 준비가 된 것입니다.

리소스 설정

리소스를 설정하려면 다음 단계를 완료하세요.

  1. 다음에서 예제 스택을 다운로드하세요. GitHub 레포.
  2. cd 명령을 사용하여 저장소로 변경합니다.
  3. Python 환경을 생성하고 필수 패키지를 설치합니다(자세한 내용은 README.md 저장소 참조).
  4. Python 환경이 활성화된 상태에서 다음 명령을 실행합니다.
  5. 다음 명령을 실행하여 AWS CDK를 배포합니다.
    cdk deploy

  6. 배포 후 스크립트를 실행하려면 다음 명령어를 실행하세요.
    python scripts/post_deployment_script.py

라벨링 작업 생성

리소스를 설정하고 나면 라벨링 작업을 생성할 준비가 된 것입니다. 이 게시물의 목적을 위해 저장소에 제공된 예제 스크립트와 이미지를 사용하여 라벨링 작업을 생성합니다.

  1. CD를 scripts 저장소의 디렉토리입니다.
  2. 다음 코드를 실행하여 인터넷에서 예제 이미지를 다운로드합니다.
    python scripts/download_example_images.py

이 스크립트는 예제 라벨링 작업에서 사용하는 10개의 이미지 세트를 다운로드합니다. 이 게시물의 뒷부분에서 사용자 정의 입력 데이터를 사용하는 방법을 검토합니다.

  1. 다음 코드를 실행하여 라벨링 작업을 만듭니다.
    python scripts/create_example_labeling_job.py <Labeling Workforce ARN>

이 스크립트는 SageMaker Ground Truth 개인 인력 ARN을 인수로 사용합니다. 이는 이 아키텍처를 배포한 것과 동일한 계정에 있는 인력에 대한 ARN이어야 합니다. 스크립트는 레이블 지정 작업을 위한 입력 매니페스트 파일을 생성하여 Amazon S3에 업로드하고 SageMaker Ground Truth 사용자 지정 레이블 지정 작업을 생성합니다. 이 게시물의 뒷부분에서 이 스크립트의 세부 사항에 대해 더 자세히 살펴보겠습니다.

데이터 세트에 레이블 지정

예제 레이블 지정 작업을 시작하면 SageMaker 콘솔과 인력 포털에 표시됩니다.

인력 포털에서 라벨링 작업을 선택하고 일을 시작하다.

예시 데이터세트의 이미지가 표시됩니다. 이 시점에서 사용자 정의 Crowd-2D-skeleton UI를 사용하여 이미지에 주석을 달 수 있습니다. 다음을 참조하여 Crowd-2D-skeleton UI에 익숙해질 수 있습니다. 사용자 인터페이스 개요. 우리는 다음의 리그 정의를 사용합니다. COCO 키포인트 탐지 데이터 세트 챌린지 인간 포즈 리그로 사용됩니다. 다시 말씀드리지만, 사용자 정의 UI 구성 요소 없이 이를 사용자 정의하여 요구 사항에 따라 포인트를 제거하거나 추가할 수 있습니다.

이미지에 주석을 다 추가했으면 다음을 선택하세요. 문의하기. 모든 이미지에 라벨이 지정될 때까지 데이터세트의 다음 이미지로 이동합니다.

라벨링 결과에 액세스

레이블 지정 작업의 모든 이미지 레이블 지정을 마치면 SageMaker Ground Truth는 주석 후 Lambda 함수를 호출하고 모든 주석이 포함된 output.manifest 파일을 생성합니다. 이것 output.manifest S3 버킷에 저장됩니다. 우리의 경우 출력 매니페스트의 위치는 S3 URI 경로를 따라야 합니다. s3://<bucket name> /labeling_jobs/output/<labeling job name>/manifests/output/output.manifest. output.manifest 파일은 JSON Lines 파일로, 각 줄은 라벨링 인력의 단일 이미지와 해당 주석에 해당합니다. 각 JSON Lines 항목은 여러 필드가 있는 JSON 개체입니다. 우리가 관심을 갖고 있는 분야를 이라고 합니다. label-results. 이 필드의 값은 다음 필드를 포함하는 개체입니다.

  • 데이터세트_객체_ID – 입력 매니페스트 항목의 ID 또는 인덱스
  • data_object_s3_uri – 이미지의 Amazon S3 URI
  • 이미지 _ 파일 _ 이름 – 이미지의 파일 이름
  • 이미지_s3_위치 – 이미지의 Amazon S3 URL
  • 원본_주석 – 원본 주석(사전 주석 작업 흐름을 사용하는 경우에만 설정 및 사용됨)
  • 업데이트_주석 – 이미지에 대한 주석
  • 작업자 ID – 주석을 작성한 근로자
  • no_changes_need – 변경 필요 없음 확인란이 선택되었는지 여부
  • 수정되었습니다 – 주석 데이터가 원래 입력 데이터와 다른지 여부
  • total_time_in_seconds – 인력이 이미지에 주석을 추가하는 데 걸린 시간

이러한 필드를 사용하면 각 이미지에 대한 주석 결과에 액세스하고 이미지에 라벨을 지정하는 데 걸리는 평균 시간과 같은 계산을 수행할 수 있습니다.

나만의 라벨링 작업 만들기

이제 예제 레이블 지정 작업을 생성하고 전체 프로세스를 이해했으므로 매니페스트 파일을 생성하고 레이블 지정 작업을 시작하는 코드를 안내합니다. 우리는 자체 라벨링 작업을 시작하기 위해 수정해야 할 스크립트의 주요 부분에 중점을 둡니다.

우리는 create_example_labeling_job.py 에 위치한 스크립트 GitHub 저장소. 스크립트는 나중에 스크립트에서 사용되는 변수를 설정하여 시작됩니다. 일부 변수는 단순성을 위해 하드 코딩되어 있지만, 스택에 종속적인 다른 변수는 AWS CDK 스택에서 생성된 값을 가져와 런타임에 동적으로 가져옵니다.

# Setup/get variables values from our CDK stack
s3_upload_prefix = "labeling_jobs"
image_dir = 'scripts/images'
manifest_file_name = "example_manifest.txt"
s3_bucket_name = read_ssm_parameter('/crowd_2d_skeleton_example_stack/bucket_name')
pre_annotation_lambda_arn = read_ssm_parameter('/crowd_2d_skeleton_example_stack/pre_annotation_lambda_arn')
post_annotation_lambda_arn = read_ssm_parameter('/crowd_2d_skeleton_example_stack/post_annotation_lambda_arn')
ground_truth_role_arn = read_ssm_parameter('/crowd_2d_skeleton_example_stack/sagemaker_ground_truth_role')
ui_template_s3_uri = f"s3://{s3_bucket_name}/infrastructure/ground_truth_templates/crowd_2d_skeleton_template.html"
s3_image_upload_prefix = f'{s3_upload_prefix}/images'
s3_manifest_upload_prefix = f'{s3_upload_prefix}/manifests'
s3_output_prefix = f'{s3_upload_prefix}/output'

이 스크립트의 첫 번째 핵심 섹션은 매니페스트 파일 생성입니다. 매니페스트 파일은 SageMaker Ground Truth 레이블 지정 작업에 대한 세부 정보가 포함된 JSON 라인 파일이라는 점을 기억하세요. 각 JSON Lines 객체는 라벨을 지정해야 하는 하나의 항목(예: 이미지)을 나타냅니다. 이 워크플로의 경우 개체에는 다음 필드가 포함되어야 합니다.

  • 소스 참조 – 레이블을 지정하려는 이미지에 대한 Amazon S3 URI입니다.
  • 주석 – 사전 주석 작업 흐름에 사용되는 주석 개체 목록입니다. 참조 군중 2D 뼈대 문서 예상 값에 대한 자세한 내용은

스크립트는 다음 코드 섹션을 사용하여 이미지 디렉터리의 각 이미지에 대한 매니페스트 줄을 생성합니다.

# For each image in the image directory lets create a manifest line
manifest_items = []
for filename in os.listdir(image_dir):
    if filename.endswith('.jpg') or filename.endswith('.png'):
        img_path = os.path.join(
            image_dir,
            filename
        )
        object_name = os.path.join(
            s3_image_upload_prefix,
            filename
        ).replace("", "/")

        # upload to s3_bucket
        s3_client.upload_file(img_path, s3_bucket_name, object_name)
f
        # add it to manifest file
        manifest_items.append({
            "source-ref": f's3://{s3_bucket_name}/{object_name}',
            "annotations": [],
        })

다른 이미지를 사용하거나 다른 이미지 디렉터리를 가리키려면 코드의 해당 섹션을 수정하면 됩니다. 또한 사전 주석 워크플로를 사용하는 경우 배열과 모든 해당 주석 개체로 구성된 JSON 문자열로 주석 배열을 업데이트할 수 있습니다. 이 배열의 형식에 대한 자세한 내용은 군중 2D 뼈대 문서.

이제 매니페스트 항목이 생성되었으므로 이전에 생성한 S3 버킷에 매니페스트 파일을 생성하고 업로드할 수 있습니다.

# Create Manifest file
manifest_file_contents = "n".join([json.dumps(mi) for mi in manifest_items])
with open(manifest_file_name, "w") as file_handle:
    file_handle.write(manifest_file_contents)

# Upload manifest file
object_name = os.path.join(
    s3_manifest_upload_prefix,
    manifest_file_name
).replace("", "/")
s3_client.upload_file(manifest_file_name, s3_bucket_name, object_name)

레이블을 지정하려는 이미지가 포함된 매니페스트 파일을 생성했으므로 이제 레이블 지정 작업을 생성할 수 있습니다. 다음을 사용하여 프로그래밍 방식으로 라벨링 작업을 생성할 수 있습니다. Python 용 AWS SDK (Boto3). 라벨링 작업을 생성하는 코드는 다음과 같습니다.

# Create labeling job
client = boto3.client("sagemaker")
now = int(round(datetime.now().timestamp()))
response = client.create_labeling_job(
    LabelingJobName=f"crowd-2d-skeleton-example-{now}",
    LabelAttributeName="label-results",
    InputConfig={
        "DataSource": {
            "S3DataSource": {"ManifestS3Uri": f's3://{s3_bucket_name}/{object_name}'},
        },
        "DataAttributes": {},
    },
    OutputConfig={
        "S3OutputPath": f"s3://{s3_bucket_name}/{s3_output_prefix}/",
    },
    RoleArn=ground_truth_role_arn,
    HumanTaskConfig={
        "WorkteamArn": workteam_arn,
        "UiConfig": {"UiTemplateS3Uri": ui_template_s3_uri},
        "PreHumanTaskLambdaArn": pre_annotation_lambda_arn,
        "TaskKeywords": ["example"],
        "TaskTitle": f"Crowd 2D Component Example {now}",
        "TaskDescription": "Crowd 2D Component Example",
        "NumberOfHumanWorkersPerDataObject": 1,
        "TaskTimeLimitInSeconds": 28800,
        "TaskAvailabilityLifetimeInSeconds": 2592000,
        "MaxConcurrentTaskCount": 123,
        "AnnotationConsolidationConfig": {
            "AnnotationConsolidationLambdaArn": post_annotation_lambda_arn
        },
    },
)
print(response)

수정하고 싶은 이 코드의 측면은 다음과 같습니다. LabelingJobName, TaskTitleTaskDescription. 그만큼 LabelingJobName SageMaker가 작업을 참조하는 데 사용할 레이블 지정 작업의 고유 이름입니다. 이는 SageMaker 콘솔에 표시되는 이름이기도 합니다. TaskTitle 비슷한 목적으로 사용되지만 고유할 필요는 없으며 인력 포털에 표시되는 직무의 이름이 됩니다. 라벨을 붙이는 대상이나 라벨 작업의 목적을 더욱 구체적으로 지정할 수 있습니다. 마지막으로, 우리는 TaskDescription 필드. 이 필드는 작업에 대한 지침 및 지침과 같이 작업이 무엇인지에 대한 추가 컨텍스트를 레이블 지정자에게 제공하기 위해 인력 포털에 표시됩니다. 이러한 필드와 다른 필드에 대한 자세한 내용은 다음을 참조하세요. create_labeling_job 문서.

UI 조정

이 섹션에서는 UI를 사용자 정의할 수 있는 몇 가지 방법을 살펴보겠습니다. 다음은 모델링 작업에 맞게 UI를 조정하기 위한 가장 일반적인 잠재적인 사용자 정의 목록입니다.

  • 레이블을 지정할 수 있는 키포인트를 정의할 수 있습니다. 여기에는 키포인트의 이름과 색상이 포함됩니다.
  • (키포인트가 연결된) 뼈대의 구조를 변경할 수 있습니다.
  • 특정 키포인트 사이의 특정 선에 대한 선 색상을 변경할 수 있습니다.

이러한 모든 UI 사용자 정의는 여기에서 사용되는 JavaScript 구성 요소인 Crowd-2d-skeleton 구성 요소에 전달된 인수를 통해 구성 가능합니다. 사용자 정의 워크플로 템플릿. 이 템플릿에서는 Crowd-2d-skeleton 구성 요소의 사용법을 찾을 수 있습니다. 다음 코드에는 단순화된 버전이 표시됩니다.

<crowd-2d-skeleton
        imgSrc="{{ task.input.image_s3_uri | grant_read_access }}"
        keypointClasses='<keypoint classes>'
        skeletonRig='<skeleton rig definition>'
        skeletonBoundingBox='<skeleton bounding box size>'
        initialValues="{{ task.input.initial_values }}"
>

이전 코드 예제에서는 구성 요소에 대한 다음 특성을 볼 수 있습니다. imgSrc, keypointClasses, skeletonRig, skeletonBoundingBoxintialValues. 다음 섹션에서는 각 속성의 목적을 설명하지만 UI를 사용자 정의하는 것은 이러한 속성의 값을 변경하고, 템플릿을 저장하고, post_deployment_script.py 우리는 이전에 사용했습니다.

imgSrc 속성

XNUMXD덴탈의 imgSrc 속성은 라벨을 지정할 때 UI에 표시할 이미지를 제어합니다. 일반적으로 매니페스트 항목마다 다른 이미지가 사용되므로 이 속성은 내장된 리퀴드 템플릿 언어. 이전 코드 예제에서 속성 값이 다음으로 설정되어 있음을 볼 수 있습니다. {{ task.input.image_s3_uri | grant_read_access }}, 이는 실제 템플릿 변수로 대체될 Liquid 템플릿 변수입니다. image_s3_uri 템플릿이 렌더링될 때의 값입니다. 사용자가 주석을 달기 위해 이미지를 열면 렌더링 프로세스가 시작됩니다. 이 프로세스는 입력 매니페스트 파일에서 항목을 가져와 주석 전 Lambda 함수에 다음과 같이 보냅니다. event.dataObject. 사전 주석 기능은 광고 항목에서 필요한 정보를 가져와서 taskInput 그런 다음 Liquid 렌더링 엔진으로 전달되어 템플릿의 모든 Liquid 변수를 대체합니다. 예를 들어 다음 줄이 포함된 매니페스트 파일이 있다고 가정해 보겠습니다.

{"source-ref": "s3://my-bucket/exmaple.jpg", "annotations": []}

이 데이터는 사전 주석 기능으로 전달됩니다. 다음 코드는 함수가 이벤트 객체에서 값을 추출하는 방법을 보여줍니다.

def lambda_handler(event, context):
    print("Pre-Annotation Lambda Triggered")
    data_object = event["dataObject"]  # this comes directly from the manifest file
    annotations = data_object["annotations"]

    taskInput = {
        "image_s3_uri": data_object["source-ref"],
        "initial_values": json.dumps(annotations)
    }
    return {"taskInput": taskInput, "humanAnnotationRequired": "true"}

이 경우 함수에서 반환된 개체는 다음 코드와 같습니다.

{
  "taskInput": {
    "image_s3_uri": "s3://my-bucket/exmaple.jpg",
    "annotations": "[]"
  },
  "humanAnnotationRequired": "true"
}

함수에서 반환된 데이터는 Liquid 템플릿 엔진에서 사용할 수 있으며, 이 엔진은 템플릿의 템플릿 값을 함수에서 반환된 데이터 값으로 바꿉니다. 결과는 다음 코드와 같습니다.

<crowd-2d-skeleton
        imgSrc="s3://my-bucket/exmaple.jpg" <-- This was “injected” into template
        keypointClasses='<keypoint classes>'
        skeletonRig='<skeleton rig definition>'
        skeletonBoundingBox='<skeleton bounding box size>'
        initialValues="[]"
>

keypointClasses 속성

XNUMXD덴탈의 keypointClasses 속성은 UI에 표시되고 주석자가 사용할 키포인트를 정의합니다. 이 속성은 객체 목록이 포함된 JSON 문자열을 사용합니다. 각 객체는 키포인트를 나타냅니다. 각 키포인트 객체에는 다음 필드가 포함되어야 합니다.

  • id – 해당 키포인트를 식별하는 고유한 값입니다.
  • – HTML 16진수 색상으로 표현되는 키포인트 색상입니다.
  • 상표 – 이름 또는 키포인트 클래스.
  • x – 이 선택적 속성은 UI에서 뼈대 그리기 기능을 사용하려는 경우에만 필요합니다. 이 속성의 값은 뼈대 경계 상자를 기준으로 한 키포인트의 x 위치입니다. 이 값은 일반적으로 다음과 같이 구합니다. 스켈레톤 리그 생성기 도구. 키포인트 주석을 수행하고 전체 골격을 한 번에 그릴 필요가 없는 경우 이 값을 0으로 설정할 수 있습니다.
  • y – 이 선택적 속성은 x와 유사하지만 수직 차원에 대한 것입니다.

에 대한 자세한 내용은 keypointClasses 속성을 참조하세요. keypointClasses 문서.

SkeletonRig 속성

XNUMXD덴탈의 skeletonRig 속성은 키포인트 사이에 선을 그려야 하는 키포인트를 제어합니다. 이 속성은 키포인트 레이블 쌍 목록이 포함된 JSON 문자열을 사용합니다. 각 쌍은 사이에 선을 그릴 키포인트를 UI에 알려줍니다. 예를 들어, '[["left_ankle","left_knee"],["left_knee","left_hip"]]' 사이에 선을 그리도록 UI에 알립니다. "left_ankle""left_knee" 그리고 사이에 선을 그어라. "left_knee""left_hip". 이는 다음에 의해 생성될 수 있습니다. 스켈레톤 리그 생성기 도구.

SkeletonBoundingBox 속성

XNUMXD덴탈의 skeletonBoundingBox 속성은 선택사항이며 UI에서 뼈대 그리기 기능을 사용하려는 경우에만 필요합니다. 뼈대 그리기 기능은 단일 주석 작업으로 전체 뼈대에 주석을 달 수 있는 기능입니다. 이 게시물에서는 이 기능을 다루지 않습니다. 이 속성의 값은 뼈대의 경계 상자 크기입니다. 이 값은 일반적으로 다음과 같이 구합니다. 스켈레톤 리그 생성기 도구. 키포인트 주석을 수행하고 전체 골격을 한 번에 그릴 필요가 없는 경우 이 값을 null로 설정할 수 있습니다. 이 값을 얻으려면 Skeleton Rig Creator 도구를 사용하는 것이 좋습니다.

초기값 속성

XNUMXD덴탈의 initialValues 속성은 다른 프로세스(예: 다른 라벨링 작업 또는 기계 학습 모델)에서 얻은 주석으로 UI를 미리 채우는 데 사용됩니다. 조정이나 검토 작업을 수행할 때 유용합니다. 이 필드의 데이터는 일반적으로 동일한 설명에서 동적으로 채워집니다. imgSrc 기인하다. 자세한 내용은 다음에서 확인할 수 있습니다. 군중 2D 뼈대 문서.

정리

향후 요금이 발생하지 않도록 하려면 S3 버킷에서 객체를 삭제하고 AWS CDK 스택을 삭제해야 합니다. Amazon SageMaker 콘솔이나 AWS 명령 줄 인터페이스 (AWS CLI). 버킷의 S3 객체를 모두 삭제한 후 다음 코드를 실행하여 AWS CDK를 삭제할 수 있습니다.

cdk destroy

이전에 생성한 리소스가 제거됩니다.

고려

워크플로를 생산하려면 추가 단계가 필요할 수 있습니다. 조직의 위험 프로필에 따른 몇 가지 고려 사항은 다음과 같습니다.

  • 액세스 및 애플리케이션 로깅 추가
  • 웹 애플리케이션 방화벽(WAF) 추가
  • 최소 권한을 따르도록 IAM 권한 조정

결론

이 게시물에서는 자세 추정 데이터 세트를 구축할 때 라벨링 효율성과 정확성의 중요성을 공유했습니다. 두 항목 모두에 도움이 되도록 SageMaker Ground Truth를 사용하여 라벨링 프로세스 중 효율성과 정확성을 향상시키는 것을 목표로 뼈대 기반 포즈 라벨링 작업을 지원하는 사용자 지정 라벨링 워크플로를 구축하는 방법을 보여주었습니다. 다양한 사용자 정의 포즈 추정 라벨링 요구 사항에 맞게 코드와 예제를 추가로 확장할 수 있는 방법을 보여주었습니다.

레이블 지정 작업에 이 솔루션을 사용하고 사용자 지정 레이블 지정 워크플로와 관련된 지원이나 문의가 있는 경우 AWS에 문의하는 것이 좋습니다.


저자에 관하여

아서 퍼트넘 AWS Professional Services의 풀스택 데이터 과학자입니다. Arthur의 전문 지식은 프런트엔드 및 백엔드 기술을 개발하고 AI 시스템에 통합하는 데 중점을 두고 있습니다. 업무 외에 Arthur는 최신 기술 발전을 탐구하고, 가족과 함께 시간을 보내고, 야외 활동을 즐기는 것을 즐깁니다.

벤 펜커 AWS Professional Services의 선임 데이터 과학자이며 고객이 스포츠에서 의료, 제조에 이르기까지 다양한 산업에서 ML 솔루션을 구축하고 배포하는 데 도움을 주었습니다. 그는 박사 학위를 가지고 있습니다. Texas A&M University에서 물리학을 전공하고 6년의 업계 경험을 쌓았습니다. Ben은 야구, 독서, 자녀 양육을 즐깁니다.

자비스 리 AWS Professional Services의 수석 데이터 과학자입니다. 그는 6년 넘게 AWS에서 근무하면서 기계 학습 및 컴퓨터 비전 문제에 관해 고객과 협력했습니다. 업무 외에는 자전거 타기를 즐깁니다.

spot_img

최신 인텔리전스

spot_img