當前位置:首頁 » 操作系統 » leveldb源碼

leveldb源碼

發布時間: 2023-04-18 03:48:12

1. win7配置caffe,import caffe時提示No mole named caffe

這種情況一般是沒有把caffe中的和python相關的內容的路徑添加到python的編譯路徑中。

2. 吐血整理:C++編程語言資源匯總

關於 C++ 框架、庫和資源的一些匯總列表,內容包括:標准庫、Web應用框架、人工智慧、資料庫、圖片處理、機器學習、日誌、代碼分析等。有需要的小夥伴可以收藏一下!

C++標准庫,包括了STL容器,演算法和函數等。

C++ Standard Library:是一系列類和函數的集合,使用核心語言編寫,也是C++ISO自身標準的一部分。

Standard Template Library:標准模板庫

C POSIX library : POSIX系統的C標准庫規范

ISO C++ Standards Committee :C++標准委員會


C++通用框架和庫

Apache C++ Standard Library:是一系列演算法,容器,迭代器和其他基本組件的集合

ASL :Adobe源代碼庫提供了同行的評審和可移植的C++源代碼庫。

Boost :大量通用C++庫的集合。

BDE :來自於彭博資訊實驗室的開發環境。

Cinder:提供專業品質創造性編碼的開源開發社區。

Cxxomfort:輕量級的,只包含頭文件的庫,將C++ 11的一些新特性移植到C++03中。

Dlib:使用契約式編程和現代C++ 科技 設計的通用的跨平台的C++庫。

EASTL :EA-STL公共部分

ffead-cpp :企業應用程序開發框架

Folly:由Facebook開發和使用的開源C++庫

JUCE :包羅萬象的C++類庫,用於開發跨平台軟體

libPhenom:用於構建高性能和高度可擴展性系統的事件框架。

LibSourcey :用於實時的視頻流和高性能網路應用程序的C++11 evented IO

LibU : C語言寫的多平台工具庫

Loki :C++庫的設計,包括常見的設計模式和習語的實現。

MiLi :只含頭文件的小型C++庫

openFrameworks :開發C++工具包,用於創意性編碼。

Qt :跨平台的應用程序和用戶界面框架

Reason :跨平台的框架,使開發者能夠更容易地使用Java,.Net和Python,同時也滿足了他們對C++性能和優勢的需求。

ROOT :具備所有功能的一系列面向對象的框架,能夠非常高效地處理和分析大量的數據,為歐洲原子能研究機構所用。

STLport:是STL具有代表性的版本

STXXL:用於額外的大型數據集的標准模板庫。

Ultimate++ :C++跨平台快速應用程序開發框架

Windows Template Library:用於開發Windows應用程序和UI組件的C++庫

Yomm11 :C++11的開放multi-methods.


btsk : 游戲 行為樹啟動器工具

Evolving Objects:基於模板的,ANSI C++演化計算庫,能夠幫助你非常快速地編寫出自己的隨機優化演算法。

Neu:C++11框架,編程語言集,用於創建人工智慧應用程序的多用途軟體系統。


Boost.Asio:用於網路和底層I/O編程的跨平台的C++庫。

libev :功能齊全,高性能的時間循環,輕微地仿效libevent,但是不再像libevent一樣有局限性,也修復了它的一些bug。

libevent :事件通知庫

libuv :跨平台非同步I/O。


音頻,聲音,音樂,數字化音樂庫

FMOD :易於使用的跨平台的音頻引擎和音頻內容的 游戲 創作工具。

Maximilian :C++音頻和音樂數字信號處理庫

OpenAL :開源音頻庫—跨平台的音頻API

Opus:一個完全開放的,免版稅的,高度通用的音頻編解碼器

Speex:免費編解碼器,為Opus所廢棄

Tonic: C++易用和高效的音頻合成

Vorbis: Ogg Vorbis是一種完全開放的,非專有的,免版稅的通用壓縮音頻格式。


生物信息,基因組學和生物技術

libsequence:用於表示和分析群體遺傳學數據的C++庫。

SeqAn:專注於生物數據序列分析的演算法和數據結構。

Vcflib :用於解析和處理VCF文件的C++庫

Wham:直接把聯想測試應用到BAM文件的基因結構變異。


壓縮和歸檔庫

bzip2:一個完全免費,免費專利和高質量的數據壓縮

doboz:能夠快速解壓縮的壓縮庫

PhysicsFS:對各種歸檔提供抽象訪問的庫,主要用於視頻 游戲 ,設計靈感部分來自於Quake3的文件子系統。

KArchive:用於創建,讀寫和操作文件檔案(例如zip和 tar)的庫,它通過QIODevice的一系列子類,使用gzip格式,提供了透明的壓縮和解壓縮的數據。

