YOLO 算法是非常著名的目标检测算法。从其全称 You Only Look Once: Unified, Real-Time Object Detection ,可以看出它的特性:Look Once: one-stage (one-shot object detectors) 算法,把目标检测的两个任务分类和定位一步完成。

Unified: 统一的架构,提供 end-to-end 的训练和预测。

Real-Time: 实时性,初代论文给出的指标 FPS 45 , mAP 63.4 。

YOLOv4: Optimal Speed and Accuracy of Object Detection ,于今年 4 月公布,采用了很多近些年 CNN 领域优秀的优化技巧。其平衡了精度与速度,目前在实时目标检测算法中精度是最高的。

论文地址:

源码地址:

本文将介绍 YOLOv4 官方 Darknet 实现,如何于 Docker 编译使用。以及从 MS COCO 2017 数据集中怎么选出部分物体,训练出模型。

主要内容有:准备 Docker 镜像

准备 COCO 数据集

用预训练模型进行推断

准备 COCO 数据子集

训练自己的模型并推断

参考内容

准备 Docker 镜像

之后,开始准备镜像,从下到上的层级为:

nvidia/cuda

准备 Nvidia 基础 CUDA 镜像。这里我们选择 CUDA 10.2 ,不用最新 CUDA 11,因为现在 PyTorch 等都还都是 10.2 呢。

拉取镜像:docker pull nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04

测试镜像:$ docker run --gpus all nvidia/cuda:10.2-cudnn7-devel-ubuntu18.04 nvidia-smi

Sun Aug 8 00:00:00 2020

+-----------------------------------------------------------------------------+

| NVIDIA-SMI 440.100 Driver Version: 440.100 CUDA Version: 10.2 |

|-------------------------------+----------------------+----------------------+

| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |

| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |

|===============================+======================+======================|

| 0 GeForce RTX 208... Off | 00000000:07:00.0 On | N/A |

| 0% 48C P8 14W / 300W | 340MiB / 11016MiB | 2% Default |

+-------------------------------+----------------------+----------------------+

| 1 GeForce RTX 208... Off | 00000000:08:00.0 Off | N/A |

| 0% 45C P8 19W / 300W | 1MiB / 11019MiB | 0% Default |

+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+

| Processes: GPU Memory |

| GPU PID Type Process name Usage |

|=============================================================================|

+-----------------------------------------------------------------------------+

OpenCV

基于 nvidia/cuda 镜像,构建 OpenCV 的镜像:cd docker/ubuntu18.04-cuda10.2/opencv4.4.0/

docker build

-t joinaero/ubuntu18.04-cuda10.2:opencv4.4.0

--build-arg opencv_ver=4.4.0

--build-arg opencv_url=https://gitee.com/cubone/opencv.git

--build-arg opencv_contrib_url=https://gitee.com/cubone/opencv_contrib.git

.

Darknet

基于 OpenCV 镜像,构建 Darknet 镜像:cd docker/ubuntu18.04-cuda10.2/opencv4.4.0/darknet/

docker build

-t joinaero/ubuntu18.04-cuda10.2:opencv4.4.0-darknet

.

上述镜像已上传 Docker Hub 。如果 Nvidia 驱动能够支持 CUDA 10.2 ,那可以直接拉取该镜像:docker pull joinaero/ubuntu18.04-cuda10.2:opencv4.4.0-darknet

准备 COCO 数据集

图像,包括:

标注,包括:2017 Train/Val annotations [241MB]

2017 Stuff Train/Val annotations [1.1GB]

2017 Panoptic Train/Val annotations [821MB]

用预训练模型进行推断

运行镜像:xhost +local:docker

docker run -it --gpus all

-e DISPLAY

-e QT_X11_NO_MITSHM=1

-v /tmp/.X11-unix:/tmp/.X11-unix

-v $HOME/.Xauthority:/root/.Xauthority

--name darknet

--mount type=bind,source=$HOME/Codes/devel/datasets/coco2017,target=/home/coco2017

--mount type=bind,source=$HOME/Codes/devel/models/yolov4,target=/home/yolov4

joinaero/ubuntu18.04-cuda10.2:opencv4.4.0-darknet

进行推断:./darknet detector test cfg/coco.data cfg/yolov4.cfg /home/yolov4/yolov4.weights

-thresh 0.25 -ext_output -show -out /home/coco2017/result.json

/home/coco2017/test2017/000000000001.jpg

推断结果:

准备 COCO 数据子集

MS COCO 2017 数据集有 80 个物体标签。我们从中选取自己关注的物体,重组个子数据集。

首先,获取样例代码:git clone https://github.com/ikuokuo/start-yolov4.gitscripts/coco2yolo.py: COCO 数据集转 YOLO 数据集的脚本

scripts/coco/label.py: COCO 数据集的物体标签有哪些

cfg/coco/coco.names: 编辑我们想要的那些物体标签

之后,准备数据集:cd start-yolov4/

pip install -r scripts/requirements.txt

export COCO_DIR=$HOME/Codes/devel/datasets/coco2017

