YOLOv4環境構築②

# 前回の記事
[YOLOv4環境構築①](https://qiita.com/kzsDev/items/89731ffe7df4e1cf4628)

参考
https://www.youtube.com/watch?v=sUxAVpzZ8hU

# DarkNetのダウンロード
Cドライブとは別のDドライブ直下に```YOLO_v4```ディレクトリを作成することにした
このディレクトリにDarkNetをダウンロードする

GitHubからクローンする
https://github.com/pjreddie/darknet

URLをコピーして
![darknet.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/5219989f-6cd1-669f-817b-4b5f8164c387.jpeg)


コマンドプロンプトから```YOLO_v4```ディレクトリに移動してクローン

```D:/YOLO_v4
$ git clone https://github.com/pjreddie/darknet.git
```

# OpenCVのdllファイルをDarkNetにコピー

[前回](https://qiita.com/kzsDev/items/89731ffe7df4e1cf4628)ビルドしたOpenCVのディレクトリ```C:\opencv\build\bin\Release```から下記ファイルを```D:\YOLO_v4\darknet\build\darknet\x64```にコピーする

- **opencv_videoio_ffmpeg430_64.dll**
- **opencv_world430.dll**

# cuDNNのdllファイルをDarkNetにコピー
先程と同様に```C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin```[（前回参照）](https://qiita.com/kzsDev/items/89731ffe7df4e1cf4628)から下記ファイルを```D:\YOLO_v4\darknet\build\darknet\x64```にコピーする

- **cudnn64_7.dll**

# cuDNNのバージョンに合わせてDarkNetの設定を変更
エディタで```D:\YOLO_v4\darknet\build\darknet```から**darknet.vcxproj**をエディタで開き編集する

「**CUDA 10**」で検索して**すべての箇所**のCUDAバージョンを
10.0から**10.2に変更**する
![darknet_cnnversion_edit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/ec18175d-234c-f26b-0270-446f1d39d565.jpeg)

同ディレクトリにある**yolo_cpp_dll.vcxproj**についても同様にバージョンの修正を行う

# YOLOv4をアップデートしたCUDAバージョンでコンパイル
Visual Studioで**yolo_cpp_dll.vcxproj**を開き、モードを**Rerease, x64**に設定して**yolo_cpp_dllをビルド**する
![yolov4_build.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/b844953a-c0f7-ab88-d109-5772b7f29571.jpeg)

# DarkNetのコンパイル
Visual Studioで```D:\YOLO_v4\darknet\build\darknet```から**darknet.sln**を開く

先程と同様にモードを**Rerease, x64**に設定する
darknetの右クリックメニューからプロパティを開く

![darknet_build.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/2417b416-0751-1da3-4cf5-42a256b0122f.jpeg)

## C/C++
### 追加のインクルードディレクトリを編集
プロパティの```C/C++ > 全般 > 追加のインクルードディレクトリ```に**C:\opencv\build\install\include**を追加

![darknet_property.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/be08f98e-e393-9a8b-0f29-32fdf0a157a9.jpeg)


![darknet_property2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/e01d3c5a-f7e3-3d97-6b1d-17ab42bf84eb.jpeg)

### プリプロセッサの定義を編集
プロパティの```C/C++ > プリプロセッサ > プリプロセッサの定義```から**CUDNN_HALFを削除**する
![darknet_property3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/07813bb8-c69d-6391-3cc1-329e6ac3e56c.jpeg)

## CUDA C/C++
プロパティの```CUDA C/C++ > Device > Code Generation```から**compute_75,sm_75を削除**する（10.2では不要）
![darknet_property4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/ca57970e-b8fe-f7e9-5cd9-a57948fdf8dd.jpeg)


## リンカー
プロパティの```リンカー > 全般 > 追加のライブラリディレクトリ```に**C:\opencv\build\install\x64\vc16\lib**を追加

![darknet_property5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/23d451a5-98a3-7818-4501-9c00182ee3b8.jpeg)


## darknetをビルド
ソリューションエクスプローラーから**darknet**を右クリックしてビルドする

## コマンドプロンプトで確認
コマンドプロンプトで```D:\YOLO_v4\darknet\build\darknet\x64```に移動しpythonからdarknetをエラーなくimportできることを確認する

```D:\YOLO_v4\darknet\build\darknet\x64
$ python
>>> import darknet
>>>
```

# YOLOv4で静止画と動画に対して物体検出をおこなう

## 学習済モデルのダウンロード
https://github.com/AlexeyAB/darknet から学習済モデルをダウンロードする

![weightsDL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/3a2bede4-027e-2678-c16e-9ce6fc6d8f03.jpeg)

ダウンロードした**yolov4.weights**を```D:\YOLO_v4\darknet\build\darknet\x64```にコピーする

同ディレクトリに動作確認に使う静止画ファイルと動画ファイルも入れておく

## 静止画で物体検出

コマンドプロンプトで```D:\YOLO_v4\darknet\build\darknet\x64```に移動し以下を実行

```
$ darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights
```

**静止画のパス**を求められるので入力する

![pred_img_dog.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644808/70234a17-0f5d-0533-fc1f-7aa84e795c0d.jpeg)


## 動画で物体検出
動画ファイルの名称は```test.mp4```
コマンドプロンプトで```D:\YOLO_v4\darknet\build\darknet\x64```に移動し以下を実行

```
$ darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4
```

# 次回に続く
かも？