【问题标题】:Problem with Pyspark UDF to get descriptors with openCV problemPyspark UDF 获取带有 openCV 问题的描述符的问题
【发布时间】: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


    【解决方案1】:

    经过多天的研究,我昨晚找到了解决方案......

    我更正的代码:

    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()
    
    +--------------------+--------------------+ 
    |            path_img|         descriptors|
    +--------------------+--------------------+ 
    |Training/Apple-Br...|[69, 113, 253, 10...| 
    |Training/Apple-Br...|[212, 236, 159, 2...|
    |Training/Apple-Br...|[60, 53, 123, 239...|
    |Training/Apple-Br...|[255, 189, 252, 1...|
    |Training/Apple-Br...|[204, 244, 149, 1...|
    +--------------------+--------------------+
    

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2012-07-18
      • 2017-08-23
      • 2021-10-06
      • 2020-11-23
      相关资源
      最近更新 更多