【发布时间】:2020-05-28 06:16:52
【问题描述】:
我从 Spark 哲学开始,就我而言,是 Pyspark。
我有一个小的学校项目要做,看起来并不难,但我已经做了很多天了,但我仍然无法成功。
我必须将图像加载到文件夹中并提取描述符以进行降维。
我使用图像路径创建了一个 Pyspark 数据框,现在我想添加一个带有描述符的列。
我是这样做的。
图片路径列表:
lst_path = []
sub_folders = os.listdir(folder)
print(sub_folders)
for f in sub_folders[:1]:
lst_categ = os.listdir(folder + f)
for file in lst_categ:
lst_path.append(folder + f + "/" + file)
print("Nombre d'images chargées :", len(lst_path))
rdd = sc.parallelize(lst_path)
row_rdd = rdd.map(lambda x: Row(x))
df = spark.createDataFrame(row_rdd, ["path_img"])
提取描述符的功能:
def get_desc(img):
img = cv2.imread(file)
orb = cv2.ORB_create(nfeatures=50)
keypoints_orb, desc = orb.detectAndCompute(img, None)
desc = desc.flatten()
return desc
函数UDF:
udf_image = udf(lambda img: get_desc(img), ArrayType(FloatType()))
新列的创建:
df2 = df.withColumn("img_vectorized", udf_image("path_img"))
printSchema() 的结果:
根
|-- path_img: 字符串 (可为空 = true)
|-- img_vectorized:array (nullable = true)
| |-- 元素:float (containsNull = true)
当我执行 df2.show() 时,我收到以下错误消息:
Py4JJavaError:调用 o773.showString 时出错。 : org.apache.spark.SparkException:作业因阶段失败而中止: 阶段 18.0 中的任务 0 失败 1 次,最近一次失败:丢失任务 0.0 在阶段 18.0(TID 93,本地主机,执行程序驱动程序):net.razorvine.pickle.PickleException:预期零参数 ClassDict 的构造(用于 numpy.core.multiarray._reconstruct)
AttributeError: 'NoneType' 对象没有属性 'flatten'
我注意到描述符为空。我指定,当我在一行上进行此提取时,它会起作用。
我不明白为什么它不适用于我的数据框。你能帮帮我吗?
谢谢。
【问题讨论】:
标签: python opencv pyspark pyspark-dataframes