LZ4 :非常快速的壓縮演算法

LZHAM :無損壓縮資料庫,壓縮比率跟LZMA接近,但是解壓縮速度卻要快得多。

LZMA :7z格式默認和通用的壓縮方法。

LZMAT :及其快速的實時無損數據壓縮庫

miniz:單一的C源文件,緊縮/膨脹壓縮庫,使用zlib兼容API,ZIP歸檔讀寫,PNG寫方式。

Minizip:Zlib最新bug修復,支持PKWARE磁碟跨越,AES加密和IO緩沖。

Snappy :快速壓縮和解壓縮

ZLib :非常緊湊的數據流壓縮庫

ZZIPlib:提供ZIP歸檔的讀許可權。


並發執行和多線程

Boost.Compute :用於OpenCL的C++GPU計算庫

Bolt :針對GPU進行優化的C++模板庫

C++React :用於C++11的反應性編程庫

Intel TBB :Intel線程構件塊

Libclsph:基於OpenCL的GPU加速SPH流體模擬庫

OpenCL :並行編程的異構系統的開放標准

OpenMP:OpenMP API

Thrust :類似於C++標准模板庫的並行演算法庫

HPX :用於任何規模的並行和分布式應用程序的通用C++運行時系統

VexCL :用於OpenCL/CUDA 的C++向量表達式模板庫。


C++ B-tree :基於B樹數據結構,實現命令內存容器的模板庫

Hashmaps: C++中開放定址哈希表演算法的實現


Bcrypt :一個跨平台的文件加密工具,加密文件可以移植到所有可支持的操作系統和處理器中。

BeeCrypt:

Botan: C++加密庫

Crypto++:一個有關加密方案的免費的C++庫

GnuPG: OpenPGP標準的完整實現

GnuTLS :實現了SSL,TLS和DTLS協議的安全通信庫

Libgcrypt

libmcrypt

LibreSSL:免費的SSL/TLS協議,屬於2014 OpenSSL的一個分支

LibTomCrypt:一個非常全面的,模塊化的,可移植的加密工具

libsodium:基於NaCI的加密庫,固執己見,容易使用

Nettle 底層的加密庫

OpenSSL : 一個強大的,商用的,功能齊全的,開放源代碼的加密庫。

Tiny AES128 in C :用C實現的一個小巧,可移植的實現了AES128ESB的加密演算法


資料庫,sql伺服器,ODBC驅動程序和工具

hiberlite :用於Sqlite3的C++對象關系映射

Hiredis: 用於Redis資料庫的很簡單的C客戶端庫

LevelDB: 快速鍵值存儲

LMDB:符合資料庫四大基本元素的嵌入鍵值存儲

MySQL++:封裝了MySql的C API的C++ 包裝器

RocksDB:來自Facebook的嵌入鍵值的快速存儲

SQLite:一個完全嵌入式的,功能齊全的關系資料庫,只有幾百KB,可以正確包含到你的項目中。


調試庫, 內存和資源泄露檢測,單元測試

Boost.Test:Boost測試庫

Catch:一個很 時尚 的,C++原生的框架,只包含頭文件,用於單元測試,測試驅動開發和行為驅動開發。

CppUnit:由JUnit移植過來的C++測試框架

CTest:CMake測試驅動程序

googletest:谷歌C++測試框架

ig-debugheap:用於跟蹤內存錯誤的多平台調試堆

libtap:用C語言編寫測試

MemTrack —用於C++跟蹤內存分配

microprofile- 跨平台的網路試圖分析器

minUnit :使用C寫的迷你單元測試框架,只使用了兩個宏

Remotery:用於web視圖的單一C文件分析器

UnitTest++:輕量級的C++單元測試框架


Cocos2d-x :一個跨平台框架,用於構建2D 游戲 ,互動圖書,演示和其他圖形應用程序。

Grit :社區項目,用於構建一個免費的 游戲 引擎,實現開放的世界3D 游戲 。

Irrlicht :C++語言編寫的開源高性能的實時#D引擎

Polycode:C++實現的用於創建 游戲 的開源框架(與Lua綁定)。


CEGUI : 很靈活的跨平台GUI庫

FLTK :快速,輕量級的跨平台的C++GUI工具包。

GTK+: 用於創建圖形用戶界面的跨平台工具包

gtkmm :用於受歡迎的GUI庫GTK+的官方C++介面。

imgui:擁有最小依賴關系的立即模式圖形用戶界面

libRocket :libRocket 是一個C++ HTML/CSS 游戲 介面中間件

MyGUI :快速,靈活,簡單的GUI

Ncurses:終端用戶界面

