1. 程式人生 > >機器學習與計算機視覺(darknet編譯)

機器學習與計算機視覺(darknet編譯)

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】

 

    曾經有一段時間,我自己很喜歡閱讀程式碼,但是對編譯程式碼不是很有興趣。這其實是本末倒置的做法。真正去學一門語言或者一個開源軟體,必須去實際操作、實際編譯、實際除錯才會有收穫。看了幾十行、幾百行的程式碼,但是不去編譯、不用gdb除錯一下,得到的知識總是有限的。所以,這裡也建議喜歡閱讀程式碼、但是不喜歡debug的同學可以稍微調整一下自己的習慣。

 

    相比較其他的深度學習框架,darknet比較小眾。但是darknet結構比較清晰,並且不依賴於第三方框架,可以在多個os上面編譯成功。下面,就開始進行編譯操作。

 

1、下載程式碼

git clone https://github.com/pjreddie/darknet.git

 

2、編譯

cd darknet
make

 

3、目前支援的平臺

我自己在ubuntu和mac上面均編譯成功

只是如果需要在ubuntu上面編譯成功,需要對Makefile稍作修改

-LDFLAGS= -lm -pthread 
+LDFLAGS= -lm -lpthread

 

4、不同的cpu進行編譯

4.1 用arm編譯器進行編譯

a,確保當前ubuntu中含有arm的gcc、g++編譯器,如果沒有也沒有關係,

shell> sudo apt-get install gcc-arm-linux-gnueabi
shell> sudo apt-get install g++-arm-linux-gnueabi

b,修改makefile

CC=arm-linux-gnueabi-gcc
CPP=arm-linux-gnueabi-g++

c,剩下來的事情就是直接make就可以了

 

4.2 用aarch64編譯器進行編譯

a,確保當前ubuntu中含有aarch64的gcc、g++編譯器,如果沒有也沒有關係

shell> sudo apt-get install gcc-aarch64-linux-gnu
shell> sudo apt-get install g++-aarch64-linux-gnu

b,修改makefile

CC=aarch64-linux-gnu-gcc
CPP=aarch64-linux-gnu-g++

c,後面一樣,直接make就可以了

 

5,其他編譯事項

GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0

    除了正常的編譯之外,darknet還支援5個基本選項。第一個、第二個都和GPU相關,如果自己機器有nvidia獨立顯示卡,可以看看是否可以用的起來。第三個和opencv相關,如果開啟,需要本地有opencv的庫。比如,sudo apt-get install libopencv-dev。第四個是一個加速選項,之前在x86用過,不清楚arm是否有效果,但是編譯沒有出錯。第五個就是普通的選項,可以在編譯的時候新增一些除錯資訊。

 

6、編譯的效果

    如果編譯成功,一般會在根目錄生成三個檔案,分別是libdarknet.a,libdarknet.so和darknet可執行檔案。

 

7、程式碼入口點

shell> grep "main" * -R -w
examples/darknet.c:int main(int argc, char **argv)

 

8、使用darknet

shell>$ ./darknet 

usage: ./darknet <function>

 

9、下載模型並且執行

shell>$ wget https://pjreddie.com/media/files/tiny.weights
shell>$ ./darknet classify cfg/tiny.cfg tiny.weights data/dog.jpg 
layer     filters    size              input                output
    0 conv     16  3 x 3 / 1   224 x 224 x   3   ->   224 x 224 x  16  0.043 BFLOPs
    1 max          2 x 2 / 2   224 x 224 x  16   ->   112 x 112 x  16
    2 conv     32  3 x 3 / 1   112 x 112 x  16   ->   112 x 112 x  32  0.116 BFLOPs
    3 max          2 x 2 / 2   112 x 112 x  32   ->    56 x  56 x  32
    4 conv     16  1 x 1 / 1    56 x  56 x  32   ->    56 x  56 x  16  0.003 BFLOPs
    5 conv    128  3 x 3 / 1    56 x  56 x  16   ->    56 x  56 x 128  0.116 BFLOPs
    6 conv     16  1 x 1 / 1    56 x  56 x 128   ->    56 x  56 x  16  0.013 BFLOPs
    7 conv    128  3 x 3 / 1    56 x  56 x  16   ->    56 x  56 x 128  0.116 BFLOPs
    8 max          2 x 2 / 2    56 x  56 x 128   ->    28 x  28 x 128
    9 conv     32  1 x 1 / 1    28 x  28 x 128   ->    28 x  28 x  32  0.006 BFLOPs
   10 conv    256  3 x 3 / 1    28 x  28 x  32   ->    28 x  28 x 256  0.116 BFLOPs
   11 conv     32  1 x 1 / 1    28 x  28 x 256   ->    28 x  28 x  32  0.013 BFLOPs
   12 conv    256  3 x 3 / 1    28 x  28 x  32   ->    28 x  28 x 256  0.116 BFLOPs
   13 max          2 x 2 / 2    28 x  28 x 256   ->    14 x  14 x 256
   14 conv     64  1 x 1 / 1    14 x  14 x 256   ->    14 x  14 x  64  0.006 BFLOPs
   15 conv    512  3 x 3 / 1    14 x  14 x  64   ->    14 x  14 x 512  0.116 BFLOPs
   16 conv     64  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x  64  0.013 BFLOPs
   17 conv    512  3 x 3 / 1    14 x  14 x  64   ->    14 x  14 x 512  0.116 BFLOPs
   18 conv    128  1 x 1 / 1    14 x  14 x 512   ->    14 x  14 x 128  0.026 BFLOPs
   19 conv   1000  1 x 1 / 1    14 x  14 x 128   ->    14 x  14 x1000  0.050 BFLOPs
   20 avg                       14 x  14 x1000   ->  1000
   21 softmax                                        1000
Loading weights from tiny.weights...Done!
data/dog.jpg: Predicted in 0.181403 seconds.
14.51%: malamute
 6.09%: Newfoundland
 5.59%: dogsled
 4.55%: standard schnauzer
 4.05%: Eskimo dog