Spaces:
Runtime error
Runtime error
import base64 | |
from box_utils import cxywh2ltrb, cxywh2xywh | |
def style(): | |
""" Style string for card models | |
""" | |
return """ | |
<link | |
rel="stylesheet" | |
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" | |
/> | |
<style> | |
.img-overlay-wrap { | |
position: relative; | |
display: inline-block; | |
} | |
.img-overlay-wrap { | |
position: relative; | |
display: inline-block; | |
/* <= shrinks container to image size */ | |
transition: transform 150ms ease-in-out; | |
} | |
.img-overlay-wrap img { | |
/* <= optional, for responsiveness */ | |
display: block; | |
max-width: 100%; | |
height: auto; | |
} | |
.img-overlay-wrap svg { | |
position: absolute; | |
top: 0; | |
left: 0; | |
} | |
</style> | |
""" | |
def card(img_url, img_w, img_h, boxes): | |
""" This is a hack to streamlit | |
Solution thanks to: https://discuss.streamlit.io/t/display-svg/172/5 | |
Converting SVG to Base64 and display with <img> tag. | |
Also we used the | |
""" | |
_boxes = "" | |
for _id, cx, cy, w, h, label, logit, is_selected, _ in boxes: | |
x, y, w, h = cxywh2xywh(cx, cy, w, h) | |
x = round(img_w * x) | |
y = round(img_h * y) | |
w = round(img_w * w) | |
h = round(img_h * h) | |
logit = "%.3f" % logit | |
_boxes += f''' | |
<text fill="white" font-size="20" x="{x}" y="{y}" style="fill:white;opacity:0.7">{label}: {logit}</text> | |
<rect x="{x}" y="{y}" width="{w}" height="{h}" style="fill:none;stroke:{"red" if is_selected else "green"}; | |
stroke-width:4;opacity:0.5" /> | |
''' | |
_svg = f''' | |
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {img_w} {img_h}"> | |
{_boxes} | |
</svg> | |
''' | |
_svg = r'<img style="position:absolute;top:0;left:0;" src="data:image/svg+xml;base64,%s"/>' % \ | |
base64.b64encode(_svg.encode('utf-8')).decode('utf-8') | |
_img_d = f''' | |
<div class="img-overlay-wrap" width="{img_w}" height="{img_h}"> | |
<img width="{img_w}" height="{img_h}" src="{img_url}"> | |
{_svg} | |
</div> | |
''' | |
return _img_d | |
def obj_card(img_url, img_w, img_h, cx, cy, w, h, *args, dst_len=100): | |
"""object card for displaying cropped object | |
Args: | |
Retrieved image and object info | |
Returns: | |
_obj_html: html string to display object | |
""" | |
w = img_w * w | |
h = img_h * h | |
s = max(w, h) | |
x = round(img_w * cx - s / 2) | |
y = round(img_h * cy - s / 2) | |
scale = dst_len / s | |
_obj_html = f''' | |
<div style="transform-origin:0 0;transform:scale({scale});"> | |
<img src="{img_url}" style="margin:{-y}px 0px 0px {-x}px;"> | |
</div> | |
''' | |
return _obj_html | |