QCustomPlot :沒有更多依賴關系的Qt繪圖控制項

Qwt :用戶與技術應用的Qt 控制項

QwtPlot3D :功能豐富的基於Qt/OpenGL的C++編程庫,本質上提供了一群3D控制項

OtterUI :OtterUI 是用於嵌入式系統和互動 娛樂 軟體的用戶界面開發解決方案

PDCurses 包含源代碼和預編譯庫的公共圖形函數庫

wxWidgets C++庫,允許開發人員使用一個代碼庫可以為widows, Mac OS X,Linux和其他平台創建應用程序


bgfx:跨平台的渲染庫

Cairo:支持多種輸出設備的2D圖形庫

Horde3D 一個小型的3D渲染和動畫引擎

magnum C++11和OpenGL 2D/3D 圖形引擎

Ogre 3D 用C++編寫的一個面向場景,實時,靈活的3D渲染引擎(並非 游戲 引擎)

OpenSceneGraph 具有高性能的開源3D圖形工具包

Panda3D 用於3D渲染和 游戲 開發的框架,用Python和C++編寫。

Skia 用於繪制文字,圖形和圖像的完整的2D圖形庫

urho3d 跨平台的渲染和 游戲 引擎。


Boost.GIL:通用圖像庫

CImg :用於圖像處理的小型開源C++工具包

CxImage :用於載入,保存,顯示和轉換的圖像處理和轉換庫,可以處理的圖片格式包括 BMP, JPEG, GIF, PNG, TIFF, MNG, ICO, PCX, TGA, WMF, WBMP, JBG, J2K。

FreeImage :開源庫,支持現在多媒體應用所需的通用圖片格式和其他格式。

GDCM:Grassroots DICOM 庫

ITK:跨平台的開源圖像分析系統

Magick++:ImageMagick程序的C++介面

MagickWnd:ImageMagick程序的C++介面

OpenCV : 開源計算機視覺類庫

tesseract-ocr:OCR引擎

VIGRA :用於圖像分析通用C++計算機視覺庫

VTK :用於3D計算機圖形學,圖像處理和可視化的開源免費軟體系統。

最後, 對於學習編程或者在工作想升職的程序員兄弟,如果你想更好的提升你的編程能力幫助你提升水平! 筆者這里或許可以幫到你~

編程學習書籍分享:

編程學習視頻分享:

分享(源碼、項目實戰視頻、項目筆記,基礎入門教程)

歡迎轉行和學習編程的夥伴,利用更多的資料學習成長比自己琢磨更快哦!

3. 如何解決使用glog和gflags時遇到的錯誤

錯誤是這樣的:

/usr/local/lib/libgflags.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status
glog是通過下面方式搏攜安裝畢銀者的:
sudo apt-get install build-essential
sudo apt-get install vim cmake git
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
在上面的安裝中同時安裝了gflags,不僅如此,我還在git上下載了gflags的源碼也進行了安裝。
解決方法:
我對下載的gflags源碼進行編譯,在cmake時候加入了expor CXXFLAGS="-fPIC"、make VERBOSE=1就可以正常使用gflags和glog了。手薯
即:
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install

4. 四大開源資料庫是哪些

開源世界中的那幾個免費資料庫
發布時間:2011-11-22 09:34:30 來源:CSDN 評論:0 點擊:1476 次 【字型大小:大 中 小】
QQ空間 新浪微博 騰訊微博 人人網 豆瓣網 網路空間 網路搜藏 開心網 復制 更多 0
開源資料庫MySQLMySQL是一個開放源碼的小型關聯式資料庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。由於其體積小、速度快、總體擁有成本低,尤其是開放源...

開源資料庫MySQL

MySQL是一個開放源碼的小型關聯式資料庫管理系統,開發者為瑞典MySQL AB公司。目前MySQL被廣泛地應用在Internet上的中小型網站中。由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網站為了降低網站總體擁有成本而選擇了MySQL作為網站資料庫。


盤點:開源社區那些免費的資料庫軟體

MySQL為多種編程語言提供了API,包括C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。而其自身是採用C和C++編寫的,使用了多種編譯器進行測試,所以,MySQL能夠保證源代碼具有很強的可移植性。這樣的一款資料庫,自然能夠支持幾乎所有的操作系統,從Unix、Linux到Windows,具體包括AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、NetBSD、OpenBSD、OS/2 Wrap、Solaris、SunOS、Windows等多種操作系統。最重要的是,它是一個可以處理擁有上千萬條記錄的大型資料庫。

與此同時,MySQL也產生了很多分支版本的資料庫也非常值得推薦。

