物体检测数据集处理总结

简介: 物体检测数据集处理总结

目录


标注工具Labelme的安装。


官方的labelme不支持大图像的打开,比如遥感图像。如果遇到图片打不开的情况,可以使用我修改的labelme。


VOC格式的数据逆向转为Labelme标注的数据集


VOC2007数据文件夹说明


XML说明


Labelme转VOC,将没有标注的数据生成测试集,并统计每个类别的个数。


将Labelme标注的数据转为txt格式的数据集。


对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。


对标注格式为txt的数据集,实现90、180、270度的旋转


标注工具Labelme的安装。

tt.png

安装pyqt

pip install PyQt5

 

安装 PIL包

pip install Pillow

安装labelme

1、官方的安装命令。

pip install labelmett.png

官方的labelme不支持大图像的打开,比如遥感图像。如果遇到图片打不开的情况,可以使用我修改的labelme。

labelme-master(修改后支持大图像).zip


https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12047245


VOC格式的数据逆向转为Labelme标注的数据集

import sys

import os.path as osp

import io

from labelme.logger import logger

from labelme import PY2

from labelme import QT4

import PIL.Image

import base64

from labelme import utils

import os

import cv2

import xml.etree.ElementTree as ET

module_path = os.path.abspath(os.path.join('..'))

if module_path not in sys.path:

   sys.path.append(module_path)

import json

from PIL import Image

Image.MAX_IMAGE_PIXELS = None

imageroot = 'RSOD/'

listDir = ['aircraft', 'oiltank']


def load_image_file(filename):

   try:

       image_pil = PIL.Image.open(filename)

   except IOError:

       logger.error('Failed opening image file: {}'.format(filename))

       return

   # apply orientation to image according to exif

   image_pil = utils.apply_exif_orientation(image_pil)

   with io.BytesIO() as f:

       ext = osp.splitext(filename)[1].lower()

       if PY2 and QT4:

           format = 'PNG'

       elif ext in ['.jpg', '.jpeg']:

           format = 'JPEG'

       else:

           format = 'PNG'

       image_pil.save(f, format=format)

       f.seek(0)

       return f.read()

def dict_json(flags, imageData, shapes, imagePath, fillColor=None, lineColor=None, imageHeight=100, imageWidth=100):

   '''

   :param imageData: str

   :param shapes: list

   :param imagePath: str

   :param fillColor: list

   :param lineColor: list

   :return: dict

   '''

   return {"version": "3.16.4", "flags": flags, "shapes": shapes, 'lineColor': lineColor, "fillColor": fillColor,

           'imagePath': imagePath.split('/')[1], "imageData": imageData, 'imageHeight': imageHeight,

           'imageWidth': imageWidth}

data = json.load(open('1.json'))

for subPath in listDir:

   xmlpathName = imageroot + subPath + '/Annotation/xml'

   imagepath = imageroot + subPath + '/JPEGImages'

   resultFile = os.listdir(xmlpathName)

   for file in resultFile:

       print(file)

       imagePH = imagepath + '/' + file.split('.')[0] + '.jpg'

       print(imagePH)

       tree = ET.parse(xmlpathName + '/' + file)

       image = cv2.imread(imagePH)

       shapes = data["shapes"]

       version = data["version"]

       flags = data["flags"]

       lineColor = data["lineColor"]

       fillColor = data['fillColor']

       newshapes = []

       for elem in tree.iter():

           if 'object' in elem.tag:

               name = ''

               xminNode = 0

               yminNode = 0

               xmaxNode = 0

               ymaxNode = 0

               for attr in list(elem):

                   if 'name' in attr.tag:

                       name = attr.text

                   if 'bndbox' in attr.tag:

                       for dim in list(attr):

                           if 'xmin' in dim.tag:

                               xminNode = int(round(float(dim.text)))

                           if 'ymin' in dim.tag:

                               yminNode = int(round(float(dim.text)))

                           if 'xmax' in dim.tag:

                               xmaxNode = int(round(float(dim.text)))

                           if 'ymax' in dim.tag:

                               ymaxNode = int(round(float(dim.text)))

               line_color = None

               fill_color = None

               newPoints = [[float(xminNode), float(yminNode)], [float(xmaxNode), float(ymaxNode)]]

               shape_type = 'rectangle'

               flags = flags

               newshapes.append(

                   {"label": name, "line_color": line_color, "fill_color": fill_color, "points": newPoints,

                    "shape_type": shape_type, "flags": flags})

       imageData_90 = load_image_file(imagePH)

       imageData_90 = base64.b64encode(imageData_90).decode('utf-8')

       imageHeight = image.shape[0]

       imageWidth = image.shape[1]

       data_90 = dict_json(flags, imageData_90, newshapes, imagePH, fillColor, lineColor, imageHeight, imageWidth)

       json_file = imagePH[:-4] + '.json'

       json.dump(data_90, open(json_file, 'w'))


