다음을 통해 공유


이미지

Important

Databricks는 이진 파일 데이터 원본을 사용하여 이미지 데이터를 원시 바이트로 Spark DataFrame에 로드할 것을 권장합니다. 이미지 데이터를 처리하기 위한 권장 워크플로는 이미지 애플리케이션용 참조 솔루션을 참조하세요.

이미지 데이터 원본은 이미지 표현의 세부 정보를 추상화하고 이미지 데이터를 로드하기 위한 표준 API를 제공합니다. 이미지 파일을 읽으려면 데이터 원본 formatimage로 지정합니다.

df = spark.read.format("image").load("<path-to-image-data>")

Scala, Java 및 R에 대해 유사한 API가 존재합니다.

중첩된 디렉터리 구조를 가져올 수 있고(예: /path/to/dir/과 같은 경로 사용) 파티션 디렉터리가 있는 경로(즉, /path/to/dir/date=2018-01-02/category=automobile와 같은 경로)를 지정하여 파티션 검색을 사용할 수 있습니다.

이미지 구조

이미지 파일은 다음 필드가 있는 image라는 단일 구조체 유형 열을 포함하는 DataFrame으로 로드됩니다.

image: struct containing all the image data
  |-- origin: string representing the source URI
  |-- height: integer, image height in pixels
  |-- width: integer, image width in pixels
  |-- nChannels
  |-- mode
  |-- data

여기서 필드는 다음과 같습니다.

  • nChannels: 색상 채널의 수입니다. 일반적인 값은 회색조 이미지의 경우 1, 컬러 이미지(예: RGB)의 경우 3, 알파 채널이 있는 컬러 이미지의 경우 4입니다.

  • mode: 데이터 필드를 해석하는 방법을 나타내는 정수 플래그입니다. 데이터가 저장되는 데이터 형식 및 채널 순서를 지정합니다. 필드 값은 다음 표에 표시된 OpenCV 유형 중 하나에 매핑되어야 하지만 적용되지는 않습니다. OpenCV 유형은 1, 2, 3 또는 4 채널에 대해 정의되고 픽셀 값에 대해 여러 데이터 형식이 정의됩니다. 채널 순서는 색상이 저장되는 순서를 지정합니다. 예를 들어 빨강, 파랑 및 녹색 구성 요소가 있는 일반적인 3채널 이미지가 있는 경우 여섯 가지 가능한 순서가 있습니다. 대부분의 라이브러리는 RGB 또는 BGR을 사용합니다. 3(4) 채널 OpenCV 유형은 BGR(A) 순서로 예상됩니다.

    OpenCV의 숫자에 대한 유형 매핑(데이터 형식 x 채널 수)

    Type C1 C2 C3 C4
    CV_8U 0 8 16 24
    CV_8S 1 9 17 25
    CV_16U 2 10 18 26
    CV_16S 3 11 19 27
    CV_32U 4 12 20 28
    CV_32S 5 13 21 29
    CV_64F 6 14 22 30
  • data: 이진 형식으로 저장된 이미지 데이터. 이미지 데이터는 차원 모양(높이, 너비, nChannels)과 모드 필드에 의해 지정된 유형 t의 배열 값을 갖는 3차원 배열로 표현됩니다. 배열은 행 우선 순서로 저장됩니다.

이미지 데이터 표시

Databricks display 함수는 이미지 데이터 표시를 지원합니다. 이미지를 참조하세요.

Notebook 예제: 이미지 파일에 데이터 읽기 및 쓰기

다음 Notebook은 이미지 파일에 데이터를 읽고 쓰는 방법을 보여 줍니다.

이미지 데이터 원본 Notebook

전자 필기장 가져오기

이미지 데이터 원본의 한계

이미지 데이터 원본은 Spark DataFrame을 만드는 동안 이미지 파일을 디코딩하고 데이터 크기를 늘리며 다음 시나리오에서 제한 사항을 도입합니다.

  1. DataFrame 유지: 더 쉽게 액세스할 수 있도록 DataFrame을 Delta 테이블에 유지하려면 디스크 공간을 절약하기 위해 디코딩된 데이터 대신 원시 바이트를 유지해야 합니다.
  2. 파티션 셔플링: 디코딩된 이미지 데이터를 셔플링하면 더 많은 디스크 공간과 네트워크 대역폭이 필요하므로 셔플링이 느려집니다. 이미지 디코딩을 가능한 한 지연시켜야 합니다.
  3. 다른 디코딩 방법 선택: 이미지 데이터 원본은 javax의 이미지 IO 라이브러리를 사용하여 이미지를 디코딩하므로 더 나은 성능을 위해 다른 이미지 디코딩 라이브러리를 선택하거나 사용자 지정된 디코딩 논리를 구현할 수 없습니다.

이진 파일 데이터 원본을 사용하여 이미지 데이터를 로드하고 필요한 경우에만 디코딩하면 이러한 제한을 피할 수 있습니다.