1. 程式人生 > >【object detection】YOLO 實踐篇(darknet):You Only Look Once

【object detection】YOLO 實踐篇(darknet):You Only Look Once

前言

最近在學習 object detection 領域的相關知識,從傳統的目標檢測如 DPM 模型,到基於候選區的R-CNN系列模型,再到 single network && end to end 的 yolo 模型,還有針對 yolo 模型的缺陷進一步完善的 SSD 模型等等。一系列的理論和實踐需要學習,希望能夠記錄學習過程中的點點滴滴,不斷修改、完善和總結,系統的學習一遍。當然,最後還是要付諸於實踐,才能更深入的掌握相關知識。

繼 R-CNN 系列的 object detection 之後, YOLO 是一種新的目標檢測方法,該方法的特點是實現快速檢測的同時還達到較高的準確率

作者將目標檢測任務看作目標區域預測和類別預測的迴歸問題。該方法採用單個神經網路直接預測物品邊界和類別概率,實現端到端的物體檢測。同時,該方法檢測速非常快,基礎版可以達到 45fps 的實時檢測,Fast YOLO 可以達到 155fps。與當前最好系統相比,雖然 YOLO 網路模型檢測得到的目標區域定位誤差更大,但是背景預測的假陽性優於當前最好的方法(YOLO 採用全圖資訊來進行預測。與滑動視窗方法和 region proposal-based 方法不同,YOLO 在訓練和預測過程中可以利用全圖資訊。Fast R-CNN 檢測方法會錯誤的將背景中的斑塊檢測為目標,原因在於Fast R-CNN在檢測中無法看到全域性影象。所以相對於Fast R-CNN,YOLO背景預測錯誤率低一半)。

YOLO-v1 的主要特點:

1)速度快,能夠達到實時的要求。在 Titan X 的 GPU 上 能夠達到 45 幀每秒。
2)使用全圖作為 Context 資訊,背景錯誤(把背景錯認為物體)比較少。
3)泛化能力強:在自然影象上訓練好的結果在藝術作品中的依然具有很好的效果。 

YOLO-v1 在 Pascal VOC-2012 資料集上訓練,能識別如下 20 種物體類別:

1)person

2)bird, cat, cow, dog, horse, sheep 

3)aeroplane, bicycle, boat, bus, car, motorbike, train 

4)bottle, chair, dining table, potted plant, sofa, tv/monitor

darknet 的主要特點:

1)darknet 完全由C語言實現,沒有任何依賴項。為了更好的視覺化,可以使用 OpenCV 來顯示圖片;
2)darknet 支援 CPU 和 GPU(CUDA/cuDNN);
3)因為較為輕型,沒有像TensorFlow那般強大的API,有另一種味道的靈活性,更為方便的從底層對其進行改進與擴充套件;
4)darknet 的實現與 caffe 的實現存在相似的地方,熟悉了darknet,相信對上手caffe有幫助;

《You only look once: Unified, Real-Time Object Detection》原文 中還提到很多其他 Detection System,如下:

1)Deformable parts models(DPM):在深度神經網路之前,早期的 Object detection 方法是通過提取影象的一些 robust 的特徵如( Haar,SIFT,HOG )等特徵,使用 DPM 模型,用 silding window 的方式來預測具有較高 score 的 bounding box。DPM 模型把物體看成了多個組成的部件(比如人臉的鼻子、嘴巴等),用部件間的關係來描述物體,這個特性非常符合自然界很多物體的非剛體特徵。DPM可以看做是HOG+SVM的擴充套件,很好的繼承了兩者的優點,在人臉檢測、行人檢測等任務上取得了不錯的效果,但是DPM相對複雜,檢測速度也較慢,從而也出現了很多改進的方法。正當大家熱火朝天改進DPM效能的時候,基於深度學習的目標檢測橫空出世,迅速蓋過了DPM的風頭,很多之前研究傳統目標檢測演算法的研究者也開始轉向深度學習。(更詳細的理論知識可以參考這篇 博文

Felzenszwalb P F, Girshick R B, McAllester D, et al. Object detection with discriminatively trained part-based models[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2010, 32(9): 1627-1645.

2)R-CNN Series:包括 R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN 等經典的網路模型。

[1] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. ImageNet Large-Scale Visual Recognition Challenge workshop, ICCV, 2013.
[2] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2014.
[3] R. Girshick, J. Donahue, T. Darrell, J. Malik. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, May. 2015.
[4] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV. 2014.
[5] S. Ren, K. He, R. Girshick, J. Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks. Advances in Neural Information Processing Systems 28 (NIPS), 2015.

3)Deep MultiBox:Szegedy et al. train a convolutional neural network to predict regions of interest instead of using Selective Search. (Szegedy 等人訓練一個卷積神經網路來預測感興趣的區域,而不是使用 SelectiveSearch 演算法直接獲得候選區)YOLO 也是通過訓練一個 CNN 預測 bounding-box。相對 MultiBox,YOLO 是一個完整的檢測系統。

D. Erhan, C. Szegedy, A. Toshev, and D. Anguelov. Scalable object detection using deep neural networks. In Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on, pages 2155–2162. IEEE, 2014.

4)OverFeat:用CNN統一來做分類、定位和檢測的經典之作,作者是深度學習大神之一,Yann Lecun。此外,OverFeat 也是 ILSVRC 2013 任務3(分類+定位)的冠軍得主。OverFeat 使用 CNN 做目標檢測的早期工作,主要思想是採用了多尺度滑動視窗來做分類、定位和檢測。雖然是多個任務但重用了模型前面幾層,這種模型重用的思路也是後來 R-CNN 系列不斷沿用和改進的經典做法。OverFeat 可以看做是 R-CNN的一個特殊情況,只需要把 Selective Search 換成多尺度的滑動視窗,每個類別的邊框迴歸器換成統一的邊框迴歸器,SVM 換為多層網路即可。但是 OverFeat 實際比R-CNN快9倍,這主要得益於卷積相關的共享計算

P. Sermanet, D. Eigen, X.Zhang, M. Mathieu, R. Fergus, and Y. LeCun. OverFeat: Integrated recognition, localization and detection using convolutional networks. In ICLR, 2014.

5)MultiGrasp:YOLO 的設計與 MultiGrasp 相似,2014年 Redmon 等人發表了這篇文章。MultiGrasp 主要用於 grasp detection,一個比 object detection 簡單很多的任務。對於一張包含單個物體的 image,MultiGrasp 只需要預測一個單一的 graspable region,而不需要預估 object 的大小、位置或者邊界,也不需要預測它屬於哪個類別。相較之下 YOLO 的任務複雜得多,對於每個 grid cell 需要預測 B 個 bounding-box 以及 P(class[i] | object),對於每個 bounding-box 需要回歸(x, y, w, h)和置信度(confidence),而且還是多目標、多類別的影象。

J. Redmon and A. Angelova. Real-time grasp detection using convolutional neural networks. CoRR, abs/1412.3128, 2014

本文不再敘述過多的理論知識,主要目的是整理 YOLO 的實踐過程,以“理論+實踐”的方式學習 yolo。本文的實踐部分主要參考darknet(https://pjreddie.com/darknet/),一個基於C語言和CUDA的開源神經網路框架。此外,github 上還有一些開源的tensorflow 版本,感興趣的讀者可以實踐一下。

Reference

- yolo實踐參考資料

- yolo理論參考資料

- darknet 原始碼解析:

- keras 版本的yolo-v2

準備工作

1)本文實踐環境:

darknet 是由 C 和 CUDA 開發的,不需要配置其他深度學習的框架(如,tensorflow、caffe 等),支援 CPU 和 GPU 運算,而且安裝過程非常簡單。本文使用的 CUDA 和 OpenCV 的版本如下所示:

CUDA:8.0
CUDNN:5.1-8.0
OpenCV-3.3.0

如果還沒搭建好環境的讀者請參考如下博文:

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

3)進入 darknet 目錄並編譯:

cd darknet
make

