TFRecord và Earth Engine

TFRecord là một định dạng nhị phân để mã hoá hiệu quả các trình tự dài của tf.Example protos. TensorFlow dễ dàng tải các tệp TFRecord thông qua gói tf.data như mô tả tại đâytại đây. Trang này mô tả cách Earth Engine chuyển đổi giữa định dạng ee.FeatureCollection hoặc ee.Image và TFRecord.

Xuất dữ liệu sang TFRecord

Bạn có thể xuất bảng (ee.FeatureCollection) hoặc hình ảnh (ee.Image) sang tệp TFRecord trong Google Drive hoặc Cloud Storage. Cấu hình của dữ liệu xuất phụ thuộc vào nội dung bạn đang xuất như mô tả dưới đây. Tất cả các số được xuất từ Earth Engine sang TFRecord đều được chuyển đổi thành kiểu float.

Xuất bảng

Khi xuất ee.FeatureCollection sang tệp TFRecord, sẽ có mối tương ứng 1:1 giữa mỗi ee.Feature trong bảng và mỗi tf.train.Example (tức là mỗi bản ghi) trong tệp TFRecord. Mỗi thuộc tính của ee.Feature được mã hoá dưới dạng một tf.train.Feature có danh sách số thực tương ứng với số hoặc ee.Array được lưu trữ trong thuộc tính. Nếu xuất một bảng có các mảng trong thuộc tính, bạn cần cho TensorFlow biết hình dạng của mảng khi đọc. Một bảng được xuất sang tệp TFRecord sẽ luôn được nén bằng loại nén GZIP. Bạn luôn nhận được đúng một tệp TFRecord cho mỗi lần xuất.

Ví dụ sau đây minh hoạ cách phân tích cú pháp dữ liệu từ bảng các thuộc tính vô hướng đã xuất ('B2',...,'B7', 'lớp phủ thực vật'). Xin lưu ý rằng kích thước của danh sách float là [1] và loại là tf.float32:

Python

dataset = tf.data.TFRecordDataset(exportedFilePath)

featuresDict = {
  'B2': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B3': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B4': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B5': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B6': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'B7': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32),
  'landcover': tf.io.FixedLenFeature(shape=[1], dtype=tf.float32)
}

parsedDataset = dataset.map(lambda example: tf.io.parse_single_example(example, featuresDict))
        

Xin lưu ý rằng ví dụ này minh hoạ việc đọc các tính năng vô hướng (tức là shape=[1]). Nếu đang xuất mảng 2D hoặc 3D (ví dụ: bản vá hình ảnh), bạn sẽ chỉ định hình dạng của các bản vá tại thời điểm phân tích cú pháp, ví dụ: shape=[16, 16] cho bản vá pixel 16x16.

Xuất hình ảnh

Khi bạn xuất hình ảnh, dữ liệu sẽ được sắp xếp theo kênh, chiều cao, chiều rộng (CHW). Quá trình xuất có thể được chia thành nhiều tệp TFRecord, mỗi tệp chứa một hoặc nhiều bản vá có kích thước patchSize do người dùng chỉ định trong quá trình xuất. Kích thước của các tệp tính bằng byte do người dùng chỉ định trong thông số maxFileSize. Có mối tương ứng 1:1 giữa mỗi bản vá và mỗi tf.train.Example trong tệp TFRecord thu được. Mỗi dải của hình ảnh được lưu trữ dưới dạng một tf.train.Feature riêng biệt trong mỗi tf.train.Example, trong đó chiều dài của danh sách float được lưu trữ trong mỗi đặc điểm là chiều rộng * chiều cao của bản vá. Bạn có thể chia các danh sách đã làm phẳng thành nhiều pixel riêng lẻ như trong ví dụ này. Hoặc bạn có thể khôi phục hình dạng của bản vá đã xuất như trong ví dụ này.

Để giúp giảm hiệu ứng cạnh, các bản vá đã xuất có thể chồng chéo lên nhau. Cụ thể, bạn có thể chỉ định một kernelSize sẽ dẫn đến các ô có kích thước:

[patchSize[0] + kernelSize[0], patchSize[1] + kernelSize[1]]
    

