Added preprocessing task belag.py
This commit is contained in:
parent
71a658b91b
commit
fd0dbd47bb
|
|
@ -0,0 +1,180 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
|
from itertools import product
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
import cv2
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
from detectron2.structures import BoxMode
|
||||||
|
from shapely.geometry import Polygon, box, MultiPolygon
|
||||||
|
import geopandas as gpd
|
||||||
|
|
||||||
|
Image.MAX_IMAGE_PIXELS = None
|
||||||
|
|
||||||
|
# with open("../data/GeoJson/Flaechenbelaege.json", "r") as file:
|
||||||
|
# flaechenbelaege = json.load(file)
|
||||||
|
# print(flaechenbelaege)
|
||||||
|
|
||||||
|
flaechenbelaege = gpd.read_file("../data/GeoJson/Flaechenbelaege.json")
|
||||||
|
|
||||||
|
reference_points = pd.read_csv("../data/Referenzpunkte.csv")
|
||||||
|
|
||||||
|
dir_in = "../data/images/"
|
||||||
|
main_image_filename = "WestendDOP2.tif"
|
||||||
|
|
||||||
|
name, ext = os.path.splitext(main_image_filename)
|
||||||
|
img = Image.open(os.path.join(dir_in, main_image_filename))
|
||||||
|
w, h = img.size
|
||||||
|
corners = reference_points.head(4)
|
||||||
|
left = min(corners["X"])
|
||||||
|
right = max(corners["X"])
|
||||||
|
bottom = min(corners["Y"])
|
||||||
|
top = max(corners["Y"])
|
||||||
|
x_scale = (right - left) / w
|
||||||
|
y_scale = (bottom - top) / h
|
||||||
|
|
||||||
|
print(left, top)
|
||||||
|
print(right, bottom)
|
||||||
|
|
||||||
|
print("Creating canvas...")
|
||||||
|
draw = ImageDraw.Draw(img)
|
||||||
|
d = 1000
|
||||||
|
grid = product(range(0, h - h % d, d), range(0, w - w % d, d))
|
||||||
|
|
||||||
|
images = []
|
||||||
|
category_translations = {
|
||||||
|
'Asphalt': "Festweg",
|
||||||
|
'Bepflanzte_Flaechen': "Baumbestand",
|
||||||
|
'Beton': "Festweg",
|
||||||
|
'Noppenpflaster': "Pflaster",
|
||||||
|
'Pflaster': "Pflaster",
|
||||||
|
'Platten': "Pflaster",
|
||||||
|
'Rasen': "Wiese",
|
||||||
|
'Rasengittersteine': "Pflaster",
|
||||||
|
'Rippenpflaster': "Pflaster",
|
||||||
|
'Sand': "Festweg",
|
||||||
|
'unbefestigt': "Festweg",
|
||||||
|
}
|
||||||
|
categories = [
|
||||||
|
"Baumbestand",
|
||||||
|
"Festweg",
|
||||||
|
"Pflaster",
|
||||||
|
"Wiese",
|
||||||
|
"Wasser",
|
||||||
|
"Gullydeckel",
|
||||||
|
]
|
||||||
|
|
||||||
|
for i, j in grid:
|
||||||
|
# if i > 14000:
|
||||||
|
# break
|
||||||
|
|
||||||
|
view_box = (
|
||||||
|
j,
|
||||||
|
i,
|
||||||
|
j + d,
|
||||||
|
i + d,
|
||||||
|
)
|
||||||
|
annotations = []
|
||||||
|
filename = f"data/images/westend/belag/{i}_{j}.tif"
|
||||||
|
image = dict(
|
||||||
|
image_id=len(images),
|
||||||
|
width=d,
|
||||||
|
height=d,
|
||||||
|
file_name=f"data/images/cropped/WestendDOP2_{i}_{j}.tif",
|
||||||
|
annotations=annotations,
|
||||||
|
)
|
||||||
|
|
||||||
|
# print(flaechenbelaege.head())
|
||||||
|
# print(flaechenbelaege.columns)
|
||||||
|
|
||||||
|
# loop over every shape
|
||||||
|
for _, row in flaechenbelaege.iterrows():
|
||||||
|
kind = row["Art"]
|
||||||
|
category_name = category_translations.get(kind, "")
|
||||||
|
category_id = categories.index(category_name)
|
||||||
|
first_obj: Polygon = row["geometry"] # ["coordinates"][0]
|
||||||
|
# pprint(first_obj)
|
||||||
|
# print(first_obj.bounds)
|
||||||
|
# polygon = Polygon(first_obj)
|
||||||
|
# print(polygon)
|
||||||
|
# print(polygon.bounds)
|
||||||
|
# print(list(first_obj.exterior.coords))
|
||||||
|
|
||||||
|
scaled = list(map(lambda xy: ((xy[0] - left) / x_scale, (xy[1] - top) / y_scale),
|
||||||
|
first_obj.exterior.coords))
|
||||||
|
|
||||||
|
# pprint(scaled[:10])
|
||||||
|
belag = Polygon(scaled)
|
||||||
|
# print(belag.bounds)
|
||||||
|
intersection = belag.intersection(box(*view_box))
|
||||||
|
if not intersection.bounds:
|
||||||
|
# print(f"No shape found in {i, j}")
|
||||||
|
continue
|
||||||
|
# print()
|
||||||
|
# print(i, j)
|
||||||
|
# print(intersection.bounds)
|
||||||
|
# exit()
|
||||||
|
|
||||||
|
# print("Drawing polygon...")
|
||||||
|
if isinstance(intersection, MultiPolygon):
|
||||||
|
intersects: List[Polygon] = intersection.geoms
|
||||||
|
# print(f"error at {a}_{b}")
|
||||||
|
# continue
|
||||||
|
else:
|
||||||
|
intersects: List[Polygon] = [intersection]
|
||||||
|
for intersect in intersects:
|
||||||
|
assert isinstance(intersect, Polygon)
|
||||||
|
# print(intersect)
|
||||||
|
# draw.rectangle(
|
||||||
|
# intersect.bounds,
|
||||||
|
# # fill="#000",
|
||||||
|
# )
|
||||||
|
global_segmentation = list(intersect.exterior.coords)
|
||||||
|
global_boundaries = intersect.bounds
|
||||||
|
draw.polygon(
|
||||||
|
global_segmentation,
|
||||||
|
fill=(
|
||||||
|
255 * (category_id % 1),
|
||||||
|
255 * (category_id % 2),
|
||||||
|
255 * (category_id % 4),
|
||||||
|
),
|
||||||
|
outline="#f00",
|
||||||
|
)
|
||||||
|
|
||||||
|
local_segmentation = [x for xs in global_segmentation for x in xs]
|
||||||
|
local_segmentation = [[
|
||||||
|
x - (i * (c % 2)) - (j * (1 - c % 2))
|
||||||
|
for c, x in enumerate(local_segmentation)
|
||||||
|
]]
|
||||||
|
local_boundaries = [
|
||||||
|
global_boundaries[0] - j,
|
||||||
|
global_boundaries[1] - i,
|
||||||
|
global_boundaries[2] - j,
|
||||||
|
global_boundaries[3] - i,
|
||||||
|
]
|
||||||
|
|
||||||
|
annotation = dict(
|
||||||
|
category_id=category_id,
|
||||||
|
category_name=f"{category_name} ({kind})",
|
||||||
|
ignore=0,
|
||||||
|
iscrowd=0,
|
||||||
|
bbox=local_boundaries,
|
||||||
|
bbox_mode=BoxMode.XYXY_ABS,
|
||||||
|
segmentation=local_segmentation,
|
||||||
|
)
|
||||||
|
annotations.append(annotation)
|
||||||
|
|
||||||
|
if annotations:
|
||||||
|
images.append(image)
|
||||||
|
# end loop
|
||||||
|
|
||||||
|
# print(f"Saving file {a}_{b}.tif ...")
|
||||||
|
# img.crop((b, a, b + d, a + d)).save(filename)
|
||||||
|
# img.save("data/images/westend/belag/zzz.tif")
|
||||||
|
|
||||||
|
with open("../data/json/belaege.json", "w") as file:
|
||||||
|
json.dump(images, file, indent=2)
|
||||||
Loading…
Reference in New Issue