You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载图片到RDD用face_recognition时遇RuntimeError:期望可写numpy数组

解决Spark RDD加载图片时face_recognition的RuntimeError问题

嘿,我之前做类似人脸比对项目时也碰到过这个错误,这就帮你理清问题根源并给出解决方案!

错误原因分析

这个RuntimeError: Expected writable numpy.ndarray with shape set错误主要来自两个核心问题:

  1. 只读的numpy数组:用np.asarray()从PIL图片转换而来的数组,有时候是只读状态(比如读取某些压缩格式的图片时),而face_recognition的人脸编码函数要求数组必须是可写的。
  2. 图片格式不兼容:如果你的图片是灰度图或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_recognition
  • numpy
  • Pillow

不然会出现依赖缺失的错误哦!

内容的提问来源于stack exchange,提问作者user5574376

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:31