MLSTRUCT-FP / test /test_db.py
rawanessam's picture
Upload 39 files
26f7fa0 verified
"""
MLSTRUCT-FP - TEST - DB
Test the dataset loader and object components.
"""
import numpy as np
import os
import unittest
from MLStructFP.db import DbLoader, Floor
from MLStructFP.db.image import *
DB_PATH = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'fp.json')
class DbLoaderTest(unittest.TestCase):
def test_db_load(self) -> None:
"""
Test db loader path and number of dataset items.
"""
db = DbLoader(DB_PATH)
self.assertEqual(os.path.dirname(DB_PATH), db.path)
db.tabulate()
# Test floors
self.assertEqual(len(db.floors), 7)
# Test geometry of a given object
f = db[302]
self.assertEqual(len(f.rect), 80)
self.assertEqual(len(f.slab), 1)
self.assertAlmostEqual(f.bounding_box.xmin, 1.08599, places=3)
self.assertAlmostEqual(f.bounding_box.xmax, 49.24599, places=3)
self.assertAlmostEqual(f.bounding_box.ymin, -24.69863, places=3)
self.assertAlmostEqual(f.bounding_box.ymax, -11.07863, places=3)
# Check rectangle data
r = f.rect[0]
self.assertEqual(r.id, 20279)
self.assertEqual(r.floor.id, 302)
mc = r.get_mass_center()
self.assertAlmostEqual(mc.x, 1.1659, places=3)
self.assertAlmostEqual(mc.y, -22.13863, places=3)
self.assertEqual(len(r.points), 4)
# Check image
self.assertEqual(f.image_scale, 188.445)
self.assertEqual(os.path.basename(f.image_path), 'f23ccf42b9c42bfe7c37a1fb7a1ea100e3d34596.png')
# Test filter
def my_filter(db_f: 'Floor') -> bool:
return db_f.id >= 1000
db.set_filter(my_filter)
self.assertEqual(len(db.floors), 3)
def test_mutator(self) -> None:
"""
Test floor mutator.
"""
f = DbLoader(DB_PATH).floors[0]
def test(x: float, y: float):
p = f.rect[0].get_mass_center()
self.assertEqual(round(p.x, 1), x)
self.assertEqual(round(p.y, 1), y)
# Test no mutator
bb = f.bounding_box
self.assertEqual(f.mutator_angle, 0)
self.assertEqual(f.mutator_scale_x, 1)
self.assertEqual(f.mutator_scale_y, 1)
test(83.1, -6.3)
# Test rotation
f.mutate(45)
test(63.2, 54.3)
self.assertNotEqual(bb, f.bounding_box)
# Rollback angle
f.mutate()
bb2 = f.bounding_box
self.assertAlmostEqual(bb.xmin, bb2.xmin)
self.assertAlmostEqual(bb.ymin, bb2.ymin)
test(83.1, -6.3)
# Test scale
f.mutate(0, -1)
test(-83.1, -6.3)
f.mutate(0, 1, -1)
test(83.1, 6.3)
# Test rotate and scale
f.mutate(60, -1, 0.65)
test(-38, -74)
# Rollback
f.mutate()
test(83.1, -6.3)
def test_hist(self) -> None:
"""
Test class histogram.
"""
db = DbLoader(DB_PATH)
self.assertEqual(db.hist(show_plot=False), ('',))
def test_add_floor(self) -> None:
"""
Test add floor to database.
"""
db = DbLoader(DB_PATH)
f0 = db.floors[0]
f = db.add_floor(floor_image=f0.image_path, scale=f0.image_scale, category=f0.category, elevation=f0.elevation)
self.assertEqual(f.image_path, f0.image_path)
self.assertEqual(f.image_scale, f0.image_scale)
self.assertEqual(f.category, f0.category)
self.assertEqual(f.elevation, f0.elevation)
def test_image(self) -> None:
"""
Test image obtain in binary/photo.
"""
f = DbLoader(DB_PATH).floors
image_binary = RectBinaryImage(image_size_px=256).init()
image_photo = RectFloorPhoto(image_size_px=256)
self.assertEqual(image_binary.image_shape, (256, 256))
r = f[0].rect[3] # Selected rectangle
image_binary.make_rect(r)
image_photo.make_rect(r)
r = f[1].rect[0] # Selected rectangle
image_binary.make_rect(r)
image_photo.make_rect(r)
self.assertEqual(np.sum(image_binary._images[0]), 2708)
self.assertEqual(np.sum(image_binary._images[1]), 6332)
self.assertEqual(np.sum(image_photo._images[0]), 284580)
self.assertEqual(np.sum(image_photo._images[1]), 883326)
# Export
if not os.path.isdir('.out'):
os.mkdir('.out')
image_binary.export('.out/binary')
image_photo.export('.out/photo')
# Now exporters must be closed
self.assertEqual(len(image_binary.get_images()), 0)
self.assertEqual(len(image_photo.get_images()), 0)