說明:編譯成功後會生成一個 darknet 的可執行檔案,執行 ./darknet 就可以執行。你可以通過修改 Makefile 的引數,切記,每次修改完 Makefile 檔案後記得重新 make 一下才能生效。

如果編譯過程執行 make 時,出現瞭如下錯誤:

[email protected]:~/hcq/deep_learning/github/darknet$ make
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv`  -DGPU -I/usr/local/cuda/include/ -DCUDNN  -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -DCUDNN -c ./src/gemm.c -o obj/gemm.o
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
In file included from ./src/utils.h:5:0,
                 from ./src/gemm.c:2:
include/darknet.h:25:43: fatal error: opencv2/highgui/highgui_c.h: 沒有那個檔案或目錄
compilation terminated.
Makefile:85: recipe for target 'obj/gemm.o' failed
make: *** [obj/gemm.o] Error 1

解決方案(詳情請參考文末的“錯誤集錦”):

sudo gedit ~/.bashrc  # 開啟環境變數配置檔案
# added by hcq 20171206 opencv
export PKG_CONFIG_PATH=/home/lab406/hcq/opencv/lib/pkgconfig:$PKG_CONFIG_PATH  # 現在是使用這個路徑,可行
export PKG_CONFIG_PATH=/home/lab406/hcq/opencv/lib:$PKG_CONFIG_PATH  # 之前是使用這個路徑,但不行
source ~/.bashrc  # 生效配置檔案的修改

預設的 Makefile 是使用 CPU。如果你配置好了 CUDA 等相關環境,想使用 GPU 跑模型,那麼修改 Makefile 如下:

GPU=1  # 從 0 修改為 1
CUDNN=1  # 從 0 修改為 1
OPENCV=1  # 從 0 修改為 1
OPENMP=0
DEBUG=0

修改完成之後,根目錄下再次執行 make 命令進行編譯,編譯成功後提示資訊如下所示(CUDA 已經編譯好了):

### 省略一大堆 warning
/home/hcq/document/opencv/include/opencv2/videoio/videoio_c.h:547:15: warning: ‘CV_FOURCC’ defined but not used [-Wunused-function]
 CV_INLINE int CV_FOURCC(char c1, char c2, char c3, char c4)
               ^
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv`  -DGPU -I/usr/local/cuda-8.0/include/ -DCUDNN  -Wall -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -DCUDNN obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/attention.o obj/darknet.o libdarknet.a -o darknet -lm -pthread  `pkg-config --libs opencv`  -L/usr/local/cuda-8.0/lib64 -lcuda -lcudart -lcublas -lcurand -lcudnn -lstdc++  libdarknet.a

darknet 官網還是很牛逼的... ...

測試一下 OpenCV 是否安裝並編譯成功:

./darknet imtest data/eagle.jpg

配置好 OpenCV 後,直接顯示影象

如果出現如下錯誤:

[email protected]:~/hcq/deep_learning/github/darknet$ ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
./darknet: error while loading shared libraries: libopencv_highgui.so.3.3: cannot open shared object file: No such file or directory

解決方案:將 opencv/lib 路徑加到配置環境中,如下圖所示:

參考網址:click here

yolo(darknet) 程式碼結構

