图像识别-二进制描述符表示在Mat - OpenCV Android



我只是好奇。我是新来的,所以请考虑一下我的问题。

假设我正在做带有图像识别的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描述符二进制表示的想法。

  1. 当你检测关键点时,你不能用FREAK来做。但正如FREAK论文所描述的,你应该用FAST角检测器检测关键点,然后用FREAK来描述它。如果您希望通过ORB描述符识别对象,那么您应该将ORB用于关键点检测和描述。注意,ORB关键点检测也可以基于FAST。你可以通过改变OpenCV文档中scoreType的参数来改变它。当你使用android时,你可以像下面这样设置这个参数

  2. 关于二进制字符串描述符。我还需要他们实现描述符匹配与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列表相同的大小

那么我如何验证这些描述符是否正确呢?

  1. 我已经匹配了原始Mat描述符与Bruteforce汉明匹配器在ORB论文中所说的
  2. 我已经注册了matcher返回的距离。
  3. 然后我计算了距离相同图像的字符串描述符之间的距离。
  4. 验证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

希望有帮助!

相关内容

  • 没有找到相关文章

最新更新