第十天 yolo V3 从0开始搭建

一:数据集标注以及生成数据集

图像数据集标注工具:Labelimg以及labelme(暂时先说Labelimg用法)

labelimg标注完数据之后可以pascal的.xml数据的格式进行保存,只能创建矩形框更加适用于目标检测制作数据集,如YOLO,而labelme以.json文件的数据格式进行保存,可以创建多种类型的边框进行标注,适用于图像分割,如MaskRcnn。

(1)Ubuntu16.04下Lableimage安装

地址:https://github.com/tzutalin/labelImg 或者到 https://pypi.org/ 的网站搜索框中搜索labelImg,点击downloads,选择相应文件下载,下载好后解压缩。

github上太慢,这里推荐使用码云下载:

 git clone https://gitee.com/mirrors/LabelImg.git

在anaconda 的python3环境下先安装下面的包。

sudo apt-get install pyqt5-dev-tools

再查看解压后的文件夹requirements,可以看到需要这两个包。

python3是pyqt5,python2是pyqt4。可以直接执行.txt文件安装,或者自己单独安装。

sudo pip3 install -r requirements/requirements-linux-python3.txt

或:

conda install pyqt=5
conda install lxml

接着输入:make qt5py3

再执行如下命令:

python labelImg.py

结果显示:

表示安装成功。

(2)如何标注数据集

进行标注以前,如果图片的命名方式是乱的,没有规律的,可以重新命名:例如从0000000,0000001,0000002,... 这种命名方式,使用如下的代码即可:原始图片保存路径设置为

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
# 批量重命名文件

class ImageRename():
    def __init__(self):
        self.path = '/home/hang/lh/program/img/'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)

        i = 0
        for item in filelist:
            if item.endswith('.jpg'):
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')
                os.rename(src, dst)
              #  os.rename(quad_src, quad_dst)
                print ('converting %s to %s ...' % (src, dst))
                i = i + 1
        print ('total %d to rename & converted %d jpgs' % (total_num, i))

if __name__ == '__main__':
    newname = ImageRename()
    newname.rename()

下面是标注数据集的方式,保存路径设置为如下地址。

下面这张图引用作者:https://blog.csdn.net/weixin_45192980/article/details/107421252?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242

有几个那种打标签的格式可以选择,分别是PascalVOC,YOLO,CreateML。

PascalVOC:YOLO:

createML:

(3)了解PascalVOC数据集格式:这里引用博文:

https://blog.csdn.net/u013832707/article/details/80060327?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

(4)如何制作PascalVOC数据集引用博文:

https://blog.csdn.net/csdn_zhishui/article/details/84962587

(5)我们的生成VOCdevkit/VOC2012/ImageSets/Mian下面的.txt文件代码:(将Annotations以及JPEGImages内容放好)

# -*- coding: utf-8 -*-
# @Time    : 2018/11/12 13:03
# @Author  : lazerliu
# @File    : xml2voc.py
import os
import random

# ==================可能需要修改的地方=====================================#
g_root_path = "/home/hang/lh/VOCdevkit/VOC2012/"
xmlfilepath = "Annotations"  # 标注文件存放路径
saveBasePath = "ImageSets/Main/"  # ImageSets信息生成路径
trainval_percent = 0.98
train_percent = 0.98
# ==================可能需要修改的地方=====================================#

os.chdir(g_root_path)
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
xml_list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(xml_list, tv)
train = random.sample(trainval, tr)

print("train and val size", tv)
print("train  size", tr)
ftrainval = open(saveBasePath + "trainval.txt", "w")
ftest = open(saveBasePath + "test.txt", "w")
ftrain = open(saveBasePath + "train.txt", "w")
fval = open(saveBasePath + "val.txt", "w")

for i in xml_list:
    name = total_xml[i][:-4] + "\n"
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

二:搭建环境

数据集做好之后,需要先搭建yolov3的训练环境。此时需要下载个预训练的权重,找张图片做个测试。

具体参考yolo v3的主页:https://pjreddie.com/darknet/yolo/

1. 下载代码:

git clone https://github.com/pjreddie/darknet

2.  编译代码: 

YOLOV3使用一个开源的神经网络框架Darknet53,使用C和CUDA,有CPU和GPU两种模式。默认使用的是CPU模式,需要切换GPU模型的话,vim修改Makefile文件。

darknet深度学习框架的好处在于是使用c做的,依赖比较少,编译很少出错,可移植性也比较好。

cd darknet
vim Makefile  #如果使用CPU模式。则不用修改Makefile文件

make

当设置OPENCV=1时实际上要注意opencv的版本。如果报错,则安装一下网址修改:

https://blog.csdn.net/zhangping1987/article/details/106552189?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

IplImage ipl = m;修改为如下方式:

3 .Darknet测试:

./darknet imtest data/eagle.jpg

安装成功。

  3.  下载个yolo V3预训练权重试试效果:

wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

4.  使用摄像头检测。

 ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

5. 使用视频检测:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

6. 以上是的模型都是使用coco数据集训练出来的。所以我没那自己训练测试的时候,需要更改cfg/coco.data指向自己的路径。

三:训练集的转换

(1)借鉴于博客:https://blog.csdn.net/Challovactor/article/details/104798090/

darknet 需要的数据格式,是每张图片对应一个txt,内容如下:

<object-class> <x> <y> <width> <height>

其中x,y,width,height是相对于图像width和height 的值。 可以使用scripts/voc_label.py脚本进行生成。

wget https://pjreddie.com/media/files/voc_label.py

将voc_label.py与VOCdevkit文件夹放在同一个文件目录下:

 

源文件是这样的:根据自己的需要修改。sets,classes

 

执行完上面脚本,标签文件会生成在VOCdevkit/VOC2007/labels/和VOCdevkit/VOC2012/labels/ 下:

注:有些情况生成的.txt的label文件为空,是因为标记数据集时有difficult的:

表示difficult为1的标记的数据集是难以识别的。在voc_label.py中就不会生成标签。

如果想要难以识别的也生成标签,在voc_label.py中可以做如下修改。但一般情况下,我们使用默认的方式。

运行完脚本同时生成文件:

里面包含的是文件的路径:

(2)修改配置文件

这里主要修改coco.data:

修改为自己路径:

classes= 80
train  = /home/lh/2012_train.txt
valid  = /home/lh/2012_test.txt
#valid = data/coco_val_5k.list
names = data/coco.names
backup = /home/pjreddie/backup/
eval=coco

修改coco.names :修改为自己需要的目标名字

修改batch_size等训练变量:

(3)开始训练

./darknet detector train cfg/coco.data cfg/yolov3.cfg

预训练./darknet detector train cfg/coco.data cfg/yolov3.cfg cfg/yolov3_20000.weights

迭代次数小于1000次,每100次保存一次。迭代次数大于1000次,每10000次保存一次

代码位置:.examples/detector.c line 138

(4) 测试

因为训练的模型的权重文件会自动保存在./darknet/backup,所以如下测试

./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3_20000.weights data/giraffe.jpg -thresh 0.4

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值