当前位置: 首页 > 知识库问答 >
问题:

Pyspark UDF获取描述符的问题与openCV问题

颜文康
2023-03-14

我从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_image = udf(lambda img: get_desc(img), ArrayType(FloatType()))

新列的创建:

df2 = df.withColumn("img_vectorized", udf_image("path_img"))

printSchema()的结果:

根--path\u img:string(nullable=true)
|--img\u矢量化:数组(nullable=true)
|--元素:浮点(containsnall=true)

当我df2.show()时,我得到以下错误消息:

Py4JJavaError:调用o773时出错。显示字符串:组织。阿帕奇。火花SparkException:作业因阶段失败而中止:阶段18.0中的任务0失败1次,最近的失败:阶段18.0中的任务0.0丢失(TID 93,localhost,executor driver):net。razorvine。泡菜。pickle异常:构造ClassDict(对于numpy.core.multiarray.u重构)需要零参数

AttributeError:“NoneType”对象没有属性“flatte”

我注意到描述符为空。我指定,当我在单行上执行此提取时,它会工作。

我不明白为什么它在我的数据帧上不起作用。你能帮我吗?

谢谢

共有1个答案

凌远
2023-03-14

经过几天的研究,我昨晚找到了解决办法...

我更正的代码:

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...|
+--------------------+--------------------+
 类似资料:
  • 问题内容: 我认为这个问题更多是“编码风格”,而不是技术问题。 说我有一行代码: 文件描述符会自动关闭还是留在内存中?如果文件描述符未关闭,则首选的关闭方式是什么? 问题答案: 如果将文件对象分配给变量,则可以使用来显式关闭它 另外,(也通常是首选),您可以使用Python文档中提到的关键字(Python 2.5及更高版本): 在处理文件对象时,最好使用关键字。这样做的好处 是 ,即使在执行过程中

  • 这是我第一次使用Yoast搜索引擎优化插件在我的网站,我正在尝试添加元描述到每一个网页和每一个帖子在我的网站。 当我在谷歌上搜索时,似乎元描述根本没有显示出来,相反谷歌将网站页面上的内容作为元描述。 当我查看页面源代码时,我在Yoast SEO中设置了一个内容作为我的元描述 这是我的网站 sunlitex.co.id/en/ 我也有一个问题的元描述模板从插件页面,我只是留空还是应该添加一些变量?

  • 我正在尝试使用这里提供的jirarestapihttps://developer.atlassian.com/server/jira/platform/rest-apis/我正试图弄清楚如何在我的项目中得到对具体问题的描述。 当我做以下查询时: curl-D--u user:password-X GET-H“内容类型:application/json”http://localhost/jira/r

  • 我正试图从IP摄像机实时捕捉图像。该流在VLC中工作得非常好,但是OpenCV的似乎混淆并损坏了传入的图像,以至于无法识别。 同样,从文件捕获工作很好,但不是实时流。如果它有不同,我使用rtsp连接URL;我也尝试了两个不同型号的相机(不同品牌),问题仍然存在。 此外,(我假设)编解码器正在输出以下几种错误:和。 我能做什么?

  • 我想让t0设置一个变量,让agent random得到一个介于1-10之间的数字(以后用这个数字来过滤人),但是我怎么设置随机变量的公式呢?我使用random.next Int(1)+5;但是错误表示:无法对来自类型random的非静态方法next Int(Int)进行静态引用。你能帮帮我吗?非常紧急

  • 得到Maven问题,下面是我得到的问题: [错误]插件org.apache.maven.plugins:maven-resources-Plugin:2.6或其依赖项无法解析: 未能读取org.apache.maven.Plugin:maven-resources-Plugin:jar:2.6: 无法将工件org.apache.maven.Plugin:2.6从/传输到central(https: