-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadjust_results4_isadog.py
More file actions
89 lines (86 loc) · 5.46 KB
/
adjust_results4_isadog.py
File metadata and controls
89 lines (86 loc) · 5.46 KB
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
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# */AIPND-revision/intropyproject-classify-pet-images/adjust_results4_isadog.py
#
# PROGRAMMER: Ryan Keeler
# DATE CREATED: 29 April 2024
# REVISED DATE:
# PURPOSE: Create a function adjust_results4_isadog that adjusts the results
# dictionary to indicate whether or not the pet image label is of-a-dog,
# and to indicate whether or not the classifier image label is of-a-dog.
# All dog labels from both the pet images and the classifier function
# will be found in the dognames.txt file. We recommend reading all the
# dog names in dognames.txt into a dictionary where the 'key' is the
# dog name (from dognames.txt) and the 'value' is one. If a label is
# found to exist within this dictionary of dog names then the label
# is of-a-dog, otherwise the label isn't of a dog. Alternatively one
# could also read all the dog names into a list and then if the label
# is found to exist within this list - the label is of-a-dog, otherwise
# the label isn't of a dog.
# This function inputs:
# -The results dictionary as results_dic within adjust_results4_isadog
# function and results for the function call within main.
# -The text file with dog names as dogfile within adjust_results4_isadog
# function and in_arg.dogfile for the function call within main.
# This function uses the extend function to add items to the list
# that's the 'value' of the results dictionary. You will be adding the
# whether or not the pet image label is of-a-dog as the item at index
# 3 of the list and whether or not the classifier label is of-a-dog as
# the item at index 4 of the list. Note we recommend setting the values
# at indices 3 & 4 to 1 when the label is of-a-dog and to 0 when the
# label isn't a dog.
#
##
# TODO 4: Define adjust_results4_isadog function below, specifically replace the None
# below by the function definition of the adjust_results4_isadog function.
# Notice that this function doesn't return anything because the
# results_dic dictionary that is passed into the function is a mutable
# data type so no return is needed.
#
def adjust_results4_isadog(results_dic, dogfile):
"""
Adjusts the results dictionary to determine if classifier correctly
classified images 'as a dog' or 'not a dog' especially when not a match.
Demonstrates if model architecture correctly classifies dog images even if
it gets dog breed wrong (not a match).
Parameters:
results_dic - Dictionary with 'key' as image filename and 'value' as a
List. Where the list will contain the following items:
index 0 = pet image label (string)
index 1 = classifier label (string)
index 2 = 1/0 (int) where 1 = match between pet image
and classifer labels and 0 = no match between labels
------ where index 3 & index 4 are added by this function -----
NEW - index 3 = 1/0 (int) where 1 = pet image 'is-a' dog and
0 = pet Image 'is-NOT-a' dog.
NEW - index 4 = 1/0 (int) where 1 = Classifier classifies image
'as-a' dog and 0 = Classifier classifies image
'as-NOT-a' dog.
dogfile - A text file that contains names of all dogs from the classifier
function and dog names from the pet image files. This file has
one dog name per line dog names are all in lowercase with
spaces separating the distinct words of the dog name. Dog names
from the classifier function can be a string of dog names separated
by commas when a particular breed of dog has multiple dog names
associated with that breed (ex. maltese dog, maltese terrier,
maltese) (string - indicates text file's filename)
Returns:
None - results_dic is mutable data type so no return needed.
"""
# STEP 1: Create a list of viable dognames from the file dognames.txt
## WARNING: Each dog gets a line, but some lines have various spellings of dog names separated by ", "
dogs = []
with open(dogfile,'r') as f:
for line in f:
# add list to dogs list because some lines have alternate dog spellings sep'd by commas and we want each separate spelling to get its own list entry
dogs += line.rstrip('\n').split(', ') # strip newline characters and then split into a list to take care of lines with multiple dog spellings
# STEP 2: Iterate through results_dic and check to see if real name and classified names are in dogs
for x in results_dic.keys():
# Make the next steps easier by pulling dict values into variables
real_dog = results_dic[x][0]
classified_dog = results_dic[x][1].split(', ')
# STEP 2a: Check real name
results_dic[x].append(1 if real_dog in dogs else 0)
# STEP 2b: Check classifed name
results_dic[x].append(1 if any(dog in dogs for dog in classified_dog) else 0)
#print(f'real dog: {results_dic[x][0]}, class dog: {results_dic[x][1]}, real is_dog: {results_dic[x][3]}, class is_dog: {results_dic[x][4]}')