Python Pyspark UDF在获取openCV描述符时出现问题
我从Spark哲学开始,就我而言,是Pyspark 我有一个小的学校项目要做,这似乎并不困难,但我已经做了很多天了,我仍然无法成功 我必须将图像加载到一个文件夹中并提取描述符以进行降维 我创建了一个带有图像路径的Pyspark数据框,现在我想添加一个带有描述符的列 我是这样做的 图像路径列表:Python Pyspark UDF在获取openCV描述符时出现问题,python,opencv,pyspark,pyspark-dataframes,Python,Opencv,Pyspark,Pyspark Dataframes,我从Spark哲学开始,就我而言,是Pyspark 我有一个小的学校项目要做,这似乎并不困难,但我已经做了很多天了,我仍然无法成功 我必须将图像加载到一个文件夹中并提取描述符以进行降维 我创建了一个带有图像路径的Pyspark数据框,现在我想添加一个带有描述符的列 我是这样做的 图像路径列表: lst_路径=[] sub_folders=os.listdir(文件夹) 打印(子文件夹) 对于子文件夹[:1]中的f: lst_categ=os.listdir(文件夹+f) 对于lst_类别中的文件
lst_路径=[]
sub_folders=os.listdir(文件夹)
打印(子文件夹)
对于子文件夹[:1]中的f:
lst_categ=os.listdir(文件夹+f)
对于lst_类别中的文件:
lst_path.append(文件夹+f+“/”+文件)
打印(“名称图像字符:,len(lst_路径))
rdd=sc.parallelize(lst_路径)
行rdd=rdd.map(λx:row(x))
df=spark.createDataFrame(行rdd,[“路径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_image = udf(lambda img: get_desc(img), ArrayType(FloatType()))
创建新列:
df2 = df.withColumn("img_vectorized", udf_image("path_img"))
printSchema()的结果为:
根|--路径\u img:string(nullable=true)
|--img_矢量化:数组(nullable=true)
||--元素:浮点(containsnall=true) 当我执行df2.show()时,我得到以下错误消息: Py4JJavaError:调用o773.showString时出错: org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段18.0中的任务0失败1次,最近一次失败:任务丢失 阶段18.0中的0.0(TID 93,localhost,executor driver):net.razorvine.pickle.pickle异常:预期的参数为零 ClassDict的构造(用于numpy.core.multiarray.\u重构) AttributeError:“非类型”对象没有属性“展平” 我注意到描述符是空的。我指定,当我在一行上执行此提取时,它会工作 我不明白为什么它在我的数据帧上不起作用。你能帮我吗
谢谢。经过几天的研究,我昨晚找到了解决办法 我的更正代码:
def get_desc(img):
image = cv2.imread(img)
orb = cv2.ORB_create(nfeatures=50)
keypoints_orb, desc = orb.detectAndCompute(image, None)
if desc is None:
desc = 0
else:
desc = desc.flatten().tolist()
return desc
udf_image = udf(get_desc, ArrayType(IntegerType()))
df_desc = df.withColumn("descriptors", udf_image("path_img"))
df_desc = df_desc.filter(df_desc.descriptors. isNotNull())
df_desc.show()
经过几天的研究,我昨晚找到了解决办法 我的更正代码:
def get_desc(img):
image = cv2.imread(img)
orb = cv2.ORB_create(nfeatures=50)
keypoints_orb, desc = orb.detectAndCompute(image, None)
if desc is None:
desc = 0
else:
desc = desc.flatten().tolist()
return desc
udf_image = udf(get_desc, ArrayType(IntegerType()))
df_desc = df.withColumn("descriptors", udf_image("path_img"))
df_desc = df_desc.filter(df_desc.descriptors. isNotNull())
df_desc.show()