Mỗi thẻ thông tin chồng lên các thẻ thông tin liền kề theo [kernelSize[0]/2, kernelSize[1]/2]. Do đó, hạt nhân có kích thước kernelSize nằm giữa một pixel cạnh của một mảng có kích thước patchSize chứa dữ liệu hoàn toàn hợp lệ. Hình 1 minh hoạ cách sắp xếp không gian của các bản vá trong không gian, trong đó Kích thước khoảng đệm tương ứng với phần hạt nhân chồng lên hình ảnh liền kề:

Sơ đồ hình ảnh TFRecord
Hình 1. Cách xuất bản vá hình ảnh. Phương diện khoảng đệm là kernelSize/2.

formatOptions

Các tham số patchSize, maxFileSizekernelSize được truyền đến lệnh gọi ee.Export (JavaScript) hoặc ee.batch.Export (Python) thông qua từ điển formatOptions, trong đó khoá là tên của các tham số bổ sung được truyền đến Export. formatOptions có thể có cho hình ảnh được xuất sang định dạng TFRecord là:

Thuộc tínhMô tảLoại
patchDimensions Các kích thước được xếp kề nhau trên vùng xuất, bao phủ chính xác từng pixel trong hộp giới hạn (ngoại trừ trường hợp kích thước bản vá không chia đều hộp giới hạn, trong trường hợp đó, các ô viền dọc theo cạnh x/y lớn nhất sẽ bị loại bỏ). Phương diện phải lớn hơn 0. Array<int>[2].
kernelSize Nếu được chỉ định, các thẻ thông tin sẽ được lưu vào vùng đệm theo kích thước lề cả dương và âm, dẫn đến việc chồng chéo giữa các bản vá lân cận. Nếu được chỉ định, bạn phải cung cấp hai phương diện (tương ứng là X và Y). Array<int>[2]. Mặc định: [1, 1]
compressed Nếu đúng, hãy nén các tệp .tfrecord bằng gzip và thêm hậu tố ".gz" Boolean. Mặc định: true
maxFileSize Kích thước tối đa, tính bằng byte, cho tệp .tfrecord đã xuất (trước khi nén). Kích thước tệp nhỏ hơn sẽ dẫn đến việc phân đoạn lớn hơn (và do đó, nhiều tệp đầu ra hơn). Số nguyên. Mặc định: 1 GiB
defaultValue Giá trị được đặt trong mỗi dải của một pixel được che một phần hoặc hoàn toàn và giá trị được đặt tại mỗi giá trị trong một đặc điểm 3D đầu ra được tạo từ một dải mảng, trong đó độ dài mảng tại pixel nguồn nhỏ hơn độ sâu của giá trị đặc điểm (tức là giá trị tại chỉ mục 3 của một pixel mảng có độ dài 2 trong một dải mảng có độ sâu đặc điểm tương ứng là 3). Phần thập phân bị loại bỏ đối với các dải loại số nguyên và được kẹp vào phạm vi của loại dải. Giá trị mặc định là: 0 Số nguyên. Giá trị mặc định: 0
tensorDepths Ánh xạ từ tên của các dải mảng đầu vào đến chiều sâu của các tensor 3D mà các dải này tạo ra. Các mảng sẽ bị cắt bớt hoặc được thêm vào các giá trị mặc định để vừa với hình dạng đã chỉ định. Đối với mỗi dải mảng, dải này phải có một mục nhập tương ứng. Mảng<int>[]. Mặc định: []
sequenceData Nếu đúng, mỗi pixel sẽ được xuất dưới dạng một SequenceExample ánh xạ các dải vô hướng đến ngữ cảnh và các dải mảng đến các trình tự của ví dụ. SequenceExamples được xuất theo thứ tự hàng chính của các pixel trong mỗi bản vá, sau đó theo thứ tự hàng chính của các bản vá theo khu vực trong trình tự tệp. Boolean. Mặc định: false
collapseBands Nếu đúng, tất cả các dải sẽ được kết hợp thành một tensor 3D duy nhất, lấy tên của dải đầu tiên trong hình ảnh. Tất cả các dải tần số đều được chuyển đổi thành byte, int64, sau đó chuyển đổi thành float theo thứ tự đó tuỳ thuộc vào loại xa nhất trong trình tự đó trong tất cả các dải tần số. Bạn được phép sử dụng dải mảng miễn là chỉ định tensor_depths. Boolean. Mặc định: false
maskedThreshold Tỷ lệ tối đa cho phép của các pixel được che trong một bản vá. Các bản vá vượt quá mức cho phép này sẽ bị loại bỏ thay vì được ghi vào tệp. Nếu bạn đặt trường này thành bất kỳ giá trị nào khác ngoài 1, thì xe bên JSON sẽ không được tạo. Giá trị mặc định là 1. Nổi. Mặc định: 1

