目录

构建YOLOv4容器

  • 编写Dockerfile
FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
LABEL maintainer="wang-junjian@qq.com"

#auto install tzdata(opencv depend)
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    git wget nano \
    libopencv-dev python3-opencv \
    && rm -rf /var/lib/apt/lists/*

#set your localtime
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

WORKDIR /
RUN git clone https://github.com/AlexeyAB/darknet.git

WORKDIR /darknet

#pre-trained weights-file for training
RUN wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137

#build darknet for GPU
RUN make GPU=1 CUDNN=1 CUDNN_HALF=1 OPENCV=1 LIBSO=1 && rm -rf obj

EXPOSE 8090

ENTRYPOINT ["bash"]
  • 构建容器
    docker build -t darknet:latest-gpu-yolov4 .
    

创建工程

  • 工程目录结构
    ├── yolov4.conv.137        预训练模型
    ├── darknet
    └── project             工程目录
      ├── backup          存储模型训练时权重值
      ├── cfg            配置目录
      │   ├── train.txt      存储用于训练的图像路径
      │   ├── valid.txt      存储用于验证的图像路径
      │   ├── voc.data       配置文件
      │   ├── voc.names      标签名
      │   └── yolov4.cfg      YOLOv4神经网络文件
      ├── data
      │   └── labels        预测时用于显示标签名字
      │       ├── 100_0.png
      │       ├── 100_1.png
      │       ├── ......
      │       └── make_labels.py
      ├── predictions        预测后的图像
      │   └── IMG_9256.jpg
      ├── test        测试图像
      │   └── IMG_9256.jpg
      ├── weights
      │   └── yolov4_final.weights 训练出来的模型
      └── images             图像样本集
          ├── IMG_9255.JPG
          ├── IMG_9255.txt
          ├── IMG_9263.JPG
          ├── IMG_9263.txt
          ├── IMG_9266.JPG
          ├── IMG_9266.txt
          ├── IMG_9280.JPG
          └── IMG_9280.txt
    
  • 训练的样本:train.txt
    images/IMG_9255.JPG
    images/IMG_9266.JPG
    images/IMG_9280.JPG
    
  • 验证的样本:valid.txt
    images/IMG_9263.JPG
    
  • 标注类型:voc.names
    close
    open
    
  • 配置文件:voc.data
    classes= 2
    train  = cfg/train.txt
    valid  = cfg/valid.txt
    names = cfg/voc.names
    backup = weights
    
  • 修改YOLO神经网络文件:yolov4.cfg
2行:batch=8
3行:subdivisions=8
5行:width=512
6行:height=512
#上面几行的修改主要是为了在GTX1060 6G的显卡上能够运行

19行:max_batches=2000

961行:filters=21    #(classes + 5)*3
968行:classes=2
1049行:filters=21
1056行:classes=2
1137行:filters=21
1144行:classes=2
  • 使用LabelImg标注图像样本集
    #python3 labelImg.py [图像目录] [标注名字文件] [标注目录]
    python3 labelImg.py project/yolos/ project/cfg/yolo.names
    

在容器中运行YOLOv4

#设置工程目录的环境变量
project_dir=""
docker run --runtime=nvidia -it --name=darknet-yolov4 --volume=$project_dir:/darknet/project -p 8090:8090 darknet:latest-gpu-yolov4

#使用本机的时区替换容器内的时区
docker run --runtime=nvidia -it --name=darknet-yolov4 --volume=/etc/localtime:/etc/localtime:ro --volume=$project_dir:/darknet/project -p 8090:8090 darknet:latest-gpu-yolov4

训练

  • mjpeg_port 训练过程可视化,通过访问http://127.0.0.1:8090/查看。
    cd project
    ../darknet detector train cfg/voc.data cfg/yolov4.cfg ../yolov4.conv.137 -mjpeg_port 8090 -map -dont_show
    

预测

  • thresh 设置阈值
    ../darknet detector test cfg/voc.data cfg/yolov4.cfg weights/yolov4_final.weights test/IMG_9256.JPG
    ../darknet detector test cfg/voc.data cfg/yolov4.cfg weights/yolov4_final.weights test/IMG_9256.JPG -thresh 0.5
    

参考资料