ultralytics/yolov3のTransfer Learning

如今人工智能越来越牛逼了,那么作为小垃圾的我也来体验一把
图像识别的应用现在已经小有成就了,那么现在来使用开源库玩玩
测试环境:Ubuntu 18.04.2 LTS (64-bit)

Oringin

  人工智能课在今年开设了,所以我这一个星期就指着物体识别(Object Detection)怼。那么首先选择的是什么库呢,代院长推荐的青年才俊——江老师科普的一个开源库YOLO(You Only Look Once),他可以识别物体,比起脸部识别还是比较新颖的,同样的话需要跑大量的数据。那么我们先在就撸起袖子开始干吧!

Before Start(安装Python3.7——Ubuntu 18.04)

  首先去全球最大的gay吧交流社——GitHub,没账号的注册一个吧,不然我不想认识你了(玩笑哈),注册完后可就可以去偷库了,搜索ultralytics/yolov3要是有git命令的话就直接git clone git@github.com:ultralytics/yolov3.git,没有的话就https下载吧,记得把master删了(虽然无所谓吧,但感觉怪怪的)。然后放在隐秘的地方嘿嘿嘿。咳咳咳,放桌面就好了,明人不干暗事。

  然后还需要Python3.7以上,系统原生自带的只有Python3.6,那么我们还需要升级一下Python,去Python官网下载第一个Gzipped source tarball就好了,下好后我们还需要准备一些附加包安装。

Noted: 以下shell代码输入不需要输入$,这只是为了说明是shell的命令!

# 升级更新一下源
$ sudo apt update
$ sudo apt upgrade -y
# 安装Python附加包
$ sudo apt install build-essential -y
$ sudo apt install libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev -y
$ sudo apt-get install zlib1g-dev

  执行完上述shell代码后,解压刚刚下好的Python包cd进入该目录

$ cd Python-3.7.2
$ ./configure --enable-optimizations # optional是为了ssl等模块的安装
#等待检测完成
$ sudo make
$ sudo make install

  等待编译安装后更换pip源,换成为清华源

$ sudo pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
$ pip3 install --upgrade pip

  到此python就安装完成了,在shell输入python3能看见如下反馈:

congtsang@congtsang-T5:~$ python3
Python 3.7.2 (default, Mar 19 2019, 23:02:26) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Let's Start

  然后按照库的教程走就差不多了,好的,本文结束!

  嘿嘿,我写这篇博客当然是遇到问题然后解决了问题了啊,那么我为什么要写博客呢。所以接下来就是比较正经的教程了,咱么一步一步来,先别急着动手好嘛,不然走错一步可能就要重来了,毕竟我不懂这个项目的架构,搞坏了怎么复原还不知道呢,只能重头再来了咯。

  下载完后呢,我们按照他的要求下载安装相关环境:

  • numpy
  • torch >= 1.0.0
  • opencv-python

  那么这些环境他已经写在requirements.txt里了,所以我们只需要在yolov3的根目录打开终端(Terminal)输入sudo pip3 install -U -r requirements.txt如下图:

requirements

  等待他安装完后就行了,之后就需要安装coco这个库来辅助yolo,进入data目录,我们看见有个get_coco_dataset.sh文件,打开后我们先把其中俩个素材先下好,因为素材有近20G这么多,加上我国是个强国,所以先用其他软件下载好。

https://pjreddie.com/media/files/train2014.zip
https://pjreddie.com/media/files/val2014.zip

  上面这俩个全是图片,训练使用的,用wget实在是太慢了,用p2p软件或下载软件下载好就行了。先运行一下bash get_coco_dataset.sh在下载上述俩文件的时候ctrl + z/c结束进程,这是为了让他把coco库偷下来,建立images文件夹,之后把下载好的上述俩文件放入coco/images里面,最后把get_coco_dataset.sh文件修改一下:

#!/bin/bash
# CREDIT: https://github.com/pjreddie/darknet/tree/master/scripts/get_coco_dataset.sh

# Clone COCO API
# git clone https://github.com/pdollar/coco && 
cd coco

# Download Images
#mkdir images && 
cd images
# wget -c https://pjreddie.com/media/files/train2014.zip
# wget -c https://pjreddie.com/media/files/val2014.zip

# Unzip
unzip -q train2014.zip
unzip -q val2014.zip

# (optional) Delete zip files
# rm -rf *.zip

cd ..

# Download COCO Metadata
wget -c https://pjreddie.com/media/files/instances_train-val2014.zip
wget -c https://pjreddie.com/media/files/coco/5k.part
wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/labels.tgz
tar xzf labels.tgz
unzip -q instances_train-val2014.zip

  再次运行bash get_coco_dataset.sh,等待他工作完。我们就可以得到如下的文件结构了:

get_coco_dataset

  那么至此我们已经成功大半了,现在只需要好好休息一下了,因为你能做到这里已经是2000 years以后了。那么我们开个香槟庆祝一下吧!

Next Step

  事已至此,我们马上就要成功了,所以我们继续加油干活,撸起咱们的袖子!

  上面我们说到了解压完所有的素材,这时候就需要把素材名字给保存好,存为trainvalno5k.txt5k.txt这俩个文件,以供训练时候可以让程序找到相关图片,链接图片。那么我们需要怎么制作这些文件呢,接下来就需要用到shell的知识了,来跟着我继续学习。

  在coco文件夹下面打开终端:

# 先运行这俩条命令试试是不是会得到相关输出/images/train2014/COCO_train2014_000000398936.jpg
$ find -name "*train*.jpg" | cut -d '.' -f 2,3
$ find -name "*val*.jpg" | cut -d '.' -f 2,3
# 如果有的话,那么我们继续操作
$ find -name "*train*.jpg" | cut -d '.' -f 2,3 > train.part
$ find -name "*val*.jpg" | cut -d '.' -f 2,3 > val.part
# 将输出保存至文件

  那么我们得到了train.partval.part俩个文件,之后我们再次修改get_coco_dataset.sh这个文件,或者做个副本为tmp.sh修改这个文件也行,做个备份也不错。

  修改如下:

#!/bin/bash

cd coco

# Set Up Image Lists
paste <(awk "{print \"$PWD\"}" <val.part) val.part | tr -d '\t' > 5k.txt
paste <(awk "{print \"$PWD\"}" <train.part) train.part | tr -d '\t' > trainvalno5k.txt

  这下我们又得到了5k.txttrainvalno5k.txt这俩个文件。之后我们还需要修改一下cfg目录下的coco.data

  如下修改:(是为了让他能知道我们之前配置的图片在哪儿)

classes=80
train=data/coco/trainvalno5k.txt
valid=data/coco/5k.txt
names=data/coco.names
backup=backup/
eval=coco

Transfer Learning

  1. Download the official YOLOv3 weights yolov3.pt (converted to PyTorch) from Google Drive folder, and place them in yolov3/weights/
  2. Copy and rename weights/yolov3.pt to weights/latest.pt, where train.py will automatically look for them when the --resume flag is present.
  3. Uncomment the transfer learning code in train.py:

only-YOLO-layers

  算了我还是翻译一下吧,下载他们官方的权重文件yolov3.pt,链接在上面自取,放置到yolov3/weights/

  之后复制下载好的yolov3.pt这个文件重新命名为latest.pt这是为了训练的时候python3 train.py --resume可以自动选择该文件。

  之后把上图该行的注释去掉就行了,注意python的严格缩进文法

Parameter modification

现在我们已经做完了所有配置工作了。只需要根据咱们的电脑来修改一些参数了。

  关于参数,无非就涉及到机器配置问题了,官方测试的显卡是training speed of 0.6 s/batch on a 1080 Ti (18 epochs/day) or 0.45 s/batch on a 2080 Ti。所以你要是这个显卡就在yolov3目录下直接运行python3 train.py就可以了,不是的话就接着学吧哈(留下了没有钱的眼泪~)

  我们可以修改的参数有如下这些:

parser.add_argument('--epochs', type=int, default=270, help='number of epochs')
parser.add_argument('--batch-size', type=int, default=8, help='size of each image batch')
parser.add_argument('--accumulate', type=int, default=1, help='accumulate gradient x batches before optimizing')
parser.add_argument('--cfg', type=str, default='cfg/yolov3.cfg', help='cfg file path')
parser.add_argument('--data-cfg', type=str, default='cfg/coco.data', help='coco.data file path')
parser.add_argument('--multi-scale', action='store_true', help='random image sizes per batch 320 - 608')
parser.add_argument('--img-size', type=int, default=32 * 13, help='pixels')
parser.add_argument('--resume', action='store_true', help='resume training flag')

  但是我啥都不知道,为了让我的小弟弟显卡能跑得起来我只是知道改batch-size这个参数,我的显卡是GeForce GTX 1060 mobile,没错是笔记本,弱小的不能支持太大的size了,我的是改为了8,所以跑起来就可以了。

mAP

After-one-Epoch

Extended knowledge

【YOLO】训练voc数据集没有框??解决方法

谈谈深度学习中的 Batch_Size

YOLO配置文件理解

YOLO配置

我是个弟弟

  我的电脑太垃圾了,跑不动270遍迭代Epoch,我跑了一遍(一遍10347个图)意思意思就行了哈,电脑要紧电脑要紧,靠他生活呢。


爱狂笑的孩子运气不会差