datasciencedojo's picture
submit button hover color updated
06b30e3
raw
history blame
6.46 kB
import cv2
from cvzone.HandTrackingModule import HandDetector
from cvzone.ClassificationModule import Classifier
import numpy as np
import math
import gradio as gr
detector = HandDetector(maxHands=1)
classifier = Classifier("ModelFull/keras_model.h5", "ModelFull/labels.txt")
offset = 20
imgSize = 300
folder = "Data/C"
counter = 0
labels = ["A", "B","C","D","E","F","G","H","I","J","K","L","M","N", "O","P","Q","R","S","T","U","V","W","X","Y","Z"]
def sign(img):
#img = cv2.imread("sign.jpg")
imgOutput = cv2.flip(img.copy(),1)
hands, img = detector.findHands(cv2.flip(img[:,:,::-1],1))
if hands:
print('hand detected')
hand = hands[0]
x, y, w, h = hand['bbox']
imlist = hand['lmList']
print(imlist)
if ((imlist[10][0] < imlist[4][0] < imlist[6][0]) or (imlist[6][0] < imlist[4][0] < imlist[10][0])):
if ((imlist[4][1] < imlist[8][1]) and (imlist[4][1] < imlist[12][1]) ):
print('In T')
cv2.rectangle(imgOutput, (x-offset, y-offset),(x + w+offset, y + h+offset), (255, 0, 255), 4)
imgOutput = cv2.flip(imgOutput,1)
cv2.rectangle(imgOutput, (0,30),(80,80), (255, 0, 255), cv2.FILLED)
cv2.putText(imgOutput, 'T', (20, 75), cv2.FONT_HERSHEY_COMPLEX, 1.7, (255, 255, 255), 2)
return imgOutput
else:
print('In K')
cv2.rectangle(imgOutput, (x-offset, y-offset),(x + w+offset, y + h+offset), (255, 0, 255), 4)
imgOutput = cv2.flip(imgOutput,1)
cv2.rectangle(imgOutput, (0,30),(80,80), (255, 0, 255), cv2.FILLED)
cv2.putText(imgOutput, 'K', (20, 75), cv2.FONT_HERSHEY_COMPLEX, 1.7, (255, 255, 255), 2)
return imgOutput
'''if imlist[4][0]>imlist[8][0] and imlist[4][0]>imlist[12][0] and imlist[4][0]>imlist[16][0] and imlist[4][0]>imlist[20][0]:
print('In M')
cv2.rectangle(imgOutput, (x-offset, y-offset),(x + w+offset, y + h+offset), (255, 0, 255), 4)
imgOutput = cv2.flip(imgOutput,1)
cv2.rectangle(imgOutput, (0,30),(80,80), (255, 0, 255), cv2.FILLED)
cv2.putText(imgOutput, 'M', (20, 75), cv2.FONT_HERSHEY_COMPLEX, 1.7, (255, 255, 255), 2)
return imgOutput'''
imgWhite = np.ones((imgSize, imgSize, 3), np.uint8) * 255
imgCrop = img[y - offset:y + h + offset, x - offset:x + w + offset]
imgCropShape = imgCrop.shape
aspectRatio = h / w
if aspectRatio > 1:
k = imgSize / h
wCal = math.ceil(k * w)
imgResize = cv2.resize(imgCrop, (wCal, imgSize))
imgResizeShape = imgResize.shape
wGap = math.ceil((imgSize - wCal) / 2)
imgWhite[:, wGap:wCal + wGap] = imgResize
prediction, index = classifier.getPrediction(imgWhite, draw=False)
print(prediction, index)
else:
k = imgSize / w
hCal = math.ceil(k * h)
imgResize = cv2.resize(imgCrop, (imgSize, hCal))
imgResizeShape = imgResize.shape
hGap = math.ceil((imgSize - hCal) / 2)
imgWhite[hGap:hCal + hGap, :] = imgResize
prediction, index = classifier.getPrediction(imgWhite, draw=False)
cv2.imwrite("check.jpg",imgWhite)
cv2.rectangle(imgOutput, (x-offset, y-offset),
(x + w+offset, y + h+offset), (255, 0, 255), 4)
imgOutput = cv2.flip(imgOutput,1)
#cv2.rectangle(imgOutput, (x - offset, y - offset-50),
# (x - offset+90, y - offset-50+50), (255, 0, 255), cv2.FILLED)
#cv2.putText(imgOutput, labels[index], (x, y -26), cv2.FONT_HERSHEY_COMPLEX, 1.7, (255, 255, 255), 2)
cv2.rectangle(imgOutput, (0,30),
(80,80), (255, 0, 255), cv2.FILLED)
cv2.putText(imgOutput, labels[index], (20, 75), cv2.FONT_HERSHEY_COMPLEX, 1.7, (255, 255, 255), 2)
#cv2.imshow("ImageCrop", imgCrop)
#cv2.imshow("ImageWhite", imgWhite)
#cv2.imshow("Image", imgOutput)
return imgOutput
def set_example_image(example: list) -> dict:
return gr.inputs.Image.update(value=example[0])
css = """
.gr-button-lg {
z-index: 14;
width: 113px;
height: 30px;
left: 0px;
top: 0px;
padding: 0px;
cursor: pointer !important;
background: none rgb(17, 20, 45) !important;
border: none !important;
text-align: center !important;
font-size: 14px !important;
font-weight: 500 !important;
color: rgb(255, 255, 255) !important;
line-height: 1 !important;
border-radius: 6px !important;
transition: box-shadow 200ms ease 0s, background 200ms ease 0s !important;
box-shadow: none !important;
}
.gr-button-lg:hover{
z-index: 14;
width: 113px;
height: 30px;
left: 0px;
top: 0px;
padding: 0px;
cursor: pointer !important;
background: none rgb(66, 133, 244) !important;
border: none !important;
text-align: center !important;
font-size: 14px !important;
font-weight: 500 !important;
color: rgb(255, 255, 255) !important;
line-height: 1 !important;
border-radius: 6px !important;
transition: box-shadow 200ms ease 0s, background 200ms ease 0s !important;
box-shadow: rgb(0 0 0 / 23%) 0px 1px 7px 0px !important;
}
footer {display:none !important}
.output-markdown{display:none !important}
#out_image {height: 22rem !important;}
"""
with gr.Blocks(title="American Sign Language Detection | Data Science Dojo", css=css) as demo:
with gr.Tabs():
with gr.TabItem('Upload'):
with gr.Row():
with gr.Column():
img_input = gr.Image(shape=(640,480))
image_button = gr.Button("Submit")
with gr.Column():
output = gr.Image(shape=(640,480), elem_id="out_image")
with gr.Row():
example_images = gr.Dataset(components=[img_input],samples=[["ex2.jpg"]])
with gr.TabItem('Webcam'):
with gr.Row():
with gr.Column():
img_input2 = gr.Webcam()
image_button2 = gr.Button("Submit")
with gr.Column():
output2 = gr.outputs.Image()
image_button2.click(fn=sign,
inputs = img_input2,
outputs = output2)
image_button.click(fn=sign,
inputs = img_input,
outputs = output)
example_images.click(fn=set_example_image,inputs=[example_images],outputs=[img_input])
demo.launch(debug=True)