适用于Windows和Linux的Yolo-v3和Yolo-v2(上)
阅读原文时间:2023年07月10日阅读:1

适用于WindowsLinuxYolo-v3Yolo-v2(上)

https://github.com/eric-erki/darknetAB

(用于对象检测的神经网络)-Tensor Cores可以在LinuxWindows上使用

更多详细信息:http : //pjreddie.com/darknet/yolo/

1.      此存储库中的改进

2.      如何使用

3.      如何在Linux上编译

o   使用cmake

o   使用make

4.      如何在Windows上编译

o   使用CMake-GUI

o   使用vcpkg

o   传统方式

5.      如何训练(Pascal VOC数据)

6.      如何使用多GPU进行训练:

7.      如何训练(检测自定义对象)

8.      如何训练tiny-yolo(检测自定义对象)

9.      什么时候应该停止训练

10.    如何在PascalVOC 2007上计算mAP

11.    如何改善物体检测

12.    如何标记对象的有界框并创建注释文件

13.    如何将Yolo用作DLL和SO库

mAP@0.5AP50-FPSGeForce 1080 Tihttps://arxiv.org/abs/1911.11929https://github.com/WongKinYiu/CrossStagePartialNetworks-更多型号

预训练模型

不同的cfg文件有权重文件(针对MS COCO数据集进行了训练):

GeForce 1080Ti上的FPS:

单击 -Yolo v3型号

单击 -Yolo v2型号

放到附近编译:darknet.exe

可以通过以下路径获取cfg文件: darknet/cfg/

要求

在其框架中的Yolo v3

数据集

  • MS COCO:用于./scripts/get_coco_dataset.sh获取标记的MS COCO检测数据集
  • OpenImages:python ./scripts/get_openimages_dataset.py用于标记训练检测数据集
  • Pascal VOC:python ./scripts/voc_label.py用于标记Train / Test / Val检测数据集
  • ILSVRC2012(ImageNet分类):使用./scripts/get_imagenet_train.sh(也imagenet_label.sh用于标记有效集)
  • 用于检测的德语/比利时/俄罗斯/ LISA / MASTIF交通标志数据集-使用此解析器:https : //github.com/angeligareta/Datasets2Darknet#detection-task
  • 其数据集列表:https : //github.com/AlexeyAB/darknet/tree/master/scripts#datasets

结果示例

Others: https://www.youtube.com/user/pjreddie/videos

