深度学习的数据格式转换(mobilenet+ssd,centernet)

这篇博客详细介绍了如何从VOC2012数据集开始,进行数据标注、分配训练集,然后转换为tfrecord和json格式。同时,文章还涉及了模型转换,包括pb到pbtxt、pt到pth、pth到onnx以及onnx到ncnn,并使用OpenCV的dnn库调用mobilenet-ssd模型。
摘要由CSDN通过智能技术生成

深度学习的数据格式转换(mobilenet+ssd,centernet)

初步生成VOC2012数据集

1、数据标注

1.1有目标的图片标注

应用labelImg对图片进行标注,下载链接:https://github.com/tzutalin/labelImg
标注时,需要注意的点,(参考自https://blog.csdn.net/chenmaolin88/article/details/79357502)

标注什么 预定义的所有类别的所有对象实例(就是说,如果图片里面有3只浣熊,就要分别标注3只浣熊), 除非:你拿不准那玩意儿是不是。对象非常非常的小(尺度自己拿捏),只能看见对象的不到 10-20%的部分 , 因此你拿不准那个到底是哪一类的,比如你只能看见一个轮胎,你不确定是卡车还是小轿车,这种就可以不用标注.如果图片中的对象肉眼都难以识别,就丢掉这张图片
难以识别(difficult) 若肉眼虽然可以大致识别,但确信度不是很高,则勾选difficult复选框,表示这个对象不是很好识别。
矩形框 用矩形框标注对象的可见区域, 不可见的区域不要标注. 非对象的区域不要标注,矩形框应该要且仅包括对象的所有可见的像素点, 除非为了包括很小一部分的对象部件,需要扩大很大一个矩形框面积,比如,小轿车的天线可以不用框进来,因为他太小了,且天线对于汽车来说无关紧要,并非主要特征。
截断Truncated 如果对象超过 15-20% 的部分不在矩形框内,则将对象标记为Truncated. 这个标记意味着矩形框内没有包含完成的对象实例。这个属性在LabelImg中无法直接勾选,需要手工编辑XML文件里的对应标签。
遮挡Occlusion 如果矩形框内,对象有超过 5% 的部分被遮挡, 标记为 Occluded. 这个标记指示矩形框内的图像存在被遮挡的情况。这个属性在LabelImg中无法直接勾选,需要手工编辑XML文件里的对应标签。
衣服、雪、泥etc 如果遮挡物是跟对象强相关的,则不用标记为遮挡,比如 人身上的衣服,应视为人的一部分。
透明 透过玻璃看到的对象也应该被标记, 但是若玻璃是有点反光的,则玻璃上的映像,应被标记为遮挡 occlusion
镜子 镜子里的对象也应该被标记。
透明 透过玻璃看到的对象也应该被标记, 但是若玻璃是有点反光的,则玻璃上的映像,应被标记为遮挡 occlusion
海报 图片里面的海报、杂志等上面的对象也应该被标记,除非是一些很浮夸的卡通画
1.2无目标图片的标注

应用以下代码,自动生成无标注目标的xml文件
参考链接:https://www.jianshu.com/p/5b2254fdf8f8

#! /usr/bin/python
# -*- coding:UTF-8 -*-
import os, sys
import glob
from PIL import Image
 
# VEDAI 图像存储位置
src_img_dir = "/home/lehui/Desktop/负样本700"
# VEDAI 图像生成的xml文件存放位置
src_xml_dir = "/home/lehui/Desktop/xml"
 
img_Lists = glob.glob(src_img_dir + '/*.jpg')
 
img_basenames = [] # e.g. 100.jpg
for item in img_Lists:
    img_basenames.append(os.path.basename(item))
 
img_names = [] # e.g. 100
for item in img_basenames:
    temp1, temp2 = os.path.splitext(item)
    img_names.append(temp1)
 
for img in img_names:
    im = Image.open((src_img_dir + '/' + img + '.jpg'))
    width, height = im.size
    # write in xml file
    #os.mknod(src_xml_dir + '/' + img + '.xml')
    xml_file = open((src_xml_dir + '/' + img + '.xml'), 'w')
    xml_file.write('<annotation>\n')
    xml_file.write('    <folder>VOC2007</folder>\n')
    xml_file.write('    <filename>' + str(img) + '.jpg' + '</filename>\n')
    xml_file.write('    <path>'+ src_xml_dir + '/' + str(img) + '.jpg' + '</path>\n')
    xml_file.write('    <source>\n')
    xml_file.write('        <database>' + "Unknow" + '</database>\n')
    xml_file.write('    </source>\n')
    xml_file.write('    <size>\n')
    xml_file.write('        <width>' + str(width) + '</width>\n')
    xml_file.write('        <height>' + str(height) + '</height>\n')
    xml_file.write('        <depth>3</depth>\n')
    xml_file.write('    </size>\n')
    xml_file.write('    <segmented>0</segmented>\n')
    xml_file.write('</annotation>')

2、分配训练集、验证集、测试集

应用以下代码,分别得到train、val、test对应的xml集合。
参考链接:https://www.cnblogs.com/gezhuangzhuang/p/10613468.html

import os  
import random  
import time  
import shutil
#xmlfilepath——所有xml的路径,saveBasePath——保存结果的路径,下面建立三个文件夹:train、val、test
xmlfilepath=r'./Annotations'  
saveBasePath=r"./Annotations"

trainval_percent=0.8  
train_percent=0.8  
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("train size",tr) 

start = time.time()

test_num=0  
val_num=0  
train_num=0  

for i in list:  
    name=total_xml[i]
    if i in trainval:  #train and val set 
        if i in train: 
            directory="train"  
            train_num += 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值