{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"!git clone https://github.com/cocodataset/cocoapi.git\n!cpp -r /kaggle/input/tensoflow-models/models .","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"!git clone https://github.com/cocodataset/cocoapi.git\n!git clone https://github.com/tensorflow/models.git\n!cd cocoapi/PythonAPI; make; cp -r pycocotools ../../models/research/\n\n# !wget -O protobuf.zip https://github.com/google/protobuf/releases/download/v3.0.0/protoc-3.0.0-linux-x86_64.zip\n!wget -O protobuf.zip \n!unzip protobuf.zip\n\n!cd models/research; ../../bin/protoc object_detection/protos/*.proto --python_out=.\n!cp -r models/research/object_detection .\n\n%set_env PYTHONPATH=/kaggle/working/models/research:/kaggle/working/models/research/slim\n    \n#!python object_detection/builders/model_builder_test.py","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# coding: utf-8\n__author__ = 'ZFTurbo: https://kaggle.com/zfturbo'\n\nimport numpy as np\nimport gzip\nimport pickle\nimport os\nimport glob\nimport time\nimport cv2\nimport datetime\nimport pandas as pd\nfrom collections import Counter, defaultdict\nimport random\nimport shutil\nimport operator\n# import pyvips\nfrom PIL import Image\nimport platform\nimport json\n\n\nif platform.processor() == 'Intel64 Family 6 Model 79 Stepping 1, GenuineIntel':\n    DATASET_PATH = 'E:/Projects_M2/2018_07_Google_Open_Images/input/'\nelse:\n    DATASET_PATH = 'D:/Projects/2018_07_Google_Open_Images/input/'\n\nROOT_PATH = os.path.dirname(os.path.dirname(os.path.realpath(\"__file__\"))) + '/'\nINPUT_PATH = ROOT_PATH + 'input/'\n#OUTPUT_PATH = ROOT_PATH + 'output/'\nOUTPUT_PATH = ROOT_PATH\n#MODELS_PATH = ROOT_PATH + 'models/'\nMODELS_PATH = INPUT_PATH\nSUBM_PATH = ROOT_PATH + 'subm/'\n\n# https://storage.googleapis.com/openimages/challenge_2018/bbox_labels_500_hierarchy_visualizer/circle.html\n\nLEVEL_1_LABELS = ['Accordion', 'Adhesive tape', 'Airplane', 'Alarm clock', 'Alpaca', 'Ambulance', 'Ant', 'Antelope',\n                  'Apple', 'Artichoke', 'Asparagus', 'Backpack', 'Bagel', 'Balloon', 'Banana', 'Barge', 'Barrel',\n                  'Baseball bat', 'Baseball glove', 'Bat', 'Bathroom cabinet', 'Bathtub', 'Beaker', 'Bee', 'Beehive',\n                  'Beer', 'Bell pepper', 'Belt', 'Bench', 'Bicycle', 'Bicycle helmet', 'Bicycle wheel', 'Bidet',\n                  'Billboard', 'Billiard table', 'Binoculars', 'Blender', 'Blue jay', 'Book', 'Bookcase', 'Boot',\n                  'Bottle', 'Bow and arrow', 'Bowl', 'Box', 'Boy', 'Brassiere', 'Bread', 'Briefcase', 'Broccoli',\n                  'Bronze sculpture', 'Brown bear', 'Bull', 'Burrito', 'Bus', 'Bust', 'Butterfly', 'Cabbage',\n                  'Cabinetry', 'Cake', 'Cake stand', 'Camel', 'Camera', 'Canary', 'Candle', 'Candy', 'Cannon',\n                  'Canoe', 'Carrot', 'Cart', 'Castle', 'Cat', 'Caterpillar', 'Cattle', 'Ceiling fan', 'Cello',\n                  'Centipede', 'Chair', 'Cheetah', 'Chest of drawers', 'Chicken', 'Chopsticks', 'Christmas tree',\n                  'Coat', 'Cocktail', 'Coconut', 'Coffee', 'Coffee cup', 'Coffee table', 'Coffeemaker', 'Coin',\n                  'Common fig', 'Computer keyboard', 'Computer monitor', 'Computer mouse', 'Convenience store',\n                  'Cookie', 'Corded phone', 'Countertop', 'Cowboy hat', 'Crab', 'Cricket ball', 'Crocodile',\n                  'Croissant', 'Crown', 'Crutch', 'Cucumber', 'Cupboard', 'Curtain', 'Cutting board', 'Dagger',\n                  'Deer', 'Desk', 'Dice', 'Digital clock', 'Dinosaur', 'Dog', 'Dog bed', 'Doll', 'Dolphin',\n                  'Door', 'Door handle', 'Doughnut', 'Dragonfly', 'Drawer', 'Dress', 'Drinking straw', 'Drum',\n                  'Duck', 'Dumbbell', 'Eagle', 'Earrings', 'Egg', 'Elephant', 'Envelope', 'Falcon', 'Fedora',\n                  'Filing cabinet', 'Fire hydrant', 'Fireplace', 'Flag', 'Flashlight', 'Flowerpot', 'Flute',\n                  'Food processor', 'Football', 'Football helmet', 'Fork', 'Fountain', 'Fox', 'French fries',\n                  'Frog', 'Frying pan', 'Gas stove', 'Giraffe', 'Girl', 'Glasses', 'Goat', 'Goggles', 'Goldfish',\n                  'Golf ball', 'Golf cart', 'Gondola', 'Goose', 'Grape', 'Grapefruit', 'Guacamole', 'Guitar',\n                  'Hamburger', 'Hamster', 'Handbag', 'Handgun', 'Harbor seal', 'Harp', 'Harpsichord', 'Headphones',\n                  'Helicopter', 'High heels', 'Honeycomb', 'Horn', 'Horse', 'Hot dog', 'House', 'Houseplant',\n                  'Human arm', 'Human beard', 'Human ear', 'Human eye', 'Human face', 'Human foot', 'Human hair',\n                  'Human hand', 'Human head', 'Human leg', 'Human mouth', 'Human nose', 'Ice cream', 'Infant bed',\n                  'Jacket', 'Jaguar', 'Jeans', 'Jellyfish', 'Jet ski', 'Jug', 'Juice', 'Kangaroo', 'Kettle',\n                  'Kitchen & dining room table', 'Kitchen knife', 'Kite', 'Knife', 'Ladder', 'Ladybug', 'Lamp',\n                  'Lantern', 'Laptop', 'Lavender', 'Lemon', 'Leopard', 'Lifejacket', 'Light bulb', 'Light switch',\n                  'Lighthouse', 'Lily', 'Limousine', 'Lion', 'Lizard', 'Lobster', 'Loveseat', 'Lynx', 'Man',\n                  'Mango', 'Maple', 'Measuring cup', 'Mechanical fan', 'Microphone', 'Microwave oven', 'Miniskirt',\n                  'Mirror', 'Missile', 'Mixer', 'Mobile phone', 'Monkey', 'Motorcycle', 'Mouse', 'Muffin', 'Mug',\n                  'Mule', 'Mushroom', 'Musical keyboard', 'Nail', 'Necklace', 'Nightstand', 'Oboe', 'Office building',\n                  'Orange', 'Organ', 'Ostrich', 'Otter', 'Oven', 'Owl', 'Oyster', 'Paddle', 'Palm tree', 'Pancake',\n                  'Paper towel', 'Parachute', 'Parrot', 'Pasta', 'Peach', 'Pear', 'Pen', 'Penguin', 'Piano',\n                  'Picnic basket', 'Picture frame', 'Pig', 'Pillow', 'Pineapple', 'Pitcher', 'Pizza', 'Plastic bag',\n                  'Plate', 'Platter', 'Polar bear', 'Pomegranate', 'Popcorn', 'Porch', 'Porcupine', 'Poster',\n                  'Potato', 'Power plugs and sockets', 'Pressure cooker', 'Pretzel', 'Printer', 'Pumpkin',\n                  'Punching bag', 'Rabbit', 'Raccoon', 'Radish', 'Raven', 'Refrigerator', 'Rhinoceros', 'Rifle',\n                  'Ring binder', 'Rocket', 'Roller skates', 'Rose', 'Rugby ball', 'Ruler', 'Salad',\n                  'Salt and pepper shakers', 'Sandal', 'Saucer', 'Saxophone', 'Scarf', 'Scissors', 'Scoreboard',\n                  'Screwdriver', 'Sea lion', 'Sea turtle', 'Seahorse', 'Seat belt', 'Segway', 'Serving tray',\n                  'Sewing machine', 'Shark', 'Sheep', 'Shelf', 'Shirt', 'Shorts', 'Shotgun', 'Shower', 'Shrimp',\n                  'Sink', 'Skateboard', 'Ski', 'Skull', 'Skyscraper', 'Slow cooker', 'Snail', 'Snake', 'Snowboard',\n                  'Snowman', 'Snowmobile', 'Snowplow', 'Sock', 'Sofa bed', 'Sombrero', 'Sparrow', 'Spatula',\n                  'Spider', 'Spoon', 'Sports uniform', 'Squirrel', 'Stairs', 'Starfish', 'Stationary bicycle',\n                  'Stool', 'Stop sign', 'Strawberry', 'Street light', 'Stretcher', 'Studio couch',\n                  'Submarine sandwich', 'Suit', 'Suitcase', 'Sun hat', 'Sunflower', 'Sunglasses', 'Surfboard',\n                  'Sushi', 'Swan', 'Swim cap', 'Swimming pool', 'Swimwear', 'Sword', 'Table tennis racket',\n                  'Tablet computer', 'Taco', 'Tank', 'Tap', 'Tart', 'Taxi', 'Tea', 'Teapot', 'Teddy bear',\n                  'Television', 'Tennis ball', 'Tennis racket', 'Tent', 'Tiara', 'Tick', 'Tie', 'Tiger', 'Tin can',\n                  'Tire', 'Toaster', 'Toilet', 'Toilet paper', 'Tomato', 'Torch', 'Tortoise', 'Towel', 'Tower',\n                  'Traffic light', 'Train', 'Training bench', 'Treadmill', 'Tripod', 'Trombone', 'Truck',\n                  'Trumpet', 'Turkey', 'Umbrella', 'Van', 'Vase', 'Vehicle registration plate', 'Violin',\n                  'Volleyball', 'Waffle', 'Wall clock', 'Washing machine', 'Waste container', 'Watch',\n                  'Watermelon', 'Whale', 'Wheel', 'Wheelchair', 'Whiteboard', 'Willow', 'Window',\n                  'Window blind', 'Wine', 'Wine glass', 'Winter melon', 'Wok', 'Woman', 'Wood-burning stove',\n                  'Woodpecker', 'Wrench', 'Zebra', 'Zucchini']\n\n\nLEVEL_2_LABELS = ['Toy', 'Home appliance', 'Plumbing fixture', 'Office supplies', 'Tableware', 'Kitchen appliance',\n                  'Couch', 'Bed', 'Table', 'Clock', 'Sculpture', 'Traffic sign', 'Building', 'Person', 'Dessert',\n                  'Fruit', 'Shellfish', 'Squash', 'Sandwich', 'Tree', 'Flower', 'Car', 'Boat', 'Aircraft', 'Hat',\n                  'Skirt', 'Glove', 'Trousers', 'Footwear', 'Luggage and bags', 'Helmet', 'Bird',\n                  'Marine invertebrates', 'Beetle', 'Moths and butterflies', 'Bear', 'Marine mammal', 'Turtle',\n                  'Fish', 'Personal care', 'Musical instrument', 'Ball', 'Racket', 'Weapon', 'Telephone',\n                  'Drink']\n\nLEVEL_3_LABELS = ['Seafood', 'Watercraft', 'Insect', 'Carnivore']\n\n# Some classes upper to make more than one class for single net\nLEVEL_4_LABELS = ['Vegetable', 'Land vehicle', 'Reptile', 'Invertebrate']\n\n# Some classes upper to make more than one class for single net\nLEVEL_5_LABELS = ['Furniture', 'Vehicle', 'Animal']\n\n# Classes with less than 500 samples in train\nLEVEL_1_LABELS_LOW_SAMPLES = ['Adhesive tape', 'Alarm clock', 'Ambulance', 'Artichoke', 'Asparagus', 'Bathroom cabinet',\n                              'Beaker', 'Belt', 'Bidet', 'Binoculars', 'Blender', 'Blue jay', 'Briefcase', 'Burrito',\n                              'Cabbage', 'Cake stand', 'Canary', 'Ceiling fan', 'Centipede', 'Coffeemaker', 'Common fig',\n                              'Corded phone', 'Cricket ball', 'Croissant', 'Crutch', 'Cutting board', 'Dagger',\n                              'Digital clock', 'Dog bed', 'Drinking straw', 'Dumbbell', 'Envelope', 'Filing cabinet',\n                              'Fire hydrant', 'Flashlight', 'Flute', 'Food processor', 'Frying pan', 'Golf ball',\n                              'Guacamole', 'Harp', 'Harpsichord', 'Honeycomb', 'Hot dog', 'Infant bed',\n                              'Kitchen knife', 'Light switch', 'Limousine', 'Lynx', 'Mango', 'Measuring cup',\n                              'Microwave oven', 'Mixer', 'Nail', 'Oboe', 'Organ', 'Paper towel', 'Picnic basket',\n                              'Pitcher', 'Popcorn', 'Porcupine', 'Power plugs and sockets', 'Pressure cooker',\n                              'Pretzel', 'Printer', 'Punching bag', 'Raccoon', 'Ring binder', 'Rugby ball', 'Ruler',\n                              'Salt and pepper shakers', 'Scissors', 'Screwdriver', 'Seahorse', 'Seat belt',\n                              'Serving tray', 'Sewing machine', 'Shower', 'Slow cooker', 'Snowmobile', 'Snowplow',\n                              'Spatula', 'Stationary bicycle', 'Stop sign', 'Stretcher', 'Submarine sandwich',\n                              'Tiara', 'Tick', 'Toaster', 'Toilet paper', 'Torch', 'Towel', 'Training bench',\n                              'Treadmill', 'Winter melon', 'Wood-burning stove', 'Wrench']\n\n\ndef save_in_file(arr, file_name):\n    pickle.dump(arr, gzip.open(file_name, 'wb+', compresslevel=3))\n\n\ndef load_from_file(file_name):\n    return pickle.load(gzip.open(file_name, 'rb'))\n\n\ndef save_in_file_fast(arr, file_name):\n    pickle.dump(arr, open(file_name, 'wb'))\n\n\ndef load_from_file_fast(file_name):\n    return pickle.load(open(file_name, 'rb'))\n\n\ndef show_image(im, name='image'):\n    cv2.imshow(name, im.astype(np.uint8))\n    cv2.waitKey(0)\n    cv2.destroyAllWindows()\n\n\ndef show_resized_image(P, w=1000, h=1000):\n    res = cv2.resize(P.astype(np.uint8), (w, h), interpolation=cv2.INTER_CUBIC)\n    show_image(res)\n\n\ndef get_date_string():\n    return datetime.datetime.now().strftime(\"%Y-%m-%d-%H-%M\")\n\n\ndef sort_dict_by_values(a, reverse=True):\n    sorted_x = sorted(a.items(), key=operator.itemgetter(1), reverse=reverse)\n    return sorted_x\n\n\ndef value_counts_for_list(lst):\n    a = dict(Counter(lst))\n    a = sort_dict_by_values(a, True)\n    return a\n\n\ndef read_single_image(path):\n    use_pyvips = False\n    try:\n        if not use_pyvips:\n            img = np.array(Image.open(path))\n        else:\n            # Much faster in case you have pyvips installed (uncomment import pyvips in top of file)\n            img = pyvips.Image.new_from_file(path, access='sequential')\n            img = np.ndarray(buffer=img.write_to_memory(),\n                         dtype=np.uint8,\n                         shape=[img.height, img.width, img.bands])\n    except:\n        try:\n            img = cv2.cvtColor(cv2.imread(path), cv2.COLOR_BGR2RGB)\n        except:\n            print('Fail')\n            return None\n\n    if len(img.shape) == 2:\n        img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)\n\n    if img.shape[2] == 2:\n        img = img[:, :, :1]\n\n    if img.shape[2] == 1:\n        img = np.concatenate((img, img, img), axis=2)\n\n    if img.shape[2] > 3:\n        img = img[:, :, :3]\n\n    return img\n\n\ndef get_description_for_labels():\n    out = open(INPUT_PATH + 'class-descriptions-boxable.csv')\n    lines = out.readlines()\n    ret_1, ret_2 = dict(), dict()\n    for l in lines:\n        arr = l.strip().split(',')\n        ret_1[arr[0]] = arr[1]\n        ret_2[arr[1]] = arr[0]\n    return ret_1, ret_2\n\n\ndef read_image_bgr_fast(path):\n    img2 = read_single_image(path)\n    img2 = img2[:, :, ::-1]\n    return img2\n\n\ndef get_subcategories(sub_cat, upper_cat, level, l, d1, sub):\n    ret = []\n    sub_cat[upper_cat] = ([], [])\n    for j, k in enumerate(l[sub]):\n        nm = d1[k['LabelName']]\n        sub_cat[upper_cat][1].append(nm)\n        if nm in sub_cat:\n            continue\n        ret.append(nm)\n        if 'Subcategory' in k:\n            get_subcategories(sub_cat, nm, level + 1, l, d1, 'Subcategory')\n        else:\n            sub_cat[nm] = ([upper_cat], [])\n    return ret\n\n\ndef get_hierarchy_structures():\n    sub_cat = dict()\n    part_cat = dict()\n    d1, d2 = get_description_for_labels()\n    arr = json.load(open(INPUT_PATH + 'bbox_labels_600_hierarchy.json', 'r'))\n    lst = dict(arr.items())['Subcategory']\n    for i, l in enumerate(lst):\n        nm = d1[l['LabelName']]\n        if 'Subcategory' in l:\n            get_subcategories(sub_cat, nm, 1, l, d1, 'Subcategory')\n        else:\n            if nm in sub_cat:\n                print('Strange!')\n                exit()\n            sub_cat[nm] = [], []\n    return sub_cat\n\n\ndef set_parents(parents, name_list, l, d1):\n    for j, k in enumerate(l['Subcategory']):\n        nm = d1[k['LabelName']]\n        parents[nm] += name_list\n        if 'Subcategory' in k:\n            set_parents(parents, name_list + [nm], k, d1)\n\n\ndef get_parents_labels():\n    d1, d2 = get_description_for_labels()\n    parents = dict()\n    for r in d2.keys():\n        parents[r] = []\n\n    arr = json.load(open(INPUT_PATH + 'bbox_labels_600_hierarchy.json', 'r'))\n    lst = dict(arr.items())['Subcategory']\n    for i, l in enumerate(lst):\n        nm = d1[l['LabelName']]\n        if 'Subcategory' in l:\n            set_parents(parents, [nm], l, d1)\n    # print(parents)\n    for p in parents:\n        parents[p] = list(set(parents[p]))\n    return parents\n\n\ndef get_description_for_labels_500():\n    out = open(INPUT_PATH + 'challenge-2018-class-descriptions-500.csv')\n    lines = out.readlines()\n    ret_1, ret_2 = dict(), dict()\n    for l in lines:\n        arr = l.strip().split(',')\n        ret_1[arr[0]] = arr[1]\n        ret_2[arr[1]] = arr[0]\n    return ret_1, ret_2\n\n\ndef random_intensity_change1(img, min_change=-20, max_change=20, separate_channel=True):\n    img = img.astype(np.float32)\n    delta = random.randint(min_change, max_change)\n    for j in range(3):\n        if separate_channel:\n            delta = random.randint(min_change, max_change)\n        img[:, :, j] += delta\n    img[img < 0] = 0\n    img[img > 255] = 255\n    return img.astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"# coding: utf-8\n__author__ = 'ZFTurbo: https://kaggle.com/zfturbo'\n\n\nif __name__ == '__main__':\n    import os\n    gpu_use = 0\n    print('GPU use: {}'.format(gpu_use))\n    os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"\n    os.environ[\"CUDA_VISIBLE_DEVICES\"] = \"{}\".format(gpu_use)\n\n\nfrom a00_utils_and_constants import *\nimport numpy as np\nimport os\nimport sys\nimport tensorflow as tf\nfrom PIL import Image\n\n# This is needed since the notebook is stored in the object_detection folder.\nsys.path.append(\"..\")\nfrom object_detection.utils import ops as utils_ops\nfrom object_detection.utils import label_map_util\nfrom object_detection.utils import visualization_utils as vis_util\n\n\ndef load_image_into_numpy_array(image):\n    (im_width, im_height) = image.size\n    return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)\n\n\n# What model to download.\n#MODEL_NAME = 'faster_rcnn_inception_resnet_v2_atrous_oid_2018_01_28'\nMODEL_NAME = 'inception-resnet-v2-atrous-oid-v4/2018_12_12'\n# Path to frozen detection graph. This is the actual model that is used for the object detection.\nPATH_TO_CKPT = MODELS_PATH + MODEL_NAME + '/frozen_inference_graph.pb'\n# List of the strings that is used to add correct label for each box.\n#PATH_TO_LABELS = os.path.join(MODELS_PATH + 'oid_bbox_trainable_label_map.pbtxt')\nPATH_TO_LABELS = 'models/research/object_detection/data/oid_bbox_trainable_label_map.pbtxt'\nNUM_CLASSES = 546\n\ndetection_graph = tf.Graph()\nwith detection_graph.as_default():\n  od_graph_def = tf.GraphDef()\n  with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:\n    serialized_graph = fid.read()\n    od_graph_def.ParseFromString(serialized_graph)\n    tf.import_graph_def(od_graph_def, name='')\n\nlabel_map = label_map_util.load_labelmap(PATH_TO_LABELS)\ncategories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)\ncategory_index = label_map_util.create_category_index(categories)\n\n\ndef resize_image(img, min_side=800, max_side=1333):\n    \"\"\" Resize an image such that the size is constrained to min_side and max_side.\n\n    Args\n        min_side: The image's min side will be equal to min_side after resizing.\n        max_side: If after resizing the image's max side is above max_side, resize until the max side is equal to max_side.\n\n    Returns\n        A resized image.\n    \"\"\"\n    (rows, cols, _) = img.shape\n\n    smallest_side = min(rows, cols)\n\n    # rescale the image so the smallest side is min_side\n    scale = min_side / smallest_side\n\n    # check if the largest side is now greater than max_side, which can happen\n    # when images have a large aspect ratio\n    largest_side = max(rows, cols)\n    if largest_side * scale > max_side:\n        scale = max_side / largest_side\n\n    # resize the image with the computed scale\n    img = cv2.resize(img, None, fx=scale, fy=scale)\n\n    return img, scale\n\n\ndef run_inference_for_images(images, graph, mirror_images=False):\n    with graph.as_default():\n        with tf.Session() as sess:\n            # Get handles to input and output tensors\n            ops = tf.get_default_graph().get_operations()\n            all_tensor_names = {output.name for op in ops for output in op.outputs}\n            tensor_dict = {}\n            for key in [\n                'num_detections', 'detection_boxes', 'detection_scores',\n                'detection_classes', 'detection_masks'\n            ]:\n                tensor_name = key + ':0'\n                if tensor_name in all_tensor_names:\n                    tensor_dict[key] = tf.get_default_graph().get_tensor_by_name(tensor_name)\n            image_tensor = tf.get_default_graph().get_tensor_by_name('image_tensor:0')\n\n            # Run inference\n            o = []\n            for i, image in enumerate(images):\n                print('Detect: {}'.format(i))\n                if mirror_images:\n                    image = image[:, ::-1, :]\n                image_expanded = np.expand_dims(image, axis=0)\n                output_dict = sess.run(tensor_dict,  feed_dict={image_tensor: image_expanded})\n                # all outputs are float32 numpy arrays, so convert types as appropriate\n                output_dict['num_detections'] = int(output_dict['num_detections'][0])\n                output_dict['detection_classes'] = output_dict['detection_classes'][0].astype(np.uint32)\n                output_dict['detection_boxes'] = output_dict['detection_boxes'][0]\n                if mirror_images:\n                    tmp = 1 - output_dict['detection_boxes'][:output_dict['num_detections'], 1]\n                    output_dict['detection_boxes'][:output_dict['num_detections'], 1] = 1 - output_dict['detection_boxes'][:output_dict['num_detections'], 3]\n                    output_dict['detection_boxes'][:output_dict['num_detections'], 3] = tmp\n                output_dict['detection_scores'] = output_dict['detection_scores'][0]\n                o.append(output_dict)\n\n    return o\n\n\ndef run_inference_for_files(files, out_dir, mirror_images):\n    batch_size = 1000\n    for batch in range(0, len(files), batch_size):\n        batch_files = files[batch:batch+batch_size]\n\n        image_arr = []\n        scales = []\n        ids = []\n        for image_path in batch_files:\n            id = os.path.basename(image_path)[:-4]\n            out_path = out_dir + id + '.pklz'\n            if os.path.exists(out_path):\n                print('Skip {}'.format(id))\n                continue\n            print('Read {}'.format(id))\n            if 0:\n                image = Image.open(image_path)\n                image_np = load_image_into_numpy_array(image)\n            else:\n                image_np = read_single_image(image_path)\n            image_np, scale = resize_image(image_np, min_side=600, max_side=1024)\n            image_arr.append(image_np.copy())\n            scales.append(scale)\n            ids.append(id)\n\n        if len(image_arr) == 0:\n            continue\n\n        # Actual detection\n        start_time = time.time()\n        output_dict = run_inference_for_images(image_arr, detection_graph, mirror_images)\n        print('Detection time: {:.3f} sec'.format(time.time() - start_time))\n\n        # Store results\n        for i, image_np in enumerate(image_arr):\n            out_path = out_dir + ids[i] + '.pklz'\n            save_in_file((scales[i], output_dict[i]), out_path)\n\n        if 0:\n            # Visualization of the results of a detection.\n            for i, image_np in enumerate(image_arr):\n                vis_util.visualize_boxes_and_labels_on_image_array(\n                    image_np,\n                    output_dict[i]['detection_boxes'],\n                    output_dict[i]['detection_classes'],\n                    output_dict[i]['detection_scores'],\n                    category_index,\n                    use_normalized_coordinates=True,\n                    line_thickness=8)\n                show_resized_image(image_np)\n\n\ndef run_inference_kaggle_tst(reverse=False, mirror_images=False):\n    files = glob.glob(INPUT_PATH + 'kaggle/challenge2018_test/*.jpg')\n    if reverse is True:\n        files = files[::-1]\n\n    print(len(files))\n    if mirror_images:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow_mirror/'\n    else:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow/'\n    if not os.path.isdir(out_dir):\n        os.mkdir(out_dir)\n    run_inference_for_files(files, out_dir, mirror_images)\n\n\ndef run_inference_validation(reverse=False, mirror_images=False):\n    files = glob.glob(DATASET_PATH + 'validation_big/*.jpg')\n    if reverse is True:\n        files = files[::-1]\n    print(len(files))\n    if mirror_images:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow_validation_mirror/'\n    else:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow_validation/'\n    if not os.path.isdir(out_dir):\n        os.mkdir(out_dir)\n    run_inference_for_files(files, out_dir, mirror_images)\n\n\ndef run_inference_tst(reverse=False, mirror_images=False):\n    files = glob.glob(DATASET_PATH + 'test/*.jpg')\n    if reverse is True:\n        files = files[::-1]\n    print(len(files))\n    if mirror_images:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow_test_mirror/'\n    else:\n        out_dir = OUTPUT_PATH + 'cache_tensorflow_test/'\n    if not os.path.isdir(out_dir):\n        os.mkdir(out_dir)\n    run_inference_for_files(files, out_dir, mirror_images)\n\n\nif __name__ == '__main__':\n    run_inference_kaggle_tst(reverse=False, mirror_images=False)\n    # run_inference_validation(reverse=False, mirror_images=False)\n    # run_inference_tst(reverse=False, mirror_images=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}