首先是MariaDB,它是一個採用Maria存儲引擎的MySQL分支版本,是由原來MySQL的作者 Michael Widenius創辦的公司所開發的免費開源的資料庫伺服器。與MySQL相比較,MariaDB更強的地方在於它擁有更多的引擎,包括Maria存儲引擎、PBXT存儲引擎、XtraDB存儲引擎、FederatedX存儲引擎,它能夠更快的復制查詢處理、運行的速度更快、更好的功能測試以及支持對Unicode的排序等。

其次是rcona,它為MySQL資料庫伺服器進行了改進,在功能和性能上較MySQL有著很顯著的提升。該版本提升了在高負載情況下的InnoDB的性能,同時,它還為DBA提供一些非常有用的性能診斷工具,並且提供很多參數和命令來控制伺服器行為。

第三是Percona Server,它使用了諸如google-mysql-tools、Proven Scaling和 Open Query對MySQL進行改造。並且,它只包含MySQL的伺服器版,並沒有提供相應對 MySQL的Connector和GUI工具進行改進。

非關系型資料庫NoSQL

從NoSQL的字面上理解,NoSQL就是Not Only SQL,被業界認為是一項全新的資料庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關系型的數據存儲,相對於目前鋪天蓋地的關系型資料庫運用,這一概念無疑是一種全新的思維的注入。


盤點:開源社區那些免費的資料庫軟體

當然,NoSQL也是隨著互聯網Web2.0網站的興起才能取得長足的進步。關鍵的需求在於,傳統的關系資料庫在應付Web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站顯得力不從心,暴露了很多難以克服的問題,而非關系型的資料庫則由於其本身的特點得到了非常迅速的發展。

首先推薦的是Oracle NoSQL Database,這是一個社區版。Oracle的這個NoSQL Database, 是在10月4號的甲骨文全球大全上發布的Big Data Appliance的其中一個組件,Big Data Appliance是一個集成了Hadoop、NoSQL Database、Oracle資料庫Hadoop適配器、Oracle資料庫Hadoop裝載器及R語言的系統。

其次推薦的是Membase。Membase是NoSQL家族的一個新的重量級的成員。Membase是開源項目,源代碼採用了Apache2.0的使用許可。該項目託管在GitHub.Source tarballs上,目前可以下載beta版本的Linux二進制包。該產品主要是由North Scale的memcached核心團隊成員開發完成,其中還包括Zynga和NHN這兩個主要貢獻者的工程師,這兩個組織都是很大的在線游戲和社區網路空間的供應商。

並且,Membase容易安裝、操作,可以從單節點方便的擴展到集群,而且為memcached(有線協議的兼容性)實現了即插即用功能,在應用方面為開 發者和經營者提供了一個比較低的門檻。做為緩存解決方案,Memcached已經在不同類型的領域(特別是大容量的Web應用)有了廣泛的使用,其中 Memcached的部分基礎代碼被直接應用到了Membase伺服器的前端。通過兼容多種編程語言和框架,Membase具備了很好的復用性。在安裝和配置方面,Membase提供了有效的圖形化界面和編程介面,包括可配置 的告警信息。

Membase的目標是提供對外的線性擴展能力,包括為了增加集群容量,可以針對統一的節點進行復制。 另外,對存儲的數據進行再分配仍然是必要的。

第三推薦的是Hibari。Hibari在日語中意思為「雲雀」,它是一個專為高可靠性和大數據存儲的資料庫引擎,可用於雲計算環境中,例如 webmail、SNS和其他要求T/P級數據存儲的環境中。同時,Hibari也支持Java,C/C++,Python,Ruby和Erlang語言的客戶端。

第四推薦的是memcachedb。這是一個由新浪網的開發人員開放出來的開源項目,給memcached分布式緩存伺服器添加了Berkeley DB的持久化存儲機制和非同步主輔復制機制,讓memcached具備了事務恢復能力、持久化能力和分布式復制能力,非常適合於需要超高性能讀寫速度,但是 不需要嚴格事務約束,能夠被持久化保存的應用場景,例如memcachedb被應用在新浪博客上面。

第五推薦的是Leveldb。這是一個Google實現的非常高效的kv資料庫,目前的版本1.2能夠支持billion級別的數據量了。 在這個數量級別下還有著非常高的性能,主要歸功於它的良好的設計,特別是LSM演算法。LevelDB是單進程的服務,性能非常之高,在一台4個Q6600的CPU機器上,每秒鍾寫數據超過40w,而隨機讀的性能每秒鍾超過10w。

XML資料庫的優勢

XML資料庫是一種支持對XML格式文檔進行存儲和查詢等操作的數據管理系統。在系統中,開發人員可以對資料庫中的XML文檔進行查詢、導出和指定格式的序列化。目前XML資料庫有三種類型:XMLEnabledDatabase(XEDB),即能處理XML的資料庫;NativeXMLDatabase(NXD),即純XML資料庫;HybridXMLDatabase(HXD),即混合XML資料庫。

關系資料庫中的第一代XML支持是切分(或分解)文檔,以適應關系表格或將文檔原封不動地存儲為字元或二進制大對象(CLOB 或 BLOB)。這兩個方法中的任一種都嘗試將XML模型強制轉換成關系模型。然而,這兩種方法在功能和性能上都有很大的局限性。混合型模型將XML存儲在類似於DOM的模型中。XML數據被格式化為緩沖數據頁,以便快速導航和執行查詢以及簡化索引編制。

在這里,首要要推薦的XML資料庫是Sedna。它號稱是一款原生態的XML資料庫,提供了全功能的核心資料庫服務,包括持久化存儲、ACID事務、索引、安全、熱備、UTF8等。實現了 W3C XQuery 規范,支持全文搜索以及節點級別的更新操作。

第二款XML資料庫是BaseX。這款資料庫用來存儲緊縮的XML數據,提供了高效的 XPath和XQuery的實現,同時,它還提供一個前端操作界面。


盤點:開源社區那些免費的資料庫軟體

第三款推薦的是XMLDB。這款資料庫使用了關系型資料庫來存儲任意的XML文檔,因為所採用的存儲機制,所以文檔的搜索速度特別快,同時執行XSL轉換也相當快。XMLDB同時還提供了一個PHP的模塊,可以應用在Web應用中。

第四塊推薦的是X-Hive/DB。它是一個為需要高級XML數據處理和存儲功能的軟體開發者設計的強大的專屬XML資料庫。X-Hive/DB Java API包含存儲、查詢、檢索、轉換和發表XML數據的方法。

與傳統關系型資料庫相比,XML資料庫具有以下優勢:第一,XML資料庫能夠對半結構化數據進行有效的存取和管理。如網頁內容就是一種半結構化數據,而傳統的關系資料庫對於類似網頁內容這類半結構化數據無法進行有效的管理。第二,提供對標簽和路徑的操作。傳統資料庫語言允許對數據元素的值進行操作,不能對元素名稱操作,半結構化資料庫提供了對標簽名稱的操作,還包括了對路徑的操作。第三,當數據本身具有層次特徵時,由於XML數據格式能夠清晰表達數據的層次特徵,因此XML資料庫便於對層次化的數據進行操作。XML資料庫適合管理復雜數據結構的數據集,如果己經以XML格式存儲信息,則XML資料庫利於文檔存儲和檢索;可以用方便實用的方式檢索文檔,並能夠提供高質量的全文搜索引擎。另外XML資料庫能夠存儲和查詢異種的文檔結構,提供對異種信息存取的支持。

5. 如何在程序中調用Caffe做圖像分類,調用caffe圖像分類

Caffe是目前深度學習比較優秀好用的一個開源庫,采樣c++和CUDA實現,具有速度快,模型定義方便等優點。學習了幾天過後,發現也有一個不方便的地方,就是在我的程序中調用Caffe做圖像分類沒有直接的介面。Caffe的數據層可以從資料庫(支持leveldb、lmdb、hdf5)、圖片、和內存中讀入。我們要在程序中使用,當然得從內存中讀入,我們首先在模型定義文件中定義數據層:
layers {
name: "mydata"
type: MEMORY_DATA
top: "data"
top: "label"
transform_param {
scale: 0.00390625
}
memory_data_param {
batch_size: 10
channels: 1
height: 24
width: 24
}
}

這里必須設置memory_data_param中的四個參數,對應這些參數可以參見源碼中caffe.proto文件。現在,我們可以設計一個Classifier類來封裝一下:
#ifndef CAFFE_CLASSIFIER_H
#define CAFFE_CLASSIFIER_H

#include <string>
#include <vector>
#include "caffe/net.hpp"
#include "caffe/data_layers.hpp"
#include <opencv2/core.hpp>
using cv::Mat;

namespace caffe {

template <typename Dtype>
class Classifier {
public:
explicit Classifier(const string& param_file, const string& weights_file);
Dtype test(vector<Mat> &images, vector<int> &labels, int iter_num);
virtual ~Classifier() {}
inline shared_ptr<Net<Dtype> > net() { return net_; }
void predict(vector<Mat> &images, vector<int> *labels);
void predict(vector<Dtype> &data, vector<int> *labels, int num);
void extract_feature(vector<Mat> &images, vector<vector<Dtype>> *out);

protected:
shared_ptr<Net<Dtype> > net_;
MemoryDataLayer<Dtype> *m_layer_;
int batch_size_;
int channels_;
int height_;
int width_;

DISABLE_COPY_AND_ASSIGN(Classifier);
};
}//namespace
#endif //CAFFE_CLASSIFIER_H

