Ubuntu16.04 MobileNet_YOLOv3制作voc数据集和训练自己的数据集

本文详细介绍了如何在Ubuntu16.04上利用MobileNet-YOLO训练自定义的车辆检测数据集。首先,按照Pascal VOC格式制作数据集,包括重命名图片、使用LabelImg标注图片、划分训练集和测试集。接着,使用Caffe的脚本将训练集和测试集转换为lmdb文件,并修改相关配置文件以适应训练需求。最后,通过训练脚本启动训练过程,观察训练日志,展示训练过程中的损失函数和性能指标。
摘要由CSDN通过智能技术生成

机器配置:ubuntu1604 nvidia RTX 2070 (8G) mem:16G cuda10 cudnn7.6.5 python3 opencv3.4.6
MobileNet-yolov3 训练自己的数据集: 类别个数:1(车)

一.制作数据集 Pascal voc 格式
    Pascal voc简介:
    |-----voc2007
    |  |---Annotations 进行detection 任务时的标签文件,xml文件格式,一般文件名和图片文件名一致. 如:(000001.jpg 000001.xml)
    |  |---ImageSets/Main/train.txt val.txt train_val.txt test.txt 存放数据集的分割文件,里面内容只有文件名,不包含后缀名. 如:(000001)
    |  |___JPEGImages 存放.jpg格式的图片文件
    我们制作数据集只需用到上面三个文件夹.以下示例为在MobileNet-YOLO中操作的,可自行更改

    (1):准备图片并重命名
        cd /home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/
        按照如下格式重新建立Pascal Voc格式目录,我的目录名字叫作VOCCar1
        |-----VOCCar1
        |  |---Annotations
        |  |---ImageSets/Main
        |  |___JPEGImages
        将所有的图片放到JPEGImages中,为了方便,名字统一用6位数字表示, 如:000000.jpg 000001.jpg ... 000100.jpg
        python3代码: python3 Rename_file.py

        #!/usr/bin/env python3
        # -*- coding utf-8 -*-
        import os
        import shutil

        def copy_rename_file(srcpath, dstpath):
            index = 0
            for root, dirs, files in os.walk(srcpath):
                for name in files:
                    oldpath = root + '/' + name
                    newname = str(index).zfill(6)+ '.jpg'
                    newpath = dstpath + '/' + newname
                    shutil.copy(oldpath, newpath)
                    index += 1

        srcpath = '/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/JPEGImages' #Change1 图片路径
        dstpath = '/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/tmp' #Change2 保存新的重命名后的图片路径
        copy_rename_file(srcpath, dstpath)

    (2):LabelImg标记图片生成xml文件
        git clone https://github.com/tzutalin/labelImg.git
        使用labelImg 打开JPEGImages,选择voc格式,会在JPEGImages图片目录下生成对应的xml文件,将这些xml文件全部存放到Annotations下

    (3):划分训练集和测试集
        python3代码: python3 ImageSets_Convert.py

        #!/usr/bin/env python3
        # -*- coding utf-8 -*-

        import os
        import random
        import time

        #总共需要修改六个路径:Change1 2 3 4 5 6,分别已经标出
        xmlfilepath=r'/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/VOCCar1/Annotations/' #Change1 xml路径(相对路径和绝对路径都可以)
        saveBasePath=r"/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit/" #Change2 VOCCar1文件夹的路径(相对路径和绝对路径都可以)
        #xmlfilepath=r'./VOCCar1/Annotations/'
        #saveBasePath=r"./"

        trainval_percent=0.8
        train_percent=0.85
        total_xml = os.listdir(xmlfilepath)
        num=len(total_xml)
        list=range(num)
        tv=int(num*trainval_percent)
        tr=int(tv*train_percent)
        trainval= random.sample(list,tv)
        train=random.sample(trainval,tr)

        print("train and val size",tv)
        print("traub suze",tr)
        ftrainval = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/trainval.txt'), 'w') #Change3 将VOCCar1 换成自己的文件夹名字
        ftest = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/test.txt'), 'w') #Change4 将VOCCar1 换成自己的文件夹名字
        ftrain = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/train.txt'), 'w') #Change5 将VOCCar1 换成自己的文件夹名字
        fval = open(os.path.join(saveBasePath,'VOCCar1/ImageSets/Main/val.txt'), 'w') #Change6 将VOCCar1 换成自己的文件夹名字
        # Start time
        start = time.time()
        for i  in 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)
        # End time
        end = time.time()
        seconds=end-start
        print( "Time taken : {0} seconds".format(seconds))

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

    制作Voc格式数据集完毕!

二:使用caffe的脚本将训练集和测试集生成lmdb文件
    (1)首先在caffe根目录下的data目录下创建一个名为 VOCCar1 的目录:
        cd /home/sx/worksoft/MobileNet-YOLO/data
        mkdir VOCCar1
        cp ./VOC0712/create_list.sh ./VOCCar1
        cp ./VOC0712/create_data.sh ./VOCCar1
        cp ./VOC0712/labelmap_voc.prototxt ./VOCCar1
    (2)修改create_list.sh,生成训练测试图片的列表
        cd /home/sx/worksoft/MobileNet-YOLO/data/VOCCar1
        vim create_list.sh

        #3处需要修改的地方 Change1 2 3
        #!/bin/bash

        root_dir="/home/sx/worksoft/MobileNet-YOLO/data/VOCdevkit" #Change1 修改为第一步数据集VOCCar1所在的目录,相对绝对路径都可以
        #root_dir="../VOCdevkit" #Change1 修改为第一步数据集VOCCar1所在的目录,相对绝对路径都可以
        sub_dir=ImageSets/Main
        bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
        for dataset in trainval test
        do
          dst_file=$bash_dir/$dataset.txt
          if [ -f $dst_file ]
          then
            rm -f $dst_file
          fi
          for name in VOCCar1 #Change2 修改为自己的目录的名称
          do
        #Change3 注意下面这一段要注释掉
        #    if [[ $dataset == "test" && $name == "VOCCar1" ]]
        #    then
        #      continue
        #    fi
            echo "Create list for $name $dataset..."
            dataset_file=$root_dir/$name/$sub_dir/$dataset.txt

            img_file=$bash_dir/$dataset"_img.txt"
            cp $dataset_file $img_file
            sed -i "s/^/$name\/JPEGImages\//g" $img_file
            sed -i "s/$/.jpg/g" $img_file

            label_file=$bash_dir/$dataset"_label.txt"
            cp $dataset_file $label_file
            sed -i "s/^/$name\/Annotations\//g" $label_file
            sed -i "s/$/.xml/g" $label_file

            paste -d' ' $img_file $label_file >> $dst_file

            rm -f $label_file
            rm -f $img_file
          done

          # Generate image name and size infomation.
          if [ $dataset == "test" ]
          then
            $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
          fi

          # Shuffle trainval file.
          if [ $dataset == "trainval" ]
          then
            rand_file=$dst_file.random
            cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
            mv $rand_file $dst_file
          fi
        done

    (3)修改create_data.sh,生成训练测试图片的lmdb文件
       cd /home/sx/worksoft/MobileNet-YOLO/data/VOCCar1
       vim create_data.sh

        #2处需要修改的地方,Change1 2
        cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
        root_dir=$cur_dir/../.. #即caffe根目录,/home/sx/worksoft/MobileNet-YOLO

        cd $root_

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值