我只是好奇。我是新来的,所以请体谅我有点虚伪的问题。
假设我正在使用图像识别的android应用程序,其中所有进程甚至计算密集都必须在移动设备cpu上进行。
我处于已经处理过图像的阶段,从图像中提取了一些特征。该组图像仅来自一个建筑物,在那里它应该识别特定的感兴趣对象(不同的窗户,图片,人工制品,建筑物外)。所以这是一个封闭的领域,我可以从不同的角度提供足够的物体图片。我计划训练神经网络并将其提供给应用而不是图像匹配算法。
我的想法是提取关键点,计算描述符(使用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
所以我可以把它交给神经网络进行训练,但是我卡住了,因为我不知道在Matrice(Class Mat - openCV)中是如何表示二进制特征/描述符的。以及如何对这些二进制描述符进行规范化,以便将其提供给神经网络(Multi-Layer Perceptron)进行训练。 (甚至伪代码也会有很大帮助)
答案 0 :(得分:2)
而不是尝试从头开始实现分类器。你有没有考虑过HaarTraining?您可以训练它来检测图像中的多个对象。
但培训过程很长。
http://note.sonots.com/SciSoftware/haartraining.html
希望它有所帮助!
答案 1 :(得分:2)
我无法给出你的问题的完整答案,因为我不熟悉神经元网络,但我可以给你一些关于ORB描述符二进制表示的想法。
当您检测关键点时,您无法通过FREAK执行此操作。但正如FREAK paper所述,您应该使用FAST角点检测器检测关键点,然后使用FREAK对其进行描述。如果要通过ORB描述符识别对象,则应使用ORB作为关键点检测和描述。请注意,ORB关键点检测也可以基于FAST。您可以通过从OpenCV documentation更改scoreType
的参数来更改它。在使用android时,您可以按照here
关于二进制字符串描述符。我还需要它们用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;
}
返回的字符串列表与MatOfKeyPoint
列表的大小相同,如果您将其转换为List<KeyPoint>
那么我如何验证这些描述符是否正确:
因此,与关键点关联的二进制描述符将如下所示:
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
...
现在关于多层感知器。我无法帮助你。这就是为什么我在开始时告诉我答案是不完整的。但是我希望我给出的评论将来会帮助你解决问题。