[email protected]:~/hcq/deep_learning/github/darknet$ tree -L 2
.
├── cfg
│   ├── alexnet.cfg
│   ├── cifar.cfg
│   ├── cifar.test.cfg
│   ├── coco.data
│   ├── combine9k.data
│   ├── darknet19_448.cfg
│   ├── darknet19.cfg
│   ├── darknet9000.cfg
│   ├── darknet.cfg
│   ├── densenet201.cfg
│   ├── extraction22k.cfg
│   ├── extraction.cfg
│   ├── extraction.conv.cfg
│   ├── go.cfg
│   ├── go.test.cfg
│   ├── gru.cfg
│   ├── imagenet1k.data
│   ├── imagenet22k.dataset
│   ├── imagenet9k.hierarchy.dataset
│   ├── jnet-conv.cfg
│   ├── resnet152.cfg
│   ├── resnet50.cfg
│   ├── rnn.cfg
│   ├── rnn.train.cfg
│   ├── strided.cfg
│   ├── t1.test.cfg
│   ├── tiny.cfg
│   ├── tiny-yolo.cfg
│   ├── tiny-yolo-voc.cfg
│   ├── vgg-16.cfg
│   ├── vgg-conv.cfg
│   ├── voc.data
│   ├── writing.cfg
│   ├── yolo.2.0.cfg
│   ├── yolo9000.cfg
│   ├── yolo.cfg
│   ├── yolov1
│   ├── yolo-voc.2.0.cfg
│   └── yolo-voc.cfg
├── data
│   ├── 9k.labels
│   ├── 9k.names
│   ├── 9k.tree
│   ├── coco9k.map
│   ├── coco.names
│   ├── dog.jpg
│   ├── eagle.jpg
│   ├── giraffe.jpg
│   ├── goal.txt
│   ├── horses.jpg
│   ├── imagenet.labels.list
│   ├── imagenet.shortnames.list
│   ├── inet9k.map
│   ├── labels
│   ├── person.jpg
│   ├── scream.jpg
│   └── voc.names
├── examples
│   ├── art.c
│   ├── attention.c
│   ├── captcha.c
│   ├── cifar.c
│   ├── classifier.c
│   ├── coco.c
│   ├── darknet.c
│   ├── detector.c
│   ├── detector.py
│   ├── detector-scipy-opencv.py
│   ├── dice.c
│   ├── go.c
│   ├── lsd.c
│   ├── nightmare.c
│   ├── regressor.c
│   ├── rnn.c
│   ├── rnn_vid.c
│   ├── segmenter.c
│   ├── super.c
│   ├── swag.c
│   ├── tag.c
│   ├── voxel.c
│   ├── writing.c
│   └── yolo.c
├── include
│   └── darknet.h
├── LICENSE
├── LICENSE.fuck
├── LICENSE.gen
├── LICENSE.gpl
├── LICENSE.meta
├── LICENSE.mit
├── LICENSE.v1
├── Makefile
├── python
│   ├── darknet.py
│   └── proverbot.py
├── README.md
├── scripts
│   ├── dice_label.sh
│   ├── gen_tactic.sh
│   ├── get_coco_dataset.sh
│   ├── imagenet_label.sh
│   └── voc_label.py
└── src
    ├── activation_kernels.cu
    ├── activation_layer.c
    ├── activation_layer.h
    ├── activations.c
    ├── activations.h
    ├── avgpool_layer.c
    ├── avgpool_layer.h
    ├── avgpool_layer_kernels.cu
    ├── batchnorm_layer.c
    ├── batchnorm_layer.h
    ├── blas.c
    ├── blas.h
    ├── blas_kernels.cu
    ├── box.c
    ├── box.h
    ├── classifier.h
    ├── col2im.c
    ├── col2im.h
    ├── col2im_kernels.cu
    ├── compare.c
    ├── connected_layer.c
    ├── connected_layer.h
    ├── convolutional_kernels.cu
    ├── convolutional_layer.c
    ├── convolutional_layer.h
    ├── cost_layer.c
    ├── cost_layer.h
    ├── crnn_layer.c
    ├── crnn_layer.h
    ├── crop_layer.c
    ├── crop_layer.h
    ├── crop_layer_kernels.cu
    ├── cuda.c
    ├── cuda.h
    ├── data.c
    ├── data.h
    ├── deconvolutional_kernels.cu
    ├── deconvolutional_layer.c
    ├── deconvolutional_layer.h
    ├── demo.c
    ├── demo.h
    ├── detection_layer.c
    ├── detection_layer.h
    ├── dropout_layer.c
    ├── dropout_layer.h
    ├── dropout_layer_kernels.cu
    ├── gemm.c
    ├── gemm.h
    ├── gru_layer.c
    ├── gru_layer.h
    ├── im2col.c
    ├── im2col.h
    ├── im2col_kernels.cu
    ├── image.c
    ├── image.h
    ├── layer.c
    ├── layer.h
    ├── list.c
    ├── list.h
    ├── local_layer.c
    ├── local_layer.h
    ├── lstm_layer.c
    ├── lstm_layer.h
    ├── matrix.c
    ├── matrix.h
    ├── maxpool_layer.c
    ├── maxpool_layer.h
    ├── maxpool_layer_kernels.cu
    ├── network.c
    ├── network.h
    ├── normalization_layer.c
    ├── normalization_layer.h
    ├── option_list.c
    ├── option_list.h
    ├── parser.c
    ├── parser.h
    ├── region_layer.c
    ├── region_layer.h
    ├── reorg_layer.c
    ├── reorg_layer.h
    ├── rnn_layer.c
    ├── rnn_layer.h
    ├── route_layer.c
    ├── route_layer.h
    ├── shortcut_layer.c
    ├── shortcut_layer.h
    ├── softmax_layer.c
    ├── softmax_layer.h
    ├── stb_image.h
    ├── stb_image_write.h
    ├── tree.c
    ├── tree.h
    ├── utils.c
    └── utils.h

