-
Notifications
You must be signed in to change notification settings - Fork 0
/
print_results.py
154 lines (134 loc) · 8.1 KB
/
print_results.py
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# */AIPND-revision/intropyproject-classify-pet-images/print_results.py
#
# PROGRAMMER: Aman Aggarwal
# DATE CREATED: 10/07/2023
# Source:- Used the hints file.
# REVISED DATE:
# PURPOSE: Create a function print_results that prints the results statistics
# from the results statistics dictionary (results_stats_dic). It
# should also allow the user to be able to print out cases of misclassified
# dogs and cases of misclassified breeds of dog using the Results
# dictionary (results_dic).
# This function inputs:
# -The results dictionary as results_dic within print_results
# function and results for the function call within main.
# -The results statistics dictionary as results_stats_dic within
# print_results function and results_stats for the function call within main.
# -The CNN model architecture as model wihtin print_results function
# and in_arg.arch for the function call within main.
# -Prints Incorrectly Classified Dogs as print_incorrect_dogs within
# print_results function and set as either boolean value True or
# False in the function call within main (defaults to False)
# -Prints Incorrectly Classified Breeds as print_incorrect_breed within
# print_results function and set as either boolean value True or
# False in the function call within main (defaults to False)
# This function does not output anything other than printing a summary
# of the final results.
##
# TODO 6: Define print_results function below, specifically replace the None
# below by the function definition of the print_results function.
# Notice that this function doesn't to return anything because it
# prints a summary of the results using results_dic and results_stats_dic
#
def print_results(results_dic, results_stats_dic, model,
print_incorrect_dogs = False, print_incorrect_breed = False):
"""
Prints summary results on the classification and then prints incorrectly
classified dogs and incorrectly classified dog breeds if user indicates
they want those printouts (use non-default values)
Parameters:
results_dic - Dictionary with key as image filename and value as a List
(index)idx 0 = pet image label (string)
idx 1 = classifier label (string)
idx 2 = 1/0 (int) where 1 = match between pet image and
classifer labels and 0 = no match between labels
idx 3 = 1/0 (int) where 1 = pet image 'is-a' dog and
0 = pet Image 'is-NOT-a' dog.
idx 4 = 1/0 (int) where 1 = Classifier classifies image
'as-a' dog and 0 = Classifier classifies image
'as-NOT-a' dog.
results_stats_dic - Dictionary that contains the results statistics (either
a percentage or a count) where the key is the statistic's
name (starting with 'pct' for percentage or 'n' for count)
and the value is the statistic's value
model - Indicates which CNN model architecture will be used by the
classifier function to classify the pet images,
values must be either: resnet alexnet vgg (string)
print_incorrect_dogs - True prints incorrectly classified dog images and
False doesn't print anything(default) (bool)
print_incorrect_breed - True prints incorrectly classified dog breeds and
False doesn't print anything(default) (bool)
Returns:
None - simply printing results.
"""
# Prints summary statistics over the run
print("\n\n*** Results Summary for CNN Model Architecture",model.upper(),
"***")
print("{:20}: {:3d}".format('N Images', results_stats_dic['n_images']))
print("{:20}: {:3d}".format('N Dog Images', results_stats_dic['n_dogs_img']))
# printing the number of not dog images int the results stats dictionary.
# TODO: 6a. REPLACE print("") with CODE that prints the text string
# 'N Not-Dog Images' and then the number of NOT-dog images
# that's accessed by key 'n_notdogs_img' using dictionary
# results_stats_dic
#
print("{:20}: {:3d}".format('N Not-Dog Images', results_stats_dic['n_notdogs_img']))
# Prints summary statistics (percentages) on Model Run
print(" ")
# taking out the key from the stats results dictionary
for key in results_stats_dic:
# TODO: 6b. REPLACE pass with CODE that prints out all the percentages
# in the results_stats_dic dictionary. Recall that all
# percentages in results_stats_dic have 'keys' that start with
# the letter p. You will need to write a conditional
# statement that determines if the key starts with the letter
# 'p' and then you want to use a print statement to print
# both the key and the value. Remember the value is accessed
# by results_stats_dic[key]
#
# if the key starts with p then (using the inbuilt function of strings)
if key.startswith('p'):
print("{}: {}".format(key, results_stats_dic[key]))
# IF print_incorrect_dogs == True AND there were images incorrectly
# classified as dogs or vice versa - print out these cases
if (print_incorrect_dogs and
( (results_stats_dic['n_correct_dogs'] + results_stats_dic['n_correct_notdogs'])
!= results_stats_dic['n_images'] ) ):
print("\nINCORRECT Dog/NOT Dog Assignments:")
# process through results dict, printing incorrectly classified dogs
# iterating through the loop
for key in results_dic:
# TODO: 6c. REPLACE pass with CODE that prints out the pet label
# and the classifier label from results_dic dictionary
# ONLY when the classifier function (classifier label)
# misclassified dogs specifically:
# pet label is-a-dog and classifier label is-NOT-a-dog
# -OR-
# pet label is-NOT-a-dog and classifier label is-a-dog
# You will need to write a conditional statement that
# determines if the classifier function misclassified dogs
# See 'Adjusting Results Dictionary' section in
# 'Classifying Labels as Dogs' for details on the
# format of the results_dic dictionary. Remember the value
# is accessed by results_dic[key] and the value is a list
# so results_dic[key][idx] - where idx represents the
# index value of the list and can have values 0-4.
#
# Pet Image Label is a Dog - Classified as NOT-A-DOG -OR-
# Pet Image Label is NOT-a-Dog - Classified as a-DOG
if sum(results_dic[key][3:]) == 1:
print("Real: {:>26} Classifier: {:>30}".format(results_dic[key][0], results_dic[key][1]))
# IF print_incorrect_breed == True AND there were dogs whose breeds
# were incorrectly classified - print out these cases
if (print_incorrect_breed and
(results_stats_dic['n_correct_dogs'] != results_stats_dic['n_correct_breed'])
):
print("\nINCORRECT Dog Breed Assignment:")
# process through results dict, printing incorrectly classified breeds
for key in results_dic:
if ( sum(results_dic[key][3:]) == 2 and
results_dic[key][2] == 0 ):
print("Real: {:>26} Classifier: {:>30}".format(results_dic[key][0],
results_dic[key][1]))