only555 发表于 2016-4-25 22:09

有做计算机视觉,图像识别的同胞吗?

本人工作的一部分是机器学习,除了工作的原因自身对这个方向 也很感兴趣。 最近做个图像识别的机器学习算法, 但是出现一个问题就是当图片上是同一个人的时候,人的各个身体部位识别的还挺好的,识别率甚至可以达到97%,但是换了另外一个人就基本什么都识别不出来了。 因为我个人是计算机专业出身的,所以对图像的pixel 的认识很浅薄,可以说是一窍不懂吧。我自己的猜测是因为我把图像数据化的时候pixel转换不对,导致算法学习的很单一,基本就是1对1的去学了,没有找到共同性。 因为之前问SAP的问题,遇到好心同胞的帮忙所以这次还想问问有有没有人做计算机视觉或者图像识别之类的。像我上面出的情况有可能是哪里出错了呢——还有大家把图片数据化的时候,如果把一个图片的pixel矩阵 例如640*480转换成一行的话,比如1*10,1*100之类的,有没有什么转换方法能够在信息流失度最小的情况下把一个图片变成一行数据?我基本用的就是R或者python.

drach 发表于 2016-4-26 09:18

好像都是用matlab的吧

小鬼2140 发表于 2016-4-26 10:08

openCV 里有相关的算法, 楼主可以自己去看看!

小鬼2140 发表于 2016-4-26 10:14

http://docs.opencv.org/3.1.0/dc/dd6/ml_intro.html#gsc.tab=0

hauke 发表于 2016-4-26 10:21

我觉得做图像处理还是c#好用{:5_338:}

bitsun 发表于 2016-4-26 10:28

楼主你问的问题很不清楚
1.你用了什么学习方法,bayes classifier? SVM? random forest? neural network? 假如是用流行的SVM, 你用了什么kernel,什么参数,具体到implementation,你用了什么库?
2。 你的识别器的学习数据是哪里来的,是自己annotate,还是来自公开数据。从你描述来看,似乎有点over fitting的问题
3. 楼主似乎要用识别人的身体部位,我的经验是这个微软的kinetic sdk已经做的非常好了

你的问题,“640*480转换成一行的话,比如1*10,1*100之类”
建议使用haar wavelet transformation,具体怎么做可以google

leelight 发表于 2016-4-26 10:32

做过一点图像识别,进来学习一下

only555 发表于 2016-4-26 11:32

bitsun 发表于 2016-4-26 10:28
楼主你问的问题很不清楚
1.你用了什么学习方法,bayes classifier? SVM? random forest? neural network?...

我自己猜测也是 over Fitting 了。 现在用的算法是xgboost但最后用什么算法,还不确定,我们没有固定的算法限制,都是看最后哪个结果好。然后用哪个。 主要的问题还是图片转换成正常数据的问题,只要这个转换好了,我们其他的学习方法就都能拿来用和比较了。 关于矩阵的问题我举个例子。我们现在把图片import 到R里面,保存的结果就是每个图片一个 480 行 640 列的一个像素矩阵。 但正常机器学习是一行对应一个分类,于是我们就想方法把每个图片的这个像素矩阵转换成一行,然后才能在这个数据上面用分类算法。 我出现over Fitting 的问题,我的猜测就是我们转换矩阵成一行数据的时候,转换的方法不对,我们把图像的颜色都换成灰色等等一系列预处理,然后在这个预处理好的图片基础上转换成一行数据。就是怕算法例如根据人的衣服颜色啊,什么之类的1:1 的去学了。我们现在没有图像处理方面的同事,大家都是计算机或者数学出身,我就是想问问 Image processing 这块怎么预处理,才能把一张图片的像素矩阵转换成一张图片一行数据,而且还能保留图像包含的内容。

mib 发表于 2016-4-26 13:01

only555 发表于 2016-4-26 11:32
我自己猜测也是 over Fitting 了。 现在用的算法是xgboost但最后用什么算法,还不确定,我们没有固定的算 ...

对不对你把图像换成BMP看看就知道了。

only555 发表于 2016-4-26 13:10

mib 发表于 2016-4-26 13:01
对不对你把图像换成BMP看看就知道了。

数字化以后如果还是矩阵格式,换成BMP图像肯定是一样的,但是问题是换成一行数据以后,这个不可能再转成图片啊,但是要做机器学习,我们还必须把它转成一行数据,要不算法没法用

bitsun 发表于 2016-4-26 14:26

only555 发表于 2016-4-26 11:32
我自己猜测也是 over Fitting 了。 现在用的算法是xgboost但最后用什么算法,还不确定,我们没有固定的算 ...

xgboost是一个库,这样来看你用的是boost算法,具体里面哪个,你应该写具体点,你到底怎么调用xgboost api的,用了什么参数。同一个算法,不同的参数对结果影响太大了。
还有你不是overfitting 问题。从你描述来看是feature extraction 问题,也就是你说的把图像转换成一个compact feature vector的问题。这本身就是识别问题非常重要的第一步,建议你用Histogram of Gradient,请自行google。这是非常成功的识别行人的feature extraction 方法,一般跟SVM一起用。但是它比较适合识别一个整个的人,对于单个身体部位的识别,比如,head, arm, leg,可能效果也不错。
另外,为什么要用xgboost?这个问题一般opencv自带的单机版机器学习库足够用了。我对opencv更熟悉些。

但是我还是那句话,识别人物和肢体,microsoft kinetic sdk效果非常好。当然你非要从底层feature extraction+ classifier都自己来,我靠,这个research+implementation工作量好大

木_偶 发表于 2016-4-26 14:52

楼主问题没问清楚,我觉得你这个有问题,首先你把一张图片转换成一个行矩阵,你一整个行矩阵都是你的feature?
如果要分析问题那一定得一步步讲的非常清楚才行,显然是算法过拟合了但是问题可能性太多了

shuoshuo0000 发表于 2016-4-26 14:57

问的莫名其妙,想帮忙都插不上嘴

only555 发表于 2016-4-26 15:38

本帖最后由 only555 于 2016-4-26 15:42 编辑

bitsun 发表于 2016-4-26 14:26
xgboost是一个库,这样来看你用的是boost算法,具体里面哪个,你应该写具体点,你到底怎么调用xgboost ap ...

我们最开始也想过找些开发好的第三方软件,稍微改动些直接用,主要 我们要把这个模型最后放在SAP HANA 里面,我这边的同事大家对R和python 比较了解,别的软件不知道最后能不能放在HANA或者 SAP BW里面。 所以大家想先自己弄看aufwand怎样。。。Histogram of Gradient 我看了,我基本找的就个,你还知道类似的能分辨人体身体部位的嘛?

yangdi12 发表于 2016-4-26 19:33

不是很理解你的思路。首先检测是检测,分类是分类。
你要把人所在的那个窗口先扣出来尺寸归一化才能谈分类的问题。。。大小不一样怎么分类。
假设你已经做了归一化,其次800x600的图像为何你要做成1 x n的数列呢?
直接分成N个m x n 的小窗口计算HOG Feature,假设你用N通道的HOG,有O个窗口,你可以把Feature归一成 1 x (NxO) 的一维Feature列,然后用SVM或者别的分类器实现。
如果你是搞机器学习出身的,应该不难的

yangdi12 发表于 2016-4-26 19:35

木_偶 发表于 2016-4-26 14:52
楼主问题没问清楚,我觉得你这个有问题,首先你把一张图片转换成一个行矩阵,你一整个行矩阵都是你的featur ...

一整个行距阵都是Feature的做法我只能想到Deep Learning的各种变种,确实有人这么粗暴地干。。

yangdi12 发表于 2016-4-26 19:41

本帖最后由 yangdi12 于 2016-4-26 19:45 编辑

only555 发表于 2016-4-26 11:32
我自己猜测也是 over Fitting 了。 现在用的算法是xgboost但最后用什么算法,还不确定,我们没有固定的算 ...

*一行对应一个分类* 这句话指的是一行中每一个数值都是一个feature的一个维度。(也有同时用几个feature拼起来的,这里先略过)
你要先对原来整体图像进行feature extraction呐。可以先切割成小块然后做各个小块的特征提取,然后按顺序从头到尾连起来成1xn的行数据(典型HOG) 。也可以做整图特征提取(典型SIFT等)。
如果你非要直接生成800x600的行向量,扔去训练,你的服务器是撑不住的。
要避免特征提取问题,你可以用图像缩放算法,比如image pyramid, 缩成 40x30的图像,然后做成1x1200的向量直接扔去训练。但根据我的经验,这种暴力做法只有deep learning方向的各种NN的变种才有可能实现,而且精确度还不一定比传统SVM高。

