# ComparisonExperiment **Repository Path**: Do_yourself_maxin/comparison-experiment ## Basic Information - **Project Name**: ComparisonExperiment - **Description**: 不同目标检测模型在江豚数据集上的测试对比 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-22 - **Last Updated**: 2023-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ComparisonExperiment #### 介绍 《基于机器学习的江豚检测跟踪与行为分析》论文2.4.2节中不同目标检测模型在江豚数据集上的测试对比 #### 软件架构 - YOLOV2-YOLOV4以官方Darknet版本(c++版本)为基准进行训练和测试。 - Fast-RCNN和Faster-RCNN以mmdetection框架为基准进行训练和测试。 - CenterNet重新编译高版本DCN,以适用于30系显卡的训练和测试。 #### 安装教程 #### 一、 Darknet安装教程 > 在Windows平台使用Cmake编译Darknet: - 下载Visual Studio:`https://visualstudio.microsoft.com/`,操作如图所示。 - 打开下载好的`Visual Studio Installer.exe` 会弹出以下界面:
此时点击“继续”。它会开始准备 Visual Studio 安装程序。若进度卡在0不动,可更改修改本机ipv4地址的dns配置:设置->网络和Internet->更改适配器选项->双击自己的网络(网线连接选择以太网,wifi连接选择WALN)->点击属性->双击Internet协议版本4->使用下面的DNS服务器地址。修改如下: > 首选DNS服务器:114.114.114.114 > 备选DNS服务器:8.8.8.8 准备完成后,会跳出以下界面: 勾选**使用C++的桌面开发**,然后点击安装,等待安装完成。 - 下载安装Cmake:`https://cmake.org/`,操作如图所示。 下载完成后,运行安装程序进行安装,安装过程在此不做过多赘述。 - 编译Opencv:此过程在此不做过多赘述,可参考Windows平台下OpenCV源码编译的步骤进行编译。 - 安装CUDA和CUDNN:此过程不在此做过多赘述,可参考这个教程的步骤进行安装。 - 克隆Darknet项目到本地 ```` git clone https://github.com/AlexeyAB/darknet.git ```` - 打开Cmake配置Darknet项目并编译: 操作步骤如下图所示。 1. 打开Cmake程序,点击`Browse Source` 选择darknet项目所在的目录,本文的路径 `D:\MyCode\darknet` 可供参考。 2. 点击 `Browse Build` 选择编译后的文件存放的路径,本文的路径 `D:\MyCode\darknet_build` 可供参考。 3. 点击`Configure` 按钮进行配置,点击后会弹出以下界面,在`Specify the generator of this project`下拉框中根据安装的Visual Studio版本进行选择,若安装的版本是`Visual Studio 2022` 就选择 `Visual Studio 17 2022`;在`Optional platform for generator`选项中选择`x64`。
4. 点击Finish后,一般会报错,如下图所示。
那是因为没有配置Opencv路径所导致的,此时点击OK,然后在`Search`搜索框中搜索`OpenCV_DIR`,接着双击`OpenCV_DIR`这个条目,在右侧会出现三个点的按钮,如下图所示。点击这个按钮选择Opencv编译后生成的静态库所在的路径,最后再次点击`Configure` ,直到不再报错后,点击`Generate` 再点击`Open Project` 完成Cmake中的配置。
5. 在点击完`Open Project`按钮后,会弹出`Visual Studio`界面,在上方菜单栏中选择`x64`和`Release` ,然后点击生成->生成解决方案,开始编译,如下图所示。编译过程会比较耗时,只需慢慢等待编译完成即可。
> 在Linux平台编译Darknet: - 克隆darknet项目到本地: ```` git clone https://github.com/AlexeyAB/darknet.git ```` - 安装CUDA和CUDNN:此过程不在此做过多赘述,可参考Linux安装CUDA教程的步骤进行安装 - 进入到项目文件夹: `cd darknet` - 修改Makefile: 使用`vim Makefile`命令打开Makefile文件,修改是否使用GPU、CUDNN和OPENCV(一般都使用,改为1),以及CUDA和CUDNN的头文件以及库文件路径,如下所示: ```` GPU=1 CUDNN=1 CUDNN_HALF=0 OPENCV=1 AVX=0 OPENMP=0 LIBSO=1 ZED_CAMERA=0 ZED_CAMERA_v2_8=0 ifeq ($(GPU), 1) COMMON+= -DGPU -I/mnt/sdb/mx/cuda-11.1/include/ #此处为cuda的头文件路径,默认为/usr/local/cuda/include/ 可根据自身情况进行修改 CFLAGS+= -DGPU ifeq ($(OS),Darwin) #MAC LDFLAGS+= -L/usr/local/cuda/lib -lcuda -lcudart -lcublas -lcurand else LDFLAGS+= -L/mnt/sdb/mx/cuda-11.1/lib64 -lcuda -lcudart -lcublas -lcurand #此处为cuda的库路径,默认为/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand 可根据自身情况修改 endif endif ifeq ($(CUDNN), 1) COMMON+= -DCUDNN ifeq ($(OS),Darwin) #MAC CFLAGS+= -DCUDNN -I/usr/local/cuda/include LDFLAGS+= -L/usr/local/cuda/lib -lcudnn else CFLAGS+= -DCUDNN -I/mnt/sdb/mx/cuda-1.1/include #此处为CUDNN的头文件路径,默认为/usr/local/cudnn/include 可根据自身情况修改 LDFLAGS+= -L/mnt/sdb/mx/cuda-11.1/lib64 -lcudnn #此处为CUDNN的库文件路径,默认为/usr/local/cudnn/lib64 可根据自身情况修改 endif endif ```` 本文CUDA版本为**11.1**,路径位于`/mnt/sdb/mx/cuda-11.1` ,本文所做修改可供参考,如下图所示。
- 修改完Makefile文件后, 在终端输入`make`命令进行编译。 #### 二、 训练并测试YOLOV2-YOLOV4(推荐在服务器也就是Linux平台进行训练) 训练YOLOV4: 0. YOLOV4的配置文件路径是 `darknet/cfg/yolov4-custom.cfg` 需要预先下载预训练模型,预训练模型已上传至百度网盘,可点击这里进行下载,提取码:`1rqp` 1. 创建名为`yolo-obj.cfg`的文件,并将`yolov4-custom.cfg`文件中的内容全部复制到`yolo-obj-.cfg`文件中,创建文件可通过`touch yolo-obj.cfg`命令进行创建,完成上述步骤后,打开`yolo-obj.cfg`文件并做如下修改: - 将`Training`那一行前的`#`符号删除 - 将`max_batches`那一行中的`max_batches`修改为(`classes*2000`,不应该低于这个值)。例如:本文训练的江豚检测模型,类别为**1** ,`max_batches`应设置为`max_batches=2000`,不得低于2000这个值。 - 将steps那一行修改为`max_batches`的80%和90%。例如本文训练的江豚检测模型`max_batches=2000`,则steps应该修改为`steps=1600,1800` - 将网络的输入尺寸修改为`width=416,height=416`,或者任何32的倍数(原则上不低于416,不然精度会降低),本文设置的尺寸为`width=608,height=608` - 将`classes=80`这一行修改为,检测的类别个数。例如本文的江豚检测模型,类别为1,应设置为`classes=1`,总共需要修改3处,分别在970行、1058行和1146行附近。 - 将位于`[convolutional]`和`[yolo]`之间的`filters=255`这一行修改为`(classes+5)x3`。例如本文的江豚检测模型,类别为1,应设置为`filters=18`,共需修改3处,分别在963行、1051行和1139行附近。 2. 在`build\darknet\x64\data\`路径下创建名为`obj.names`的文件,在文件中输入检测类别的名字。例如,本文的江豚检测任务,`obj.names`文件中的内容为`Neophocaena`(江豚的英文名) 3. 在`build\darknet\x64\data\`路径下,创建名为`obj.data`的文件,文件中应包含以下内容: ```` classes = 1 #根据检测类别修改,本文为1 train = data/train.txt #训练集路径 valid = data/test.txt #验证集路径 names = data/obj.names #类别名文件路径 backup = backup/ #训练得到的模型存放的路径 ```` 4. 将数据集图片放到`build\darknet\x64\data\obj`下,若没有obj这个文件夹,创建一个即可。 5. 将数据集标签(txt文件)放到`build\darknet\x64\data\obj`下。 6. 训练: - windows环境可在`cmd`命令行中输入以下命令进行训练: ```` darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 ```` - Linux环境可在终端中输入以下命令进行训练: ```` ./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 ```` 7. 多GPU训练:可在训练命令后加上`gpus`参数指定gpu的序号(此处假定有4张显卡) - Windows环境: ```` darknet.exe detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -gpus 0,1,2,3 ```` - Linux环境: ```` ./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -gpus 0,1,2,3 ```` 8. 训练完成后会在`build\darknet\x64\backup\` 路径下生成名为`yolo-obj_final.weights`的模型权重文件。 9. 测试精度: - Windows环境: ```` darknet.exe detector valid data/obj.data yolo-obj.cfg backup/yolo-obj_final.weights ```` - Linux环境: ```` ./darknet detector valid data/obj.data yolo-obj.cfg backup/yolo-obj_final.weights ```` 10. 测试FPS: ```` darknet.exe detector demo data/obj.data yolo-obj.cfg backup/yolo-obj_final.weights test.mp4 -dont_show -ext_output ```` - Linux环境: ```` ./darknet detector demo data/obj.data yolo-obj.cfg backup/yolo-obj_final.weights test.mp4 -dont_show -ext_output ```` 训练YOLOV3: 0. 下载预训练模型:已上传至百度网盘,点击这里进行下载,提取码:`nson` 其他步骤和训练YOLOV4步骤基本一致,只第一步中需将`darknet/cfg/yolov3.cfg`中的内容复制到自己创建的cfg文件中。 训练YOLOV2: 0. 下载预训练模型:已上传至百度网盘,点击这里进行下载,提取码:`5ljd` 1. 将数据集格式从yolo格式转换为voc格式:本文一提供转换脚本,位于`src/yolo2voc.py`中。 - 可通过以下命令运行`src/yolo2voc.py`实现数据集格式的转换。 ```` python yolo2voc.py --yolo_label ./labels --voc_label ./Annotations --img_path ./images --classes Neophocaena --task_id 0 --yolo_label yolo格式的数据集标签文件的路径,默认为./labels 根据自身情况修改 --voc_label 生成voc格式数据集的路径,默认为./Annotations 可随意指定 --img_path 数据集图片的路径,默认为./images 根据自身情况指定 -- classes 数据集类别名称,根据自身情况指定,本文为江豚,所以设置为Neophocaena ```` - 转换数据集格式后,可通过以下命令生成`train.txt`和`val.txt`: ```` python yolo2voc.py --main_path ./Main --task_id 1 --main_path 转换数据集后Main文件夹所在路径 ```` 2. 修改`darknet/cfg/voc.data`文件,修改内容如下: ```` classes= 1 #根据自身情况设置,本文为1 train = /train.txt # train.txt文件所在路径,根据自身情况设置 valid = /val.txt # val.txt文件所在路径,根据自身情况设置 names = data/voc.names # 类别名称,根据自身情况修改文件中的内容,本文为Neophocaena backup = /home/pjreddie/backup/ # 训练好的模型存放路径,可自行设置。 ```` 3. 修改`darknet/cfg/yolo-voc.2.0.cfg`文件,有两处需要修改: - `classes=N`(N为类别数,本文为1) - 最后一个`[convolutional]`层中`filters=(classes+4+1)x5`本文设置为`filters=30` 4. 训练: - Windows平台: ```` darknet.exe detector train cfg/voc.data yolo-voc.2.0.cfg darknet19_448.conv.23 ```` - Linux平台: ```` ./darknet detector train cfg/voc.data yolo-voc.2.0.cfg darknet19_448.conv.23 ```` 5. 多GPU训练:同上 6. 测试精度: - Windows平台: ```` darknet.exe detector valid cfg/voc.data yolo-voc.2.0.cfg backup/yolo-voc_final.weights ```` - Linux平台: ```` ./darknet detector valid cfg/voc.data yolo-voc.2.0.cfg backup/yolo-voc_final.weights ```` 7. 测试FPS: ```` darknet.exe detector demo cfg/voc.data yolo-voc.2.0.cfg backup/yolo-voc_final.weights test.mp4 -dont_show -ext_output ```` - Linux平台: ```` ./darknet detector demo cfg/voc.data yolo-voc.2.0.cfg backup/yolo-voc_final.weights test.mp4 -dont_show -ext_output ```` #### 三、 MMDetection安装教程 0. 从Miniconda官网下载并安装Miniconda 1. 创建conda虚拟环境并激活 ```` conda create --name openmmlab python=3.8 -y conda activate openmmlab ```` 2. 从Pytoch官网下载并安装Pytoch,在此不做过多赘述 3. 使用`MIM`安装`MMEngine`和`MMCV`: ```` pip install -U openmim mim install mmengine mim install "mmcv>=2.0.0" ```` 4. 安装MMDetection: ```` git clone https://github.com/open-mmlab/mmdetection.git cd mmdetection pip install -v -e . ```` #### 四、 训练并测试Fast-RCNN和Faster-RCNN 训练并测试Fast-RCNN: 0. 开始训练前需将数据集格式从yolo格式转换为coco格式,本文已提供转换脚本,位于`src/yolo2coco.py`中,可通过以下命令运行,实现格式的转换: ```` python yolo2coco.py --root_dir ./data --ramdom_split --root_dir yolo格式的数据集所在的路径,需要根据自身情况修改 ```` 1. 格式转换过后,会在`annotations`文件夹下生成`train.json`、`val.json`、`test.json`三个文件,需将这三个文件重命名为`instances_train2017.json`、`instances_val2017.json`、`instances_test2017.json` 2. 在训练Fast-RCNN之前,需首先训练RPN,并使用RPN提取区域建议。在RPN配置文件(`configs/rpn/fast-rcnn_r50_fpn_1x_coco.py`)中将`test_evaluator`的类型更改为`DumpProposals`,以获得如下区域方案。 - 获取训练图像区域建议的配置修改如下: ```` # For training set val_dataloader = dict( dataset=dict( ann_file='data/coco/annotations/instances_train2017.json', data_prefix=dict(img='val2017/'))) val_dataloader = dict( _delete_=True, type='DumpProposals', output_dir='data/coco/proposals/', proposals_file='rpn_r50_fpn_1x_train2017.pkl') test_dataloader = val_dataloader test_evaluator = val_dataloader ```` - 获取测试图像区域建议的配置修改如下: ```` # For validation set val_dataloader = dict( _delete_=True, type='DumpProposals', output_dir='data/coco/proposals/', proposals_file='rpn_r50_fpn_1x_val2017.pkl') test_evaluator = val_dataloader ```` - 可用以下命令提取区域建议: ```` ./tools/dist_test.sh \ configs/rpn_r50_fpn_1x_coco.py \ checkpoints/rpn_r50_fpn_1x_coco_20200218-5525fa2e.pth \ 8 ```` 3. 修改Fast-RCNN配置文件(`configs/fast-rcnn/fast-rcnn_r50_fpn_1x_coco.py`)中`proposal_file`的路径,并使用`ProposalBroadcaster`处理真实边界框和提取的区域建议。本文修改的示例如下所示,可供参考: ```` train_pipeline = [ dict( type='LoadImageFromFile', backend_args={{_base_.backend_args}}), dict(type='LoadProposals', num_max_proposals=2000), dict(type='LoadAnnotations', with_bbox=True), dict( type='ProposalBroadcaster', transforms=[ dict(type='Resize', scale=(1333, 800), keep_ratio=True), dict(type='RandomFlip', prob=0.5), ]), dict(type='PackDetInputs') ] test_pipeline = [ dict( type='LoadImageFromFile', backend_args={{_base_.backend_args}}), dict(type='LoadProposals', num_max_proposals=None), dict( type='ProposalBroadcaster', transforms=[ dict(type='Resize', scale=(1333, 800), keep_ratio=True), ]), dict( type='PackDetInputs', meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 'scale_factor')) ] train_dataloader = dict( dataset=dict( proposal_file='data/coco/proposals/rpn_r50_fpn_1x_train2017.pkl', pipeline=train_pipeline)) val_dataloader = dict( dataset=dict( proposal_file='data/coco/proposals/rpn_r50_fpn_1x_val2017.pkl', pipeline=test_pipeline)) test_dataloader = val_dataloader ```` 4. 训练Fast-RCNN模型 ```` python tools/train.py configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py ```` 5. 多GPU训练 ```` bash ./tools/dist_train.sh \ ${CONFIG_FILE} \ ${GPU_NUM} \ [optional arguments] ```` 6. 测试及推理: ```` python tools/test.py configs/fast_rcnn/fast_rcnn_r50_fpn_1x_coco.py work_dirs/faster_rcnn_r50_fpn_1x_coco/latest.pth ```` 7. FPS测试: ```` python -m torch.distributed.launch --nproc_per_node=1 --master_port=29500 tools/analysis_tools/benchmark.py \ configs/faster_rcnn/fast-rcnn_r50_fpn_1x_coco.py \ work_dirs/faster_rcnn_r50_fpn_1x_coco/latest.pth \ --launcher pytorch ```` 训练并测试Faster-RCNN: 同上。 #### 五、 训练并测试CenterNet 0. 创建虚拟环境并激活: ```` conda create --name CenterNet python=3.6 conda activate CenterNet ```` 1. 安装Pytorch:此步骤在此不做过多赘述。 2. 安装COCOAPI:依次执行以下命令 ```` # 本文COOCAPI的安装路径为:`mnt/sdb/mx/cocoapi` 可供参考 git clone https://github.com/cocodataset/cocoapi.git cd cocoapi/PythonAPI make python setup.py install --user ```` 3. 克隆CenterNet到本地: ```` git clone https://github.com/xingyizhou/CenterNet.git ```` 4. 安装必要的依赖: ```` cd CenterNet pip install -r requirements.txt ```` 5. 编译可变形卷积组件: ```` cd CenterNet/src/lib/models/networks rm -r DCNv2 git clone https://github.com/clearlove7-piggy/DCNv2_latest.git cd DCNv2 python setup.py build develop ```` 6. 编译NMS组件: ```` cd CenterNet/src/lib/external make ```` 7. 在CenterNet文件夹下创建`models`文件夹,并将下载好的预训练模型放到改文件夹下,点击这里下载预训练模型,提取码:`d4nc` 8. 训练CenterNet:运行以下命令训练CenterNet ```` python src/main.py ctdet --exp_id coco_dla --batch_size 32 --master_batch 15 --lr 1.25e-4 --gpus 0,1 ```` 9. 测试模型性能: ```` python src/test.py ctdet --exp_id coco_dla --keep_res --load_model ../models/ctdet_coco_dla_2x.pth ```` #### 五、 本文中不同目标检测模型在江豚数据集上的性能测试结果
模型 mAP(%) Recall(%) FPS(帧/s)
YOLOV5 92.5 94.1 172
YOLOV4 91.7 91.1 97
YOLOV3 88.5 86.3 54
YOLOV2 83.2 84.1 46
Fast-RCNN 91.9 60.2 35
Faster-RCNN 96.4 72.8 43
CenterNet 92.1 67.3 56
#### 参考 > Paper: - Objects as Points - Fast R-CNN - Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks - YOLOv4: Optimal Speed and Accuracy of Object Detection > Code: - darknet - mmdetection - CenterNet