實踐過程中主要修改的檔案:

1)Makefile

2)./cfg 目錄下的引數配置檔案

3)./data 目錄下的資料



實踐步驟(文末附有問題集錦,不斷更新)
 

1. 下載預訓練的模型引數 yolo.weights:

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

1)基於 yolo.weights 模型引數測試單張影象:

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

2)基於 yolo.weights 模型引數測試多張影象(Multiple Images):不需要給定測試影象的路徑,直接輸入如下命令,然後程式會提示你輸入測試影象路徑,直到使用“ctrl + C”退出程式。

./darknet detect cfg/yolo.cfg yolo.weights

3)於 yolo.weights 模型引數,使用“-thresh”引數控制顯示的 bounding-box 個數。darknet 預設只顯示被檢測的物體中 confidence 大於或等於0.25的bounding-box,可以通過引數 "-thresh <value>" 改變。例如,“-thresh 0”表示顯示出所有的bounding-box。你們可以根據實際所需,設定不同的值。

值得一提的是,上述使用的是普通版的yolo(normal yolo),檢測速度大概是 40-90 fps,在 VOC-2017 資料集上 mAP = 78.6%,COCO 資料集上 mAP = 48.1%。tiny yolo 是 yolo 的 fast 版本,網路結構有所改變(卷積層減少了),速度高達 155 fps,但是犧牲了準確率。本文不再介紹 tiny yolo 版本,感興趣的讀者可以參考 darknet 官網。

2. 基於yolo.weights 模型引數,使用網路攝像頭(Webcam)進行實時檢測,所需工具如下:

1)網路攝像頭,如有多個攝像頭可以使用 “-c <num>”引數進行選擇,預設引數為0。

2)CUDA 和 OpenCV

萬事俱備後,執行如下命令,你將看到當前的 FPS、框出物體的bounding-box、所屬類別的概率。

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

3. 基於 yolo.weights 模型引數,測試一段視訊(CUDA、OpenCV、Video),官網有提供一段檢測的視訊。

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights <video file>

4. 基於 darknet 在 VOC 資料集上訓練 YOLO:

1)下載 Pascal VOC 2007 和 2012 的資料集,資料集的目錄可以參考上文的程式碼結構

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

2)生成 VOC 資料集的標籤,darknet 需要一個“.txt”檔案,每行表示一張影象的資訊,包括(x, y, w, h)如下所示:

<object-class> <x> <y> <width> <height>

darknet 官網提供了一個針對 VOC 資料集,處理標籤的指令碼,執行如下命令:

wget https://pjreddie.com/media/files/voc_label.py  # 獲取指令碼
python voc_label.py  # 執行指令碼,獲得所需的“.txt”檔案

標籤處理完成後,在darknet的根目錄下,你應該能看到如下幾個檔案:

其中,2007_train.txt 和 2012_train.txt 分別表示2007年和2012年的訓練資料。在本例中,我們將結合2007年和2012年的訓練資料進行訓練(測試資料使用2007年的測試資料),執行如下命令整合到 train.txt 檔案中:

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

3)修改“./cfg/voc.data”配置檔案

