greenhouse/libs/labelFile.py

88 lines
2.6 KiB
Python
Raw Normal View History

2016-09-06 17:24:47 +08:00
# Copyright (c) 2016 Tzutalin
# Create by TzuTaLin <tzu.ta.lin@gmail.com>
2017-01-02 20:50:02 -05:00
try:
from PyQt5.QtGui import QImage
except ImportError:
from PyQt4.QtGui import QImage
2016-09-06 17:24:47 +08:00
from base64 import b64encode, b64decode
from pascal_voc_io import PascalVocWriter
import os.path
2015-09-17 10:37:20 +08:00
import sys
2015-09-17 10:37:20 +08:00
class LabelFileError(Exception):
pass
2015-09-17 10:37:20 +08:00
class LabelFile(object):
# It might be changed as window creates
suffix = '.xml'
2015-09-17 10:37:20 +08:00
def __init__(self, filename=None):
self.shapes = ()
self.imagePath = None
self.imageData = None
self.verified = False
2015-09-17 10:37:20 +08:00
def savePascalVocFormat(self, filename, shapes, imagePath, imageData,
lineColor=None, fillColor=None, databaseSrc=None):
2015-09-17 10:37:20 +08:00
imgFolderPath = os.path.dirname(imagePath)
imgFolderName = os.path.split(imgFolderPath)[-1]
imgFileName = os.path.basename(imagePath)
imgFileNameWithoutExt = os.path.splitext(imgFileName)[0]
2016-09-06 17:24:47 +08:00
# Read from file path because self.imageData might be empty if saving to
# Pascal format
image = QImage()
image.load(imagePath)
imageShape = [image.height(), image.width(),
1 if image.isGrayscale() else 3]
writer = PascalVocWriter(imgFolderName, imgFileNameWithoutExt,
2015-09-17 10:37:20 +08:00
imageShape, localImgPath=imagePath)
writer.verified = self.verified
2015-09-17 10:37:20 +08:00
for shape in shapes:
points = shape['points']
label = shape['label']
2017-04-25 10:24:06 +02:00
# Add Chris
difficult = int(shape['difficult'])
bndbox = LabelFile.convertPoints2BndBox(points)
2017-04-25 10:24:06 +02:00
writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult)
2015-09-17 10:37:20 +08:00
writer.save(targetFile=filename)
2015-09-17 10:37:20 +08:00
return
def toggleVerify(self):
self.verified = not self.verified
2015-09-17 10:37:20 +08:00
@staticmethod
def isLabelFile(filename):
fileSuffix = os.path.splitext(filename)[1].lower()
return fileSuffix == LabelFile.suffix
@staticmethod
def convertPoints2BndBox(points):
xmin = float('inf')
ymin = float('inf')
xmax = float('-inf')
ymax = float('-inf')
2015-09-17 10:37:20 +08:00
for p in points:
x = p[0]
y = p[1]
xmin = min(x, xmin)
ymin = min(y, ymin)
xmax = max(x, xmax)
ymax = max(y, ymax)
# Martin Kersner, 2015/11/12
# 0-valued coordinates of BB caused an error while
# training faster-rcnn object detector.
if xmin < 1:
xmin = 1
if ymin < 1:
ymin = 1
2015-09-17 10:37:20 +08:00
return (int(xmin), int(ymin), int(xmax), int(ymax))