File size: 3,002 Bytes
4593d5d
 
 
 
 
 
 
 
 
 
 
 
 
 
9fff2e5
 
4593d5d
 
113622c
4593d5d
7a53eba
113622c
4593d5d
 
41e6737
7a53eba
41e6737
 
 
 
 
 
 
 
4593d5d
9c28001
4593d5d
 
0f71548
28ad0c2
4593d5d
 
 
0f71548
4593d5d
 
cb6ff81
ab650c6
41e6737
 
 
 
 
 
 
 
 
d8a7f48
ec74a93
41e6737
 
 
 
 
 
 
 
ec74a93
41e6737
 
 
 
 
 
 
 
4593d5d
41e6737
 
 
 
 
 
 
4593d5d
 
1eff44d
41e6737
4593d5d
 
 
 
 
3ddc0e7
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
90
91
92
93
94
import easyocr 
from gradio_client import Client, handle_file
import pandas as pd
import gradio as gr

clientImg = Client("dj-dawgs-ipd/IPD-Image-ViT-Finetune")
clientEngText = Client("dj-dawgs-ipd/IPD-Text-English-Finetune")
clientHingText = Client("dj-dawgs-ipd/IPD-Text-Hinglish")

profanity_df = pd.read_csv('Hinglish_Profanity_List.csv' , encoding = 'utf-8')
profanity_hn = profanity_df['profanity_hn']

def extract_text(image):
    reader = easyocr.Reader(['en'])
    data = [result[1] for result in reader.readtext(image)]
    return ' '.join([l for l in data])

def predict(image):
    
    imgResult = clientImg.predict(
        image=handle_file(image),
        api_name="/predict"
    )
    
    label , confidence = imgResult[0]['label'] , float(imgResult[1]['label'])    

    if (label == 'finger_gun_to_the_head' and confidence > 0.98) or (label != 'finger_gun_to_the_head' and confidence > 0.95):
        return {
            "prediction" : "hate",
            "language" : None,
            "label" : label,
            "confidence" : confidence,
            "hate_text" : None
        }
    else:
        ocr_text = extract_text(image).lower()
        
        engResult = clientEngText.predict(
		text=ocr_text[:200],
		api_name="/predict"
        )
        
        hingResult = clientHingText.predict(
        		text=ocr_text[:200],
        		api_name="/predict"
        )

        profanityFound = [word for word in ocr_text.split() if word in profanity_hn]

        if len(profanityFound) > 0:
            return {
                "prediction" : "hate",
                "language" : "Hindi",
                "label" : "Profanity Found",
                "confidence" : None,
                "hate_text" : profanityFound
            }

        elif engResult[0] != "NEITHER" and engResult[1] > 0.5:
            return {
                "prediction" : "hate",
                "language" : "English",
                "label" : engResult[0],
                "confidence" : engResult[1],
                "hate_text" : ocr_text[:200]
            }

        elif hingResult[0] != "NAG" and hingResult[1] > 0.5:
            return {
                "prediction" : "hate",
                "language" : "Hinglish",
                "label" : hingResult[0],
                "confidence" : hingResult[1],
                "hate_text" : ocr_text[:200]
            }

        else:
            return {
                "prediction" : "not_hate",
                "language" : None,
                "label" : "No hate found, yay!",
                "confidence" : None,
                "hate_text" : None
            }
        
iface = gr.Interface(fn=predict,
                     inputs = gr.Image(type='filepath'),
                     outputs=gr.JSON(),         
                     title = "Hate Speech Detection in Image",
                     description = "Detect hateful symbols or text in Image"
        )
                     
if __name__ == "__main__":
    iface.launch(show_error=True)