classes= 20  # 類別總數
train  = /home/hcq/document/deepLearning/github/darknet/train.txt  # 訓練資料所在的位置
valid  = /home/hcq/document/deepLearning/github/darknet/2007_test.txt  # 測試資料所在的位置
names = data/voc.names
backup = backup  # 備份yolo模型引數的位置

4)下載預訓練的引數(卷積權重),“darknet19_448.conv.23”是使用 Imagenet 資料集進行預訓練:

wget https://pjreddie.com/media/files/darknet19_448.conv.23  # 下載預訓練的網路模型引數

當然,如果硬體條件足夠的話,你也可以自己進行預訓練。首先下載“Darknet19 448x448 model”網路模型,然後執行如下命令(由於硬體條件限制,本文沒有實踐此部分):

./darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23

5)在darknet根目錄下,建立一個“backup”資料夾:

mkdir backup

6)輸入如下命令,訓練模型:

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

5. 基於 darknet 在 COCO 資料集上訓練 YOLO

1)獲取 COCO 資料集,在 darknet 根目錄下執行如下命令:

cp scripts/get_coco_dataset.sh data
cd data
bash get_coco_dataset.sh

2)修改“cfg/coco.data”和“cfg/yolo.cfg”配置檔案:
“./cfg/coco.data

classes= 80
train  = /home/hcq/document/deepLearning/github/darknet/data/coco/trainvalno5k.txt
#valid  = coco_testdev
valid = /home/hcq/document/deepLearning/github/darknet/data/coco/5k.txt
names = data/coco.names
backup = backup
eval=coco

- “./cfg/yolo.cfg

[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
....

3)訓練模型:

./darknet detector train cfg/coco.data cfg/yolo.cfg darknet19_448.conv.23

問題集錦

1. 【OpenCV:to the PKG_CONFIG_PATH environment variable】

原因沒有配置 PKG_CONFIG_PATH 環境預設情況下,pkg-config首先在prefix/lib/pkgconfig/中查詢相關包(譬如opencv)對應的相應的檔案(opencv.pc)。在linux上上述路徑名為 /usr/lib/pkconfig/。若是沒有找到,它也會到PKG_CONFIG_PATH這個環境變數所指定的路徑下去找。若是沒有找到,它就會報錯。

解決方案:找到 opencv.pc 所在的目錄,正常情況下是在如下路徑:

./opencv/lib/pkgconfig  # opencv 的編譯請參考:http://blog.csdn.net/houchaoqun_xmu/article/details/78565077

然後開啟環境變數的配置檔案,將路徑加上去,一系列命令如下所示:

sudo gedit ~/.bashrc  # 開啟環境變數配置檔案
# added by hcq 20171206 opencv
export PKG_CONFIG_PATH=/home/lab406/hcq/opencv/lib/pkgconfig:$PKG_CONFIG_PATH  # 現在是使用這個路徑,可行
export PKG_CONFIG_PATH=/home/lab406/hcq/opencv/lib:$PKG_CONFIG_PATH  # 之前是使用這個路徑,但不行
source ~/.bashrc  # 生效配置檔案的修改

2. 【darknet: ./src/cuda.c:36: check_error: Assertion `0' failed】CUDNN忘記設定為1,出現錯誤:

mask_scale: Using default '1.000000'
Loading weights from darknet19_448.conv.23...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Resizing
576
Loaded: 0.031443 seconds
Region Avg IOU: 0.242979, Class: 0.011581, Obj: 0.442039, No Obj: 0.477931, Avg Recall: 0.066667,  count: 30
CUDA Error: mapping of buffer object failed
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
Aborted (core dumped)
[email protected]:~/document/deepLearning/github/darknet$ 

修改Makefile檔案,將 CUDNN 設定為 1,重新編譯即可。

說明:也有可能是訓練資料或者測試資料路徑的問題造成的(網上有類似的,但本文還未遇到過)

3. 【darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.】這種情況網上比較多類似的問題,主要都是說“ARCH= --gpu-architecture=compute_xx  --gpu-code=compute_xx”的問題。直接到網上搜搜看就有答案了。