1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- # --------------------------------------------------------
- # Tensorflow Faster R-CNN
- # Licensed under The MIT License [see LICENSE for details]
- # Written by Xinlei Chen
- # --------------------------------------------------------
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
- import numpy as np
- from six.moves import range
- import PIL.Image as Image
- import PIL.ImageColor as ImageColor
- import PIL.ImageDraw as ImageDraw
- import PIL.ImageFont as ImageFont
- STANDARD_COLORS = [
- 'AliceBlue', 'Chartreuse', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque',
- 'BlanchedAlmond', 'BlueViolet', 'BurlyWood', 'CadetBlue', 'AntiqueWhite',
- 'Chocolate', 'Coral', 'CornflowerBlue', 'Cornsilk', 'Crimson', 'Cyan',
- 'DarkCyan', 'DarkGoldenRod', 'DarkGrey', 'DarkKhaki', 'DarkOrange',
- 'DarkOrchid', 'DarkSalmon', 'DarkSeaGreen', 'DarkTurquoise', 'DarkViolet',
- 'DeepPink', 'DeepSkyBlue', 'DodgerBlue', 'FireBrick', 'FloralWhite',
- 'ForestGreen', 'Fuchsia', 'Gainsboro', 'GhostWhite', 'Gold', 'GoldenRod',
- 'Salmon', 'Tan', 'HoneyDew', 'HotPink', 'IndianRed', 'Ivory', 'Khaki',
- 'Lavender', 'LavenderBlush', 'LawnGreen', 'LemonChiffon', 'LightBlue',
- 'LightCoral', 'LightCyan', 'LightGoldenRodYellow', 'LightGray', 'LightGrey',
- 'LightGreen', 'LightPink', 'LightSalmon', 'LightSeaGreen', 'LightSkyBlue',
- 'LightSlateGray', 'LightSlateGrey', 'LightSteelBlue', 'LightYellow', 'Lime',
- 'LimeGreen', 'Linen', 'Magenta', 'MediumAquaMarine', 'MediumOrchid',
- 'MediumPurple', 'MediumSeaGreen', 'MediumSlateBlue', 'MediumSpringGreen',
- 'MediumTurquoise', 'MediumVioletRed', 'MintCream', 'MistyRose', 'Moccasin',
- 'NavajoWhite', 'OldLace', 'Olive', 'OliveDrab', 'Orange', 'OrangeRed',
- 'Orchid', 'PaleGoldenRod', 'PaleGreen', 'PaleTurquoise', 'PaleVioletRed',
- 'PapayaWhip', 'PeachPuff', 'Peru', 'Pink', 'Plum', 'PowderBlue', 'Purple',
- 'Red', 'RosyBrown', 'RoyalBlue', 'SaddleBrown', 'Green', 'SandyBrown',
- 'SeaGreen', 'SeaShell', 'Sienna', 'Silver', 'SkyBlue', 'SlateBlue',
- 'SlateGray', 'SlateGrey', 'Snow', 'SpringGreen', 'SteelBlue', 'GreenYellow',
- 'Teal', 'Thistle', 'Tomato', 'Turquoise', 'Violet', 'Wheat', 'White',
- 'WhiteSmoke', 'Yellow', 'YellowGreen'
- ]
- NUM_COLORS = len(STANDARD_COLORS)
- try:
- FONT = ImageFont.truetype('arial.ttf', 24)
- except IOError:
- FONT = ImageFont.load_default()
- def _draw_single_box(image, xmin, ymin, xmax, ymax, display_str, font, color='black', thickness=4):
- draw = ImageDraw.Draw(image)
- (left, right, top, bottom) = (xmin, xmax, ymin, ymax)
- draw.line([(left, top), (left, bottom), (right, bottom),
- (right, top), (left, top)], width=thickness, fill=color)
- text_bottom = bottom
- # Reverse list and print from bottom to top.
- text_width, text_height = font.getsize(display_str)
- margin = np.ceil(0.05 * text_height)
- draw.rectangle(
- [(left, text_bottom - text_height - 2 * margin), (left + text_width,
- text_bottom)],
- fill=color)
- draw.text(
- (left + margin, text_bottom - text_height - margin),
- display_str,
- fill='black',
- font=font)
- return image
- def draw_bounding_boxes(image, gt_boxes, im_info):
- num_boxes = gt_boxes.shape[0]
- gt_boxes_new = gt_boxes.copy()
- gt_boxes_new[:,:4] = np.round(gt_boxes_new[:,:4].copy() / im_info[2])
- disp_image = Image.fromarray(np.uint8(image[0]))
- for i in range(num_boxes):
- this_class = int(gt_boxes_new[i, 4])
- disp_image = _draw_single_box(disp_image,
- gt_boxes_new[i, 0],
- gt_boxes_new[i, 1],
- gt_boxes_new[i, 2],
- gt_boxes_new[i, 3],
- 'N%02d-C%02d' % (i, this_class),
- FONT,
- color=STANDARD_COLORS[this_class % NUM_COLORS])
- image[0, :] = np.array(disp_image)
- return image
|