構造函數中我們通過模型定義文件(.prototxt)和訓練好的模型(.caffemodel)文件構造一個Net對象,並用m_layer_指向Net中的memory data層,以便待會調用MemoryDataLayer中AddMatVector和Reset函數加入數據。
#include <cstdio>

#include <algorithm>
#include <string>
#include <vector>

#include "caffe/net.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/util/io.hpp"
#include "caffe/util/math_functions.hpp"
#include "caffe/util/upgrade_proto.hpp"
#include "caffe_classifier.h"

namespace caffe {

template <typename Dtype>
Classifier<Dtype>::Classifier(const string& param_file, const string& weights_file) : net_()
{
net_.reset(new Net<Dtype>(param_file, TEST));
net_->CopyTrainedLayersFrom(weights_file);
//m_layer_ = (MemoryDataLayer<Dtype>*)net_->layer_by_name("mnist").get();
m_layer_ = (MemoryDataLayer<Dtype>*)net_->layers()[0].get();
batch_size_ = m_layer_->batch_size();
channels_ = m_layer_->channels();
height_ = m_layer_->height();
width_ = m_layer_->width();
}

template <typename Dtype>
Dtype Classifier<Dtype>::test(vector<Mat> &images, vector<int> &labels, int iter_num)
{
m_layer_->AddMatVector(images, labels);
//
int iterations = iter_num;
vector<Blob<Dtype>* > bottom_vec;

vector<int> test_score_output_id;
vector<Dtype> test_score;
Dtype loss = 0;
for (int i = 0; i < iterations; ++i) {
Dtype iter_loss;
const vector<Blob<Dtype>*>& result =
net_->Forward(bottom_vec, &iter_loss);
loss += iter_loss;
int idx = 0;
for (int j = 0; j < result.size(); ++j) {
const Dtype* result_vec = result[j]->cpu_data();
for (int k = 0; k < result[j]->count(); ++k, ++idx) {
const Dtype score = result_vec[k];
if (i == 0) {
test_score.push_back(score);
test_score_output_id.push_back(j);
} else {
test_score[idx] += score;
}
const std::string& output_name = net_->blob_names()[
net_->output_blob_indices()[j]];
LOG(INFO) << "Batch " << i << ", " << output_name << " = " << score;
}
}
}
loss /= iterations;
LOG(INFO) << "Loss: " << loss;
return loss;
}

template <typename Dtype>
void Classifier<Dtype>::predict(vector<Mat> &images, vector<int> *labels)
{
int original_length = images.size();
if(original_length == 0)
return;
int valid_length = original_length / batch_size_ * batch_size_;
if(original_length != valid_length)
{
valid_length += batch_size_;
for(int i = original_length; i < valid_length; i++)
{
images.push_back(images[0].clone());
}
}
vector<int> valid_labels, predicted_labels;
valid_labels.resize(valid_length, 0);
m_layer_->AddMatVector(images, valid_labels);
vector<Blob<Dtype>* > bottom_vec;
for(int i = 0; i < valid_length / batch_size_; i++)
{
const vector<Blob<Dtype>*>& result = net_->Forward(bottom_vec);
const Dtype * result_vec = result[1]->cpu_data();
for(int j = 0; j < result[1]->count(); j++)
{
predicted_labels.push_back(result_vec[j]);
}
}
if(original_length != valid_length)
{
images.erase(images.begin()+original_length, images.end());
}
labels->resize(original_length, 0);
std::(predicted_labels.begin(), predicted_labels.begin() + original_length, labels->begin());
}

template <typename Dtype>
void Classifier<Dtype>::predict(vector<Dtype> &data, vector<int> *labels, int num)
{
int size = channels_*height_*width_;
CHECK_EQ(data.size(), num*size);
int original_length = num;
if(original_length == 0)
return;
int valid_length = original_length / batch_size_ * batch_size_;
if(original_length != valid_length)
{
valid_length += batch_size_;
for(int i = original_length; i < valid_length; i++)
{
for(int j = 0; j < size; j++)
data.push_back(0);
}
}
vector<int> predicted_labels;
Dtype * label_ = new Dtype[valid_length];
memset(label_, 0, valid_length);
m_layer_->Reset(data.data(), label_, valid_length);
vector<Blob<Dtype>* > bottom_vec;
for(int i = 0; i < valid_length / batch_size_; i++)
{
const vector<Blob<Dtype>*>& result = net_->Forward(bottom_vec);
const Dtype * result_vec = result[1]->cpu_data();
for(int j = 0; j < result[1]->count(); j++)
{
predicted_labels.push_back(result_vec[j]);
}
}
if(original_length != valid_length)
{
data.erase(data.begin()+original_length*size, data.end());
}
delete [] label_;
labels->resize(original_length, 0);
std::(predicted_labels.begin(), predicted_labels.begin() + original_length, labels->begin());
}
template <typename Dtype>
void Classifier<Dtype>::extract_feature(vector<Mat> &images, vector<vector<Dtype>> *out)
{
int original_length = images.size();
if(original_length == 0)
return;
int valid_length = original_length / batch_size_ * batch_size_;
if(original_length != valid_length)
{
valid_length += batch_size_;
for(int i = original_length; i < valid_length; i++)
{
images.push_back(images[0].clone());
}
}
vector<int> valid_labels;
valid_labels.resize(valid_length, 0);
m_layer_->AddMatVector(images, valid_labels);
vector<Blob<Dtype>* > bottom_vec;
out->clear();
for(int i = 0; i < valid_length / batch_size_; i++)
{
const vector<Blob<Dtype>*>& result = net_->Forward(bottom_vec);
const Dtype * result_vec = result[0]->cpu_data();
const int dim = result[0]->count(1);
for(int j = 0; j < result[0]->num(); j++)
{
const Dtype * ptr = result_vec + j * dim;
vector<Dtype> one_;
for(int k = 0; k < dim; ++k)
one_.push_back(ptr[k]);
out->push_back(one_);
}
}
if(original_length != valid_length)
{
images.erase(images.begin()+original_length, images.end());
out->erase(out->begin()+original_length, out->end());
}
}
INSTANTIATE_CLASS(Classifier);
} // namespace caffe

