OpenCV читает изображения из pyspark и передает их модели Keras - PullRequest
0 голосов
/ 12 февраля 2020

Это дополнительный вопрос к ответу, опубликованному здесь . Я использую 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\ ...'

1 Ответ

0 голосов
/ 24 апреля 2020

Не уверен, что это то, что вы ищете, но я смог добиться путем преобразования изображений PIL в изображение cv2.

Spark loading:

images = sc.binaryFiles('/tmp/images/*', 10)
df = images.map(lambda img: extract_line_coords(img)).toDF()
df.show(5, False)

Функция

def extract_line_coords(binary_images):
    name, img = binary_images
    pil_image = Image.open(io.BytesIO(img)).convert('RGB') 
    cv2_image = numpy.array(pil_image) 
    cv2_image = cv2_image[:, :, ::-1].copy() 
    gray     = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2GRAY)
    ...
    ...

Ссылка: Преобразование изображения из формата PIL в формат openCV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...