Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark UDF在获取openCV描述符时出现问题_Python_Opencv_Pyspark_Pyspark Dataframes - Fatal编程技术网

Python Pyspark UDF在获取openCV描述符时出现问题

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_类别中的文件

我从Spark哲学开始,就我而言,是Pyspark

我有一个小的学校项目要做,这似乎并不困难,但我已经做了很多天了,我仍然无法成功

我必须将图像加载到一个文件夹中并提取描述符以进行降维

我创建了一个带有图像路径的Pyspark数据框,现在我想添加一个带有描述符的列

我是这样做的

图像路径列表:

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()