Tệp "mixer" (bộ trộn) TFRecord

Khi bạn xuất sang TFRecord, Earth Engine sẽ tạo một tệp phụ có tên là "mixer" (bộ trộn) với các tệp TFRecord. Đây là một tệp JSON đơn giản dùng để xác định cách sắp xếp không gian của các bản vá (tức là tham chiếu địa lý). Bạn cần tệp này để tải các dự đoán được thực hiện trên hình ảnh lên như mô tả trong phần tiếp theo.

Xuất chuỗi thời gian

Hỗ trợ xuất hình ảnh sang cả Examples và SequenceExamples. Khi bạn xuất sang Ví dụ, vùng xuất sẽ được cắt thành các bản vá và các bản vá đó được xuất theo thứ tự hàng chính vào một số tệp .tfrecord, trong đó mỗi băng có một đặc điểm riêng (trừ khi bạn chỉ định collapseBands). Khi bạn xuất sang SequenceExamples, một SequenceExample cho mỗi pixel sẽ được xuất, với các SequenceExamples đó theo thứ tự hàng chính trong một bản vá, sau đó theo thứ tự hàng chính của các bản vá trong vùng xuất ban đầu (nếu bạn không chắc chắn, hãy luôn giả định mọi thứ sẽ theo thứ tự hàng chính trong một số dung lượng). Lưu ý: mọi dải vô hướng của hình ảnh sẽ được đóng gói vào ngữ cảnh của SequenceExample, trong khi các dải mảng sẽ trở thành dữ liệu trình tự thực tế.

Dải mảng

Bạn có thể xuất dải mảng khi xuất hình ảnh sang định dạng TFRecord. Việc xuất các dải mảng cung cấp một phương tiện để điền sẵn "FeatureLists" của SequenceExamples và một cách để tạo tensor 3D khi xuất sang các ví dụ thông thường. Để biết thông tin về cách quản lý chiều dài/chiều sâu của dải mảng, hãy xem collapseBands và/hoặc tensorDepths trong bảng ở trên. Lưu ý: việc sử dụng collapseBands và xuất sang SequenceExamples (vì vậy, hãy đặt tham số sequenceData) sẽ khiến tất cả các dải bị thu gọn thành một chuỗi thời gian trên mỗi pixel.

Tải TFRecords lên Earth Engine

Bạn có thể tải bảng (chỉ dòng lệnh) và hình ảnh lên Earth Engine dưới dạng tệp TFRecord. Đối với bảng, mối quan hệ 1:1 đã mô tả trước đó áp dụng theo hướng ngược lại (tức là tf.train.Example -> ee.Feature).

Tải hình ảnh lên

Nếu bạn tạo thông tin dự đoán trên hình ảnh đã xuất, hãy cung cấp trình kết hợp khi bạn tải thông tin dự đoán lên (dưới dạng tệp TFRecord) để lấy hình ảnh được tham chiếu địa lý. Xin lưu ý rằng phần chồng chéo của các bản vá (Phương diện khoảng đệm trong Hình 1) sẽ bị loại bỏ để tạo ra vùng phủ liên tục của vùng đã xuất. Các kết quả dự đoán phải được sắp xếp dưới dạng một trình tự tf.train.Example có cùng số lượng và thứ tự như các ví dụ về hình ảnh mà bạn đã xuất ban đầu (ngay cả giữa một số lượng tệp tuỳ ý).