此存储库中的改进

  • 增加了对Windows的支持
  • 添加了最新模型:CSP,PRN,EfficientNet
  • 添加的层:[conv_lstm],[scale_channels] SE / ASFF / BiFPN,[local_avgpool],[sam],[Gaussian_yolo],[reorg3d](固定的[reorg]),固定的[batchnorm]
  • 新增了训练循环模型(具有conv-lstm [conv_lstm]/ conv-rnn层[crnn])以精确检测视频的功能
  • 添加了数据扩充:[net] mixup=1 cutmix=1 mosaic=1 blur=1。添加的激活:SWISH,MISH,NORM_CHAN,NORM_CHAN_SOFTMAX
  • 增加了使用CPU-RAM进行GPU处理训练的能力,以增加mini_batch_size和准确性(而非批处理规范同步)
  • 如果使用此XNOR-net模型训练自己的权重(位1推断),则在CPU和GPU上的二进制神经网络性能将提高24的检测速度:https : //github.com/AlexeyAB/darknet/blob/master /cfg/yolov3-tiny_xnor.cfg
  • 通过将2层融合到1个卷积+批量范数中,将神经网络性能提高了7
  • 改进的性能:如果在或中定义了Tensor Core,则在GPU Volta / Turing(Tesla V100,GeForce RTX等)上检测2,CUDNN_HALFMakefiledarknet.sln
  • 改进了FullHD的性能1.2倍,4K的性能2倍,使用darknet detector demo… 可以检测视频(文件/流)
  • 性能提高了3.5的数据增强进行训练(使用OpenCV SSE / AVX功能而不是手写功能)-消除了在多GPU或GPU Volta上进行训练的瓶颈
  • 使用AVX在Intel CPU上提高了检测和训练的性能(Yolo v3〜85 
  • 在调整网络大小时优化内存分配 random=1
  • 优化的GPU初始化以进行检测-最初使用batch = 1,而不是使用batch = 1重新初始化
  • 使用命令添加了正确的mAPF1IoUPrecision-Recall计算darknet detector map…
  • -map在训练过程中添加了平均损耗和精度mAP(标志)图表
  • ./darknet detector demo … -json_port 8070 -mjpeg_port 8090作为JSON和MJPEG服务器运行,以使用软件或Web浏览器通过网络在线获取结果
  • 增加了训练锚的计算
  • 添加了检测和跟踪对象的示例:https : //github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp
  • 如果使用了不正确的cfg文件或数据集,则为运行时提示和警告
  • 许多其代码修复…

并添加了手册- 如何训练Yolo v3 / v2(以检测自定义对象)

另外,可能对使用简化的存储库感兴趣,该存储库中已实现INT8量化(+ 30%的加速和-1%的mAP降低): https://github.com/AlexeyAB/yolo2_light

如何在命令行上使用

在Linux上,请使用./darknet代替darknet.exe,例如:./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights

在Linux上./darknet,在根目录中找到可执行文件,而在Windows上,在目录中找到可执行文件。\build\darknet\x64

  • Yolo v3 COCO- 图片:darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -thresh 0.25

  • 输出对象的坐标:darknet.exe detector test cfg/coco.data yolov3.cfg yolov3.weights -ext_output dog.jpg

  • Yolo v3 COCO- 视频:darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -ext_output test.mp4

  • Yolo v3 COCO- WebCam 0:darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights -c 0

  • 用于网络摄像机的 Yolo v3 COCO-智能网络摄像头:darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights http://192.168.0.80:8080/video?dummy=param.mjpg

  • Yolo v3-保存结果视频文件res.avi:darknet.exe detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights test.mp4 -out_filename res.avi

  • Yolo v3 Tiny COCO-视频:darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4

  • 允许来自软件浏览器或Web浏览器ip-address:8070和8090的多个连接的JSONMJPEG服务器:./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output

  • GPU1上的 Yolo v3 Tiny :darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4

  • 替代方法Yolo v3 COCO-图片: darknet.exe detect cfg/yolov3.cfg yolov3.weights -i 0 -thresh 0.25

  • Amazon EC2上进行训练,以使用URL来查看mAP和损失图,例如:http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090在Chrome / Firefox中(Darknet应该使用OpenCV进行编译): ./darknet detector train cfg/coco.data yolov3.cfg darknet53.conv.74 -dont_show -mjpeg_port 8090 -map

  • 186 MB Yolo9000-图片: darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights

  • 如果使用cpp api构建应用程序,请记住将data / 9k.tree和data / coco9k.map放在应用程序的同一文件夹下

  • 要处理图像列表data/train.txt并将检测结果保存到result.json文件中,请使用: darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights -ext_output -dont_show -out result.json < data/train.txt

  • 处理图像列表data/train.txt并保存检测结果以result.txt供使用:

    darknet.exe detector test cfg/coco.data
    cfg/yolov3.cfg yolov3.weights -dont_show -ext_output < data/train.txt
    > result.txt

  • 伪标记-处理图像列表data/new_train.txt并将检测结果以Yolo训练格式保存为每个图像作为标签.txt(通过这种方式,可以增加训练数据量)使用: darknet.exe detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights
    -thresh 0.25 -dont_show -save_labels < data/new_train.txt

  • 要计算锚点: darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9
    -width 416 -height 416

  • 要检查准确性mAP @ IoU = 50: darknet.exe detector map data/obj.data
    yolo-obj.cfg backup\yolo-obj_7000.weights

  • 要检查准确性mAP @ IoU = 75: darknet.exe detector map data/obj.data
    yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75

用于在任何Android智能手机上使用网络摄像机mjpeg-stream

1.      下载Android手机mjpeg-stream
soft:IP网络摄像头/ Smart WebCam

o  
智能网络摄像头-最好:https : //play.google.com/store/apps/details? id =com.acontech.android.SmartWebCam2

o  
IP网络摄像头:https : //play.google.com/store/apps/details?id=com.pas.webcam

2.      通过WiFi(通过WiFi路由器)或USB将Android手机连接到计算机

3.      在手机上启动Smart WebCam

4.      替换下面的地址,在电话应用程序(Smart WebCam)中显示并启动:

如何在Linux上编译(使用cmake

该CMakeLists.txt将尝试查找已安装的可选依赖像CUDA,cudnn,ZED与编译构建。还将创建一个共享对象库文件以darknet用于代码开发。

在克隆的存储库中执行以下操作:

mkdir build-release

cd build-release

cmake ..

make

make install

如何在Linux上编译(使用make

只需make在darknet目录中进行即可。在制作之前,可以在Makefile:链接中设置此类选项

  • GPU=1使用CUDA进行构建以通过使用GPU加速(CUDA应该在中/usr/local/cuda)
  • CUDNN=1使用cuDNN v5-v7进行构建,以通过使用GPU加速训练(cuDNN应该在中/usr/local/cudnn)
  • CUDNN_HALF=1 为Tensor Core构建(在Titan V / Tesla V100 /
    DGX-2及更高版本上)加速检测3倍,训练2倍
  • OPENCV=1 使用OpenCV 4.x / 3.x / 2.4.x构建-允许检测来自网络摄像机或网络摄像机的视频文件和视频流
  • DEBUG=1 调试Yolo版本
  • OPENMP=1 使用OpenMP支持进行构建以通过使用多核CPU来加速Yolo
  • LIBSO=1生成一个库darknet.so和uselib使用该库的二进制可运行文件。或者,可以尝试运行,以便LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
    ./uselib test.mp4如何使用自己的代码使用此SO库-可以查看C ++示例:https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp  或在这样的方式:LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
    ./uselib data/coco.names cfg/yolov3.cfg yolov3.weights test.mp4
  • ZED_CAMERA=1 构建具有ZED-3D摄像机支持的库(应安装ZED SDK),然后运行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names
    cfg/yolov3.cfg yolov3.weights zed_camera

要在Linux上运行Darknet,请使用本文提供的示例,只需使用./darknet代替darknet.exe,即使用以下命令:./darknet detector
test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights

如何在Windows上编译(使用CMake-GUI

如果已经安装了Visual Studio
2015/2017/2019,CUDA> 10.0,cuDNN> 7.0和OpenCV> 2.4,则这是在Windows上构建Darknet的推荐方法。

使用CMake-GUI如下所示这个IMAGE

1.     
配置

2.     
发电机的可选平台(设置:x64)

3.     
完成

4.     
生成

5.     
打开工程

6.     
设置:x64和发行版

7.     
建立

8.     
建立解决方案

如何在Windows上编译(使用vcpkg

如果已经安装了Visual Studio
2015/2017/2019,CUDA> 10.0,cuDNN> 7.0,OpenCV> 2.4,则要编译Darknet,建议使用 CMake-GUI

否则,请按照下列步骤操作:

1.      将Visual Studio安装或更新到至少2017版,并确保已对其进行完全修补(如果不确定是否自动更新到最新版本,请再次运行安装程序)。如果需要从头开始安装,请从此处下载VS:Visual Studio社区

2.      安装CUDA和cuDNN

3.      安装git和cmake。确保至少在当前帐户的路径上

4.      安装vcpkg并尝试安装测试库以确保一切正常,例如vcpkg install opengl

5.      定义环境变量,VCPKG_ROOT指向的安装路径vcpkg

6.      用名称VCPKG_DEFAULT_TRIPLET和值定义另一个环境变量x64-windows

7.      打开Powershell并键入以下命令:

8.   PS \>                  cd $env:VCPKG_ROOT

9.   PS Code\vcpkg>         .\vcpkg install pthreads opencv[ffmpeg] #replace with opencv[cuda,ffmpeg] in case you want to use cuda-accelerated openCV

8.      打开Powershell,转到darknet文件夹并使用命令进行构建.\build.ps1。如果要使用Visual Studio,将在构建后找到CMake为创建的两个自定义解决方案,一个在中build_win_debug,另一个在中build_win_release,其中包含适用于系统的所有配置标志。

如何在Windows上编译(旧版方式)

1.      如果具有CUDA 10.0cuDNN 7.4OpenCV 3.x(路径:C:\opencv_3.0\opencv\build\include&C:\opencv_3.0\opencv\build\x64\vc14\lib),则打开build\darknet\darknet.sln,设置x64释放https://hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u。 jpeg并执行以下操作:构建->构建Darknet。还要添加Windows系统变量CUDNN以及CUDNN的路径:https ://user-images.githubusercontent.com/4096485/53249764-019ef880-36ca-11e9-8ffe-d9cf47e7e462.jpg

1.1. 查找文件opencv_world320.dll和opencv_ffmpeg320_64.dll(或opencv_world340.dll和opencv_ffmpeg340_64.dll)C:\opencv_3.0\opencv\build\x64\vc14\bin并放在附近darknet.exe

1.2. 检查是否存在bin和include文件夹C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0,然后从安装CUDA的路径将复制到此文件夹

1.3. 要安装CUDNN(加速神经网络),请执行以下操作:

o   下载并安装CUD 10.0cuDNN v7.4.1https//developer.nvidia.com/rdp/cudnn-archive

o   添加CUDNN具有CUDNN路径的Windows系统变量:https ://user-images.githubusercontent.com/4096485/53249764-019ef880-36ca-11e9-8ffe-d9cf47e7e462.jpg

o   将文件复制cudnn64_7.dll到\build\darknet\x64附近的文件夹darknet.exe

1.4. 如果要在没有CUDNN的情况下进行构建,请:打开\darknet.sln->(右键单击项目)->属性-> C / C ++->预处理程序->预处理程序定义,然后删除:CUDNN;

2.      如果有其版本的CUDA(不是10.0build\darknet\darknet.vcxproj,请使用记事本打开,用“ CUDA 10.0”找到2个位置,并将其更改为CUDA版本。然后打开\darknet.sln->(右键单击项目)->属性-> CUDA C / C ++->设备,然后将其删除;compute_75,sm_75。然后执行步骤1

3.      如果没有GPU,但是拥有OpenCV 3.0(路径:C:\opencv_3.0\opencv\build\include&C:\opencv_3.0\opencv\build\x64\vc14\lib),则打开build\darknet\darknet_no_gpu.sln,设置x64Release,然后执行以下操作:Build-> Build darknet_no_gpu

4.      如果使用的是OpenCV 2.4.13而不是3.0,则应在\darknet.sln打开后更改路径

4.1(右键单击项目)->属性-> C / C ++->常规->其包含目录: C:\opencv_2.4.13\opencv\build\include

4.2(右键单击项目)->属性->链接器->常规->其库目录: C:\opencv_2.4.13\opencv\build\x64\vc14\lib

5.      如果带有Tensor内核的GPU(nVidia Titan V / Tesla V100 / DGX-2及更高版本)加速检测3倍,训练2倍:\darknet.sln->(右键单击项目)->属性-> C / C ++->预处理程序->预处理程序定义,并在此处添加:CUDNN_HALF;

注意:仅在安装Visual Studio之后,才必须安装CUDA。

如何编译(自定义):

另外,可以为CUDA 9.1和OpenCV 3.0 创建自己的darknet.sln&darknet.vcxproj例子

然后添加到创建的项目中:

  • (右键单击项目)->属性-> C / C ++->常规->其包含目录,放在这里:

C:\opencv_3.0\opencv\build\include;..\..\3rdparty\include;

%(AdditionalIncludeDirectories);

$(CudaToolkitIncludeDir);$(CUDNN)\include

C:\opencv_3.0\opencv\build\x64\vc14\lib;

$(CUDA_PATH)\lib\$(PlatformName);

$(CUDNN)\lib\x64;%(AdditionalLibraryDirectories)

  • (右键单击项目)->属性->链接器->输入->其依赖项,放在这里:

..\..\3rdparty\lib\x64\pthreadVC2.lib;cublas.lib;curand.lib;cudart.lib;cudnn.lib;%(AdditionalDependencies)

  • (右键单击项目)->属性-> C / C ++->预处理程序->预处理程序定义

OPENCV;_TIMESPEC_DEFINED;_CRT_SECURE_NO_WARNINGS;_CRT_RAND_S;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)

  • 编译为.exe(X64和Release)并使用.exe将.dll-s放在附近:https : //hsto.org/webt/uh/fk/-e/uhfk-eb0q-hwd9hsxhrikbokd6u.jpeg

  • pthreadVC2.dll, pthreadGC2.dll 来自\ 3rdparty \ dll \ x64

  • cusolver64_91.dll, curand64_91.dll, cudart64_91.dll, cublas64_91.dll -91(对于CUDA 9.1或版本),来自C:\ Program Files \ NVIDIA GPU Computing Toolkit \
    CUDA \ v9.1 \ bin

  • 对于OpenCV的3.2:opencv_world320.dll与opencv_ffmpeg320_64.dll从C:\opencv_3.0\opencv\build\x64\vc14\bin

  • 对于OpenCV的2.4.13: opencv_core2413.dll,opencv_highgui2413.dll并opencv_ffmpeg2413_64.dll从C:\opencv_2.4.13\opencv\build\x64\vc14\bin

训练方法(Pascal VOC资料):

1.      下载卷积层的预训练权重(154 MB):http : //pjreddie.com/media/files/darknet53.conv.74并放入目录build\darknet\x64

2.      下载Pascal VOC数据并将其解压缩到目录中,build\darknet\x64\data\voc将创建dir build\darknet\x64\data\voc\VOCdevkit\:

o  
http://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar

o  
http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar

o  
http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar

2.1将文件下载voc_label.py到dir build\darknet\x64\data\voc:http : //pjreddie.com/media/files/voc_label.py

3.      下载并安装适用于Windows的Python:https//www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe

4.      运行命令:(python
build\darknet\x64\data\voc\voc_label.py生成文件:2007_test.txt,2007_train.txt,2007_val.txt,2012_train.txt,2012_val.txt)

5.      运行命令: type 2007_train.txt
2007_val.txt 2012_*.txt > train.txt

6.      设置batch=64并subdivisions=8在文件中yolov3-voc.cfg:链接

7.      使用train_voc.cmd或使用命令行开始训练:

darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg
darknet53.conv.74

注意:要禁用Loss-Window use标志-dont_show。如果使用的是CPU,请尝试使用darknet_no_gpu.exe代替darknet.exe。)

如果需要,请更改文件中的路径 build\darknet\cfg\voc.data

有关链接的训练的更多信息:http : //pjreddie.com/darknet/yolo/#train-voc

注意:如果在训练过程中看到(损失)字段的nan值avg-则训练有误,但如果出现nan在其行中-则训练进行得很好。

如何使用多GPU进行训练:

1.      首先在1个GPU上进行1000次迭代训练: darknet.exe
detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

2.      然后停止并通过使用部分训练的模型/backup/yolov3-voc_1000.weights运行训练来进行multigpu(最多4个GPU):darknet.exe detector train cfg/voc.data cfg/yolov3-voc.cfg /backup/yolov3-voc_1000.weights
-gpus 0,1,2,3

仅对于小型数据集,有时对于4个GPU集learning_rate =
0.00025(例如,learning_rate = 0.001 / GPU)而言,降低学习率会更好。在这种情况下burn_in = and max_batches =在cfg文件中增加4倍的时间。即使用burn_in = 4000代替1000。 Same
goes for steps= if policy=steps is set.。

https://groups.google.com/d/msg/darknet/NbJqonJBTSY/Te5PfIpuCAAJ