我只是好奇。我是新来的,所以请考虑一下我的问题。
假设我正在做带有图像识别的android应用程序,其中所有进程甚至计算密集型都必须发生在移动设备cpu上。
我正处于已经处理图像的阶段,从图像中提取了一些特征。该图像集只来自一个建筑物,它应该识别特定的感兴趣的对象(不同的窗户,图片,人工制品,建筑物外)。所以这是一个封闭的领域,我可以从不同的角度提供足够的物体图片。我打算训练Neural Network,然后提供给app,而不是图像匹配算法。
我的想法是提取关键点,计算描述符(使用FREAK为关键点ORB为描述符),在这些描述符中,我想以单个文件或数组结束最后会变成这样
Desc1 Desc2 Desc3 Desc4 DescN......... Class
_________________________________________________________________________________
Picture 1 0.121 0.923 0.553 0.22 0.28 "object1"
Picture 2 0.22 0.53 0.54 0.55 0.32 .........."object1" (different scale, angle)
Picture 3 .... ... ... ... .. .........."object2"
Picture N
Picture N+1
所以我可以把它给神经网络进行训练,但是我卡住了,因为我不知道二进制特征/描述符是如何在矩阵中表示的(类Mat - openCV)。我该如何继续规范化这些二元描述符,这样我就可以把它输入神经网络(多层感知器)进行训练。(即使伪代码也会大有帮助)
我不能给你一个完整的答案,因为我不熟悉Neuronal Networks,但我可以给你一些关于ORB描述符二进制表示的想法。
-
当你检测关键点时,你不能用FREAK来做。但正如FREAK论文所描述的,你应该用FAST角检测器检测关键点,然后用FREAK来描述它。如果您希望通过ORB描述符识别对象,那么您应该将ORB用于关键点检测和描述。注意,ORB关键点检测也可以基于FAST。你可以通过改变OpenCV文档中
scoreType
的参数来改变它。当你使用android时,你可以像下面这样设置这个参数 -
关于二进制字符串描述符。我还需要他们实现描述符匹配与MySQL查询。由于OpenCV-java中的Mat只有双描述符表示,我已经实现了将它们转换为二进制的方法。为此,应将描述符Mat转换为
List<Double>
。你可以用我的函数来得到描述符的二进制表示。该函数将返回List<String>
。
代码如下:
public static List<String> descriptorToBinary(List<Double> desc){
List<String> binary_desc = new ArrayList<String>();
String desc_bin= "";
for(int i = 0; i < desc.size(); i++){
String binary_str_tmp = Integer.toBinaryString((int)((double)desc.get(i)));
if (binary_str_tmp.length() < 16)
{
int number_of_zeros = 16 - binary_str_tmp.length();
String str_tmp = "";
for(int t = 0; t < number_of_zeros; t++){
str_tmp += "0";
}
binary_str_tmp = str_tmp + binary_str_tmp;
}
desc_bin+= binary_str_tmp;
binary_desc.add(final_binary_str);
}
return binary_desc;
}
如果您将其转换为List<KeyPoint>
,返回的字符串列表将具有与MatOfKeyPoint
列表相同的大小
那么我如何验证这些描述符是否正确呢?
- 我已经匹配了原始Mat描述符与Bruteforce汉明匹配器在ORB论文中所说的
- 我已经注册了matcher返回的距离。
- 然后我计算了距离相同图像的字符串描述符之间的距离。
- 验证openv的汉明距离是否与字符串描述符之间的距离相同。它们是相同的,所以从Mat到List的转换很好。
所以与关键点相关的二进制描述符看起来像这样:
Picture 1: object1
keypoint1 : 512bit binary descriptor (1s and 0s)
keypoint2 : 512bit binary descriptor
keypoint3 : 512bit binary descriptor
...
Picture 2: object2
keypoint1 : 512bit binary descriptor
keypoint2 : 512bit binary descriptor
keypoint3 : 512bit binary descriptor
...
现在谈谈多层感知机。这件事我帮不了你。这就是为什么我一开始就说我的答案是不完整的。但是我希望我给出的意见能帮助你在将来解决你的问题。
而不是尝试从头实现一个分类器。你考虑过HaarTraining吗?你可以训练它来检测图像中的多个对象。
训练过程是漫长的。
http://note.sonots.com/SciSoftware/haartraining.html希望有帮助!