CVPR2014 Objectness源码转换(完整版) VS2012 X64 –>win32


一、版本转换

   1.将源码中vs2012 X64版本转换为vs2012 win32版本。

2.源码下载及其相关资料下载http://mmcheng.net/zh/bing/

3.需要下载源码(Paper部分)和VOC数据库(Download部分,800多M)

PS:VOC最好下载作者的,作者将里面的xml修改成适合OpenCV操作的yml文件,直接下载是没有的哟

4.以下所有设置都是在Release下进行的,Debug雷同。

5.OpenCV建议使用2.4.8版本以上,我这里采用是2.4.8

二、环境设定

源码是X64的,请自觉配置管理器,新建->添加  Win32

查看属性管理器,会发现增加了两项Win32目录,之前是没有的

三、在LibLinear工程中编译生成LibLinear.lib文件

具体如下:

1.右键LibLinear,选为启动项目

2.在linear.cpp文件中,修改print_string_stdout函数为:

extern "C" static void print_string_stdout(const char *s)

3.打开LibLinear工程的Release属性页,通用属性->常规,修改:项目默认值->配置类型(静态库.lib),常规->目标文件拓展名(.lib)

4.C/C++->代码生成 –>运行库->多线程(/MT)

PS:MT对应Release,MTD对应Debug

5.Ctrl+F5,会在当前工程下的Release文件加下生成LibLinear.lib

6.切换回来,将Objectness设为启动项目

7.LibLinear配置完了,接下来的配置都是针对Objectness的

8.打开Release属性,链接器->附加库目录,添加LibLinear.lib的目录,

eg. E:\VS2012 workspace\BingObjectnessCVPR14\Objectness\Release

注意:链接库依赖项 要设为是(yes)

 

四、用_popcnt函数实现_popcnt64函数功能

 

需要自己动手在INT64类型基础上写函数。要加头文件#include<intrin.h>在stdafx.h中。

inline INT64 __popcnt64(INT64x)

{

       return __popcnt((unsignedint)(x ))+__popcnt((unsignedint)(x>> 32));

}


五、Objectness配置(简单粗暴)

1.打开Release属性页

2.配置OpenCV(百度),注意在链接器->输入 这里要把opencv所有的lib 包含进去,不然会报下面这类错误:

opencv_core248.lib(persistence.obj): error LNK2019:无法解析的外部符号 _gzputs

3.还要添加一些系统的lib,gdi.lib(一般会有),comctl32.lib, 不然会报下面这类错误:

opencv_highgui248.lib(window_w32.obj): error LNK2019:无法解析的外部符号 __imp__CreateToolbarEx@52

4.C/C++ ->预处理器 –>预处理器定义添加: _LIB _CRT_SECURE_NO_WARNINGS

5.C/C++ ->代码生成 –>运行库多线程(/MT) ;

不然会报下面这类错误:

error LNK2038:检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配 值“MD_DynamicRelease”

启用函数级链接->是(/GY);

启用增强指令集->流式处理 SIMD 扩展 2 (/arch:SSE2);

PS:先查一下自己的CPU支不支持SSE2,一般i3以上就可以,不然建议换台电脑

6.C/C++ ->语言->OpenMP支持->是 (/openmp)

配置完成啦,绝对简单粗暴!

 

六、代码中Mat无法解析问题


  具体原因暂时无法知道,可能是opencv中Mat_对INT64(unsignedlong long)类型的支持问题,可以用以下matchTemplate()函数替换FilterBing.cpp文件中的matchTemplate原函数。自己运行看看有没有问题,有问题再修改。

