質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

Google ColabolatoryでEarth EngineとTensorFlowを併用する際に失敗する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 973
退会済みユーザー

退会済みユーザー

Google Earth EngineからのデータをNumpy配列としてロードするために使用する関数がエラーを起こす

Google Earth EngineをPython APIにて書いています。
Earth Engine とTensorFlowを併用するためのコードを練習しています。

書いているコード

# 認証(成功)
!pip install earthengine-api
!earthengine authenticate

#ライブラリのインポート(成功)
import ee
from IPython import display
import math
from matplotlib import pyplot
import numpy
from osgeo import gdal
import tempfile
import tensorflow as tf
import urllib
import zipfile

#Earth Engineクライアントの初期化(成功)
ee.Initialize()

# 対応するFmaskデータと共にLandsatイメージのDL(成功)
input_image = ee.Image('LANDSAT/LT5_L1T_TOA_FMASK/LT50100551998003CPE00')

#Earth Engine画像のサムネイルを簡単に印刷できるようにするためのヘルパー関数を定義(成功)
def print_image(image):
  display.display(display.Image(ee.data.getThumbnail({
      'image': image.serialize(),
      'dimensions': '360',
  })))

# ヘルパー関数を定義して画像とデータを視覚化(成功)
print_image(input_image.visualize(
    bands=['B3', 'B2', 'B1'],
    min=0,
    max=0.3,
))
print_image(input_image.visualize(
    bands=['fmask'],
    min=0,
    max=4,
    palette=['808080', '0000C0', '404040', '00FFFF', 'FFFFFF'],
))

# Earth Engineから生データを numpy配列としてダウンロードするためのヘルパー関数をいくつか定義(成功)
def download_tif(image, scale):
  url = ee.data.makeDownloadUrl(ee.data.getDownloadId({
        'image': image.serialize(),
        'scale': '%d' % scale,
        'filePerBand': 'false',
        'name': 'data',
  }))
  local_zip, headers = urllib.urlretrieve(url)
  with zipfile.ZipFile(local_zip) as local_zipfile:
    return local_zipfile.extract('data.tif', tempfile.mkdtemp())

def load_image(image, scale):
  local_tif_filename = download_tif(image, scale)
  dataset = gdal.Open(local_tif_filename, gdal.GA_ReadOnly)
  bands = [dataset.GetRasterBand(i + 1).ReadAsArray() for i in range(dataset.RasterCount)]
  return numpy.stack(bands, 2)

# 有効なデータバンドを含むEarth Engineからのデータを numpy配列としてロードするためにこの関数を使用する、 またFmaskバンドをバイナリクラウドラベルに変換します(すなわち fmask = 4)(ここで失敗)
mask = input_image.mask().reduce('min')
data = load_image(input_image.addBands(mask), scale=240)
data[:,:,7] = numpy.equal(data[:,:,7], 4)

エラーメッセージ

何を怒られたのかよくわかりません。何かがインストール不足でしょうか?

AttributeError                            Traceback (most recent call last)
<ipython-input-9-935423fdb1d9> in <module>()
      1 mask = input_image.mask().reduce('min')
----> 2 data = load_image(input_image.addBands(mask), scale=240)
      3 data[:,:,7] = numpy.equal(data[:,:,7], 4)

<ipython-input-8-6a10eb8a20f9> in load_image(image, scale)
     11 
     12 def load_image(image, scale):
---> 13   local_tif_filename = download_tif(image, scale)
     14   dataset = gdal.Open(local_tif_filename, gdal.GA_ReadOnly)
     15   bands = [dataset.GetRasterBand(i + 1).ReadAsArray() for i in range(dataset.RasterCount)]

<ipython-input-8-6a10eb8a20f9> in download_tif(image, scale)
      6         'name': 'data',
      7   }))
----> 8   local_zip, headers = urllib.urlretrieve(url)
      9   with zipfile.ZipFile(local_zip) as local_zipfile:
     10     return local_zipfile.extract('data.tif', tempfile.mkdtemp())

AttributeError: module 'urllib' has no attribute 'urlretrieve'

該当のソースコード

上記コードの動かない部分だけを抜粋します。

mask = input_image.mask().reduce('min')
data = load_image(input_image.addBands(mask), scale=240)
data[:,:,7] = numpy.equal(data[:,:,7], 4)

試したこと

ライブラリをインポートした際に、

import urllib

というコードを

import urllib.request

としてみたのですが、ダメでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

単にurllib.urlretrieveがpython2の書き方というだけで、他のライブラリは関係ないですね。

import urllib.requestするところまでは正しくて、あとはurllib.urlretrieve(url)urllib.request.urlretrieve(url)と書き直せば動いたでしょう。惜しかったですね。

21.6. urllib.request --- URL を開くための拡張可能なライブラリ — Python 3.6.8 ドキュメント
python3 urlretrieve - Qiita

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/03 10:14

    ありがとうございます!解決しました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る