Anidex_app / main.py
Raja4321123's picture
Rename app.py to main.py
c7d9157
# main.py
import numpy as np
from flask import Flask, jsonify, request, render_template
import pyttsx3
import base64
import numpy as np
from io import BytesIO
from PIL import Image
import tensorflow as tf
import requests
import json
import os
from dotenv import load_dotenv
load_dotenv()
app = Flask(__name__)
upload_folder = os.path.join('static', 'img')
app.config['UPLOAD'] = upload_folder
HUGGINGFACEHUB_APT_TOKEN = os.getenv("HUGGINGFACEHUB_APT_TOKEN")
ANIMAL_API_TOKEN = os.getenv("ANIMAL_API_TOKEN")
Animal_danger_classification = {
"Antelope": "Vulnerable",
"Badger": "Least Concern",
"Bat": "Vulnerable",
"Bear": "Vulnerable",
"Bee": "Least Concern",
"Beetle": "Least Concern",
"Bison": "Least Concern",
"Boar": "Least Concern",
"Butterfly": "Vulnerable",
"Cat": "Least Concern",
"Caterpillar": "Least Concern",
"Chimpanzee": "Endangered",
"Cockroach": "Least Concern",
"Cow": "Least Concern",
"Coyote": "Least Concern",
"Crab": "Least Concern",
"Crow": "Least Concern",
"Deer": "Least Concern",
"Dog": "Least Concern",
"Dolphin": "Least Concern",
"Donkey": "Least Concern",
"Dragonfly": "Vulnerable",
"Duck": "Least Concern",
"Eagle": "Least Concern",
"Elephant": "Endangered",
"Flamingo": "Vulnerable",
"Fly": "Least Concern",
"Fox": "Least Concern",
"Goat": "Least Concern",
"Goldfish": "Least Concern",
"Goose": "Least Concern",
"Gorilla": "Endangered",
"Grasshopper": "Least Concern",
"Hamster": "Least Concern",
"Hare": "Least Concern",
"Hedgehog": "Least Concern",
"Hippopotamus": "Vulnerable",
"Hornbill": "Vulnerable",
"Horse": "Least Concern",
"Hummingbird": "Least Concern",
"Hyena": "Least Concern",
"Jellyfish": "Least Concern",
"Kangaroo": "Least Concern",
"Koala": "Vulnerable",
"Ladybugs": "Least Concern",
"Leopard": "Vulnerable",
"Lion": "Vulnerable",
"Lizard": "Least Concern",
"Lobster": "Least Concern",
"Mosquito": "Least Concern",
"Moth": "Least Concern",
"Mouse": "Least Concern",
"Octopus": "Least Concern",
"Okapi": "Endangered",
"Orangutan": "Endangered",
"Otter": "Vulnerable",
"Owl": "Least Concern",
"Ox": "Least Concern",
"Oyster": "Least Concern",
"Panda": "Endangered",
"Parrot": "Least Concern",
"Pelecaniformes": "Least Concern",
"Penguin": "Vulnerable",
"Pig": "Least Concern",
"Pigeon": "Least Concern",
"Porcupine": "Least Concern",
"Possum": "Least Concern",
"Raccoon": "Least Concern",
"Rat": "Least Concern",
"Reindeer": "Least Concern",
"Rhinoceros": "Vulnerable",
"Sandpiper": "Least Concern",
"Seahorse": "Least Concern",
"Seal": "Vulnerable",
"Shark": "Least Concern",
"Sheep": "Least Concern",
"Snake": "Least Concern",
"Sparrow": "Least Concern",
"Squid": "Least Concern",
"Squirrel": "Least Concern",
"Starfish": "Least Concern",
"Swan": "Least Concern",
"Tiger": "Vulnerable",
"Turkey": "Least Concern",
"Turtle": "Vulnerable",
"Whale": "Vulnerable",
"Wolf": "Least Concern",
"Wombat": "Least Concern",
"Woodpecker": "Least Concern",
"Zebra": "Least Concern"
}
ANIMAL_NAMES = ['Antelope',
'Badger',
'Bat',
'Bear',
'Bee',
'Beetle',
'Bison',
'Boar',
'Butterfly',
'Cat',
'Caterpillar',
'Chimpanzee',
'Cockroach',
'Cow',
'Coyote',
'Crab',
'Crow',
'Deer',
'Dog',
'Dolphin',
'Donkey',
'Dragonfly',
'Duck',
'Eagle',
'Elephant',
'Flamingo',
'Fly',
'Fox',
'Goat',
'Goldfish',
'Goose',
'Gorilla',
'Grasshopper',
'Hamster',
'Hare',
'Hedgehog',
'Hippopotamus',
'Hornbill',
'Horse',
'Hummingbird',
'Hyena',
'Jellyfish',
'Kangaroo',
'Koala',
'Ladybugs',
'Leopard',
'Lion',
'Lizard',
'Lobster',
'Mosquito',
'Moth',
'Mouse',
'Octopus',
'Okapi',
'Orangutan',
'Otter',
'Owl',
'Ox',
'Oyster',
'Panda',
'Parrot',
'Pelecaniformes',
'Penguin',
'Pig',
'Pigeon',
'Porcupine',
'Possum',
'Raccoon',
'Rat',
'Reindeer',
'Rhinoceros',
'Sandpiper',
'Seahorse',
'Seal',
'Shark',
'Sheep',
'Snake',
'Sparrow',
'Squid',
'Squirrel',
'Starfish',
'Swan',
'Tiger',
'Turkey',
'Turtle',
'Whale',
'Wolf',
'Wombat',
'Woodpecker',
'Zebra']
MODEL = tf.keras.models.load_model("animal_classification_model.h5")
@app.route('/', methods=['GET'])
def home():
return render_template("home.html")
@app.route('/generate_speech', methods=['POST'])
def generate_speech():
information = request.form.get('information')
print(information)
# Generate speech using pyttsx3
talk(information)
return jsonify({"message": "Speech generated successfully"})
def read_file_as_image(data) -> np.ndarray:
image = Image.open(BytesIO(data))
return image
def animal_data(predicted_class):
api_url = 'https://api.api-ninjas.com/v1/animals?name={}'.format(
predicted_class)
response = requests.get(
api_url, headers={'X-Api-Key': ANIMAL_API_TOKEN})
if response.status_code == requests.codes.ok:
pass
else:
print("Error:", response.status_code, response.text)
data = response.text
dict = json.loads(data)
data = response.text
dict = json.loads(data)
# print(type(dict), "knowing")
data = [i for i in dict if i["name"].lower() ==
predicted_class.lower()]
return data[0]
def talk(text):
engine = pyttsx3.init()
newVoiceRate = 120
engine.setProperty('rate', newVoiceRate)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
print("started speech")
engine.say(text)
engine.runAndWait()
print("make speech stop")
engine.stop()
@app.route("/predict", methods=["POST"])
def predict():
if "file" not in request.files:
return jsonify({"error": "No file provided"}), 400
file = request.files["file"]
if file.filename == "":
return jsonify({"error": "No selected file"}), 400
bytes = file.read()
IMAGE_SIZE = (256, 256)
# pass
image = read_file_as_image(bytes)
print(image, "hey")
data = BytesIO()
image.save(data, "JPEG")
encoded_img_data = base64.b64encode(data.getvalue())
if file:
# Convert the file contents to a TensorFlow tensor
img_array = tf.keras.preprocessing.image.img_to_array(image)
img_array = tf.expand_dims(img_array, 0)
# resized_image.shape
resized_image = tf.image.resize(img_array, IMAGE_SIZE)
# model prediction
predictions = MODEL.predict(resized_image)
# processing predicted output to give valid result
predicted_class = ANIMAL_NAMES[np.argmax(predictions[0])]
confidence = round(100 * (np.max(predictions[0])), 2)
print(predicted_class)
data = animal_data(predicted_class)
classification = Animal_danger_classification[predicted_class]
# print(data)
# print(type(data))
information = f'It is a {predicted_class} with {confidence} percent accuracy, It belongs to {data["taxonomy"]["kingdom"]} kingdom and {data["taxonomy"]["family"]} family , It can be found in {data["locations"]}, Its lifespan is mostly {data["characteristics"]["lifespan"]}, skin type {data["characteristics"]["skin_type"]} , and it is a {data["characteristics"]["diet"]}, An interesting fact about {predicted_class}: {data["characteristics"]["slogan"]} by danger classification of extinction it is {classification}'
return render_template("index.html", information=information, img_data=encoded_img_data.decode('utf-8'), classes=data["taxonomy"]["class"], family=data["taxonomy"]["family"], kingdom=data["taxonomy"]["kingdom"], locations=data["locations"], lifespan=data["characteristics"]["lifespan"], skin_type=data["characteristics"]["skin_type"], diet=data["characteristics"]["diet"], fun_fact=data["characteristics"]["slogan"], accuracy=confidence, name=predicted_class, classification=classification)
# return jsonify({
# "class": predicted_class,
# "confidence": float(confidence),
# "response": data,
# "Danger Classification": classification
# })
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)
'''
These are some of the animals whose exact data is not available in the api
{'name': 'boar', 'present': 0}
{'name': 'cat', 'present': 0}
{'name': 'dog', 'present': 0}
{'name': 'ladybugs', 'present': 0}
{'name': 'orangutan', 'present': 0}
{'name': 'panda', 'present': 0}
{'name': 'pelecaniformes', 'present': 0}
{'name': 'sandpiper', 'present': 0}
{'name': 'turtle', 'present': 0}
{'name': 'whale', 'present': 0}
'''