<span style="font-family:KaiTi_GB2312;">void FilterBING::matchTemplate(const Mat &mag1u, Mat &matchCost1f)
{
    const int H = mag1u.rows, W = mag1u.cols;
    const Size sz(W+1, H+1); //Expand original size to avoid dealing with boundary conditions
    Mat_<float> scores(sz);
    // @2013.3.22 by ly;
    const int sizeSZ = sz.width * sz.height;
    INT64 * Tig1 = (INT64 *)malloc(sizeSZ * sizeof(INT64));
    INT64 * Tig2 = (INT64 *)malloc(sizeSZ * sizeof(INT64));
    INT64 * Tig4 = (INT64 *)malloc(sizeSZ * sizeof(INT64));
    INT64 * Tig8 = (INT64 *)malloc(sizeSZ * sizeof(INT64));
    byte * Row1 = (byte *)malloc(sizeSZ * sizeof(byte));
    byte * Row2 = (byte *)malloc(sizeSZ * sizeof(byte));
    byte * Row4 = (byte *)malloc(sizeSZ * sizeof(byte));
    byte * Row8 = (byte *)malloc(sizeSZ * sizeof(byte));
    memset(Tig1, 0, sizeSZ * sizeof(INT64));memset(Tig2, 0, sizeSZ * sizeof(INT64));
    memset(Tig4, 0, sizeSZ * sizeof(INT64));memset(Tig8, 0, sizeSZ * sizeof(INT64));
    memset(Row1, 0, sizeSZ * sizeof(byte));memset(Row2, 0, sizeSZ * sizeof(byte));
    memset(Row4, 0, sizeSZ * sizeof(byte));memset(Row8, 0, sizeSZ * sizeof(byte));
    for (int y=1; y<= H; y++)
    {
        const byte * G = mag1u.ptr(y-1);
        INT64 * T1 =Tig1 + y*sz.width;
        INT64 * T2 =Tig2 + y*sz.width;
        INT64 * T4 =Tig4 + y*sz.width;
        INT64 * T8 =Tig8 + y*sz.width;
        INT64 * Tu1 =Tig1 + (y-1)*sz.width;
        INT64 * Tu2 =Tig2 + (y-1)*sz.width;
        INT64 * Tu4 =Tig4 + (y-1)*sz.width;
        INT64 * Tu8 =Tig8 + (y-1)*sz.width;
        byte * R1 =Row1 + y*sz.width;
        byte * R2 =Row2 + y*sz.width;
        byte * R4 =Row4 + y*sz.width;
        byte * R8 =Row8 + y*sz.width;
        float *s =scores.ptr<float>(y);
        for (int x=1;x<= W; x++)
        {
            byte g =G[x-1];
            R1[x] = (R1[x-1] << 1) | ((g>> 4) & 1);
            R2[x] = (R2[x-1] << 1) | ((g>> 5) & 1);
            R4[x] = (R4[x-1] << 1) | ((g>> 6) & 1);
            R8[x] = (R8[x-1] << 1) | ((g>> 7) & 1);
            T1[x] = (Tu1[x] << 8) | R1[x];
            T2[x] = (Tu2[x] << 8) | R2[x];
            T4[x] = (Tu4[x] << 8) | R4[x];
            T8[x] = (Tu8[x] << 8) | R8[x];
            s[x] = dot(T1[x], T2[x], T4[x],T8[x]);
        }
    }
    free(Tig1); free(Tig2); free(Tig4); free(Tig8);
    free(Row1); free(Row2); free(Row4);free(Row8);
    scores(Rect(8, 8,W-7, H-7)).copyTo(matchCost1f);
}
</span>


七、Debugging information *.exe cannot be found(C++不能调试解决方法)


可以略过,感觉没什么用

打开属性页

1.  C/C++->常规->调试信息格式->用于“编辑并继续”的程序数据库 (/ZI)

2.  C/C++->优化->优化->已禁用 (/Od)

3.  链接器 ->调试->生成调试信息->是 (/DEBUG)


八.程序运行


终于可以运行程序了

1.  将已经下载好的VOC数据集解压,放在某个地方,eg:D:\VOC

2.  打开Main.cpp文件中的RunObjectness方法 ,修改为DataSetVOC voc2007(“D:/VOC/”);

3.  Ctrl+F5,终于出现黑框框了,有木有很兴奋奋斗


这个和作者的效果还是有一定差距的,不过效果也算是很不错了!

Ps:我的电脑比较老了,有时候还是会崩溃,重启一下,就OK了。囧

4.  把程序最后一行objNess.illuTestReults(boxesTests);注释去了,在VOC2007/Local/下能看到图片预测目标窗口的结果

效果还是不错的,精度还没怎么做分析,程序运行结束后,VOC2007/Results/下生成有个PerImgAll.m的文件,直接在Matlab中就能跑出结果


    上面的精度曲线称为DR-#WIN curves,源自TPAMI 2012的一篇论文:Measuring the objectness of image windows。原文还提出了将窗口数量比如[[0,5000]归一化到[0,1]之间,用曲线下的面积作为目标检测的度量结果,并称之为the area under the curve(AUC),这样AUC的范围就在[0,1]之间了。

以上就是我自己在环境转换中遇到的所有问题以及解答,过程很有意思,就是电脑太卡,实在不爽!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值