由於加入的數據個數必須是batch_size的整數倍,所以我們在加入數據時採用填充的方式。
CHECK_EQ(num % batch_size_, 0) <<
"The added data must be a multiple of the batch size."; //AddMatVector

在模型文件的最後,我們把訓練時的loss層改為argmax層:
layers {
name: "predicted"
type: ARGMAX
bottom: "prob"
top: "predicted"
}

6. caffe windows10 vs2013怎麼配置

1.配置環境
我在自己的筆記本配置的caffe,配置的環境為:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假設在配置caffe之前,你已經准備好這些。
本文中將給出一些編譯好的依賴庫,如果你也是用的Windows 7 64位+VS2013,可以直接使用。
2.准備依賴庫
在Windows下配置caffe,一個很主要的問題就是依賴庫的編譯。不像在Ubuntu下那麼方便,在Windows下,依賴庫都需要使用vs2013進行編譯才能使用。下面我將介紹caffe需要的依賴庫(如果你也是win7 64位+VS2013,可以直接使用我提供的依賴庫)。
2.1 boost
boost可以下載源碼進行編譯,也可以直接下載安裝文件。我使用的是後者,方便、快捷。
我使用的是:boost_1.56_0-msvc-12.0-64.exe
注意下載適合你的配置環境的boost版本即可。
下載完畢,雙擊運行安裝文件即可。
2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
這一部分的很多都是谷歌的開源庫,不容易下載(你懂的)。所以我使用的是Neil Z. SHAO『s Blog
提供的編譯好的。
下載完,解壓得到3rdparty文件夾。在下一段將會用到。
3.建立caffe工程
准備好了caffe需要的依賴庫和環境之後,下面就可以建立caffe的vs項目,進行編譯了。
3.1 下載caffe源碼
可以從caffe的github主頁下載源碼。
下載地址:Caffe』s GitHub
解壓文件,假設caffe源碼所在目錄為CAFFE_ROOT。
3.2 准備項目需要的依賴庫和系統環境變數
經過上一階段的准備,caffe項目所需的依賴庫都已經准備好。
1.首先設置系統環境變數(以我的為例):
CUDA_PATH_V6_5 安裝好cuda6.5之後,會自動添加環境變數CUDA_PATH_V6_5
OPENCV_2_49 D:/Tools/opencv2.49/build/
BOOST_1_56 D:/Tools/boost_1_56_0
2.將3rdparty文件夾放到CAFFE_ROOT
3.3 用vs建立caffe項目
1.用VS2013在CAFFE_ROOT下建立 win32 console application,選擇空項目。
將項目的平台由32位改為64位
2.修改項目屬性
項目——屬性——C/C++——常規——附加包含目錄
添加:
../include;
../src;
../3rdparty/include;
../3rdparty;
../3rdparty/include;
../3rdparty/include/openblas;
../3rdparty/include/hdf5;
../3rdparty/include/lmdb;
../3rdparty/include/leveldb;
../3rdparty/include/gflag;
../3rdparty/include/glog;
../3rdparty/include/google/protobuf;
項目——屬相——VC++目錄——包含目錄
添加:
$(CUDA_PATH_V6_5)\include;
$(OPENCV_2_49)\include;
$(OPENCV_2_49)\include\opencv;
$(OPENCV_2_49)\include\opencv2;
$(BOOST_1_56)
項目——屬性——鏈接器——常規——附加庫目錄
添加:
$(CUDA_PATH_V6_5)\lib\$(PlatformName);
$(OPENCV_2_49)\x64\vc12\lib;
$(BOOST_1_56)\lib64-msvc-12.0;
..\3rdparty\lib;
項目——屬性——鏈接器——輸入——附加依賴項
debug添加:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
release添加:
opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
3.4 編譯caffe
配置好caffe項目的屬性之後,下面就可以一步一步的編譯caffe了。
3.4.1 編譯./src中的文件
首先,將../src文件夾中的*.cpp文件添加到工程中。

