1. 程式人生 > >Ubuntu下YOLOv3代碼運行

Ubuntu下YOLOv3代碼運行

下使用 NPU turn jpg 是我 默認 電腦 https cal

YOLO是近幾年物體檢測主要算法之一,2018年已發展到YOLOv3,是目前速度最快的物體檢測算法,詳細內容可查看YOLO主頁。YOLO的主要優勢在於基於純C語言編寫的DarkNet,可查看DarkNet主頁,不需要其他依賴庫,跨平臺能力強,運行速度快,這裏是下載地址。有趣的是裏邊的有好幾個LICENSE,其中LICENSE.fuck的內容是這樣的:

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
               Version 2, December 2004

Copyright (C) 2004 Sam Hocevar <[email protected]>

Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.

       DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  1. You just DO WHAT THE FUCK YOU WANT TO.

短短幾行字出現了三次“FUCK”,還出現在標題中。這是我第一次見到這樣的LICENSE文檔,估計是往github上推送時忘了刪除吧。
下面是我運行YOLOv3代碼的過程。
我的運行環境為:

  • Ubuntu16.04LTS
  • CUDA9.0
  • cuDNN7.0.5
  • AMD Ryzen 1600
  • NVIDIA GTX1070

一. 使用CPU運行

這個比較簡單,在Ubuntu下載、編譯、運行非常方便,按照YOLO主頁給的提示執行就可以看到結果。

1. 下載

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

2. 編譯

cd darknet
make

執行完命令可以看到生成了可執行文件darknet和庫文件libdarknet.a和libdarknet.so。在Ubuntu下使用makefile文件進行編譯非常方便,執行一個命即可,比在Windows安裝cygwin和GUI的CMake,使用CMake在界面方式編譯要簡單得多。

3. 下載預訓練的權重文件

wget https://pjreddie.com/media/files/yolov3.weights

在Ubuntu中下載速度很慢,要幾個小時。我打開了另一臺裝Windows的電腦,用下載神器迅雷幾分鐘就下完了,感謝國內下載完這個文件還開著電腦和迅雷的小夥伴們。然後將該文件拷貝至Ubuntu電腦上darknet目錄下。

4. 運行檢測器

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

這裏的“./darknet”表示當前目錄下的darknet,這點與Windows的命令行不同。運行完可看到下面的結果,並在darknet目錄下生成了檢測結果的jpg文件。

layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32 0.299 BFLOPs
1 conv 64 3 x 3 / 2 416 x 416 x 32 -> 208 x 208 x 64 1.595 BFLOPs
.......
105 conv 255 1 x 1 / 1 52 x 52 x 256 -> 52 x 52 x 255 0.353 BFLOPs
106 detection
truth_thresh: Using default ‘1.000000‘
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 0.029329 seconds.
dog: 99%
truck: 93%
bicycle: 99%

這幾步在我的電腦上執行順利,沒有出現問題。

二. 使用GPU運行

四個步驟相同,區別在於要修改Makefile文件。而且電腦要提前裝好CUDA和cuDNN,可參看
環境配置(近期實測)——Ubuntu16.04+CUDA9.0+tensorflow-gpu填坑記。 Makefile文件修改如下:

GPU=0
CUDNN=0
NVCC=nvcc

改為

GPU=1
CUDNN=1
NVCC=/usr/local/cuda-9.0/bin/nvcc #即改為本機CUDA安裝地址

修改完執行make提示:

include/darknet.h:16:23: fatal error: cudnn.h: 沒有那個文件或目錄
compilation terminated.
Makefile:89: recipe for target ‘obj/gemm.o‘ failed
make: *** [obj/gemm.o] Error 1

是因為缺乏頭文件cudnn.h,需要將其復制。由於需要管理員權限,我使用命令復制。
進入所在目錄~/下載/cuda/include(下載CUDA的默認位置,可能會有不同),運行:

sudo cp cudnn.h /usr/include

然後再darknet目錄下執行make,提示

/usr/bin/ld: 找不到 -lcudnn
collect2: error: ld returned 1 exit status
Makefile:83: recipe for target ‘libdarknet.so‘ failed
make: *** [libdarknet.so] Error 1

這是因為缺少庫文件libcudnn.so,我使用命令復制。進入所在目錄~/下載/cuda/lib64(下載CUDA的默認位置,可能會有不同),打開終端,運行

sudo cp libcudnn.so /usr/local/cuda-9.0/lib64

再在darknet目錄下執行make命令,可以看到,已生成可執行程序darkenet和庫libdarknet.o和libdarknet.so。剩余過程同上,最後也可以生成有方框標記概率的jpg文件。

Ubuntu下YOLOv3代碼運行