기본 제공 이미지 객체 감지 알고리즘을 사용한 학습

AI Platform Training의 기본 제공 알고리즘을 사용하여 학습하면 학습 코드를 작성하지 않고도 데이터세트를 제출하고 모델을 학습시킬 수 있습니다. 이 페이지에서는 기본 제공 이미지 객체 감지 알고리즘의 작동 방식과 사용 방법을 설명합니다.

개요

기본 제공 이미지 객체 감지 알고리즘은 학습 및 검증 데이터세트를 사용하여 모델을 지속적으로 학습시킨 후 학습 작업 중에 생성된 가장 정확한 저장된 모델을 출력합니다. 또한 초매개변수 조정을 사용하여 최고의 모델 정확성을 얻을 수 있습니다. 내보낸 저장된 모델은 로컬에서 사용하거나 프로덕션 서비스의 AI Platform Prediction에 배포하여 예측에 직접 사용할 수 있습니다.

제한사항

이미지 기본 제공 알고리즘은 단일 CPU, GPU 또는 TPU로 학습을 지원합니다. 이로 인해 저장된 모델은 CPU 및 GPU에서의 작업과 호환됩니다.

기본 제공 이미지 객체 알고리즘을 사용한 학습에서는 다음 기능이 지원되지 않습니다.

  • 분산 학습. AI Platform Training에서 TensorFlow 분산 학습 작업을 실행하려면 학습 애플리케이션을 만들어야 합니다.
  • 멀티 GPU 학습. 기본 제공 알고리즘은 GPU를 한 번에 하나만 사용합니다. 머신 하나에서 GPU를 여러 개 사용하는 학습을 최대한 활용하려면 학습 애플리케이션을 만들어야 합니다. 자세한 내용은 머신 유형을 참조하세요.

지원되는 머신 유형

지원되는 AI Platform Training 확장 등급과 머신 유형은 다음과 같습니다.

프로젝트에 액세스하도록 Cloud TPU 승인

다음 단계를 수행하여 Google Cloud 프로젝트와 연결된 Cloud TPU 서비스 계정 이름을 승인합니다.

  1. projects.getConfig를 호출하여 Cloud TPU 서비스 계정 이름을 가져옵니다. 예:

    PROJECT_ID=PROJECT_ID
    
    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
        https://ml.googleapis.com/v1/projects/$PROJECT_ID:getConfig
    
  2. API에서 반환한 serviceAccountProjecttpuServiceAccount 필드 값을 저장합니다.

  3. Cloud TPU 서비스 계정을 초기화합니다.

    curl -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
      -H "Content-Type: application/json" -d '{}'  \
      https://serviceusage.googleapis.com/v1beta1/projects/<serviceAccountProject>/services/tpu.googleapis.com:generateServiceIdentity
    

이제 Cloud TPU 서비스 계정을 Cloud ML 서비스 에이전트 역할이 있는 멤버로 프로젝트에 추가합니다. Google Cloud Console에서 또는 gcloud 명령어를 사용하여 다음 단계를 완료합니다.

콘솔

  1. Google Cloud Console에 로그인하고 TPU를 사용 중인 프로젝트를 선택합니다.
  2. IAM 및 관리자 > IAM을 선택합니다.
  3. 추가 버튼을 클릭하여 프로젝트에 멤버를 추가합니다.
  4. 멤버 입력란에 TPU 서비스 계정을 입력합니다.
  5. 역할 드롭다운 목록을 클릭합니다.
  6. Cloud ML 서비스 에이전트 역할을 사용 설정합니다(서비스 에이전트 역할 > Cloud ML 서비스 에이전트).

gcloud

  1. 프로젝트 ID 및 Cloud TPU 서비스 계정이 포함된 환경 변수를 설정합니다.

    PROJECT_ID=PROJECT_ID
    SVC_ACCOUNT=your-tpu-sa-123@your-tpu-sa.google.com.iam.gserviceaccount.com
    
  2. Cloud TPU 서비스 계정에 ml.serviceAgent 역할을 부여합니다.

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member serviceAccount:$SVC_ACCOUNT --role roles/ml.serviceAgent
    

서비스 계정에 역할을 부여하는 방법에 대한 자세한 내용은 IAM 문서를 참조하세요.

학습용 입력 데이터 형식 지정

