Bag of Words cpp实现(stable version 0.01)
致謝:基礎框架來源BoW,開發版本在此基礎上進行,已在Ubuntu、OS X上測試通過,Windows需要支持c++11的編譯器(VS2012及其以上)。
使用
代碼下載地址:bag-of-words-stable-version,這個是穩定版,上層目錄里的開發版不要下載,那是我添加測試新模塊所用的。
編譯
修改Makefile文件,如果你的系統支持多線程技術,將
CFLAGS = -std=c++11修改為
CFLAGS = -std=c++11 -fopenMP # if openMP accesses, using this修改完上面后,再修改編譯所需的OpenCV和cppsugar,即
INCPATH = -I/usr/local/include -I/Users/willard/codes/cpp/opencv-computer-vision/cpp/BoVW/cppsugar LIBPATH = -L/usr/local/lib/usr/local/include和/usr/local/lib分別是OpenCV所在的包含頭文件目錄路徑和庫目錄路徑,修改為你本機所在的目錄即可。后面的cppsugar目錄同樣換成你本機的目錄。 修改。這些修改完成后,執行下面命令進行編譯:
make編譯后即可在所在目錄生成可執行文件。
生成圖庫列表文件
對于待檢索的圖像庫imagesDataSet,執行下面命令
python imgNamesToTXT.py -t /Users/willard/Pictures/imagesDataSet上面執行后生成一個imageNamesList.txt的文件,該文件中包含的是每幅圖像的路徑及其圖像文件名。
建立索引
執行下面命令,會完成特征提取、生成詞典、量化生成bag of word向量:
./index imageNamesList.txt上面命令執行玩,會生成兩個文件bows.dat和dict.dat,分別存放的是圖像庫每幅圖像的bag of word向量以及詞典。
查詢圖像
按下面命令進行查詢
./search /Users/willard/Pictures/first1000/ukbench00499.jpg imageNamesList.txt其中/Users/willard/Pictures/first1000/ukbench00499.jpg是查詢圖像,執行完后,會生成一個result.html的文件,應為要顯示檢索結果,所以這里采用的是用html頁面的方式顯示檢索結果的,用瀏覽器打開即可。
批量測試
為了評價檢索的效果,可以使用ukbenchScores.cpp計算在ukbench圖像庫上的NS score(NS分數),下面是在ukbench1000張圖像上計算的NS score:
Ukbench?first 1000 images, the NS-scores: 3.358, with tf*idf and histogram intersection kernel distance.
Ukbench?first 1000 images, the NS-scores: 3.602, with tf and histogram intersection kernel distance.
Bag of words原理
關于bag of words的原理,可以查閱我的博文BoW圖像檢索Python實戰和Bag of Words模型。注意,該框架中采用的相似性度量方式是直方圖相交(histogram intersection kernel)的方法,測試發現直方圖相交的方法要比用余弦距離度量的方式效果更好,但計算速度較慢。
開發版本bag-of-words-dev-version中加入了逆文檔詞頻以及RANSAC重排,待效果達到預期后,會添加到穩定版中。
This is a test for?\KaTeXKATEX,?a^2 + b^2 = c^2a?2??+b?2??=c?2??, if you want it in display style, try:\text{e} = \lim_{n\to\infty} \left(1+\frac{1}{n}\right)^n,e=?n→∞?lim??(1+?n??1??)?n??,and\pi = \lim_{k=0}^\infty \, \frac{1}{16^k} \left( \frac{4}{8k+1} - \frac{2}{8k+4} - \frac{1}{8k+5} - \frac{1}{8k+6} \right).π=?k=0?lim?∞???16?k????1??(?8k+1??4????8k+4??2????8k+5??1????8k+6??1??).
c = \pm\sqrt{a^2 + b^2}c=±√?a?2??+b?2?????
e^x = \lim_{n\rightarrow \infty} \sum_{t=0}^{n} ( \frac{1}{t!}\cdot x^t )= \sum_{t=0}^{\infty} (1 + x + \frac{1}{2!}x^2+\frac{1}{3!}x^3+ ... + \frac{1}{t!}\cdot x^t)e?x??=?n→∞?lim???t=0?∑?n??(?t!??1???x?t??)=?t=0?∑?∞??(1+x+?2!??1??x?2??+?3!??1??x?3??+...+?t!??1???x?t??)
from:?http://yongyuan.name/blog/bag-of-words-cpp-implement.html
總結
以上是生活随笔為你收集整理的Bag of Words cpp实现(stable version 0.01)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIFT(ASIFT) Matching
- 下一篇: VLFeat SLIC超像素分割(Cpp