Labelme标注的数据集转VOC2007格式的数据集。

VOC2007数据文件夹说明

1)JPEGImages文件夹


文件夹里包含了训练图片和测试图片,混放在一起


2)Annatations文件夹


文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片


3)ImageSets文件夹


Action存放的是人的动作,我们暂时不用


Layout存放的人体部位的数据。我们暂时不用


Main存放的是图像物体识别的数据,Main里面有test.txt, train.txt, val.txt,trainval.txt.这四个文件我们后面会生成


XML说明

<?xml version="1.0" encoding="utf-8"?>


<annotation>


        <source>


                  <image>optic rs image</image>


                  <annotation>Lmars RSDS2016</annotation>


                  <flickrid>0</flickrid>


                  <database>Lmars Detection Dataset of RS</database>


        </source>


        <object>


<!--bounding box的四个坐标,分别为左上角和右下角的x,y坐标-->


                  <bndbox>


                           <xmin>690</xmin>


                           <ymin>618</ymin>


                           <ymax>678</ymax>


                           <xmax>748</xmax>


                  </bndbox>


<!--是否容易被识别,0表示容易,1表示困难-->


                  <difficult>0</difficult>


                  <pose>Left</pose>


<!--物体类别-->


                  <name>aircraft</name>


<!--是否被裁剪,0表示完整,1表示不完整-->


                  <truncated>1</truncated>


        </object>


        <filename>aircraft_773.jpg</filename>


        <!--是否用于分割,0表示用于,1表示不用于-->


        <segmented>0</segmented>


<!--图片所有者-->


        <owner>


                  <name>Lmars, Wuhan University</name>


                  <flickrid>I do not know</flickrid>


        </owner>


        <folder>RSDS2016</folder>


        <size>


                  <width>1044</width>


                  <depth>3</depth>


                  <height>915</height>


        </size>


</annotation>


完整代码:

import os
from typing import List, Any
import numpy as np
import codecs
import json
from glob import glob
import cv2
import shutil
from sklearn.model_selection import train_test_split
# 1.标签路径
labelme_path = "LabelmeData/"  # 原始labelme标注数据路径
saved_path = "VOC2007/"  # 保存路径
isUseTest=True#是否创建test集
# 2.创建要求文件夹
if not os.path.exists(saved_path + "Annotations"):
    os.makedirs(saved_path + "Annotations")
if not os.path.exists(saved_path + "JPEGImages/"):
    os.makedirs(saved_path + "JPEGImages/")
if not os.path.exists(saved_path + "ImageSets/Main/"):
    os.makedirs(saved_path + "ImageSets/Main/")