기본 제공 이미지 객체 감지 알고리즘을 사용하려면 입력 데이터를 tf.Examples 형식으로 지정하고 TFRecord 파일에 저장해야 합니다. tf.Example 데이터 구조 및 TFRecord 파일 형식 모두 TensorFlow를 통해 데이터를 효율적으로 읽도록 설계되었습니다.

TFRecord 형식은 바이너리 레코드 시퀀스를 저장하는 데 사용되는 단순 형식입니다. 이 경우 모든 레코드는 이미지의 바이너리 표현을 포함합니다. 각 이미지는 클래스 라벨과 함께 tf.Example로 표현됩니다. 많은 tf.Example를 하나의 TFRecord 파일에 저장할 수 있습니다. 또한 여러 TFRecord 파일에서 대량의 데이터세트를 샤딩할 수도 있습니다.

TFRecord 및 tf.Example에 대해 자세히 알아보세요.

이미지를 TFRecords로 변환

TensorFlow는 JPEG에서 TFRecord 형식으로 이미지를 변환하는 데 사용할 수 있는 스크립트를 제공합니다.

다음과 같은 경우 스크립트를 사용할 수 있습니다.

  • Cloud Storage에 이미지를 저장하는 경우
  • Cloud Storage의 이미지 경로와 해당 라벨에 CSV 파일이 있는 경우 예를 들면 다음과 같습니다.

    gs://cloud-ml-data/img/flower_photos/daisy/754296579_30a9ae018c_n.jpg,daisy
    gs://cloud-ml-data/img/flower_photos/dandelion/18089878729_907ed2c7cd_m.jpg,dandelion
    
  • 이러한 CSV 파일을 Cloud Storage에 저장합니다.

다음 예시에서는 스크립트를 실행하는 방법을 보여줍니다.

  1. 스크립트 다운로드:

    curl https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/jpeg_to_tf_record.py > ./jpeg_to_tf_record.py
    
  2. 아직 실행하지 않았다면 프로젝트 ID 및 버킷 이름의 변수를 설정합니다.

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
  3. 임시 파일에서 데이터세트에 사용할 수 있는 모든 라벨 목록을 만듭니다.

    cat << EOF > /tmp/labels.txt
    daisy
    dandelion
    roses
    sunflowers
    tulips
    EOF
    
  4. 공개 cloud-ml-data 버킷과 라벨 목록에서 꽃 데이터를 사용하여 스크립트를 실행합니다.

    python -m jpeg_to_tf_record.py \
           --train_csv gs://cloud-ml-data/img/flower_photos/train_set.csv \
           --validation_csv gs://cloud-ml-data/img/flower_photos/eval_set.csv \
           --labels_file /tmp/labels.txt \
           --project_id $PROJECT_ID \
           --output_dir gs://$BUCKET_NAME/flowers_as_tf_record
    

Cloud Storage 버킷 권한 확인

데이터를 저장하려면 AI Platform Training 작업을 실행하는 데 사용하는 것과 동일한 Google Cloud 프로젝트에서 Cloud Storage 버킷을 사용합니다. 그렇지 않으면 데이터가 저장된 Cloud Storage 버킷에 AI Platform Training 액세스 권한을 부여합니다.

필수 입력 형식

기본 제공 이미지 객체 감지 알고리즘을 학습시키려면 이미지 데이터가 다음 필드를 포함한 tf.Example로 구성되어야 합니다.

  • image/encoded는 문자열로 인코딩된 원시 이미지입니다.

  • image/object/class/label은 해당 이미지의 정수 라벨 목록입니다(상자당 하나의 라벨).

    데이터 세트에 사용되는 정수 라벨 세트는 1부터 시작하는 연속 시퀀스여야 합니다. 예를 들어 데이터 세트에 5개의 클래스가 있는 경우 각 라벨은 [1, 5] 간격의 정수여야 합니다.

  • image/object/bbox/xmin은 해당 이미지의 정규화된 왼쪽 x 좌표 목록입니다(상자당 하나의 좌표). 각 좌표는 [0, 1] 간격이어야 합니다.

  • image/object/bbox/xmax은 해당 이미지의 정규화된 오른쪽 x 좌표 목록입니다(상자당 하나의 좌표). 각 좌표는 [0, 1] 간격이어야 합니다.

  • image/object/bbox/ymin는 해당 이미지의 정규화된 위쪽 y 좌표 목록입니다(상자당 하나의 좌표). 각 좌표는 [0, 1] 간격이어야 합니다.

  • image/object/bbox/ymax은 해당 이미지의 정규화된 아래쪽 x 좌표 목록입니다(상자당 하나의 좌표). 각 좌표는 [0, 1] 간격이어야 합니다.

다음 예에서는 두 개의 경계 상자가 포함된 이미지의 tf.Example 구조를 보여줍니다. 첫 번째 상자에는 1 라벨이 있고, 왼쪽 위 모서리는 정규화된 좌표 (0.1, 0.4)에 있고, 오른쪽 아래 모서리는 정규화된 좌표 (0.5, 0.8)에 있습니다. 두 번째 상자에는 2 라벨이 있고, 왼쪽 위 모서리는 정규화된 좌표 (0.3, 0.5)에 있고, 오른쪽 아래 모서리는 정규화된 좌표 (0.4, 0.7)에 있습니다.

{
    'image/encoded': '<encoded image data>',
    'image/object/class/label': [1, 2],
    'image/object/bbox/xmin': [0.1, 0.3],
    'image/object/bbox/xmax': [0.5, 0.4],
    'image/object/bbox/ymin': [0.4, 0.5],
    'image/object/bbox/ymax': [0.8, 0.7]
}

tf.Example 형식은 TFRecord 객체 감지 스크립트에서 사용한 형식과 동일해야 합니다.

출력으로 최적의 저장된 모델 가져오기

학습 작업이 완료되면 AI Platform Training은 작업을 제출할 때 jobDir로 지정한 Cloud Storage 버킷에 TensorFlow 저장된 모델을 작성합니다. 저장된 모델은 jobDir/model에 작성됩니다. 예를 들어 작업을 gs://your-bucket-name/your-job-dir에 제출한 경우 AI Platform Training은 저장된 모델을 gs://your-bucket-name/your-job-dir/model에 작성합니다.

초매개변수 조정을 사용 설정한 경우 AI Platform Training은 학습 과정에서 얻은 최고의 정확성으로 TensorFlow 저장된 모델을 반환합니다. 예를 들어 2,500개의 학습 단계가 포함된 학습 작업을 제출했고 2,000단계에서 가장 높은 정확성을 얻은 경우 특정 지점에서 TensorFlow 저장된 모델이 저장됩니다.

AI Platform Training의 각 시도는 Cloud Storage 버킷의 자체 디렉터리에 최고의 정확성을 갖춘 TensorFlow 저장된 모델을 작성합니다. 예를 들면 gs://your-bucket-name/your-job-dir/model/trial_{trial_id}입니다.