# train

python scripts/coco2yolo.py

--coco_img_dir $COCO_DIR/train2017/

--coco_ann_file $COCO_DIR/annotations/instances_train2017.json

--yolo_names_file ./cfg/coco/coco.names

--output_dir ~/yolov4/coco2017/

--output_name train2017

--output_img_prefix /home/yolov4/coco2017/train2017/

# valid

python scripts/coco2yolo.py

--coco_img_dir $COCO_DIR/val2017/

--coco_ann_file $COCO_DIR/annotations/instances_val2017.json

--yolo_names_file ./cfg/coco/coco.names

--output_dir ~/yolov4/coco2017/

--output_name val2017

--output_img_prefix /home/yolov4/coco2017/val2017/

数据集,内容如下:~/yolov4/coco2017/

├── train2017/

│ ├── 000000000071.jpg

│ ├── 000000000071.txt

│ ├── ...

│ ├── 000000581899.jpg

│ └── 000000581899.txt

├── train2017.txt

├── val2017/

│ ├── 000000001353.jpg

│ ├── 000000001353.txt

│ ├── ...

│ ├── 000000579818.jpg

│ └── 000000579818.txt

└── val2017.txt

训练自己的模型并推断

准备必要文件Edit: keep desired objects

Download yolov4.cfg, then changed:

batch=64, subdivisions=32 <32 for 8-12 GB GPU-VRAM>

width=512, height=512

classes=

max_batches=

steps=

filters=

filters=

Edit: train, valid to YOLO datas

csdarknet53-omega.conv.105docker run -it --rm --gpus all

--mount type=bind,source=$HOME/Codes/devel/models/yolov4,target=/home/yolov4

joinaero/ubuntu18.04-cuda10.2:opencv4.4.0-darknet

./darknet partial cfg/csdarknet53-omega.cfg /home/yolov4/csdarknet53-omega_final.weights /home/yolov4/csdarknet53-omega.conv.105 105

训练自己的模型

运行镜像:cd start-yolov4/

xhost +local:docker

docker run -it --gpus all

-e DISPLAY

-e QT_X11_NO_MITSHM=1

-v /tmp/.X11-unix:/tmp/.X11-unix

-v $HOME/.Xauthority:/root/.Xauthority

--name darknet

--mount type=bind,source=$HOME/Codes/devel/models/yolov4,target=/home/yolov4

--mount type=bind,source=$HOME/yolov4/coco2017,target=/home/yolov4/coco2017

--mount type=bind,source=$PWD/cfg/coco,target=/home/cfg

joinaero/ubuntu18.04-cuda10.2:opencv4.4.0-darknet

进行训练:mkdir -p /home/yolov4/coco2017/backup

# Training command

./darknet detector train /home/cfg/coco.data /home/cfg/yolov4.cfg /home/yolov4/csdarknet53-omega.conv.105 -map

中途可以中断训练,然后这样继续:# Continue training

./darknet detector train /home/cfg/coco.data /home/cfg/yolov4.cfg /home/yolov4/coco2017/backup/yolov4_last.weights -map

yolov4_last.weights 每迭代 100 次,会被记录。

如果多 GPU 训练,可以在 1000 次迭代后,加参数 -gpus 0,1 ,再继续:# How to train with multi-GPU

# 1. Train it first on 1 GPU for like 1000 iterations

# 2. Then stop and by using partially-trained model `/backup/yolov4_1000.weights` run training with multigpu

./darknet detector train /home/cfg/coco.data /home/cfg/yolov4.cfg /home/yolov4/coco2017/backup/yolov4_1000.weights -gpus 0,1 -map

训练过程,记录如下:

加参数 -map 后,上图会显示有红线 mAP。

查看模型 mAP@IoU=50 精度:$ ./darknet detector map /home/cfg/coco.data /home/cfg/yolov4.cfg /home/yolov4/coco2017/backup/yolov4_final.weights

...

Loading weights from /home/yolov4/coco2017/backup/yolov4_final.weights...

seen 64, trained: 384 K-images (6 Kilo-batches_64)

Done! Loaded 162 layers from weights-file

calculation mAP (mean average precision)...

Detection layer: 139 - type = 27

Detection layer: 150 - type = 27

Detection layer: 161 - type = 27

160

detections_count = 745, unique_truth_count = 190

class_id = 0, name = train, ap = 80.61% (TP = 142, FP = 18)

for conf_thresh = 0.25, precision = 0.89, recall = 0.75, F1-score = 0.81

for conf_thresh = 0.25, TP = 142, FP = 18, FN = 48, average IoU = 75.31 %

IoU threshold = 50 %, used Area-Under-Curve for each unique Recall

mean average precision (mAP@0.50) = 0.806070, or 80.61 %

Total Detection Time: 4 Seconds

进行推断:./darknet detector test /home/cfg/coco.data /home/cfg/yolov4.cfg /home/yolov4/coco2017/backup/yolov4_final.weights

-ext_output -show /home/yolov4/coco2017/val2017/000000006040.jpg

