File size: 5,548 Bytes
e9b6d8d
32519f3
e9b6d8d
bb3539d
 
 
 
 
 
f50f47c
85352dd
bb3539d
bceb4a7
 
 
0db357b
bb3539d
 
e9b6d8d
32519f3
 
bb3539d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f50f47c
2adcde0
 
 
 
 
 
 
f50f47c
bceb4a7
 
 
2adcde0
 
1f3ab5a
 
 
 
bceb4a7
70e3686
bceb4a7
70e3686
 
 
bceb4a7
 
bb3539d
 
 
 
 
 
 
 
 
f50f47c
bb3539d
 
f50f47c
bb3539d
 
f50f47c
bb3539d
 
f50f47c
bb3539d
 
f50f47c
bb3539d
 
f50f47c
bb3539d
 
f50f47c
e9b6d8d
bb3539d
 
 
e9b6d8d
 
 
 
 
 
 
bb3539d
 
e9b6d8d
 
bb3539d
 
 
f50f47c
 
 
 
 
 
 
bb3539d
 
 
 
 
c23f366
 
 
 
bb3539d
c23f366
 
bb3539d
 
 
c23f366
 
e9b6d8d
c23f366
bb3539d
 
 
 
 
 
 
 
 
e9b6d8d
 
 
 
 
bb3539d
 
32519f3
bb3539d
e9b6d8d
 
 
 
bb3539d
e9b6d8d
 
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import gradio as gr
# import torch
from ultralyticsplus import YOLO, render_result
import cv2
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import smtplib
import os
from twilio.rest import Client

sender_email = os.environ.get("sender_email")
receiver_email = os.environ.get("receiver_email")
sender_password = os.environ.get("sender_password")
smtp_port = 2525
smtp_server = "smtp.gmail.com"
subject = "Accident detected"

classes: ['car', 'bike', 'person', 'car_car_accident', 'car_bike_accident', 'car_person_accident', 'bike_bike_accidnet', 'bike_person_accident', 'car_object_accident', 'bike_object_accident']

def send_email(accident_type):
    body = accident_type

    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = receiver_email
    msg['Subject'] = subject

    msg.attach(MIMEText(body, 'plain'))

    filename = "res.png"
    folder = "./result/"
    fullFileName = folder + filename

    attachment = open(fullFileName, 'rb')

    attachment_package = MIMEBase('application', 'octet-stream')
    attachment_package.set_payload((attachment).read())
    encoders.encode_base64(attachment_package)
    attachment_package.add_header('Content-Disposition', "attachment; filename= " + filename)
    msg.attach(attachment_package)

    text = msg.as_string()


    print("Connecting to server")
    gmail_server = smtplib.SMTP(smtp_server, smtp_port)
    gmail_server.starttls()
    gmail_server.login(sender_email, sender_password)
    print("Successfully connected to server")
    print()

    print("Sending email to ", receiver_email)
    gmail_server.sendmail(sender_email, receiver_email, text)
    print("Email sent to ", receiver_email)
    print()

    gmail_server.quit()

def send_sms(accident_type):
    # print(os.environ.get("account_sid"))
    # print(os.environ.get("auth_token"))
    # print(os.environ.get("my_twilio_number"))
    # print(os.environ.get("receiver_number"))
    # print(os.environ.get("sender_email"))
    # print(os.environ.get("receiver_email"))
    # print(os.environ.get("sender_password"))

    account_sid = os.environ.get("account_sid")
    auth_token = os.environ.get("auth_token")
    my_twilio_number = os.environ.get("my_twilio_number")
    receiver_number = os.environ.get("receiver_number")

    # print(account_sid)
    # print(auth_token)
    # print(my_twilio_number)
    # print(receiver_number)

    # client = Client(account_sid, auth_token)

    # message = client.messages.create(body=accident_type,
    #                              from_=my_twilio_number,
    #                              to=receiver_number)
    print(accident_type)


def check_acc(box):
    # return format(box.cls)
    res_index_list = box.cls.tolist()
    result = ""

    for index in res_index_list:
        if index ==3:
            result = "car car accident detected"
            break
        elif index==4:
            result = "car bike accident detected"
            break
        elif index==5:
            result = "car person accident detected"
            break
        elif index==6:
            result = "bike bike accident detected"
            break
        elif index==7:
            result = "bike person accident detected"
            break
        elif index ==8:
            result = "car object accident detected"
            break
        elif index == 9:
            result = "bike object accident detected"
            break
    
    return result

def image_predict(image):
    model_path = "best.pt"
    model = YOLO(model_path)
    results = model.predict(image,
                            conf = 0.4,
                            iou = 0.6,
                            imgsz = 640)
    box = results[0].boxes
    res = check_acc(box)
    print("object Type: ", res)

    render = render_result(model=model, image=image, result=results[0])
    # if res == "car car accident detected":
    #     cv2.imwrite("./result/res.png", render)
    # print(render)
    # if res == "car car accident detected":
    #     render.save("./result/res.png")
    #     # send_email(res)
    #     send_sms
    if len(res) >0:
        # render.save("./result/res.png")
        send_sms(res)

    return (res, render)

def extract_frames(video):
    vidcap = cv2.VideoCapture(video)
    vidcap = cv2.VideoCapture(video)
    fps = vidcap.get(cv2.CAP_PROP_FPS)
    nof = 5
    frame_no = 0
    while vidcap.isOpened():
        res = ""
        render = None
        success, image = vidcap.read()
        if success ==False:
            break
        if (frame_no*nof)%fps==0:
            res, render = image_predict(image)

        if len(res) >0:
            return (res, render)
    return ("", None)

def take_input(image, video):
    if(video != None):
        res = extract_frames(video)
    else:
        res = image_predict(image)
    return res

with gr.Blocks(title="YOLOS Object Detection - ClassCat", css=".gradio-container {background:lightyellow;}") as demo:
    gr.HTML('<h1>Yolo Object Detection</h1>')
    gr.HTML("<br>")
    with gr.Row():
        input_image = gr.Image(label="Input image")
        input_video = gr.Video(label="Input video")
        output_label = gr.Text(label="output label")
        output_image = gr.Image(label="Output image")
    gr.HTML("<br>")
    send_btn = gr.Button("Detect")
    gr.HTML("<br>")

    send_btn.click(fn=take_input, inputs=[input_image, input_video], outputs=[output_label, output_image])

demo.launch(debug=True)