# 3.获取待处理文件
files = glob(labelme_path + "*.json")
files = [i.replace("\\","/").split("/")[-1].split(".json")[0] for i in files]
print(files)
# 4.读取标注信息并写入 xml
for json_file_ in files:
    json_filename = labelme_path + json_file_ + ".json"
    json_file = json.load(open(json_filename, "r", encoding="utf-8"))
    height, width, channels = cv2.imread(labelme_path + json_file_ + ".jpg").shape
    with codecs.open(saved_path + "Annotations/" + json_file_ + ".xml", "w", "utf-8") as xml:
        xml.write('<annotation>\n')
        xml.write('\t<folder>' + 'WH_data' + '</folder>\n')
        xml.write('\t<filename>' + json_file_ + ".jpg" + '</filename>\n')
        xml.write('\t<source>\n')
        xml.write('\t\t<database>WH Data</database>\n')
        xml.write('\t\t<annotation>WH</annotation>\n')
        xml.write('\t\t<image>flickr</image>\n')
        xml.write('\t\t<flickrid>NULL</flickrid>\n')
        xml.write('\t</source>\n')
        xml.write('\t<owner>\n')
        xml.write('\t\t<flickrid>NULL</flickrid>\n')
        xml.write('\t\t<name>WH</name>\n')
        xml.write('\t</owner>\n')
        xml.write('\t<size>\n')
        xml.write('\t\t<width>' + str(width) + '</width>\n')
        xml.write('\t\t<height>' + str(height) + '</height>\n')
        xml.write('\t\t<depth>' + str(channels) + '</depth>\n')
        xml.write('\t</size>\n')
        xml.write('\t\t<segmented>0</segmented>\n')
        for multi in json_file["shapes"]:
            points = np.array(multi["points"])
            labelName=multi["label"]
            xmin = min(points[:, 0])
            xmax = max(points[:, 0])
            ymin = min(points[:, 1])
            ymax = max(points[:, 1])
            label = multi["label"]
            if xmax <= xmin:
                pass
            elif ymax <= ymin:
                pass
            else:
                xml.write('\t<object>\n')
                xml.write('\t\t<name>' + labelName+ '</name>\n')
                xml.write('\t\t<pose>Unspecified</pose>\n')
                xml.write('\t\t<truncated>1</truncated>\n')
                xml.write('\t\t<difficult>0</difficult>\n')
                xml.write('\t\t<bndbox>\n')
                xml.write('\t\t\t<xmin>' + str(int(xmin)) + '</xmin>\n')
                xml.write('\t\t\t<ymin>' + str(int(ymin)) + '</ymin>\n')
                xml.write('\t\t\t<xmax>' + str(int(xmax)) + '</xmax>\n')
                xml.write('\t\t\t<ymax>' + str(int(ymax)) + '</ymax>\n')
                xml.write('\t\t</bndbox>\n')
                xml.write('\t</object>\n')
                print(json_filename, xmin, ymin, xmax, ymax, label)
        xml.write('</annotation>')
# 5.复制图片到 VOC2007/JPEGImages/下
image_files = glob(labelme_path + "*.jpg")
print("copy image files to VOC007/JPEGImages/")
for image in image_files:
    shutil.copy(image, saved_path + "JPEGImages/")
# 6.split files for txt
txtsavepath = saved_path + "ImageSets/Main/"
ftrainval = open(txtsavepath + '/trainval.txt', 'w')
ftest = open(txtsavepath + '/test.txt', 'w')
ftrain = open(txtsavepath + '/train.txt', 'w')
fval = open(txtsavepath + '/val.txt', 'w')
total_files = glob("./VOC2007/Annotations/*.xml")
total_files = [i.replace("\\","/").split("/")[-1].split(".xml")[0] for i in total_files]
trainval_files=[]
test_files=[]
if isUseTest:
    trainval_files, test_files = train_test_split(total_files, test_size=0.15, random_state=55)
else:
    trainval_files=total_files
for file in trainval_files:
    ftrainval.write(file + "\n")
# split
train_files, val_files = train_test_split(trainval_files, test_size=0.15, random_state=55)
# train
for file in train_files:
    ftrain.write(file + "\n")
# val
for file in val_files:
    fval.write(file + "\n")
for file in test_files:
    print(file)
    ftest.write(file + "\n")
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()


tt.png

注:训练集和验证集的划分方法是采用 sklearn.model_selection.train_test_split 进行分割的。


Labelme转VOC,将没有标注的数据生成测试集,并统计每个类别的个数。


对标注数据的统计。

tt.png

将没有标注的数据放在test文件夹下面。

tt.png

import os

import numpy as np

import codecs

import json

from glob import glob

import cv2

import shutil

from sklearn.model_selection import train_test_split

dicImg={}

imgLis=[]

# 1.标签路径

labelme_path = "USA/"  # 原始labelme标注数据路径

saved_path = "VOC2007/"  # 保存路径

# 2.创建要求文件夹

if not os.path.exists(saved_path + "Annotations"):

   os.makedirs(saved_path + "Annotations")

if not os.path.exists(saved_path + "JPEGImages/"):

   os.makedirs(saved_path + "JPEGImages/")

if not os.path.exists(saved_path + "test/"):

   os.makedirs(saved_path + "test/")

if not os.path.exists(saved_path + "ImageSets/Main/"):

   os.makedirs(saved_path + "ImageSets/Main/")

# 3.获取待处理文件

files = glob(labelme_path + "*.json")

files = [i.replace("\\","/").split("/")[-1].split(".json")[0] for i in files]

print(files)

# 4.读取标注信息并写入 xml

for json_file_ in files:

   json_filename = labelme_path + json_file_ + ".json"

   json_file = json.load(open(json_filename, "r", encoding="utf-8"))

   height, width, channels = cv2.imread(labelme_path + json_file_ + ".jpg").shape

   with codecs.open(saved_path + "Annotations/" + json_file_ + ".xml", "w", "utf-8") as xml:

       xml.write('<annotation>\n')

       xml.write('\t<folder>' + 'UAV_data' + '</folder>\n')

       xml.write('\t<filename>' + json_file_ + ".jpg" + '</filename>\n')

       xml.write('\t<source>\n')

       xml.write('\t\t<database>The UAV autolanding</database>\n')

       xml.write('\t\t<annotation>UAV AutoLanding</annotation>\n')

       xml.write('\t\t<image>flickr</image>\n')

       xml.write('\t\t<flickrid>NULL</flickrid>\n')

       xml.write('\t</source>\n')

       xml.write('\t<owner>\n')

       xml.write('\t\t<flickrid>NULL</flickrid>\n')

       xml.write('\t\t<name>wanghao</name>\n')

       xml.write('\t</owner>\n')

       xml.write('\t<size>\n')

       xml.write('\t\t<width>' + str(width) + '</width>\n')

       xml.write('\t\t<height>' + str(height) + '</height>\n')

       xml.write('\t\t<depth>' + str(channels) + '</depth>\n')

       xml.write('\t</size>\n')

       xml.write('\t\t<segmented>0</segmented>\n')

       for multi in json_file["shapes"]:

           points = np.array(multi["points"])

           labelName=multi["label"].lower()

           if labelName in dicImg:

               count=dicImg[labelName]

               count=count+1;

               dicImg[labelName]=count

           else:

               dicImg[labelName]=1

           xmin = min(points[:, 0])

           xmax = max(points[:, 0])

           ymin = min(points[:, 1])

           ymax = max(points[:, 1])

           label = multi["label"]

           if xmax <= xmin:

               pass

           elif ymax <= ymin:

               pass

           else:

               xml.write('\t<object>\n')

               xml.write('\t\t<name>' + labelName+ '</name>\n')

               xml.write('\t\t<pose>Unspecified</pose>\n')

               xml.write('\t\t<truncated>1</truncated>\n')

               xml.write('\t\t<difficult>0</difficult>\n')

               xml.write('\t\t<bndbox>\n')

               xml.write('\t\t\t<xmin>' + str(int(xmin)) + '</xmin>\n')

               xml.write('\t\t\t<ymin>' + str(int(ymin)) + '</ymin>\n')

               xml.write('\t\t\t<xmax>' + str(int(xmax)) + '</xmax>\n')

               xml.write('\t\t\t<ymax>' + str(int(ymax)) + '</ymax>\n')

               xml.write('\t\t</bndbox>\n')

               xml.write('\t</object>\n')

               print(json_filename, xmin, ymin, xmax, ymax, label)

       xml.write('</annotation>')

   imgLis.append(json_file_+'.jpg')

   shutil.copy(labelme_path+json_file_+'.jpg', saved_path + "JPEGImages/")

print(imgLis)

# 5.复制图片到 VOC2007/JPEGImages/下

image_files = glob(labelme_path + "*.jpg")

txtsavepath = saved_path + "ImageSets/Main/"

print("copy image files to VOC007/JPEGImages/")

ftest = open(txtsavepath + '/test.txt', 'w')

for image in image_files:

   if image.split('\\')[1] not in imgLis:

       print(image)

       shutil.copy(image, saved_path + "test/")

       ftest.write(image.replace("\\","/").split("/")[-1].split(".jpg")[0] + "\n")

# 6.split files for txt

ftrainval = open(txtsavepath + '/trainval.txt', 'w')

ftrain = open(txtsavepath + '/train.txt', 'w')

fval = open(txtsavepath + '/val.txt', 'w')

total_files = glob("./VOC2007/Annotations/*.xml")

total_files = [i.replace("\\","/").split("/")[-1].split(".xml")[0] for i in total_files]

for file in total_files:

   ftrainval.write(file + "\n")

# split

train_files, val_files = train_test_split(total_files, test_size=0.15, random_state=42)

# train

for file in train_files:

   ftrain.write(file + "\n")

# val

for file in val_files:

   fval.write(file + "\n")

ftrainval.close()

ftrain.close()

fval.close()

print(dicImg)

ftest.close()



将Labelme标注的数据转为txt格式的数据集。

tt.png

一张图像对应一个txt,txt中每行对应一个标记物体。


格式:类别 xmin ymin xmax ymax


import json

import os

from glob import glob

import shutil

# convert labelme json to DOTA txt format

def custombasename(fullname):

   return os.path.basename(os.path.splitext(fullname)[0])

IN_PATH = 'USA'

OUT_PATH = 'labeltxt'

if not os.path.exists(OUT_PATH):

   os.makedirs(OUT_PATH)

file_list = glob(IN_PATH + '/*.json')

for i in range(len(file_list)):

   with open(file_list[i]) as f:

       label_str = f.read()

       label_dict = json.loads(label_str)  # json文件读入dict

       imgepath=file_list[i].split('.')[0]+'.jpg'

       # 输出 txt 文件的路径

       out_file = OUT_PATH + '/' + custombasename(file_list[i]) + '.txt'

       shutil.copy(imgepath, OUT_PATH)

       # 写入 poly 四点坐标 和 label

       fout = open(out_file, 'w')

       out_str = ''

       for shape_dict in label_dict['shapes']:

           out_str += shape_dict['label'] + ' '

           points = shape_dict['points']

           for p in points:

               out_str += (str(p[0]) + ' ' + str(p[1]) + ' ')

           out_str +='\n'

       fout.write(out_str)

       fout.close()

   print('%d/%d' % (i + 1, len(file_list)))



对Labelme标注图像,进行90、180、270的旋转,实现标注数据的扩充。

在制作做遥感图像物体检测数据集的时候,遥感图像的物体都是平面的,有角度的问题,


可以对被检测物体实现不同角度的旋转,丰富数据集同时减少标注的工作量。

tt.png

比如上图中的飞机,机头的朝向是斜向下的,现实中的飞机可能有各种的朝向,如果不做旋转,就会降低模型的检测能力。下图是旋转90度的效果。

 tt.png

需要安装的包:


labelme


scipy1.0.0版本


pyqt5



旋转最大的难点在于旋转后,需要对标注的点重新计算,保证标注的坐标不出现错乱。


旋转90度后,坐标转化:


 points=shapelabel['points']#获取初始的坐标。

 newPoints = [[float(points[0][1]), w-float(points[1][0])],

                [float(points[1][1]), w-float(points[0][0])]]#旋转90度,重新对应坐标。w表示原始图像的宽度。

选旋转180度后,坐标转化:


points = shapelabel['points']

newPoints = [[w-float(points[1][0]), h - float(points[1][1])],

                    [w-float(points[0][0]), h - float(points[0][1])]] #旋转180度,重新对应坐标。h表示原始图像的高度。

旋转270度,坐标转化:


points = shapelabel['points']


