Commit a79d878e authored by Hansi rathnayaka's avatar Hansi rathnayaka

chatbot implementation

parent 444e47ac
......@@ -11,9 +11,23 @@
## run Server
- .\env\Scripts\activate
- uvicorn index:app --reload
- uvicorn main:app --reload
## Export Dependencies
- .\env\Scripts\activate
- pip freeze > requirements.txt
\ No newline at end of file
- pip freeze > requirements.txt
## Deploy to deta.sh
- Install deta CLI
`iwr https://get.deta.dev/cli.ps1 -useb | iex`
- Login to deta
`deta login`
- Deploy
`deta new`
from pymongo import MongoClient
conn = MongoClient("mongodb+srv://skin-disease:skindis123@cluster0.bv8ia.mongodb.net/skinDiseaseDB?retryWrites=true&w=majority")
conn = MongoClient("mongodb+srv://skin-disease:skindis123@cluster0.bv8ia.mongodb.net/skinDiseaseDB?retryWrites=true&w=majority", tls=True, tlsAllowInvalidCertificates=True)
db = conn['skinDiseaseDB']
disease_collection = db['disease']
#mongodb+srv://skin-disease:skindis123@cluster0.bv8ia.mongodb.net/test
\ No newline at end of file
{"23,2,8,9,11,12,68,15": "Acne Symptoms", "4,28,0,0,0,0,0,0": "Rosacea Symptoms", "53,32,6,21,39,0,0,0": "actinic keratosis symptoms", "84,81,82,72,85,0,0,0": "Atopic dermatitis", "37,42,55,27,0,0,0,0": "Bullous disease symptoms", "49,61,63,46,67,31,51,16": "Cellulitis Symptoms", "86,76,73,78,0,0,0,0": "Eczema Symptoms", "33,10,30,57,0,0,0,0": "Exanthems Symptoms", "56,47,34,70,7,5,0,0": "Alopecia symptoms", "75,71,45,13,0,0,0,0": "Herpes HPV symptoms", "79,77,74,83,0,0,0,0": "Light Disease Symptoms", "44,48,20,35,60,41,43,0": "lupus symptoms", "1,18,22,3,29,0,0,0": "melanoma symptoms", "66,69,19,25,14,59,0,0": "Nail Fungus symptoms", "52,40,61,17,24,0,0,0": "poison ivy symptoms", "50,58,26,38,65,62,0,0": "psoriasis symptoms", "36,80,54,64,0,0,0,0": "Scabies symptoms"}
\ No newline at end of file
from fastapi import FastAPI
from routes.disease import disease
from routes.doctor import doctor
from routes.prediction import prediction
app = FastAPI()
app.include_router(disease)
app.include_router(doctor)
app.include_router(prediction)
from pydantic import BaseModel
from typing import Optional
class Disease(BaseModel):
name: str
description: Optional[str]=""
\ No newline at end of file
from fastapi import APIRouter
from transformers import AutoTokenizer, AutoModelWithLMHead, AutoConfig
import torch
from os import error
from pydantic import BaseModel
disease = APIRouter()
class Message(BaseModel):
msg: str
@disease.post('/api/chatbot')
async def create_disease(message: Message):
try:
tokenizerx = AutoTokenizer.from_pretrained(pretrained_model_name_or_path="t5-base")
model = AutoModelWithLMHead.from_pretrained("./chatbot/t5-bot/best_tfmr")
text = message
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
preprocess_text = text.strip().replace("\n","")
tokenized_text = tokenizerx.encode(preprocess_text, return_tensors="pt").to(device)
model = model.to(device)
outs = model.generate(
tokenized_text,
temperature=1.5,
length_penalty=1.5,
max_length=128,
num_beams=1,
early_stopping=True,
no_repeat_ngram_size=2
)
dec = [tokenizerx.decode(ids) for ids in outs]
print("Predicted Answer: ", dec)
return {"success": True, "msg":dec}
except error:
return {"success": False, "msg": error}
from fastapi import APIRouter
from config.db import conn
from os import error
from models.disease import Disease
from schemas.disease import diseaseEntity, diseasesEntity
disease = APIRouter()
@disease.post('/api/disease')
async def create_disease(disease: Disease):
try:
conn.skinDiseaseDB.disease.insert_one(dict(disease))
return {"success": True}
except error:
return {"success": False, "msg": error}
......@@ -10,9 +10,15 @@ from schemas.availability import availabilityEntity, availabilitiesEntity
from fastapi import APIRouter
from models.doctor import Doctor
from config.db import conn
from pydantic import BaseModel
doctor = APIRouter()
class Availabilities(BaseModel):
availabilities: List[Availability]
@doctor.get('/api/doctors')
async def find_all_doctors():
return doctorsEntity(conn.skinDiseaseDB.doctor.find())
......@@ -52,14 +58,10 @@ async def delete_doctor(id):
@doctor.put('/api/availability/{id}')
async def update_availability(id, availabilities: List[Availability]):
try:
available_dic = dict()
for available in availabilities:
print(available)
#conn.skinDiseaseDB.doctor.find_one_and_update({"id":id},{"$set": {'isAvailable': isAvailable}})
return availabilities
async def update_availability(id, availabilities: Availabilities):
try:
conn.skinDiseaseDB.doctor.find_one_and_update({"serviceID": id}, {"$set": {'availability': availabilities }})
return {"success": True, }
except error:
return {"success": False, "msg": error}
......
from fastapi import APIRouter, File, UploadFile
from pydantic import BaseModel
# import tensorflow as tf
# from tensorflow import keras
from typing import List
from os import error
# import pandas as pd
# import numpy as np
import json
#from keras.preprocessing import image
from config.db import disease_collection
from schemas.disease import diseasesEntity
prediction = APIRouter()
class Symptoms(BaseModel):
symptoms: List[int]
batch_size = 32
img_height = 180
img_width = 180
class_names = ['Acne and Rosacea Photos', 'Actinic Keratosis Basal Cell Carcinoma and other Malignant Lesions', 'Atopic Dermatitis Photos', 'Bullous Disease Photos', 'Cellulitis Impetigo and other Bacterial Infections', 'Eczema Photos', 'Exanthems and Drug Eruptions', 'Hair Loss Photos Alopecia and other Hair Diseases', 'Herpes HPV and other STDs Photos', 'Light Diseases and Disorders of Pigmentation', 'Lupus and other Connective Tissue diseases', 'Melanoma Skin Cancer Nevi and Moles', 'Nail Fungus and other Nail Disease', 'Poison Ivy Photos and other Contact Dermatitis', 'Psoriasis pictures Lichen Planus and related diseases', 'Scabies Lyme Disease and other Infestations and Bites', 'Seborrheic Keratoses and other Benign Tumors', 'Systemic Disease', 'Tinea Ringworm Candidiasis and other Fungal Infections', 'Urticaria Hives', 'Vascular Tumors', 'Vasculitis Photos', 'Warts Molluscum and other Viral Infections']
def load_data_json(path=''):
with open(path, 'r') as fp:
data = json.load(fp)
fp.close()
return data
def is_image(filename: str)->bool:
valid = (".png", ".jpg", "jpeg")
return filename.endswith(valid)
def read_imagefile( image:UploadFile ):
if is_image(image.filename):
directory = './temp_images/temp_image.jpg'
with open(directory, 'wb+') as image_upload:
image_upload.write(image.file.read())
return directory
return None
# PREDICT DISEASE FROM SYMPTOMSES
@prediction.post('/api/predictions/symptoms')
async def predict_symptoms(symptoms: Symptoms):
try:
data = load_data_json('./data.json')
threshold = 0.5
input = set(symptoms.symptoms)
output = []
for key in data.keys():
numbers = [int(i) for i in key.split(',') if int(i) != 0]
lenght = len(numbers)
score = len(list(input&set(numbers)))/lenght
if score>=threshold:
output.append(data.get(key))
diseases = diseasesEntity(disease_collection.find({"name": {"$in": output}}))
return {"success": True, "result": diseases}
except error:
return {"success": False, "msg": error}
# PREDICT DISEASE FROM PICTURES
@prediction.post('/api/predictions/picture')
async def predict_symptoms(req_file: UploadFile = File(...)):
try:
# img = read_imagefile(req_file)
# if img is None:
# return {"success": False, "msg": 'Not a valid data format'}
# model_path = './xception'
# image_path = "./temp_images/temp_image.jpg"
# #load model
# model = keras.models.load_model(model_path)
# #load data
# load_img = image.load_img(image_path, target_size=(img_height, img_width))
# img_array = image.img_to_array(load_img)
# img_array = tf.expand_dims(img_array, 0)
# #predict
# predictions = model.predict(img_array, batch_size)
# score = tf.nn.softmax(predictions[0])
# #return
# prediction = class_names[np.argmax(score)]
return {"success": True, "result": req_file.filename}
except error:
return {"success": False, "msg": error}
def diseaseEntity(item) -> dict:
return {
"name": item["name"],
"description": item["description"],
}
def diseasesEntity(entity) -> list:
return [diseaseEntity(item) for item in entity]
\ No newline at end of file
......@@ -20,4 +20,4 @@ def doctorGetEntity(item) -> dict:
}
def doctorsEntity(entity) -> list:
return [doctorGetEntity(item) for item in entity]
\ No newline at end of file
return [doctorGetEntity(item) for item in entity]
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment