构建YOLOv4容器
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
images/IMG_9255.JPG
images/IMG_9266.JPG
images/IMG_9280.JPG
images/IMG_9263.JPG
close
open
classes= 2
train = cfg/train.txt
valid = cfg/valid.txt
names = cfg/voc.names
backup = weights
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
#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
训练
cd project
../darknet detector train cfg/voc.data cfg/yolov4.cfg ../yolov4.conv.137 -mjpeg_port 8090 -map -dont_show
预测
../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
参考资料