newPoints = [[h - float(points[1][1]), float(points[0][0])],

                    [h - float(points[0][1]),  float(points[1][0])]]


完整代码如下:


tt.png

#scipy的版本为1.0.0
import scipy
from scipy import misc
import os
import glob
import PIL.Image
from labelme.logger import logger
from labelme import PY2
from labelme import QT4
import io
import json
import os.path as osp
import PIL.Image
from scipy import ndimage
import base64
from labelme import utils

def load_image_file(filename):

   try:

       image_pil = PIL.Image.open(filename)

   except IOError:

       logger.error('Failed opening image file: {}'.format(filename))

       return

   # apply orientation to image according to exif

   image_pil = utils.apply_exif_orientation(image_pil)

   with io.BytesIO() as f:

       ext = osp.splitext(filename)[1].lower()

       if PY2 and QT4:

           format = 'PNG'

       elif ext in ['.jpg', '.jpeg']:

           format = 'JPEG'

       else:

           format = 'PNG'

       image_pil.save(f, format=format)

       f.seek(0)

       return f.read()

def dict_json(flags,imageData,shapes,imagePath,fillColor=None,lineColor=None,imageHeight=100,imageWidth=100):

   '''

   :param imageData: str

   :param shapes: list

   :param imagePath: str

   :param fillColor: list

   :param lineColor: list

   :return: dict

   '''

   return {"version":"3.16.4","flags":flags,"shapes":shapes,'lineColor':lineColor,"fillColor":fillColor,'imagePath':imagePath.split('\\')[1],"imageData":imageData,'imageHeight':imageHeight,'imageWidth':imageWidth}

def get_image_paths(folder):

   return glob.glob(os.path.join(folder, '*.jpg'))

def create_read_img(filename):

   data = json.load(open(filename.split('.')[0]+'.json'))

   shapes = data["shapes"]

   version = data["version"]

   flags = data["flags"]

   lineColor = data["lineColor"]

   fillColor = data['fillColor']

   newshapes = []

   im = misc.imread(filename)

   h,w,d=im.shape

   img_rote_90 = ndimage.rotate(im, 90)

   img_path_90=filename[:-4]+'_90.jpg'

   scipy.misc.imsave(img_path_90,img_rote_90)

   imageData_90 = load_image_file(img_path_90)

   imageData_90 = base64.b64encode(imageData_90).decode('utf-8')

   imageHeight =w

   imageWidth = h

   for shapelabel in shapes:

       newLabel=shapelabel['label']

       newline_color=shapelabel['line_color']

       newfill_color=shapelabel['fill_color']

       points=shapelabel['points']

       newPoints = [[float(points[0][1]), w-float(points[1][0])],

                [float(points[1][1]), w-float(points[0][0])]]

       newshape_type=shapelabel['shape_type']

       newflags=shapelabel['flags']      newshapes.append({'label':newLabel,'line_color':newline_color,'fill_color':newfill_color,'points':newPoints,'shape_type':newshape_type,'flags':newflags})

   data_90 = dict_json(flags, imageData_90, newshapes, img_path_90, fillColor, lineColor, imageHeight, imageWidth)

   json_file = img_path_90[:-4] + '.json'

   json.dump(data_90, open(json_file, 'w'))

   img_rote_180 = ndimage.rotate(im, 180)

   img_path_180=filename[:-4]+'_180.jpg'

   scipy.misc.imsave(img_path_180,img_rote_180)

   imageData_180 = load_image_file(img_path_180)

   imageData_180 = base64.b64encode(imageData_180).decode('utf-8')

   imageHeight = h

   imageWidth = w

   newshapes = []

   for shapelabel in shapes:

       newLabel = shapelabel['label']

       newline_color = shapelabel['line_color']

       newfill_color = shapelabel['fill_color']

       points = shapelabel['points']

       newPoints = [[w-float(points[1][0]), h - float(points[1][1])],

                    [w-float(points[0][0]), h - float(points[0][1])]]

       newshape_type = shapelabel['shape_type']

       newflags = shapelabel['flags']

       newshapes.append(

           {'label': newLabel, 'line_color': newline_color, 'fill_color': newfill_color, 'points': newPoints,

            'shape_type': newshape_type, 'flags': newflags})

   data_180 = dict_json(flags, imageData_180, newshapes, img_path_180, fillColor, lineColor, imageHeight, imageWidth)

   json_file = img_path_180[:-4] + '.json'

   json.dump(data_180, open(json_file, 'w'))

   img_rote_270 = ndimage.rotate(im, 270)

   img_path_270=filename[:-4]+'_270.jpg'

   scipy.misc.imsave(img_path_270,img_rote_270)

   imageData_270 = load_image_file(img_path_270)

   imageData_270 = base64.b64encode(imageData_270).decode('utf-8')

   imageHeight = w

   imageWidth = h

   newshapes = []

   for shapelabel in shapes:

       newLabel = shapelabel['label']

       newline_color = shapelabel['line_color']

       newfill_color = shapelabel['fill_color']

       points = shapelabel['points']

       newPoints = [[h - float(points[1][1]), float(points[0][0])],

                    [h - float(points[0][1]),  float(points[1][0])]]

       newshape_type = shapelabel['shape_type']

       newflags = shapelabel['flags']

       newshapes.append(

           {'label': newLabel, 'line_color': newline_color, 'fill_color': newfill_color, 'points': newPoints,

            'shape_type': newshape_type, 'flags': newflags})

   data_270 = dict_json(flags, imageData_270, newshapes, img_path_270, fillColor, lineColor, imageHeight, imageWidth)

   json_file = img_path_270[:-4] + '.json'

   json.dump(data_270, open(json_file, 'w'))

   print(filename)