依次編譯每一個*.cpp文件。
1.編譯blob.cpp
直接編譯時會報錯,缺少文件」caffe\proto\caffe.pb.h」
這個時候需要將proto.exe放到../3rdparty/bin文件夾
將GernaratePB.bat放在../scripts文件夾

運行bat腳本文件即可生成caffe.pb.h
然後就可以成功編譯。
2.編譯common.cpp
直接編譯這個文件,會出現關於getid和fopen_s的錯誤。可通過如下步驟修改:
在代碼前面添加:#include <process.h>
修改項目屬性:項目——屬性——C/C++——預處理器——預處理器定義
添加:_CRT_SECURE_NO_WARNINGS
在代碼中getid的位置進行如下修改:
#ifdef _MSC_VER
pid = getid();
#else
pid = _getid();
#endf
修改完畢之後,可以成功編譯。
3.編譯net.cpp
直接編譯這個文件,會出現關於mkstep、close、mkdtemp的錯誤。需要進行如下修改:
在io.hpp頭文件中添加:#include 「mkstep.h」
在io.hpp頭文件中,在close()的位置進行如下修改:
#ifdef _MSC_VER
close(fd);
#else
_close(fd);
#endif
在mkdtemp的位置進行如下修改:
#ifndef _MSC_VER
char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
#else
errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
#endif
修改完畢,可以成功編譯。
4.編譯solver.cpp
直接編譯會出現關於snprintf的錯誤,需要進行如下修改:
#ifdef _MSC_VER
#define snprinf sprintf_s
#endif
修改完畢,可以成功編譯。
5.其他剩餘的cpp文件也依次編譯
3.4.2 編譯./src/layers中的文件
將./src/layers中的所有的cpp和cu文件都添加到項目中。

右鍵點擊cu文件,修改屬性。

在bnll_layer.cu文件,進行如下修改:
float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0
依次編譯所有的文件。
3.4.3 編譯./src/util中的文件
將./src/util中所有的文件添加到項目

1.在io.cpp中
修改ReadProtoFromBinaryFile函數
O_RDONLY ——> O_RDONLY | O_BINARY
在代碼中進行如下修改:
#ifdef _MSC_VER
#define open _open
#endif
將close()改為_close()
2.在math_functions.cpp中
做如下修改:
#define __builtin_popcount __popcnt
#define __builtin_popcountl __popcnt
3.在db.cpp中
作如下修改:
#ifdef _MSC_VER
#include <direct.h>
#endif
修改CHECK_EQ
#ifdef _MSC_VER
CHECK_EQ(_mkdir(source.c_str()),0)<<」mkdir」<<source<<」failed」;
#else
CHECK_EQ(mkdir(source.c_str(),0744),0)<<」mkidr」<<source<<」failed」;
#endif
4.依次編譯其他文件
3.4.4 編譯./src/proto中的文件
參照上一步,將proto中的文件都添加到項目。
修改屬性:
項目——屬性——C/C++——預處理器——預處理器定義
添加:_SCL_SECURE_NO_WARNINGS
編譯所有文件。
3.4.5 編譯./tools中的文件
本文件夾下有多個cpp文件,通過它們的名字就可以知道相應的功能。添加不同的cpp文件到項目中,然後生成項目,就可以得到不同功能的exe文件。
將caffe.cpp添加到工程,生成項目,得到caffe.exe文件,可用於訓練模型
將computer_image_mean.cpp添加到工程,生成項目,得到的exe文件可用於將訓練樣本轉換為caffe使用的leveldb/lmdb數據集。
依次類推。
自此,caffe在Windows下的編譯已經完畢,接下來就可以使用它來訓練自己的模型了。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:333
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:374
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:609
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:30
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:105
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:940
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:736
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:800
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:507
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:369