Ubuntu16.04下tensorflow+SSD实现目标检测,labelimg数据集的制作(二)

Ubuntu16.04下使用lableimg制作自己的数据集

介绍:labelimg是对图片进行标注数据信息的工具,例如在一张有人脸的图像上,我们获取人脸信息,可以在人脸上标注一个矩形框,将人脸获取到,这时标注好的数据就会形成一个voc格式的文件或者是xml的文件来去记录矩形框的坐标值。当你在数据进行清理打包的时候,只需要对图片和标注信息的voc或者XML文件合并起来,就能在你要打包的图片中显示出矩形框。下面开始进行操作

1.首先是下载labelimg的压缩包,下是我的自己的压缩包:
下载好后进入你下载压缩包的目录下打开终端进行解压,解压的命令是:unzip labelImg-master.zip
解压好后进入文件夹在终端输入下面代码就能打开
sudo apt-get install pyqt5-dev-tools sudo pip3 install lxml make qt5py3 python3 labelImg.py python3 labelImg.py [IMAGE_PATH] [PRE-DEFINED CLASS FILE]
基本的操作就是:W进行矩形框的绘制,给标好的数据打上标签,在左边选择保存的格式是pascalVOC还是YOLO 的格式


这个是voc格式的数据
Ubuntu16.04下tensorflow+SSD实现目标检测,labelimg数据集的制作(二)_第1张图片
这个是yolo的文件格式
Ubuntu16.04下tensorflow+SSD实现目标检测,labelimg数据集的制作(二)_第2张图片
像这样操作完成后,想要直接丢给TensorFlow训练是不行的,还必须将xml(txt)文件转化成pascalvoc再转化tfrecord的文件格式。
为什么要转化格式呢?
因为在做模型训练的时候,我们是有数据集、验证集和测试集的,在做目标检测任务时,若使用Github已复现的论文时,需首先将自己的数据集转化为VOC数据集的格式,因为论文作者使用的是公开数据集VOC 2007、VOC2012、COCO等类型数据集做方法验证与比对。
创建3个文件夹:
JPEGImages:用来保存你的数据图片
Annotations:这里是存放你对所有数据图片做的标注,每张照片的标注信息必须是xml格式
ImageSets:该文件下有一个main文件,main文件下有四个txt文件,分别是train.txt、test.txt、trainval.txt、val.txt
在这里插入图片描述
使用Python脚本进行数据打包
需要注意的是下面要修改的地址,设置成自己的文件路径就行:


rootdir = "/home/hyb/models/dataset/widerface"
gtfile = "/home/hyb/models/dataset/widerface/wider_face_split/wider_face_val_bbx_gt.txt"
im_folder = "/home/hyb/models/dataset/widerface/WIDER_val/images"
fwrite = open("/home/hyb/models/dataset/widerface/ImageSets/Main/val.txt", "w")
import os, cv2, sys, shutil, numpy

from xml.dom.minidom import Document
import os


# 本程序可以讲widerface转为VOC格式的数据