img_path = 'USA'  #这个路径是所有图片在的位置

imgs = get_image_paths(img_path)

print (imgs)

for i in imgs:

   create_read_img(i)


对标注格式为txt的数据集,实现90、180、270度的旋转


#scipy的版本为1.0.0
import scipy
from scipy import misc
import os
import glob
from scipy import ndimage
def get_image_paths(folder):
    return glob.glob(os.path.join(folder, '*.jpg'))
def create_read_img(filename):
    objectList = []
    with open(filename.split('.')[0] + ".txt") as f:
        for line in f.readlines():
            for aa in line.split(' '):
                if aa!='\n':
                    objectList.append(aa)
    im = misc.imread(filename)
    h,w,d=im.shape
    img_rote_90 = ndimage.rotate(im, 90)
    img_path_90=filename[:-4]+'_90.jpg'
    scipy.misc.imsave(img_path_90,img_rote_90)
    img_path_90_txt=img_path_90[:-4]+'.txt'
    outLable = ''
    for i in range(int(len(objectList)/5)):
        object_label = objectList[i * 5]
        outLable+=object_label+' '
        object_x1 = objectList[i * 5 + 1]
        object_y1 = objectList[i * 5 + 2]
        object_x2 = objectList[i * 5 + 3]
        object_y2 = objectList[i * 5 + 4]
        outLable += object_y1 + ' '
        outLable += str(w-float(object_x2)) + ' '
        outLable += object_y2 + ' '
        outLable += str(w-float(object_x1)) + '\n'
    fout = open(img_path_90_txt, 'w')
    fout.write(outLable)
    fout.close()
    img_rote_180 = ndimage.rotate(im, 180)
    img_path_180=filename[:-4]+'_180.jpg'
    scipy.misc.imsave(img_path_180,img_rote_180)
    img_path_180_txt = img_path_180[:-4] + '.txt'
    outLable = ''
    for i in range(int(len(objectList) / 5)):
        object_label = objectList[i * 5]
        outLable += object_label + ' '
        object_x1 = objectList[i * 5 + 1]
        object_y1 = objectList[i * 5 + 2]
        object_x2 = objectList[i * 5 + 3]
        object_y2 = objectList[i * 5 + 4]
        outLable += str(w-float(object_x2)) + ' '
        outLable += str(h-float(object_y2) )+ ' '
        outLable += str(w-float(object_x1)) + ' '
        outLable += str(h - float(object_y1)) + '\n'
    fout = open(img_path_180_txt, 'w')
    fout.write(outLable)
    fout.close()
    img_rote_270 = ndimage.rotate(im, 270)
    img_path_270=filename[:-4]+'_270.jpg'
    scipy.misc.imsave(img_path_270,img_rote_270)
    img_path_270_txt = img_path_270[:-4] + '.txt'
    outLable = ''
    for i in range(int(len(objectList) / 5)):
        object_label = objectList[i * 5]
        outLable += object_label + ' '
        object_x1 = objectList[i * 5 + 1]
        object_y1 = objectList[i * 5 + 2]
        object_x2 = objectList[i * 5 + 3]
        object_y2 = objectList[i * 5 + 4]
        outLable += str(h-float(object_y2)) + ' '
        outLable += (object_x1) + ' '
        outLable +=str (h-float(object_y1)) + ' '
        outLable += (object_x2) + '\n'
    fout = open(img_path_270_txt, 'w')
    fout.write(outLable)
    fout.close()
    print(filename)
