Это дополнительный вопрос к ответу, опубликованному здесь . Я использую PySpark 2.4.4. У меня есть куча изображений (некоторые .png, некоторые .jpeg), хранящиеся в Google Cloud Storage (GCS), которые мне нужно передать модели Tensorflow. Я получаю свои изображения вот так.
images = spark.read.format("image").option("dropInvalid", False).load("gs://my-bucket/my_image.jpg")
images = images.collect()
image = cv2.imdecode(np.frombuffer(images[0].image.data, np.uint8), cv2.IMREAD_COLOR)
На основании прочитанной документации OpenCV кажется, что OpenCV не может понять мой формат данных. Я знаю это, потому что cv2.imdecode(...)
возвращает None
. В официальной документации Spark прямо упоминается совместимость с OpenCV, поэтому я знаю, что это возможно.
В конце концов я хочу иметь возможность сделать это.
prediction = model.predict(np.array([image]))[0]
За пределами Spark, если я получаю свое изображение не из GCS, а из конечной точки http, все, что мне нужно сделать, это , который работает.
resp = urllib.request.urlopen(image_url)
image = resp.read()
prediction = model.predict(np.array([image]))[0]
Чтобы лучше понять, что ищет модель, вот как должны выглядеть данные, прежде чем они будут переданы в np.array([...])
часть.
print(resp.read())
>>> b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\ ...'
Я могу подтвердить, что изображения не повреждены, когда они находятся в GCS. Когда я загружаю одно и то же изображение из GCS на свой ноутбук, а затем читаю его вот так, я получаю похожий формат. Модель также может потреблять изображение таким образом. Я также визуально проверил загруженный образ GCS, и он выглядит нормально.
with open("./my_image.jpeg", "rb") as image:
print(image.read())
>>> b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\ ...'