【发布时间】:2018-08-04 08:43:19
【问题描述】:
在否决这个问题并标记为重复之前,让我解释一下这个问题,我 在堆栈上尝试了所有具有类似问题的可能解决方案, 但他们都没有工作。我也查了,setting an array element with a sequence" error could be improved. #6584
所以我在 3 个不同的特征上训练一个随机森林分类器,它们都具有不同的维度,但我将它们重塑为 (-1,1),这可以适合训练 RF(随机森林)模型,但它会继续提供同样的错误一次又一次,因为我已经尝试了所有可能的事情,这里是正在使用的功能列表,
在这里,我通过简单地取平均值/平均值来计算颜色特征 不同颜色空间的图像,这里正在研究 RGB、LAB、HSV 和 分别是灰色图像,从下面的代码中,我已将所有图像展平 可能的特征向量数组,来自不同的颜色空间。
def extract_color_feature(rgb_roi, lab_roi, hsv_roi, gray_roi):
avg_rgb_per_row = np.average(rgb_roi, axis=0)
avg_rgb = np.average(avg_rgb_per_row, axis=0).flatten()
avg_lab_per_row = np.average(lab_roi, axis=0)
avg_lab = np.average(avg_lab_per_row, axis=0).flatten()
h, s, _ = cv2.split(hsv_roi)
h_avg = cv2.mean(h)
s_avg = cv2.mean(s)
avg_hs = np.hstack([h_avg, s_avg]).flatten()
lbp = extract_lbp(gray_roi).flatten()
avg_rgb = np.array(avg_rgb, dtype=np.float32).flatten()
avg_lab = np.array(avg_lab, dtype=np.float32).flatten()
avg_hs = np.array(avg_hs, dtype=np.float32).flatten()
lbp = np.array(lbp, dtype=np.float32).flatten()
avg_color = np.hstack([avg_rgb, avg_lab, avg_hs, lbp])
return avg_color.flatten()
在下面的函数中,我只计算了直方图值 再次使用不同的色彩空间 RGB、LAB、HSV 色彩空间。作为 这里的每个直方图都是在单个颜色通道上执行的,所以深度 每个直方图特征将始终为 1。
def compute_hist_feature(rgb_seg, hsv_seg, lab_seg, mask):
b, g, r = cv2.split(rgb_seg)
h, s, v = cv2.split(hsv_seg)
l, a, b = cv2.split(lab_seg)
r_equ = cv2.equalizeHist(r)
g_equ = cv2.equalizeHist(g)
b_equ = cv2.equalizeHist(b)
r_hist = cv2.calcHist([r_equ], [0], mask, [8],
[0, 256]).flatten()
g_hist = cv2.calcHist([g_equ], [0], mask, [8],
[0, 256]).flatten()
b_hist = cv2.calcHist([b_equ], [0], mask, [8],
[0, 256]).flatten()
l_hist = cv2.calcHist([l], [0], mask, [8],
[0, 256]).flatten()
a_hist = cv2.calcHist([a], [0], mask, [8],
[0, 256]).flatten()
bb_hist = cv2.calcHist([b], [0], mask, [8],
[0, 256]).flatten()
h_hist = cv2.calcHist([h], [0], mask,
[8], [0, 256]).flatten()
s_hist = cv2.calcHist([s], [0], mask,
[8], [0, 256]).flatten()
h_hist = np.array(h_hist, dtype=np.float32).flatten()
r_hist = np.array(r_hist, dtype=np.float32).flatten()
g_hist = np.array(g_hist, dtype=np.float32).flatten()
b_hist = np.array(b_hist, dtype=np.float32).flatten()
s_hist = np.array(s_hist, dtype=np.float32).flatten()
l_hist = np.array(l_hist, dtype=np.float32).flatten()
a_hist = np.array(a_hist, dtype=np.float32).flatten()
bb_hist = np.array(bb_hist, dtype=np.float32).flatten()
hist = np.hstack([r_hist, g_hist, b_hist, h_hist, s_hist, l_hist, a_hist, bb_hist])
return hist.flatten()
最后我使用 位置特征 ,通过简单的展平 向下 (x,y) 坐标列表形成一个特征数组,它将 分别代表位置特征。
cords = [t[::-1] for t in clusters_.get(disc)] # reversing the list of tuples
disc_pts = np.array(cords, dtype=np.int32)
loc_feat = np.array(cords, dtype=np.float32).flatten()
这里最初的绳索代表一个深度为 2 的数组,因为每个 像素有两个坐标,所以我把它展平,形成一个数组 深度为 1。
最后我将所有三个特征叠加起来形成单个特征向量,
feat_vec = np.hstack([loc_feat, color_feat, hist_feat]).flatten()
在这里,我手动检查了所有三个特征向量中的元素, 为了确认dtype,数组的维度是不模糊的 触发错误,但对我来说一切都很好。
这是第一个,位置特征
[ 82. 209. 82. 210. 83. 210. 82. 211. 83. 211. 82. 212.
83. 212. 84. 212. 81. 213. 82. 213. 83. 213. 84. 213.
81. 214. 82. 214. 83. 214. 84. 214. 81. 215. 82. 215.
83. 215. 84. 215. 81. 216. 82. 216. 83. 216. 84. 216.
81. 217. 82. 217. 83. 217. 84. 217. 81. 218. 82. 218.
83. 218. 84. 218. 85. 218. 81. 219. 82. 219. 83. 219.
84. 219. 85. 219. 81. 220. 82. 220. 83. 220. 84. 220.
85. 220. 81. 221. 82. 221. 83. 221. 84. 221. 85. 221.
81. 222. 82. 222. 83. 222. 84. 222. 85. 222. 86. 222.
81. 223. 82. 223. 83. 223. 84. 223. 85. 223. 86. 223.
81. 224. 82. 224. 83. 224. 84. 224. 85. 224. 86. 224.
81. 225. 82. 225. 83. 225. 84. 225. 85. 225. 86. 225.
87. 225. 81. 226. 82. 226. 83. 226. 84. 226. 85. 226.
86. 226. 87. 226. 81. 227. 82. 227. 83. 227. 84. 227.
85. 227. 86. 227. 87. 227. 82. 228. 83. 228. 84. 228.
85. 228. 86. 228. 87. 228. 82. 229. 83. 229. 84. 229.
85. 229. 86. 229. 87. 229. 82. 230. 83. 230. 84. 230.
85. 230. 86. 230. 87. 230. 82. 231. 83. 231. 84. 231.
85. 231. 86. 231. 87. 231. 82. 232. 83. 232. 84. 232.
85. 232. 86. 232. 87. 232. 82. 233. 83. 233. 84. 233.
85. 233. 86. 233. 87. 233. 88. 233. 83. 234. 84. 234.
85. 234. 86. 234. 87. 234. 88. 234. 83. 235. 84. 235.
85. 235. 86. 235. 87. 235. 88. 235. 83. 236. 84. 236.
85. 236. 86. 236. 87. 236. 88. 236. 83. 237. 84. 237.
85. 237. 86. 237. 87. 237. 88. 237. 84. 238. 85. 238.
86. 238. 87. 238. 84. 239. 85. 239. 86. 239. 87. 239.
84. 240. 85. 240. 86. 240. 87. 240. 84. 241. 85. 241.
86. 241. 87. 241. 85. 242. 86. 242. 87. 242. 85. 243.
86. 243.]
这是颜色特征向量
[ 3.35917592e-01 3.25945705e-01 3.25065553e-01 3.34438205e-01
2.04288393e-01 1.97153553e-01 1.85440078e-01 0.00000000e+00
0.00000000e+00 0.00000000e+00 1.32209742e-02 0.00000000e+00
0.00000000e+00 0.00000000e+00 2.62172282e-04 3.93258437e-04
1.31086141e-04 9.36329598e-05 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 9.98417616e-01 7.02247198e-04]
这是直方图特征向量
[ 0. 0. 0. 0. 0. 0. 0. 169. 0. 0. 0. 0.
0. 0. 0. 169. 0. 163. 6. 0. 0. 0. 0. 0.
0. 0. 0. 169. 0. 0. 0. 0. 169. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 29. 93. 47.
0. 0. 0. 0. 169. 0. 0. 0. 0. 0. 0. 169.
0. 0. 0. 0.]
可以看出所有三个数组的数据类型和维度都是相同的,但是在使用 RF 或 SVC 分类器进行训练时仍然会出现错误,同样当我不使用位置特征并且只进行训练时使用颜色和直方图特征,则不会产生错误,并且训练和预测程序都可以正常工作。但只有当所有三个特征叠加时它才会产生错误。
当为训练设置 RF 分类器时会引发错误。这里的 _data 是先前计算的特征向量 (~feat_vec~) 的列表。和 _labels 分别为每个数据(图像)样本对应的标签 1 或 0。
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(_data, _labels)
完整的错误追溯:
Traceback (most recent call last):
File "~/openCV/saliency_detection/svm_train.py", line 59, in <module>
model.fit(_data, _labels)
File "/usr/lib/python2.7/site-packages/sklearn/ensemble/forest.py", line 247, in fit
X = check_array(X, accept_sparse="csc", dtype=DTYPE)
File "/usr/lib/python2.7/site-packages/sklearn/utils/validation.py", line 382, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
【问题讨论】:
-
你遗漏了最重要的事情。 您的异常回溯在哪里? 此外,寻求帮助调试的问题必须包含minimal reproducible example 以重现问题。这不是最小的。显然,所有这些被注释掉的代码行都与这个错误无关。这只是噪音。当您想了解和修复错误时,通过消除创建一个最小示例是必不可少的。
-
@HåkenLid 感谢您的建议,帖子已修改。
-
当您收到此错误时,
_data和_labels是什么?这些变量不会在您的问题的其他地方使用。 -
确保您传递了预期的参数类型。不幸的是,像 scikit 这样的库经常有非常无信息的错误消息。 scikit-learn.org/stable/modules/generated/…
-
@HåkenLid 没关系,我检查了一下,这不是 sklearn 的问题,而是关于 numpy 数组的问题,请参阅此问题,github.com/numpy/numpy/issues/6584
标签: python arrays numpy random-forest scikit-image