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:\VS 2012 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原函数。自己运行看看有没有问题,有问题再修改。
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);
}
七、Debugging information *.exe cannot be found or does not match(C++不能调试解决方法)
可以略过,感觉没什么用
打开属性页
- C/C++ ->常规->调试信息格式->用于“编辑并继续”的程序数据库 (/ZI)
- C/C++ ->优化->优化->已禁用 (/Od)
- 链接器 ->调试->生成调试信息->是 (/DEBUG)
八.程序运行
终于可以运行程序了
- 将已经下载好的VOC数据集解压,放在某个地方,eg:D:\VOC
- 打开Main.cpp文件中的RunObjectness方法 DataSetVOC voc2007(“D:/VOC/”);
- Ctrl+F5,终于出现黑框框了,有木有很兴奋
Ps:我的电脑比较老了,有时候还是会崩溃,重启一下,就OK了。囧
- 把程序最后一行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]之间了。
CVPR2014 Objectness 源码转换(完整版) VS2012 X64 –>win32的更多相关文章
- [译]JavaScript源码转换:非破坏式与再生式
原文:http://ariya.ofilabs.com/2013/06/javascript-source-transformation-non-destructive-vs-regenerative ...
- Chrome自带恐龙小游戏的源码研究(完)
在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...
- 〖Windows〗Linux的Qt程序源码转换至Windows平台运行,编码的解决
在中国大陆,Windows默认的编码是gb2312,而Linux是UTF8: 多数情况下,把Linux上的程序转换至Windows上运行需要进行编码转换才能正常显示: 而其实大可以不必的,同样,文件使 ...
- Java SpringMVC实现PC端网页微信扫码支付完整版
一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...
- android源码-安卓源码-Android源码下载-安卓游戏源码
android源码 高仿精仿金山手机卫士应用源码V1.2 高仿精仿金山手机卫士应用源码,该应用的级别实现了金山卫士的级别功能了,可以说跟现实中我们使用的金山卫士应用的功能几乎差不 人气:9286 ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- 2014年4月份第2周51Aspx源码发布详情
HFC代码转化工具源码 2014-4-8 [VS2010]源码描述:HFC代码转化工具源码 1.主要实现HTML代码转化为C#或者JS代码,为我们平时编码节省时间. 2.把代码复制到面板上,通过右键 ...
- 2014年6月份第3周51Aspx源码发布详情
基于知识树的多课程网络教学平台源码 2014-6-16 [VS2008]功能介绍:本平台是一个支持网上教学的网站,支持多个课程,教师可根据需要创建课程,进行课程结构.题库等的管理. 技术特色 ...
- 2014年3月份第2周51Aspx源码发布详情
MVC+EF某钢电子交易平台源码 2014-3-10 [VS2012]功能介绍:本源码是一套完整的电子交易平台系统,完全基于ASP.NET MVC+EF三层构架,开发环境为Visual Studio ...
随机推荐
- node获取URL数据
req.method -->GET req.hostname -->127.0.0.1 req.originalUrl -->/test/test/test?name=wang ...
- Android开发——Google关于Application Not Responding的建议
秒内没有执行完毕. 2. 避免ANR的一些建议 Android applications normally run entirely on asingle (i.e. main) thre ...
- java反射操作类方法与属性
package com.fanshe.test; public class User { private int age; private String email; private String u ...
- 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...
- [B2B、B2C、C2C] 区别介绍
最近在学习建站系统的时候,偶尔我们的老大会说几个自己所不太了解的名词“简称”,所以呢?我就总结了一下,如果有不全面的地方,还请博友们多多指点! B2B B2B(也有写成BTB)是指企业对企业之间的营销 ...
- 讨伐Cucumber行为驱动
Cucumber行为驱动,简称BDD,其核心思想是把自然语言转换成代码:但在敏捷开发的过程中,这种东西极大的束缚了测试人员的手脚,感觉它像封建时代的八股文,要遵守严格的韵律,反正我个人十分反感:就像在 ...
- Ajax跨域请求解决方式
前端 jQuery方式 .ajax({ type: "POST", url: "http://xxx.com/api/test", dataType: 'jso ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- 参加2018之江杯全球人工智能大赛 :视频识别&问答(四)
很遗憾没有在规定的时间点(2018-9-25 12:00:00)完成所有的功能并上传数据,只做到写了模型代码并只跑了一轮迭代,现将代码部分贴出. import keras from keras.lay ...
- ThinkPHP自定义成功界面、失败界面、异常界面
在ThinkPHP的手册中,附录里边的配置参考,有一个模板引擎设置. 或者在手册里面的控制器,跳转和重定向里面. 紧接着,就讲到了如何自定义这些界面. 将上诉的配置参数写到到配置文件里,修改路径到自己 ...