Spaces:
Runtime error
Runtime error
| #Lodel model and tags | |
| import tensorflow as tf | |
| import os | |
| graph_def = tf.compat.v1.GraphDef() | |
| labels = [] | |
| # These are set to the default names from exported models. | |
| filename = "model.pb" | |
| labels_filename = "labels.txt" | |
| # Import the TF graph | |
| with tf.io.gfile.GFile(filename, 'rb') as f: | |
| graph_def.ParseFromString(f.read()) | |
| tf.import_graph_def(graph_def, name='') | |
| # Create a list of labels. | |
| with open(labels_filename, 'rt') as lf: | |
| for l in lf: | |
| labels.append(l.strip()) | |
| #Prepare an image for prediction | |
| from PIL import Image | |
| import numpy as np | |
| import cv2 | |
| # Load from a file | |
| imageFile = "AI generated S2.jpg" | |
| image = Image.open(imageFile) | |
| #Define helper functions. The steps below use the following helper functions: | |
| def convert_to_opencv(image): | |
| # RGB -> BGR conversion is performed as well. | |
| image = image.convert('RGB') | |
| r,g,b = np.array(image).T | |
| opencv_image = np.array([b,g,r]).transpose() | |
| return opencv_image | |
| def crop_center(img,cropx,cropy): | |
| h, w = img.shape[:2] | |
| startx = w//2-(cropx//2) | |
| starty = h//2-(cropy//2) | |
| return img[starty:starty+cropy, startx:startx+cropx] | |
| def resize_down_to_1600_max_dim(image): | |
| h, w = image.shape[:2] | |
| if (h < 1600 and w < 1600): | |
| return image | |
| new_size = (1600 * w // h, 1600) if (h > w) else (1600, 1600 * h // w) | |
| return cv2.resize(image, new_size, interpolation = cv2.INTER_LINEAR) | |
| def resize_to_256_square(image): | |
| h, w = image.shape[:2] | |
| return cv2.resize(image, (256, 256), interpolation = cv2.INTER_LINEAR) | |
| def update_orientation(image): | |
| exif_orientation_tag = 0x0112 | |
| if hasattr(image, '_getexif'): | |
| exif = image._getexif() | |
| if (exif != None and exif_orientation_tag in exif): | |
| orientation = exif.get(exif_orientation_tag, 1) | |
| # orientation is 1 based, shift to zero based and flip/transpose based on 0-based values | |
| orientation -= 1 | |
| if orientation >= 4: | |
| image = image.transpose(Image.TRANSPOSE) | |
| if orientation == 2 or orientation == 3 or orientation == 6 or orientation == 7: | |
| image = image.transpose(Image.FLIP_TOP_BOTTOM) | |
| if orientation == 1 or orientation == 2 or orientation == 5 or orientation == 6: | |
| image = image.transpose(Image.FLIP_LEFT_RIGHT) | |
| return image | |
| # Update orientation based on EXIF tags, if the file has orientation info. | |
| image = update_orientation(image) | |
| # Convert to OpenCV format | |
| image = convert_to_opencv(image) | |
| #If the image has a dimension greater than 1600 pixels | |
| image = resize_down_to_1600_max_dim(image) | |
| #Crop the largest center square | |
| h, w = image.shape[:2] | |
| min_dim = min(w,h) | |
| max_square_image = crop_center(image, min_dim, min_dim) | |
| #Resize that square down to 256x256 | |
| augmented_image = resize_to_256_square(max_square_image) | |
| #Crop the center for the specific input size for the model | |
| # Get the input size of the model | |
| with tf.compat.v1.Session() as sess: | |
| input_tensor_shape = sess.graph.get_tensor_by_name('Placeholder:0').shape.as_list() | |
| network_input_size = input_tensor_shape[1] | |
| # Crop the center for the specified network_input_Size | |
| augmented_image = crop_center(augmented_image, network_input_size, network_input_size) | |
| #Classify an image | |
| output_layer = 'loss:0' | |
| input_node = 'Placeholder:0' | |
| with tf.compat.v1.Session() as sess: | |
| try: | |
| prob_tensor = sess.graph.get_tensor_by_name(output_layer) | |
| predictions = sess.run(prob_tensor, {input_node: [augmented_image] }) | |
| except KeyError: | |
| print ("Couldn't find classification output layer: " + output_layer + ".") | |
| print ("Verify this a model exported from an Object Detection project.") | |
| exit(-1) | |
| #Display the results | |
| # Print the highest probability label | |
| highest_probability_index = np.argmax(predictions) | |
| print('Classified as: ' + labels[highest_probability_index]) | |
| print() | |
| # Or you can print out all of the results mapping labels to probabilities. | |
| label_index = 0 | |
| for p in predictions: | |
| truncated_probablity = np.float64(np.round(p,8)) | |
| print (labels[label_index], truncated_probablity) | |
| label_index += 1 | |
| def classify_image(image): | |
| # Use the loaded model to make predictions | |
| output_layer = 'loss:0' # Replace with the actual output layer name if different | |
| input_node = 'Placeholder:0' # Replace with the actual input node name if different | |
| with tf.compat.v1.Session() as sess: | |
| try: | |
| prob_tensor = sess.graph.get_tensor_by_name(output_layer) | |
| predictions = sess.run(prob_tensor, {input_node: [image]}) | |
| except KeyError: | |
| print( | |
| "Couldn't find classification output layer: " + output_layer + "." | |
| ) | |
| print("Verify this is a model exported from an Object Detection project.") | |
| exit(-1) | |
| # ... (Process predictions as needed, e.g., return labels and probabilities) | |
| # For example (replace with your desired output format): | |
| highest_probability_index = np.argmax(predictions) | |
| return labels[highest_probability_index], predictions[0] # Return label and probability |