加载图片到RDD用face_recognition时遇RuntimeError:期望可写numpy数组
解决Spark RDD加载图片时face_recognition的RuntimeError问题
嘿,我之前做类似人脸比对项目时也碰到过这个错误,这就帮你理清问题根源并给出解决方案!
错误原因分析
这个RuntimeError: Expected writable numpy.ndarray with shape set错误主要来自两个核心问题:
- 只读的numpy数组:用
np.asarray()从PIL图片转换而来的数组,有时候是只读状态(比如读取某些压缩格式的图片时),而face_recognition的人脸编码函数要求数组必须是可写的。 - 图片格式不兼容:如果你的图片是灰度图或RGBA(带透明通道)格式,转换后的数组形状可能不符合
face_recognition的预期——它默认处理的是RGB三通道图像。
修复后的完整代码
我们只需要修改图片转数组的函数,同时解决这两个问题:
import face_recognition import numpy as np from io import BytesIO from PIL import Image from pyspark import SparkContext sc = SparkContext(appName="LoadingImage") images = sc.binaryFiles("./images/") def image_to_array(rawdata): # 读取原始二进制数据为PIL图片 img = Image.open(BytesIO(rawdata)) # 统一转换为RGB格式,兼容灰度、RGBA等各种图片类型 img_rgb = img.convert("RGB") # 转换为numpy数组 arr = np.array(img_rgb) # 检查数组是否可写,不可写则复制生成可写副本 if not arr.flags.writeable: arr = arr.copy() return arr # 将图片二进制数据转换为符合要求的numpy数组 i_arr = images.values().map(image_to_array) # 现在可以正常进行人脸编码了 face_encodings = i_arr.map(lambda img_arr: face_recognition.face_encodings(img_arr))
关键修复点说明
convert("RGB"):强制把所有图片转成三通道RGB格式,彻底避免灰度图(单通道)或RGBA(四通道)带来的形状不兼容问题。arr.copy():当PIL返回的数组是只读状态时,复制数组会生成一个可写的新数组,完全满足face_recognition对数组可写性的要求。
额外注意事项
如果是在Spark集群环境运行,一定要确保所有工作节点都安装了以下依赖:
face_recognitionnumpyPillow
不然会出现依赖缺失的错误哦!
内容的提问来源于stack exchange,提问作者user5574376
相关产品推荐
相关产品推荐