img_path = 'CutResult'  #这个路径是所有图片在的位置
imgs = get_image_paths(img_path)
print (imgs)
for i in imgs:
    create_read_img(i)
目录
相关文章
|
2月前
|
数据可视化 计算机视觉
训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练
本文介绍了一个用于煤炭与矸石分类的煤矸石目标检测数据集,包含891张训练图片和404张验证图片,分为煤炭、矸石和混合物三类。数据集已标注并划分为训练和验证集,适用于YOLOv5/v6/v7/v8训练。数据集可通过提供的链接下载。
77 1
训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练
|
6月前
|
机器学习/深度学习 数据采集 自动驾驶
探索深度学习的点云分类
点云分类是指将三维点云数据中的每个点或整个点云进行分类的任务。点云数据由大量三维点构成,每个点包含空间坐标(x, y, z),有时还包含其他信息如颜色和法向量。点云分类在自动驾驶、机器人导航、3D重建等领域有广泛应用。
162 1
|
7月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
|
7月前
|
机器学习/深度学习 自动驾驶 算法
图像识别中的scikit-learn:从像素到分类
【4月更文挑战第17天】本文介绍了如何使用Python的scikit-learn进行图像识别,包括图像预处理、特征提取(如HOG、SIFT)和分类器训练(如SVM、决策树)。通过一个示例展示了从像素数据到图像分类的完整流程,强调了预处理和特征提取的重要性。虽然scikit-learn在图像识别中有应用,但随着深度学习的发展,卷积神经网络在该领域展现出更强的性能,暗示了未来结合深度学习与scikit-learn的研究趋势。
|
7月前
|
机器学习/深度学习 计算机视觉 网络架构
YOLOv9实时目标检测新SOTA
【2月更文挑战第6天】YOLOv9实时目标检测新SOTA
176 2
YOLOv9实时目标检测新SOTA
|
7月前
|
机器学习/深度学习 编解码 算法
目标检测舰船数据集整合
目标检测舰船数据集整合
839 0
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
【深度学习】MNIST手写数字数据集的分类识别
【深度学习】MNIST手写数字数据集的分类识别
103 0
|
传感器 数据采集 编解码
3D目标检测数据集 DAIR-V2X-V
本文分享国内场景3D目标检测,公开数据集 DAIR-V2X-V(也称为DAIR-V2X车端)。DAIR-V2X车端3D检测数据集是一个大规模车端多模态数据集,包括: 22325帧 图像数据 22325帧 点云数据 2D&3D标注 基于该数据集,可以进行车端3D目标检测任务研究,例如单目3D检测、点云3D检测和多模态3D检测。
318 0
|
机器学习/深度学习 算法 数据库
图像识别2:图像多分类实验
图像识别2:图像多分类实验
76 0
|
机器学习/深度学习
机器学习系列(14)_PCA对图像数据集的降维_03
降维的目的之一是希望抛弃对模型带来负面影响的特征,同时,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带来的信息不会在PCA当中大量抛弃。
机器学习系列(14)_PCA对图像数据集的降维_03