我从星火哲学开始,就我而言,就是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()的结果:



当我执行df2.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()
+--------------------+--------------------+
|            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...|
+--------------------+--------------------+

10-08 05:37
查看更多