142 lines
7.7 KiB
Python
142 lines
7.7 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
# */AIPND-revision/intropyproject-classify-pet-images/print_results_hints.py
|
|
#
|
|
# PROGRAMMER:
|
|
# DATE CREATED:
|
|
# REVISED DATE:
|
|
# PURPOSE: This is a *hints* file to help guide students in creating the
|
|
# 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: EDIT and ADD code BELOW to do the following that's stated in the
|
|
# comments below that start with "TODO: 6" for the print_results function.
|
|
# Specifically edit and add code below within the the print_results function.
|
|
# Notice that this function doesn't 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']))
|
|
|
|
# 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("")
|
|
|
|
|
|
# Prints summary statistics (percentages) on Model Run
|
|
print(" ")
|
|
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]
|
|
#
|
|
pass
|
|
|
|
|
|
# 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
|
|
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
|
|
pass
|
|
|
|
# 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:
|
|
|
|
# Pet Image Label is-a-Dog, classified as-a-dog but is WRONG breed
|
|
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]))
|