我从星火哲学开始,就我而言,就是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...|
+--------------------+--------------------+