로컬 환경에서 폴더가 분리된 이미지 파일에 따라 ABEJA Platform의 데이터 세트 만들기

입문


본 보도는 다음과 같은 절차를 총결한 보도이다.
  • ABEJA Platform SDK를 사용하여 로컬 환경에서 폴더별로 구분된 이미지 파일에 따라 ABEJA Platform의 Classification용 데이터 세트를 제작
  • 사전 준비

  • 로컬 환경에 ABEJA Platform SDK 설치
  • 설치 방법
  • 데이터 준비


    예제로 다운로드된 이미지(757MB).

    데이터 Lake 채널 만들기


    Console의 DataLake Channel에서 "+ Channel 만들기"를 클릭하여 Channel을 만듭니다.
    Stanford Dogs Dataset
    생성된 채널의 ID를 유지합니다.

    데이터 Lake 채널에 데이터 업로드


    SDK를 사용하여 로컬에서 다운로드한 이미지 파일을 업로드합니다.
    현재 디렉터리를 다운로드한 이미지 폴더 바로 아래로 이동하여 Python 해석기를 시작합니다.
    우선 이미지 파일의 수량을 확인하십시오.
    
    from glob import glob
    
    # load filenames for images
    file_names = list(glob('./*/*'))
    dir_names = list(glob('./*'))
    
    # print number of images in dataset
    print('There are %d total images.' % len(file_names))
    
    모두 20560장이 있습니다.이번에는 그중의 블루계 견종 데이터만 선정하고 싶어요.
    
    # select directories
    selected_dirnames = [d for d in dir_names if 'bull' in d]
    print(selected_dirnames)
    
    그런 다음 ABEJA Platform SDK에 대한 자격 증명을 설정합니다.
    콘솔 오른쪽 상단의 계정 이름을 클릭하면 사용자 ID, 개인 액세스 토큰, 제작 ID가 표시됩니다.
    크리덴샤르의 user_id는 콘솔에 표시되는 사용자 ID (13자리 숫자) 의 시작 부분에 "user-"를 추가합니다.
    
    # set credential
    credential = {
        'user_id': 'user-XXXXXXXXXXXXX',
        'personal_access_token': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    }
    
    organization_id='XXXXXXXXXXXXX'
    
    데이터를 데이터 lake에 업로드합니다.방금 기록된 채널 ID를 업로드 대상으로 지정합니다.또한 업로드할 때 서명을 메타데이터로 이미지에 부여합니다.
    이번 데이터 집합은 폴더 이름이'n02096585-Bostonubull'의 형식이 되어 폴더 이름에서 필요하지 않은 숫자·기호를 삭제하고 대문자로 변환된 것을 라벨 이름으로 한다.
    
    from abeja.datalake import Client as DatalakeClient
    
    # set datalake channel_id
    channel_id = 'XXXXXXXXXXXXX'
    
    datalake_client = DatalakeClient(organization_id, credential)
    channel = datalake_client.get_channel(channel_id)
    
    import os
    from tqdm import tqdm
    
    # upload directory data to datalake
    for d in tqdm(selected_dirnames):
        # convert to uppercase and remove numbers
        label_name = os.path.basename(d).upper()[10:]
        metadata = {'label': label_name}
        channel.upload_dir(d, metadata=metadata)
    
    이미지가 업로드되었습니다.탭 이름이 메타데이터로 부여된 것도 확인했다.

    데이터 세트 만들기


    그리고 데이터 sets를 만듭니다.
    먼저 이미지 분류에 사용할 교사 데이터 탭을 만듭니다.ABEJA Platform은 JSON을 통해 레이블을 관리합니다.
    
    import json
    
    labels = sorted([os.path.basename(d).upper()[10:] for d in selected_dirnames])
    labels_and_id = []
    label_to_id = {}
    
    for i, name in enumerate(labels):
        label_to_id[name] = i
        labels_and_id.append({'label_id': i,
                       'label': name})
    
    # define category name
    category_name = 'bull-classificaiton'
    
    # create dataset label
    category = {
        'category_id': 0,
        'name': category_name,
        'labels': labels_and_id}
    
    props = {'categories': [category]}
    json.dumps(props)
    
    위 명령을 입력하면 다음 레이블이 출력됩니다.
    {
      "categories": [
        {
          "category_id": 0,
          "labels": [
            {
              "label": "BOSTON_BULL",
              "label_id": 0
            },
            {
              "label": "BULL_MASTIFF",
              "label_id": 1
            },
            {
              "label": "FRENCH_BULLDOG",
              "label_id": 2
            },
            {
              "label": "STAFFORDSHIRE_BULLTERRIER",
              "label_id": 3
            }
          ],
          "name": "bull-classificaiton"
        }
      ]
    }
    
    컨트롤러의 데이터 sets에서 "+ 데이터 sets 만들기"를 누르십시오.
    데이터 세트의 이름과 유형(이번에는 Classification)을 입력하고 속성에 JSON 탭을 복사하여 붙여넣습니다. Datasets를 만듭니다.

    마지막으로 Datalake에 업로드된 데이터를 Datasets에 등록합니다.
    방금 만든 데이터 sets의 표지를 등록 목표로 지정합니다.
    
    # create dataset by importing datalake files
    from abeja.datasets import Client as DatasetClient
    
    dataset_client = DatasetClient(organization_id, credential)
    
    # define dataset id
    dataset_id = 'XXXXXXXXXXXXX'
    
    dataset = dataset_client.get_dataset(dataset_id)
    
    for f in tqdm(channel.list_files()):
        data_uri = f.uri
        filename = f.metadata['filename']
        label = f.metadata['label']
        label_id = label_to_id[label]
    
        if os.path.splitext(filename)[1].lower() == '.jpg' or \
        os.path.splitext(filename)[1].lower() == '.jpeg':
            content_type = 'image/jpeg'
        elif os.path.splitext(filename)[1].lower() == '.png':
            content_type = 'image/png'
        else:
            print('{} is invalid file type.'.format(filename))
            continue
    
        source_data = [{'data_uri': data_uri, 'data_type': content_type}]
        attributes = {'classification': [{'category_id': 0, 'label_id': label_id, 'label': label}]}
    
        dataset.dataset_items.create(source_data, attributes)
    
    교사 데이터 제작 완료!
    레이블을 클릭하면 각 레이블이 필터링한 이미지를 미리 보기에서 확인할 수 있습니다.

    총결산


    본고는 ABEJA Platform SDK를 사용하여 로컬 환경에서 폴더를 나누는 이미지 파일에서 ABEJA Platform의 Classification용 데이터 집합을 만드는 절차를 총괄하였다.이번에는 일부 콘솔을 사용하고 SDK를 사용하여 모든 단계를 수행할 수 있습니다.자세한 내용은 공식 문서 를 참조하십시오.

    참고 자료


    예제 코드(Jupyter Notebook 형식)
    https://sdk-spec.abeja.io/datalake/sample_tutorial.html#steps-1-create-a-datalake-channel
    ABEJA 플랫폼에 주석 데이터 업로드
    https://github.com/abeja-inc/Platform_handson/blob/master/bulldog_classification/notebook/Create_ABEJA_Platform_dataset.ipynb

    좋은 웹페이지 즐겨찾기