def writexml(filename, saveimg, bboxes, xmlpath):
    doc = Document()

    annotation = doc.createElement('annotation')

    doc.appendChild(annotation)

    folder = doc.createElement('folder')

    folder_name = doc.createTextNode('widerface')
    folder.appendChild(folder_name)
    annotation.appendChild(folder)
    filenamenode = doc.createElement('filename')
    filename_name = doc.createTextNode(filename)
    filenamenode.appendChild(filename_name)
    annotation.appendChild(filenamenode)
    source = doc.createElement('source')
    annotation.appendChild(source)
    database = doc.createElement('database')
    database.appendChild(doc.createTextNode('wider face Database'))
    source.appendChild(database)
    annotation_s = doc.createElement('annotation')
    annotation_s.appendChild(doc.createTextNode('PASCAL VOC2007'))
    source.appendChild(annotation_s)
    image = doc.createElement('image')
    image.appendChild(doc.createTextNode('flickr'))
    source.appendChild(image)
    flickrid = doc.createElement('flickrid')
    flickrid.appendChild(doc.createTextNode('-1'))
    source.appendChild(flickrid)
    owner = doc.createElement('owner')
    annotation.appendChild(owner)
    flickrid_o = doc.createElement('flickrid')
    flickrid_o.appendChild(doc.createTextNode('muke'))
    owner.appendChild(flickrid_o)
    name_o = doc.createElement('name')
    name_o.appendChild(doc.createTextNode('muke'))
    owner.appendChild(name_o)

    size = doc.createElement('size')
    annotation.appendChild(size)

    width = doc.createElement('width')
    width.appendChild(doc.createTextNode(str(saveimg.shape[1])))
    height = doc.createElement('height')
    height.appendChild(doc.createTextNode(str(saveimg.shape[0])))
    depth = doc.createElement('depth')
    depth.appendChild(doc.createTextNode(str(saveimg.shape[2])))

    size.appendChild(width)

    size.appendChild(height)
    size.appendChild(depth)
    segmented = doc.createElement('segmented')
    segmented.appendChild(doc.createTextNode('0'))
    annotation.appendChild(segmented)
    for i in range(len(bboxes)):
        bbox = bboxes[i]
        objects = doc.createElement('object')
        annotation.appendChild(objects)
        object_name = doc.createElement('name')
        object_name.appendChild(doc.createTextNode('face'))
        objects.appendChild(object_name)
        pose = doc.createElement('pose')
        pose.appendChild(doc.createTextNode('Unspecified'))
        objects.appendChild(pose)
        truncated = doc.createElement('truncated')
        truncated.appendChild(doc.createTextNode('0'))
        objects.appendChild(truncated)
        difficult = doc.createElement('difficult')
        difficult.appendChild(doc.createTextNode('0'))
        objects.appendChild(difficult)
        bndbox = doc.createElement('bndbox')
        objects.appendChild(bndbox)
        xmin = doc.createElement('xmin')
        xmin.appendChild(doc.createTextNode(str(bbox[0])))
        bndbox.appendChild(xmin)
        ymin = doc.createElement('ymin')
        ymin.appendChild(doc.createTextNode(str(bbox[1])))
        bndbox.appendChild(ymin)
        xmax = doc.createElement('xmax')
        xmax.appendChild(doc.createTextNode(str(bbox[0] + bbox[2])))
        bndbox.appendChild(xmax)
        ymax = doc.createElement('ymax')
        ymax.appendChild(doc.createTextNode(str(bbox[1] + bbox[3])))
        bndbox.appendChild(ymax)
    f = open(xmlpath, "w")
    f.write(doc.toprettyxml(indent=''))
    f.close()


rootdir = "/home/hyb/models/dataset/widerface"
gtfile = "/home/hyb/models/dataset/widerface/wider_face_split/wider_face_val_bbx_gt.txt"
im_folder = "/home/hyb/models/dataset/widerface/WIDER_val/images"
fwrite = open("/home/hyb/models/dataset/widerface/ImageSets/Main/val.txt", "w")

# wider_face_train_bbx_gt.txt的文件内容
# 第一行为名字
# 第二行为头像的数量 n
# 剩下的为n行人脸数据
# 以下为示例
# 0--Parade/0_Parade_marchingband_1_117.jpg
# 9
# 69 359 50 36 1 0 0 0 0 1
# 227 382 56 43 1 0 1 0 0 1
# 296 305 44 26 1 0 0 0 0 1
# 353 280 40 36 2 0 0 0 2 1
# 885 377 63 41 1 0 0 0 0 1
# 819 391 34 43 2 0 0 0 1 0
# 727 342 37 31 2 0 0 0 0 1
# 598 246 33 29 2 0 0 0 0 1
# 740 308 45 33 1 0 0 0 2 1

with open(gtfile, "r") as gt:
    while (True):
        gt_con = gt.readline()[:-1]
        if gt_con is None or gt_con == "":
            break;
        im_path = im_folder + "/" + gt_con;
        print(im_path)
        im_data = cv2.imread(im_path)
        if im_data is None:
            continue
        # 可视化的部分
        # cv2.imshow(im_path, im_data)
        # cv2.waitKey(0)

        numbox = int(gt.readline())

        # 获取每一行人脸数据
        bboxes = []
        if numbox == 0:  # numbox 为0 的情况处理
            gt.readline()
        else:
            for i in range(numbox):
                line = gt.readline()
                infos = line.split(" ")  # 用空格分割
                # x y w h .....
                bbox = (int(infos[0]), int(infos[1]), int(infos[2]), int(infos[3]))
                # 绘制人脸框
                # cv2.rectangle(im_data, (int(infos[0]), int(infos[1])),
                #               (int(infos[0]) + int(infos[2]), int(infos[1]) + int(infos[3])),
                #               color=(0, 0, 255), thickness=1)
                bboxes.append(bbox)  # 将一张图片的所有人脸数据加入bboxes
            # cv2.imshow(im_path, im_data)
            # cv2.waitKey(0)
            filename = gt_con.replace("/", "_")  # 将存储位置作为图片名称,斜杠转为下划线
            fwrite.write(filename.split(".")[0] + "\n")
            cv2.imwrite("{}/JPEGImages/{}".format(rootdir, filename), im_data)
            xmlpath = "{}/Annotations/{}.xml".format(rootdir, filename.split(".")[0])
            writexml(filename, im_data, bboxes, xmlpath)
fwrite.close()

你可能感兴趣的:(深度学习,神经网络)