OpenCV从pyspark读取图像并传递给Keras模型。

这是对已发布的答案的后续问题 此处. 我使用的是PySpark 2.4.4。我有一堆图像(一些.png一些.jpeg)存储在谷歌云存储(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. 官方火花 文件 明确提到了与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\ ...'

解决方案:

不知道这是否是你要找的,但我能够通过将PIL图像转换为cv2图像来实现。

Spark加载:

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

给TA打赏
共{{data.count}}人
人已打赏
未分类

翩翩起舞 :- 行列布局-文字溢出和间隔符消失。

2022-9-9 2:23:21

未分类

在Camunda中,我如何区分在ErrorEnd事件中终止的进程实例和EndEvent?

2022-9-9 2:23:23

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索