【发布时间】:2019-06-19 16:46:26
【问题描述】:
我在将一系列图像转换为正确格式以输入 sklearn.svm.SVC 时遇到了一些困难。
这是我的第一个图像识别项目,所以我有点痛苦。
我有一个循环,它将一堆 base64 RGB 图像(不同大小)引入数据帧
imageData = mpimg.imread(io.BytesIO(base64.b64decode(value)),format='JPG')
然后我将 RGB 图像转换为灰度,并展平
data_images = rgb2gray(imageData).ravel()
rgb2gray:
def rgb2gray(rgb):
r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
return gray
如果我看尺寸差异
df_raw.sample(10)
我们可以看到我的样本之间的图片像素长度是不一样的。我对如何进行有点困惑。由于没有更好的主意,我决定根据最大尺寸的图片添加填充,
df_raw.picLen.max()
然后在每个 1D 图片数组的末尾附加一些零。
def padPic(x,numb,maxN):
N = maxN-len(x)
out = np.pad(x,(numb,N),'constant')
return out
打电话
df_raw['picNew'] = df_raw.apply(lambda row: padPic(row['pic'],0,df_raw.picLen.max()), axis=1)
df_raw['picNewLen'] = df_raw.apply(lambda row: len(row['picNew']), axis=1)
从这里我尝试使用图片数据作为 X 和一组标签作为 y 来拟合一个模型来支持向量算法。
from sklearn.svm import SVC
X_train, X_test, y_train, y_test = train_test_split(df_raw.picNew, df_raw.name, test_size = 0.2, random_state=42)
检查尺寸:
print('Training data and target sizes: \n{}, {}'.format(X_train.shape,y_train.shape))
print('Test data and target sizes: \n{}, {}'.format(X_test.shape,y_test.shape))
训练数据和目标大小:(198,), (198,) 测试数据和目标 尺寸:(50,), (50,)
在我说服自己一切准备就绪后,我尝试拟合模型
svm = SVC()
svm.fit(X_train, y_train)
这会引发错误,我不知道为什么:
/opt/wakari/anaconda/envs/ulabenv_2018-11-13_10.15.00/lib/python3.5/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 499 500""" --> 501 返回数组(a,dtype,copy=False,order=order) 502 503
ValueError: 使用序列设置数组元素。
我认为这一定与数组大小有关,但我无法弄清楚。 :-/
除了错误之外,更一般地说,我对我的方法有一个疑问。特别是我认为我的“填充”可能不正确,也许调整大小会更好。 我感谢对我的方法的任何反馈。谢谢
【问题讨论】:
标签: python arrays scikit-learn classification svm