출력 저장된 모델의 서명은 다음과 같습니다.

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['encoded_image'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: encoded_image_string_tensor:0
    inputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: key:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['detection_boxes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100, 4)
        name: detection_boxes:0
    outputs['detection_classes'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_classes:0
    outputs['detection_scores'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 100)
        name: detection_scores:0
    outputs['key'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Identity:0
    outputs['num_detections'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1)
        name: num_detections:0
  Method name is: tensorflow/serving/predict

입력:

  • encoded_image: 디코딩되지 않은 원시 이미지 바이트입니다. tf.Example에 저장된 image/encoded와 동일합니다.
  • key: 예측 입력의 문자열 값 식별자입니다. 이 값은 출력 key로 전달되며, 일괄 예측에서 예측 출력을 입력에 매핑하는 데 유용합니다.

출력:

  • num_detections: 감지된 경계 상자의 수입니다.
  • detection_boxes: 감지 경계 상자의 상대([0,1]의 값) 좌표([ymin, xmin, ymax, xmax]) 목록입니다.
  • detection_classes: detection_boxes의 각 감지 상자에 대해 예측된 클래스(정수) 라벨 목록입니다.
  • detection_scores: detection_boxes의 각 감지 상자에 대한 scores 목록입니다.
  • key: 출력 키입니다.

예측 출력의 예시는 다음과 같습니다.

{u'detection_classes': [1.0, 3.0, 3.0, ...],
u'key': u'test_key',
u'num_detections': 100.0,
u'detection_scores': [0.24401935935020447, 0.19375669956207275, 0.18359294533729553, ...]]}

구성 예시

gcloud를 사용하여 작업을 제출하려면 머신 유형 및 초매개변수 조정 사양에 맞는 config.yaml 파일을 만들어야 합니다. Google Cloud Console을 사용하는 경우에는 이 파일을 만들 필요가 없습니다. 학습 작업 제출 방법에 대해 알아보세요.

다음 예시 config.yaml 파일은 학습 작업에 TPU 리소스를 할당하는 방법을 보여줍니다.

cat << EOF > config.yaml
trainingInput:
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    tpuTfVersion: 1.14
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
EOF

그 다음 config.yaml 파일을 사용하여 학습 작업을 제출합니다.

초매개변수 조정 구성

초매개변수 조정을 사용하려면 머신 구성과 동일한 config.yaml 파일에 초매개변수 조정 구성을 포함시킵니다.

Google Cloud Console에서 각 초매개변수에 대한 간략한 설명과 기본 제공 이미지 객체 감지 알고리즘의 참조에서 자세한 설명을 확인할 수 있습니다.

다음 예시 config.yaml 파일은 학습 작업에 TPU 리소스를 할당하는 방법과 초매개변수 조정 구성을 포함하는 방법을 보여줍니다.

cat << EOF > config.yaml
trainingInput:
  # Use a cluster with many workers and a few parameter servers.
  scaleTier: CUSTOM
  masterType: n1-standard-16
  masterConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: NVIDIA_TESLA_P100
      count: 1
  workerType:  cloud_tpu
  workerConfig:
    imageUri: gcr.io/cloud-ml-algos/image_object_detection:latest
    acceleratorConfig:
      type: TPU_V2
      count: 8
  workerCount: 1
  # The following are hyperparameter configs.
  hyperparameters:
   goal: MAXIMIZE
   hyperparameterMetricTag: "AP"
   maxTrials: 6
   maxParallelTrials: 3
   enableTrialEarlyStopping: True
   params:
   - parameterName: initial_learning_rate
     type: DOUBLE
     minValue: 0.001
     maxValue: 0.1
     scaleType: UNIT_LOG_SCALE
EOF

이미지 객체 감지 학습 작업 제출

이 섹션에서는 기본 제공 이미지 객체 감지 알고리즘을 사용하여 학습 작업을 제출하는 방법을 설명합니다.

Console

알고리즘 선택

  1. Google Cloud Console의 AI Platform 학습 작업 페이지로 이동합니다.

    AI Platform 학습 작업 페이지

  2. 새 학습 작업 버튼을 클릭합니다. 아래 표시된 옵션 중에서 기본 제공 알고리즘 학습을 클릭합니다.

  3. 새 학습 작업 만들기 페이지에서 이미지 객체 감지를 선택하고 다음을 클릭합니다.

학습 및 검증 데이터 선택

  1. 학습 데이터 아래의 드롭다운 메뉴에서 단일 파일을 사용할지 아니면 여러 파일을 사용할지 지정합니다.

    • 단일 파일의 경우 'GCS 버킷의 단일 파일 사용'을 선택한 상태로 둡니다.
    • 여러 파일의 경우 'Cloud Storage 디렉터리 한곳에 저장된 여러 파일 사용'을 선택합니다.
  2. 디렉터리 경로찾아보기를 클릭합니다. 오른쪽 패널에서 학습 데이터를 업로드한 버킷의 이름을 클릭하고 파일로 이동합니다.

    여러 파일을 선택한 경우 와일드 카드 이름에 와일드 카드 문자를 넣습니다. 경로가 올바른지 확인하는 데 도움이 되도록 아래에 '전체 GCS 경로'가 표시됩니다.

  3. 검증 데이터 아래의 드롭다운 메뉴에서 단일 파일을 사용할지 아니면 여러 파일을 사용할지 지정합니다.

    • 단일 파일의 경우 'GCS 버킷의 단일 파일 사용'을 선택한 상태로 둡니다.
    • 여러 파일의 경우 'Cloud Storage 디렉터리 한곳에 저장된 여러 파일 사용'을 선택합니다.
  4. 디렉터리 경로찾아보기를 클릭합니다. 오른쪽 패널에서 학습 데이터를 업로드한 버킷의 이름을 클릭하고 파일로 이동합니다.

    여러 파일을 선택한 경우 와일드 카드 이름에 와일드 카드 문자를 넣습니다. 경로가 올바른지 확인하는 데 도움이 되도록 아래에 '전체 GCS 경로'가 표시됩니다.

  5. 출력 디렉터리에 AI Platform Training이 학습 작업의 출력을 저장할 개발자의 Cloud Storage 버킷 경로를 입력합니다. Cloud Storage 버킷 경로를 직접 입력하거나 찾아보기 버튼을 클릭하여 선택할 수 있습니다.

    쉽게 관리할 수 있도록 이 학습 작업을 저장할 새 디렉터리를 개발자의 Cloud Storage 버킷에 만듭니다. 찾아보기 창에서 이 작업을 수행할 수 있습니다.

    다음을 클릭합니다.

알고리즘 인수 설정

각 알고리즘별 인수는 초매개변수 조정 없이 학습 작업에 대한 기본값을 표시합니다. 알고리즘 인수에서 초매개변수 조정을 사용 설정하는 경우에는 최솟값과 최댓값을 지정해야 합니다.

모든 알고리즘 인수에 대해 자세히 알아보려면 Google Cloud Console의 링크를 클릭해 기본 제공 이미지 객체 감지 참조의 세부정보를 참조하세요.

작업 제출

작업 설정 탭에서 다음을 수행합니다.

  1. 고유한 작업 ID를 입력합니다.
  2. 사용 가능한 리전을 입력합니다(예: 'us-central1').
  3. 머신 유형을 선택하려면 확장 등급으로 'CUSTOM'을 선택합니다. 커스텀 클러스터 사양을 제공하는 섹션이 표시됩니다.
    1. 마스터 유형에서 사용 가능한 머신 유형을 선택합니다.
    2. TPU를 사용하려면 작업자 유형cloud_tpu로 설정합니다. 작업자 수의 기본값은 1입니다.

완료를 클릭하여 학습 작업을 제출합니다.

gcloud

  1. 작업의 환경 변수 설정

    PROJECT_ID="YOUR_PROJECT_ID"
    BUCKET_NAME="YOUR_BUCKET_NAME"
    
    # Specify the same region where your data is stored
    REGION="YOUR_REGION"
    
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region $REGION
    
    # Set Cloud Storage paths to your training and validation data
    # Include a wildcard if you select multiple files.
    TRAINING_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/train-*.tfrecord"
    VALIDATION_DATA_PATH="gs://${BUCKET_NAME}/YOUR_DATA_DIRECTORY/eval-*.tfrecord"
    
    # Specify the Docker container for your built-in algorithm selection
    IMAGE_URI="gcr.io/cloud-ml-algos/image_object_detection:latest"
    
    # Variables for constructing descriptive names for JOB_ID and JOB_DIR
    DATASET_NAME="coco"
    ALGORITHM="object_detection"
    MODEL_NAME="${DATASET_NAME}_${ALGORITHM}"
    DATE="$(date '+%Y%m%d_%H%M%S')"
    
    # Specify an ID for this job
    JOB_ID="${MODEL_NAME}_${DATE}"
    
    # Specify the directory where you want your training outputs to be stored
    JOB_DIR="gs://${BUCKET_NAME}/algorithm_training/${JOB_ID}"
    
  2. 작업을 제출합니다.

    gcloud ai-platform jobs submit training $JOB_ID \
      --region=$REGION \
      --config=config.yaml \
      --job-dir=$JOB_DIR \
      -- \
      --training_data_path=$TRAINING_DATA_PATH \
      --validation_data_path=$VALIDATION_DATA_PATH \
      --train_batch_size=64 \
      --num_eval_images=500 \
      --train_steps_per_eval=2000 \
      --max_steps=22500 \
      --num_classes=90 \
      --warmup_steps=500 \
      --initial_learning_rate=0.08 \
      --fpn_type="nasfpn" \
      --aug_scale_min=0.8 \
      --aug_scale_max=1.2
    

  3. 작업이 성공적으로 제출되면 다음 gcloud 명령어를 사용하여 로그를 볼 수 있습니다.

    gcloud ai-platform jobs describe $JOB_ID
    gcloud ai-platform jobs stream-logs $JOB_ID
    

다음 단계