Scaled-YOLOv4:YOLOv4官方改进版!55.8% AP!
很新,我就测下
Github地址
Gitee 地址 推荐
新的改变
聚焦于针对 YOLOv4 的模型缩放(model scale)。
旗下有三款模型
-
YOLOv4-CSP(面向普通GPU) .;
-
YOLOv4-tiny(面向低端GPU);
-
YOLOv4-large(面向高端GPU)
1、下载
此处可以指定下载任意所需分支
git clone --branch [tags标签] [git地址]
git clone --branch yolov4-large https://gitee.com/guls/ScaledYOLOv4.git
文件夹内容如下:
-
utils :模型重要组成元件代码;
-
model :模型结构配置文件;
-
data :模型数据路径、类别、标签配置文件;
- train.py test.py detect.py
2、环境配置
项目文档中,提到可以进行docker环境进行训练和测试,如下
# create the docker container, you can change the share memory size if you have more.
nvidia-docker run --name yolov4_csp -it -v your_coco_path/:/coco/ -v your_code_path/:/yolo --shm-size=64g nvcr.io/nvidia/pytorch:20.06-py3
本着最简单,就在本地机器上进行训练。
-
Anaconda环境
pytorch版本没有什么限制,我使用的是pytorch==1.7,其他版本没测试,不过估计没什么问题,因为代码没指定版本
- install mish-cuda
install mish-cuda, if you use different pytorch version, you could try https://github.com/JunnYu/mish-cuda
代码
cd ScaledYOLOv4
git clone https://github.com/thomasbrandon/mish-cuda
或git clone https://gitee.com/lytlm1994/mish-cuda.git
cd mish-cuda
python setup.py build install
此处建议替换Gitee上的源码,你要说为什么?快就一个字
记住此处在进行编译之前,先将mish-cuda备份一次,后面会用到!
安装完成
3. 再次编译mish-cuda
文档中提到
For using pre-trained models:
所以,你要使用预训练模型,再安装一次叭!
可以尝试文档中介绍的下载方式
cd ScaledYOLOv4
git clone https://github.com/thomasbrandon/mish-cuda mc
cd mc
如果安装官方方式下载不下来,那就直接拷贝刚刚的备份文件叭
复制过去之后,就是接下来的步骤,简单重命名
# change all of name which is mish_cuda to mish_mish and build.
# 1. mc/src/mish_cuda -> mc/src/mish_mish
# 2. mc/csrc/mish_cuda.cpp -> mc/csrc/mish_mish.cpp
# 3. in mc/setup.py
# 3.1 line 5 -> 'csrc/mish_mish.cpp'
# 3.2 line 11 -> name='mish_mish'
# 3.3 line 20 -> 'mish_mish._C'
继续:
python setup.py build
# rename mc/build/lib.xxx folder to mc/build/lib
编译之后,你会发现,在mc >> build下面有如下样式文件夹
此时,将这两个文件夹中的 mish_mish 和 csrc文件夹剪切出来,粘贴在新建的lib文件夹下
好了,到此处为止,环境配置完全。
3、数据准备
安装data文件夹下各个yaml文件进行配置,常见的VOC数据集即可;
train: ../coco/train2017.txt # 训练txt,三类txt的内容格式一致。
val: ../coco/val2017.txt #
test: ../coco/testdev2017.txt #
每一行代表一张图片的路径
数据文件夹结构如下:
只需关注train和valid目录下的images 和 labels文件夹
images文件夹里面都是图片
labels文件夹里面是对应images图片同名的txt,如下
这是其中一个txt内容格式:
标签 xmin ymin xmax ymax
5 0.4817708333333333 0.4550925925925926 0.13125 0.23425925925925928
注意:我这里是用的yolov5的数据集,需要进行归一化处理,这里我没有还原成标准,这样是可以训练的
一张图片对应一个txt,图片里包含多少目标,txt里就会有多少行目标信息
4、训练、测试
先附上代码
python train.py --batch-size 8
--img 896 896
--data coco.yaml
--cfg yolov4-p5.yaml
--weights 'weights/yolov4-p5.pt'
--sync-bn --device 1,3
--name yolov4-p5
-
batch_size: 根据自己显存大小而定;
-
device:指定GPU序号;
-
img:图片大小,自己设定,建议先把自己的数据跑一遍;
-
data:准备好的数据配置文件,里面可以替换类别,txt路径,数量信息;
-
cfg: 模型配置文件,涉及到模型结构、优化器等训练参数,可以微调,最主要的是把nc参数给修改掉
-
name:模型名称,要和cfg、预训练模型weights一一对应起来
好,到这里为止,即可开始美好的训练了,如下
这些警告,和使用的pytorch版本有相关,但不影响训练
打印模型结构。。。
训练进程。。。
tips:docker操作
拉取目标镜像
docker pull nvcr.io/nvidia/pytorch:20.06-py3
此处,附上我常用的docker操作,方便查看
docker ps -a # 列出所有容器(包括已停止的容器)
docker start <CONTAINER ID|NAME> # 启动容器
docker stop <CONTAINER ID|NAME> # 停止容器
docker stop $(docker ps -a -q) # 停止所有容器
docker rm <CONTAINER ID|NAME> # 删除容器(必须是停止的)
docker rm $(docker ps -a -q) # 删除所有容器
docker rmi <IMAGE ID> # 删除镜像
docker exec -it 775c7c9ee1e1 /bin/bash # 使用docker exec进入Docker容器
docker search imagename # 查找镜像
docker pull imagename # 下载最新版
docker pull imagename:5.6 # 下载指定版本
docker images # 查看本地镜像
docker run imagename # 运行镜像
docker run -t -i ubuntu:15.10 /bin/bash # 使用版本为15.10的ubuntu系统镜像来运行容器
# docker run -d --name mynginx nginx #启动nginx镜像,没有会自动pull
# docker attach d20f3dc6cd92 #进入一个正在运行的容器
# docker stop bfd094233f96 #停止一个容器
docker stop $(docker ps -a -q) #停止所有的container,这样才能够删除其中的images:
docker rm bfd094233f96 #删除一个容器,默认并不会删除运行中的容器。所以删除容器前,必须先停止容器
docker rmi training/sinatra #删除本地镜像
docker rmi <image id> #删除镜像 删除前必须先停止所有的容器。image id可以通过docker images查看
docker rmi $(docker images -q) #删除全部image
docker rm $(docker ps -a -q) #如果想要删除所有container的话再加一个指令:
docker rmi $(docker images -q -f "dangling=true") #清理所有未打过标签的本地镜像,其中 -q 和 -f 是 quiet,–filter 的缩写
docker rmi $(docker images | grep "^<none>" | awk "{print $3}") # 删除所有id为<None>的镜像
docker logs [container ID or NAMES] # 获取容器的输出信息
docker cp container:path hostpath # 从容器内复制文件到指定的路径上
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
–name 使用一个自定义的名字