傻卵 发表于 2016-4-26 19:44

做这个没啥前途啊,请看google图像搜索....

人家google公司大吧,资金充足吧,人员够顶尖吧,再看google图像搜索功能,用用就知道了,跟泼屎一样,你做这个能弄出个啥

yangdi12 发表于 2016-4-26 19:48

傻卵 发表于 2016-4-26 19:44
做这个没啥前途啊,请看google图像搜索....

人家google公司大吧,资金充足吧,人员够顶尖吧,再看google ...

人如其名

bitsun 发表于 2016-4-26 20:39

yangdi12 发表于 2016-4-26 19:33
不是很理解你的思路。首先检测是检测,分类是分类。
你要把人所在的那个窗口先扣出来尺寸归一化才能谈分类 ...

说的很对,从楼主给出的图像尺寸来看,不大可能已经normalization(是不是就是你说的归一化?)。所以我还忘记提feature extraction前的sliding window方法。
我觉得楼主肯定不是机器学习出身,我个人认为选择的库就很狭窄,限定于boost,不过是用来训练大数据量的分布式boost,为什么不用opencv呢,这是带python wrapper的,甚至可以用 torch。我感觉楼主更想要的是一个现成能用的sdk,感觉微软的kinetic sdk绝对是首选。

bitsun 发表于 2016-4-26 20:41

傻卵 发表于 2016-4-26 19:44
做这个没啥前途啊,请看google图像搜索....

人家google公司大吧,资金充足吧,人员够顶尖吧,再看google ...

试试看goggle,更让我惊讶deep learning成熟度的是Rekognition,可惜他们的demo好像关闭了,据说被亚马逊收购中,你试过他们的demo以后,你就会觉得你就是你的名字一样。

mandriva 发表于 2016-4-26 20:54


如果把一个图片的pixel矩阵 例如640*480转换成一行的话,比如1*10,1*100之类的,有没有什么转换方法能够在信息流失度最小的情况下把一个图片变成一行数据?我基本用的就是R或者python.


啥子意思? 640*480 正是一行阿, bool(640*480 == 1 * 640 * 480) == True
可以实现无损转换,算法
from PIL import Image

def serializer(fn):
#fn == filename or path which can be viewed by OS
    serialization = []
    with Image.open(fn) as im:
      width, height = im.size
      pix = im.load()
#   640 x 480
    for y in range(height):
# Make a vertical loop with y coordinate
      for x in range(width):
# Loop horizontally with x coordinate
            serialization.append(pix)

    return serialization


only555 发表于 2016-4-26 20:55

