在低估这个问题并标记为重复之前,让我解释一下这个问题,我 堆栈上尝试了类似问题的所有可能的解决方案, 但他们都没有工作。我还检查了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)坐标列表下方形成一个特征数组 分别代表位置feautre。
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.]
这是彩色feautre矢量
[ 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是先前计算的特征向量列表(~feff_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.
答案 0 :(得分:1)
很可能是因为尝试从列表或不同长度的数组创建数组而导致错误。
如果没有dtype
,则以下内容会创建object
dtype
数组;使用数字dtype
会引发此错误。
In [33]: np.array([[1,2,3],[4,5,6],[7,8,9,10]])
Out[33]:
array([list([1, 2, 3]), list([4, 5, 6]), list([7, 8, 9, 10])],
dtype=object)
In [34]: np.array([[1,2,3],[4,5,6],[7,8,9,10]], dtype=int)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-34-677fde45dbde> in <module>()
----> 1 np.array([[1,2,3],[4,5,6],[7,8,9,10]], dtype=int)
ValueError: setting an array element with a sequence.
它无法从3个不同长度的列表中创建2d数字数组。
In [37]: np.array([[1,2,3],[4,5,6],[7,8,9]], dtype=int)
Out[37]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
在追溯变量名称中更改,但我猜测问题可以追溯到您提供的_data
变量fit
。您不会显示创建_data
的代码,但只会给出模糊的描述:
_data是特征向量列表(~fera_vec~)
从您的打印件看,颜色和直方图看起来有大约80个值。但位置显然还有很多。这符合您的主张
当我不使用位置功能并仅使用颜色和直方图功能进行训练时,它也不会产生错误,并且训练和预测程序都能正常工作。但只有当所有三个特征堆叠起来时,它才能解决错误。
您hstack
他们可以告诉我们关于它们如何在np.array(....)
中发挥作用的事实。
In [35]: np.hstack([[1,2,3],[4,5,6],[7,8,9,10]])
Out[35]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
以下是我之前回答有关同一个ValueError的问题的列表:
https://stackoverflow.com/search?q=user%3A901925+ValueError%2Bsequence