File size: 3,263 Bytes
1d64201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bce365b
1d64201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

import sys
sys.path.append("/workspaces/tensorflow-gpu/cocoapi/PythonAPI/pycocotools")
import os
import cv2
from detectron2.data import DatasetCatalog
import detectron2.data as ddata
from detectron2.engine import DefaultPredictor
from detectron2.evaluation import COCOEvaluator
from detectron2.utils.visualizer import ColorMode
from detectron2.utils.visualizer import Visualizer
import random
import matplotlib.pyplot as plt
import time
from from_root import from_root
from rcnn_model.utils.floorplan_vectorizer_utils import check_image_size_thresh


results_directory = str(from_root("results"))+"/"
max_image_size = 700*500

def main(cfg,results_filename = "eval_results.txt"):
    #update config file
    cfg.DATALOADER.NUM_WORKERS = 1
    cfg.SOLVER.IMS_PER_BATCH = 1                                           
    cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")

    #run evaluation
    results = standard_evaluation(cfg)

    #save results
    file = open(results_directory+results_filename,"w")
    file.write(str(results))
    file.close()


### Evaluation ###

def standard_evaluation(cfg):
    #load predictor
    predictor = DefaultPredictor(cfg)
    test_data_loader = ddata.build_detection_test_loader(cfg, "inodata_val")

    #save some validation images
    save_validation_images(predictor)

    #create evaluator
    evaluator = COCOEvaluator("inodata_val",tasks={"segm","bbox"},output_dir="./eval_output",distributed=False,max_dets_per_image=50,allow_cached_coco=False)
    print("EVALUATING")
    evaluator.reset()

    #load results into evaluator
    for inputs, outputs in block_prediction(test_data_loader, predictor):
        evaluator.process(inputs,outputs)
        del inputs
        del outputs
        print("|",end="")
        time.sleep(.5)
    print("")

    #run evaluator
    results = evaluator.evaluate()
    print(results)
    print("EVALUATED")
    return results


def block_prediction(loader, predictor):
    for data in loader:
        if(check_image_size_thresh(data[0]["file_name"],max_image_size)):
            image = cv2.imread(data[0]["file_name"])
            result = predictor(image)
            yield data, [result]
            del image
            del result


### Validation Images ###

def save_validation_images(predictor):
    val_img_id = 1
    for d in random.sample(DatasetCatalog.get("inodata_val"), 16):
        save_image(d,predictor,val_img_id)
        val_img_id += 1


def save_image(d, predictor, val_img_id):
    try:
        if(check_image_size_thresh(d["file_name"],max_image_size)):
            #set load image
            val_img_dest_path = "models/rcnn/validation_images/RCNN_val_image_"+str(val_img_id)+".png"
            im = cv2.imread(d["file_name"])
            outputs = predictor(im)

            #save image
            v = Visualizer(im[:,:,::-1],scale=0.5,instance_mode=ColorMode.IMAGE_BW)
            out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
            plt.imshow(out.get_image()[:,:,::-1])
            plt.axis('off')
            plt.savefig(val_img_dest_path,bbox_inches='tight',pad_inches=0)
            print("Saved validation image to "+val_img_dest_path)
            plt.clf()
    except:
        print("ERROR SAVING IMAGE")