yangdi12 发表于 2016-4-26 19:41
*一行对应一个分类* 这句话指的是一行中每一个数值都是一个feature的一个维度。(也有同时用几个featur ...

{:8_498:} 我大概看明白你的意思了,原来这么麻烦的东西。 我们机器学习这块像选特征值,实现算法,选最优参数,ensamble 之类的都不是什么问题,就是不会把图片转换成数据。我们现在的做法估计都谈不上暴力,可能就是傻。 我们一个图片里面有些场景大部分地方都是人,然后每个人有个动作,例如搬运货物啊,吃饭啊之类的,然后对应的label 就是这群人在干什么,例如arbeiten ,essen, rauchen 等等。 所以我们最后要做的还是分类。分类回归我们都做过很多,这没什么问题,但就是没办法合理的把每个图片换成一行数据然后对应一个状态(label)例如arbeiten,然后去算。我们根本就还没去想选特征值的事情呢,以为和正常一样,先把数据整合一起, 变成一个label对应一个图片数据(1*n features) 然后才是选特征值。你上面说的2种方法我去试试,感觉第二种好像更适合,因为我们图像里面可以好几个人,这样分块提取特征值后可能会更准确些,例如2个人在工作一个人在抽烟,那最后的分类可能能自动分辨出来他们是工作。可能会更准确些。。谢谢你的回复,明天我和同事说说,然后大家再尝试一下。原谅我高考不及格的语文吧。。哈哈。。

only555 发表于 2016-4-26 21:05

bitsun 发表于 2016-4-26 20:39
说的很对,从楼主给出的图像尺寸来看,不大可能已经normalization(是不是就是你说的归一化?)。所以我还 ...

小妹,才疏学浅,见笑了,还期待大神门的帮助啊。。

sailajohn 发表于 2016-4-26 21:19

如果你拥有大量训练数据,每个类别超过至少1000幅以上的图片,并且分布相对平均,我建议你使用深的卷积神经网络(CNN),深度学习是你需要的最佳选择,请搜索caffe deeplearning framework。深度神经网络的优势就是利用大数据让层级化的神经网络自行学习更高阶的特征属性。简单的说针对你的问题,一个深度网络的入口就是你的原始像素矩阵,在一个已经训练完备的deep model上进行一个前向计算,从最后的全连神经层输出的结果,比如可能是一个2048维的特征向量,就是你需要的高阶的特征向量,后面你可以将它倒入HaHa,或者训练分类器都行。

only555 发表于 2016-4-26 21:27

sailajohn 发表于 2016-4-26 21:19
如果你拥有大量训练数据,每个类别超过至少1000幅以上的图片,并且分布相对平均,我建议你使用深的卷积神经 ...

非常感谢你的回复啊,这个深度学习我还没具体接触过,只是平时听过这方面的报道。 如果我没理解错你的意思 ,你是说 我利用这个深度学习下的这个类似神经网络的model 可以直接输入我们图片数据化后的 像素矩阵,然后model的输出是一个图片对应一行的正常矩阵,这个输出我就可以拿来做正常的分类学习了。是这样吗? 那太好了啊,我们需要的就是这个类型的转换。。。

sailajohn 发表于 2016-4-26 22:16

only555 发表于 2016-4-26 21:27
非常感谢你的回复啊,这个深度学习我还没具体接触过,只是平时听过这方面的报道。 如果我没理解错你的意 ...

就是这个意思,而且通过一个训练完备的CNN模型(例如在image net数据集上训练出来的模型,image net是著名的图像分类竞赛数据集,拥有1000个类别,每个类大概1000幅图片)你用你的图片在模型上前向运算输出的特征值向量要比传统机器学习的人工设计的特征如hog,sift,surf等等等等都要高级,优越,你得到的分类结果也会更好,caffe framework是巴克利大学视觉实验室提供的开源深度学习库,c++编写,拥有python和matlab接口,同时提供已经训练好的image net模型,caffe开源模型园(caffe zoo)中你也可以找到很多其他研究机构提供的模型,大多是前沿科研成果的样机,例如训练的更优的牛津大学视觉实验室的vgg系列模型...

傻卵 发表于 2016-4-26 22:34

bitsun 发表于 2016-4-26 20:41
试试看goggle,更让我惊讶deep learning成熟度的是Rekognition,可惜他们的demo好像关闭了,据说被亚马逊 ...

那天看鸿观去google 总部采访,才知道google做图像查询的负责人是一个中国人,据说是google公司元老级人物了,吹的多么牛逼,然后按照鸿观里说的试用了下google的图像搜索........

感觉真的是一泼屎

谁说关闭了?如果你说的是google图像搜索的话,你现在可以去试试,根本就不好用!

所以我觉得做这个没前途

bitsun 发表于 2016-4-26 23:00

only555 发表于 2016-4-26 20:55
我大概看明白你的意思了,原来这么麻烦的东西。 我们机器学习这块像选特征值,实现算法,选最 ...

随着你的表述越来越多,感觉你是要做一个human action recognition?
那第一步应该是做 human detection, 至少你可以把人物从图片背景分离出来,再用其他人建议的CNN模型训练出来的特征加SVM。好吧,感觉可以发一篇论文了,以action recognition + deep learning可以搜出大一堆文献。deep learning我一直只是仰视,看其他大神给意见吧。
但做机器视觉,识别感觉就是要不停阅读文献

bitsun 发表于 2016-4-26 23:07

傻卵 发表于 2016-4-26 22:34
那天看鸿观去google 总部采访,才知道google做图像查询的负责人是一个中国人,据说是google公司元老级人 ...

负责人是中国人就不行?你得有多自卑。在机器学习机器视觉领域,华人还真的非常牛逼。如果真是一个华人在负责,我一点都不奇怪。
另外你会错我的意思,我是说Rekognition的demo,谷歌开发的goggle这个app你也可以试试,谷歌的图片搜索,我没试过,但是给我感觉是识别相近图片而已,并没语义上的识别,当然会显得非常傻瓜,但是这早就不是图片识别的前沿了,算了不跟你太多废话了。觉得你先入为主太厉害
页: [1] 2
查看完整版本: 有做计算机视觉,图像识别的同胞吗?