推断结果:

参考内容

结语

为什么用 Docker ? Docker 导出镜像,可简化环境部署。如 PyTorch 也都有镜像,可以直接上手使用。

关于 Darknet 还有什么? 下回介绍 Darknet 于 Ubuntu 编译,及使用 Python 接口 。

Let's go coding ~

coco训练集darknet_YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集相关推荐

  1. 机器学习中的训练集 验证集 测试集的关系

    1.划分测试集目的 为了了解一个模型对新样本的泛化能力,唯一的办法是:让已经训练好的模型真正的处理新的样本. 解决方法: 将原始数据划分成两个部分:训练集 测试集.可以使用训练集来训练模型,然后用测试 ...

  2. 【入门篇】如何正确使用机器学习中的训练集、验证集和测试集?

    [注] ·本文为转载文章,原文作者是王树义老师,原文链接为 https://zhuanlan.zhihu.com/p/71961236 训练集.验证集和测试集,林林总总的数据集合类型,到底该怎么选.怎 ...

  3. 一个训练集未知的神经网络

    如有一个神经网络已经训练好了,则可以通过改变测试集与训练集相似程度的办法改变这个网络的分类准确率. (0,1)---m*n*k---(1,0)(0,1) 比如一个分类0和1的网络,如果测试集的图片写的 ...

  4. voc格式的图片训练集相对普通训练集有何优点?

    原提问: voc格式的图片训练集相对普通训练集有何优点? 描述: 普通的训练集指的是包含一堆一一对应的.jpg文件和.txt位置框信息文件,还有train.txt和test.txt以及obj.name ...

  5. 训练集样本不平衡问题对CNN的影响

    转载自  训练集样本不平衡问题对CNN的影响 训练集样本不平衡问题对CNN的影响 本文首发于知乎专栏"ai insight"! 卷积神经网络(CNN)可以说是目前处理图像最有力的工 ...

  6. 华为推出全球最快AI训练集群Atlas 900,算力超群

    9月18日,华为全联接2019(HUAWEI CONNECT)大会上,华为副董事长胡厚崑发布了Atlas 900 AI训练集群,以超强算力带给企业人工智能业务的极致体验.世界正从数字化向智能化转型,人 ...

  7. 训练集、验证集和测试集的概念及划分原则

    深度学习中,常将可得的数据集划分为训练集(training set),验证集(development set/validation set)和测试集(test set).下文主要回答以下几个问题:一是 ...

  8. 使用resnet, inception3进行fine-tune出现训练集准确率很高但验证集很低的问题

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 最近用keras跑基于resnet50,inception3的一些迁移学习的实验,遇到一些问题 ...

  9. 【已解决】使用keras对resnet, inception3进行fine-tune出现训练集准确率很高但验证集很低的问题(BN)

    最近用keras跑基于resnet50,inception3的一些迁移学习的实验,遇到一些问题.通过查看github和博客发现是由于BN层导致的,国外已经有人总结并提了一个PR(虽然并没有被merge ...

最新文章

  1. [Google API](4)搜索结果
  2. android双重for循环,Android实现ViewPager无限循环效果(二)
  3. jquery地址栏链接与a标签链接匹配添加样式!
  4. php还原json,PHP语言中使用JSON和将json还原成数组
  5. 计算机网络——HTTP协议和Web
  6. Android 系统性能优化(24)--布局优化
  7. getgrgid()函数
  8. Javawbe的实战案例
  9. 广告关闭php,电脑右下角的广告怎么去掉
  10. 审计人员需要哪些计算机知识,审计人员应具备的知识与技能
  11. 二极管的分类、电路符号及万用表测发光二极管正负极
  12. 《神经网络与深度学习》读书笔记(不完全)
  13. unity游戏开发之谷歌上架准备
  14. Enhancing Diversity in Teacher-Student Networks via Asymmetric branches for Unsupervised reid论文解读
  15. 什么是浏览器指纹? 浏览器指纹技术应用有哪些?
  16. Linux常用命令——modprobe命令
  17. 通信工程专业就业之------通信协议栈开发(LTE/NR)
  18. Smells and Heuristics
  19. python中的copy.deepcopy()
  20. python摩斯电码,列表简单使用

热门文章

  1. oracle简易数据库搭建,Oracle 10g 手工创建一个最简单的数据库
  2. OpenShift 4 - 在控制台中安装使用 Web Terminal
  3. OpenShift 4 - 创建Service Mesh运行环境
  4. OpenShift 4 之通过ImageTrigger自动构建变化级联镜像
  5. (一)在Azure上创建完整的无服务器云原生应用程序
  6. .NET Core 3.0 Preview 6 发布,新增用于 ARM64 的 Alpine Docker 镜像
  7. ASP.NET项目中的驼峰格式JSON响应
  8. 加速ASP.NET Core WEB API应用程序——第1部分
  9. ajax表单图片,js中使用ajax上传一个带有图片的表单数据
  10. 关于ssm框架的整理(三) 2021-05-11