| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | 
                        - #  Licensed under the Apache License, Version 2.0 (the "License");
 - #  you may not use this file except in compliance with the License.
 - #  You may obtain a copy of the License at
 - #
 - #      http://www.apache.org/licenses/LICENSE-2.0
 - #
 - #  Unless required by applicable law or agreed to in writing, software
 - #  distributed under the License is distributed on an "AS IS" BASIS,
 - #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 - #  See the License for the specific language governing permissions and
 - #  limitations under the License.
 - #
 - 
 - import os
 - import PIL
 - from PIL import ImageDraw
 - from api.utils.log_utils import logger
 - 
 - 
 - def save_results(image_list, results, labels, output_dir='output/', threshold=0.5):
 -     if not os.path.exists(output_dir):
 -         os.makedirs(output_dir)
 -     for idx, im in enumerate(image_list):
 -         im = draw_box(im, results[idx], labels, threshold=threshold)
 - 
 -         out_path = os.path.join(output_dir, f"{idx}.jpg")
 -         im.save(out_path, quality=95)
 -         logger.info("save result to: " + out_path)
 - 
 - 
 - def draw_box(im, result, lables, threshold=0.5):
 -     draw_thickness = min(im.size) // 320
 -     draw = ImageDraw.Draw(im)
 -     color_list = get_color_map_list(len(lables))
 -     clsid2color = {n.lower():color_list[i] for i,n in enumerate(lables)}
 -     result = [r for r in result if r["score"] >= threshold]
 - 
 -     for dt in result:
 -         color = tuple(clsid2color[dt["type"]])
 -         xmin, ymin, xmax, ymax = dt["bbox"]
 -         draw.line(
 -             [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin),
 -              (xmin, ymin)],
 -             width=draw_thickness,
 -             fill=color)
 - 
 -         # draw label
 -         text = "{} {:.4f}".format(dt["type"], dt["score"])
 -         tw, th = imagedraw_textsize_c(draw, text)
 -         draw.rectangle(
 -             [(xmin + 1, ymin - th), (xmin + tw + 1, ymin)], fill=color)
 -         draw.text((xmin + 1, ymin - th), text, fill=(255, 255, 255))
 -     return im
 - 
 - 
 - def get_color_map_list(num_classes):
 -     """
 -     Args:
 -         num_classes (int): number of class
 -     Returns:
 -         color_map (list): RGB color list
 -     """
 -     color_map = num_classes * [0, 0, 0]
 -     for i in range(0, num_classes):
 -         j = 0
 -         lab = i
 -         while lab:
 -             color_map[i * 3] |= (((lab >> 0) & 1) << (7 - j))
 -             color_map[i * 3 + 1] |= (((lab >> 1) & 1) << (7 - j))
 -             color_map[i * 3 + 2] |= (((lab >> 2) & 1) << (7 - j))
 -             j += 1
 -             lab >>= 3
 -     color_map = [color_map[i:i + 3] for i in range(0, len(color_map), 3)]
 -     return color_map
 - 
 - 
 - def imagedraw_textsize_c(draw, text):
 -     if int(PIL.__version__.split('.')[0]) < 10:
 -         tw, th = draw.textsize(text)
 -     else:
 -         left, top, right, bottom = draw.textbbox((0, 0), text)
 -         tw, th = right - left, bottom - top
 - 
 -     return tw, th
 
 
  |