Scaled-YOLOv4:YOLOv4官方改进版!55.8% AP!

很新,我就测下

Github地址
Gitee 地址 推荐

新的改变

聚焦于针对 YOLOv4 的模型缩放(model scale)。
旗下有三款模型

  1. YOLOv4-CSP(面向普通GPU) .;
  2. YOLOv4-tiny(面向低端GPU)
  3. YOLOv4-large(面向高端GPU)
    在这里插入图片描述

1、下载

此处可以指定下载任意所需分支

git clone --branch [tags标签] [git地址]
git clone --branch yolov4-large https://gitee.com/guls/ScaledYOLOv4.git

在这里插入图片描述
文件夹内容如下:
在这里插入图片描述

  1. utils :模型重要组成元件代码;
  2. model :模型结构配置文件;
  3. data :模型数据路径、类别、标签配置文件;
  4. 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

本着最简单,就在本地机器上进行训练。

  1. Anaconda环境
    pytorch版本没有什么限制,我使用的是pytorch==1.7,其他版本没测试,不过估计没什么问题,因为代码没指定版本
    在这里插入图片描述
  2. 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
  1. batch_size: 根据自己显存大小而定;

  2. device:指定GPU序号;

  3. img:图片大小,自己设定,建议先把自己的数据跑一遍;

  4. data:准备好的数据配置文件,里面可以替换类别,txt路径,数量信息;

  5. cfg: 模型配置文件,涉及到模型结构、优化器等训练参数,可以微调,最主要的是把nc参数给修改掉

  6. 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 使用一个自定义的名字
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