Report Final Submit
Report Final Submit
(for the partial fulfillment of Bachelor of Technology Degree in Computer Science &
Engineering)
Submitted by
AMAN GUSAIN
GOURAV SINGH
MRIDUL GUSAIN
SHIVAM NEGI
PROFESSOR
This is to certify that the thesis titled “Anomaly Detection in Surveillance Video”
submitted by Aman Gusain, Gourav Singh, Mridul Gusain, Shivam Negi, to Graphic
Era Hill University for the award of the degree of Bachelor of Technology, is a genuine
representation of their research work under our guidance. The entirety or in parts, has not
been previously submitted to any other educational institution or University for the
purpose of obtaining any other degree or diploma.
We would like to extend our sincere appreciation to all those who have contributed to the
completion of this report on the AI Trainer For Yoga Practices First and foremost, we
would like to express our heartfelt thanks to Dr. Ashok Kumar Sahoo, our mentor, for his
invaluable guidance, support, and insightful suggestions. His expertise in both AI and
Yoga has played a vital role in shaping the direction and depth of this report. We are truly
grateful for his patience and wisdom. We would also like to acknowledge the experts and
practitioners who generously shared their knowledge and experiences with us. Their
contributions have provided us with a comprehensive understanding of the subject matter
and enriched the content of this report. Furthermore, we would like to thank our peers
and classmates for their valuable discussions and feedback, which have helped refine and
strengthen our ideas. Their collaboration has been instrumental in shaping the final
outcome of this report. We would also like to express our appreciation to the faculty
members and staff of Graphic Era Hill University for their support and provision of
necessary resources throughout this project. Finally, we extend our heartfelt gratitude to
our families and friends for their unwavering belief in us and constant encouragement
throughout this endeavor. Their love and support have been the driving force behind our
accomplishments.
Thank you
1
ABSTRACT
World is growing rapidly and it is proportionally becoming harder to manage and secure
areas manually. That’s where the concept of surveillance dissolves in, it is now better and
efficient to equip surveillance cameras with a system in place to alert the right authority if
something irregular gets caught by it. Anomaly Detection System [5] does just that, it
observes the footage and when a variation occurs it performs the encoded task such as
alerting the relevant authorities. Video Surveillance [6] cameras are being used
everywhere to observe and secure administrations, institutions, organizations and
pathways. The crucial feature that the security application should provide is real-time
anomaly detection. The video anomalies can be defined as the variations from the actual
dataset [7] provided. The system should detect violent activities, traffic violations and
such out of the ordinary events. Anomaly detection is a demanding and tedious activity as
the nature of the footage depends on various natural variables such as human errors,
behaviors and instincts.
Video Surveillance systems and Anomaly Detection Systems has become the first wall of
defense and security against various threats as well as accidents. With such systems in
place, we no more worry about someone slacking off their job or any human errors. Even
the time taken by humans or non-automated procedures to contact and alert the
authorities about a threat or an accident is now done in a matter of milliseconds.
2
TABLE OF CONTENTS
ACKNOWLEDGEMENT i
ABSTRACT ii
LIST OF TABLES iv
LIST OF FIGURES v
ABBREVIATIONS vi
NOTATIONS vii
1. INTRODUCTION 7
2. PREMISE 8
2.1 Object Detection 8
3. REQUIREMENT ANALYSIS 16
3.1 Libraries and Tool 16
4. PROJECT DESIGN 23
4.1 Fire Detection 23
5. RESULT 28
A. A SAMPLE APPENDIX 32
B. REFERENCE
41
3
LIST OF FIGURES
4
ABBREVIATIONS
2D Two Dimensional
5
NOTATIONS
^ Power
* Multiplication
- Subtraction
/ Divide
6
1. CHAPTER 1
INTRODUCTION
YOLO consists of two main components: the backbone network and the detection layer.
Each of these components in detail, including their formulas are as follows:
Backbone Network:
The backbone network, typically based on the Darknet architecture, serves as a feature
extractor. It processes the input image and produces feature maps that capture relevant
information about objects.
Let's denote the input image as I, and the backbone network as f. The output feature maps
from the backbone network can be represented as F = f(I).
YOLO Training:
Training and inference are essential stages in utilizing the YOLO (You Only Look Once)
object detection algorithm. In this section, we will explore the training process of YOLO,
including loss computation and backpropagation. We will also cover the inference phase,
where object detection is performed using the trained model.
Training Process:
Data Preparation:
To train YOLO, you need a labeled dataset with bounding box annotations and
corresponding object classes. Each annotation consists of the object's bounding box
coordinates (x, y, width, height) and the class label.
Loss Computation:
YOLO utilizes a combination of localization loss, confidence loss, and class loss to train
the model. These losses are computed for each bounding box prediction and contributes
to the average loss function.
a. Localization Loss (L_coord):
The localization loss measures the discrepancy between the predicted bounding box
coordinates and the ground truth coordinates. It is computed using the mean squared error
(MSE) loss or a similar regression loss function. The formula for the localization loss is:
where (x, y, w, h) are the predicted bounding box coordinates, (x', y', w', h') are the
ground truth coordinates, and λ_coord is a coefficient that balances the influence of the
13
localization loss.
b. Confidence Loss (L_obj and L_noobj):
The confidence loss evaluates the objectness confidence of predicted bounding boxes. It
consists of two components: L_obj, which measures the confidence for boxes containing
objects, and L_noobj, which measures the confidence for background boxes.
L_obj is computed as the binary cross-entropy loss between the predicted objectness
score (c) and the indicator function (I_obj) that indicates whether an object is present in
the ground truth box. The formula for L_obj is:
L_obj = [I_obj * log(c) + (1 - I_obj) * log(1 - c)].
L_noobj is computed similarly but considers the confidence for background boxes where
no object is present:
L_noobj = [I_noobj * log(c) + (1 - I_noobj) * log(1 - c)],
where I_noobj is the indicator function for background boxes.
c. Class Loss (L_class):
The class loss measures the discrepancy between the predicted class probabilities and the
ground truth class labels. It is computed using the categorical cross-entropy loss. The
formula for the class loss is:
L_class = _class * [I_obj * (p * log(p') + (1 - p) * log(1 - p'))],
where p is the predicted class probability, p' is the ground truth class probability, and
λ_class is a coefficient that balances the influence of the class loss.
The overall loss function for YOLO training is given by:
Loss = L_coord + L_obj + L_noobj + L_class.
Backpropagation and Parameter Updates:
Once the loss is computed, backpropagation is performed to calculate the gradients of the
model parameters with respect to the loss. The gradients are then used to update the
model weights using optimization algorithms like stochastic gradient descent (SGD),
Adam, or RMSprop.
Iterative Training:
YOLO is typically trained iteratively over multiple epochs, where each epoch involves
passing the training dataset through the network, computing the loss, performing
14
backpropagation, and updating the model parameters. The model gradually learns to
improve its object detection capabilities during these iterations.
Inference Process:
After training, the YOLO model can be used for object detection on new unseen images.
The inference process involves the following steps:
Image Preprocessing:
The input image is preprocessed to match the network's input requirements, such as
resizing, normalization, and format conversion.
Forward Pass:
The preprocessed image is passed through the trained YOLO network. The network
performs a forward pass, extracting features, predicting bounding boxes, and class
probabilities for objects present in the image.
Non-Maximum Suppression (NMS):
To eliminate redundant detections, a post-processing step called non-maximum
suppression (NMS) is applied. NMS removes overlapping bounding boxes based on their
confidence scores, retaining only the most confident and accurate detections.
Output Visualization:
Finally, the remaining bounding boxes and their associated class labels and probabilities
are visualized on the input image, providing the detected objects' locations and
categories.
By following these steps, YOLO can efficiently detect objects in real-time with high
accuracy, making it a popular choice for various computer vision applications.
It's important to note that the specific formulas and techniques mentioned above are
based on the original YOLO algorithm (YOLOv1). Newer versions, such as YOLOv2,
YOLOv3, YOLOv4, and YOLOv5, introduce variations and improvements to the
architecture, loss functions, and training strategies, enhancing the overall performance of
YOLO.
15
3. CHAPTER 3
REQUIREMENT ANALYSIS
(SRS should be included in this chapter i.e., use case, DFD, Class
Diagram, ER diagram etc.)
19
scipy.optimize.linear_sum_assignment:
The linear_sum_assignment function in the scipy.optimize module is a powerful tool for
solving the linear sum assignment problem, also known as the assignment problem. This
problem involves finding the optimal assignment of a set of tasks to a set of agents, with
each agent having a specific cost or benefit associated with performing each task. The
goal is to minimize the total cost or maximize the total benefit of the assignment.
The linear_sum_assignment function implements the Hungarian algorithm, which
efficiently solves the assignment problem by finding the optimal assignment in
polynomial time. It takes as input a cost matrix, where each element represents the cost or
benefit of assigning a particular task to a specific agent. The cost matrix can be a square
matrix or a rectangular matrix.
The linear_sum_assignment function returns two arrays: the row indices and the column
indices that represent the optimal assignment. The row indices correspond to the tasks,
and the column indices correspond to the agents. Each element in the row indices array
indicates which agent is assigned to the corresponding task.
By using the linear_sum_assignment function, you can easily solve various optimization
problems that involve task assignment, such as job scheduling, resource allocation, and
matching problems. It provides an efficient and reliable solution for finding the optimal
assignment based on the given costs or benefits.
Overall, the linear_sum_assignment function in scipy.optimize is a valuable tool for
solving the assignment problem. It simplifies the process of finding the optimal
assignment by implementing the Hungarian algorithm, allowing you to efficiently
allocate tasks to agents and optimize the overall cost or benefit of the assignment.
20
start_webcam
This function starts the webcam and returns a VideoCapture object.
start_video
This function loads a video file and returns a VideoCapture object.
euclidean_distance
This function calculates the Euclidean distance[9] between two points.
calculate_cost_matrix
This function calculates the cost matrix for linear assignment optimization. It takes two
lists of positions as input, and returns a 2D NumPy array of distances between each pair
of positions.
detect_crash
This is the main function that performs crash detection. It takes the network, output
layers, and a VideoCapture object as input. It reads frames from the video stream, detects
vehicles in each frame using the YOLOv4-tiny model, and keeps track of their positions.
If the system detects a crash, it saves a frame of the video as an image.
torch.cuda.get_device_properties():
Returns a named tuple containing the properties of the specified GPU device.
os.chdir():
Changes the current working directory to the specified path.
glob.glob():
Returns a list of file paths that match a specified pattern.
cv2.VideoCapture():
Initializes a video capture object to read frames from a video file.
matplotlib.animation.FuncAnimation():
Creates a new animation object that repeatedly calls a function to update the plot with
new data.
Image(filename=imageName, width=400):
Displays an image file with the specified filename and width.
plot_results():
Plots the training losses and performance metrics from a CSV file.
21
detect.py:
A script that runs object detection on images or videos using a trained YOLOv5[11]
model.
create_animation():
Creates a Matplotlib animation object from a list of images.
display():
Displays a Matplotlib figure or image object.
Image() (from IPython.display):
Displays an image file or object.
4.
22
4. CHAPTER 4
PROJECT DESIGN
First the user needs to choose between the two modules of what he wants to detect crash
or fire detection and then give the path of the video to the respective module for the
detection.
4.1 Fire Detection
1. Import necessary libraries for the YOLOv5 model.
2. Set the current working directory to the yolov5 folder.
3. Check the torch version and device (CPU or GPU) being used.
4. Train the YOLOv5 model using the train.py script with the following parameters:
Image size of 640x640 pixels.
Batch size of 16.
Train for 3 epochs.
Use the fire_config.yaml file for data configuration.
Start with the pre-trained yolov5s.pt weights.
Use one worker for data loading.
5. Plot the training losses and performance metrics using the plot_results function from
the utils.plots library.
6. Predict on a set of images using the detect.py script with the following parameters:
Use the best.pt weights generated during training.
Image size of 640x640 pixels.
Confidence threshold of 0.25.
Source images are located in the ../datasets/fire/val/images/ directory.
7. Display the resulting detections on the first 3 test images using the display and Image
functions.
8. Predict on a video using the detect.py script with the following parameters:
Use the best.pt weights generated during training.
23
Image size of 640x640 pixels.
Confidence threshold of 0.25.
The source video is located in the runs/detect/exp2/ directory.
9. Read in the frames of the resulting video using OpenCV and store them in a list.
10. Create an animation of the resulting frames using the create_animation function,
which uses Matplotlib [11] and HTML5 for the animation.
11. Display the animation of the resulting frames.
12. Visualize the feature map of an image using the detect.py script with the following
parameters:
Use the best.pt weights generated during training.
Image size of 640x640 pixels.
Confidence threshold of 0.25.
Source image to visualize is defined as a variable called image_path.
Add the --visualize flag to the detect.py script to generate the feature map.
13. Display the resulting feature map image using the display and Image functions.
This is a Python script designed to train a YOLOv5 model for object detection on images
and videos using the PyTorch[12] deep learning framework. The model is trained on a
custom dataset of fire images and videos.
The script begins by importing necessary libraries and setting the working directory. It
then trains the YOLOv5 model using the "train.py" script, passing in arguments such as
image size, batch size, number of epochs, dataset configuration file, pre-trained weights,
and number of workers.
After training the model, the script plots the training losses and performance metrics
using the "plot_results" function from the "utils.plots" module.
The script performs object detection on images using the trained model, passing in
arguments such as the path to the saved model weights, image size, confidence threshold,
and source directory of the images. It also displays the inference results on some test
images.
24
Next, the script performs object detection on a video file, passing in the path to the saved
model weights, image size, confidence threshold, and source file of the video. It then
reads the frames of the video and stores them as a list of images.
Finally, the script visualizes the feature map of a single image by running object
detection on it and generating an output file of the feature map. It then displays the
feature map image.
Overall, this script demonstrates how to train and evaluate a custom YOLOv5 model for
object detection on images and videos, as well as how to visualize the feature map of an
image using the trained model.
Class Diagram 1
25
8. Calculate the distance between each pair of vehicle positions.
9. If the distance between a pair of vehicles is below a certain threshold, and their
relative velocity is above a certain threshold, trigger a crash detection.
10. Save a frame of the video as an image if a crash is detected.
11. Repeat steps 3-10 until the end of the video stream is reached.
12. Release the video stream and close all windows.
The code is a Python script for detecting crashes between vehicles in a video stream or
webcam feed using YOLOv4 object detection and the Hungarian algorithm [13] for
vehicle tracking. The main function detect_crash() reads in frames from the video stream,
applies YOLOv4 object detection to detect vehicles, and tracks the position of each
detected vehicle using the Hungarian algorithm. If a crash is detected between two
vehicles, the function saves the frame as an image file and outputs a message indicating
that a crash has been detected.
The script uses several Python packages, including OpenCV, NumPy, argparse, math,
and scipy.optimize. It also requires two pre-trained files, yolo v4-tiny. weights and
yolov4-tiny.cfg, which are used by the YOLOv4 object detection model.
The script takes two optional arguments, --webcam and --video_path. If --webcam is set
to True, the script will use the computer's default webcam as the video source. If --
webcam is set to False (the default value), the script will use the video file specified in --
video_path as the video source.
The load_yolo() function loads the YOLOv4 object detection model from the pre-trained
files and returns the model and a list of its output layer names. The start_webcam() and
start_video() functions create a VideoCapture object for reading frames from the webcam
or video file, respectively.
The euclidean_distance() function is responsible for calculating the Euclidean distance
between two points in a two-dimensional space. It is utilized in the object detection code
to measure the distance between the positions of vehicles in two consecutive frames.
The Euclidean distance is a straight-line distance between two points in a Cartesian
coordinate system.The calculate_cost_matrix() function utilizes the euclidean_distance()
26
function to construct a cost matrix for the Hungarian algorithm. The cost matrix
represents the pairwise distances between the positions of vehicles in two consecutive
frames. Each element of the matrix corresponds to the cost or distance between two
positions.
The calculate_cost_matrix() function takes two lists of positions: positions1 and
positions2. It iterates over each pair of positions and calculates the Euclidean distance
between them using the euclidean_distance() function. The distances are then stored in a
two-dimensional numpy array, representing the cost matrix.
The cost matrix is later used by the Hungarian algorithm (implemented in
linear_sum_assignment()) to find the optimal assignment of vehicles between frames
based on minimizing the overall cost. This assignment helps determine the
correspondence between vehicles in different frames, facilitating the detection of
potential collisions or crashes.
By utilizing the Euclidean distance and the cost matrix, the object detection code can
effectively track and analyze the movements of vehicles over time, enabling the detection
of potential crashes or collisions between them.
.
The detect_crash() function applies YOLOv4 object detection to each frame in the video
stream, tracks the positions of the detected vehicles using the Hungarian algorithm, and
saves the frame as an image file if a crash is detected. The function uses OpenCV to read
and display the video stream.
The script outputs a message indicating that the crash detection has started and displays
the video stream. If a crash is detected, the script outputs a message indicating that a
crash has been detected and saves the frame as an image file in a subdirectory named
crash_frames.
Overall, the code provides a simple but effective way to detect crashes between vehicles
in a video stream or webcam feed using YOLOv4 object detection and the Hungarian
algorithm.
27
5.
28
5 CHAPTER 5
RESULT
The Crash Detection Module is an important part of the project that helps to detect
potential crashes and save snapshots of the moments leading up to the accident. The
functionality of this module can vary depending on the specific arguments used in the
project. It is essential to specify the video path when building the Crash Detection
Module, as failing to do so can result in a black screen and an immediate exit.
In situations where an accident does occur, the module will save a snapshot of the
incident, along with a warning message displayed on the terminal. These snapshots
provide valuable information about the events leading up to the crash and can be used for
further analysis and investigation.
The above snapshots show that accident happened and it will save the snapshot of the
incident.
Fire Detection Module is the other part of the project that helps the user to quickly
identify fires so that preventive measures or relief measures can be taken place.
29
Figure 2 Fire Detection in room
The Fire Detection Module processes the frames of the video and makes changes to the
video by creating a bounding box if it detects fire using the create animation function.
The YOLOV5 model was trained at 10 epochs and with batch size 16 and the images
were of size 640 x 640 pixels, the confidence of (0.25). Used 1 worker for data loading.
As a result, the time spent on training the model was 10 hrs. When the model was tested
on a mp4 video it showed the bounding boxes for fire in the video.
30
Figure 3 Fire Spreading in a room
The first three columns are the YOLOV5 model containing the loss components which
are the box loss, the objectness loss and the classification loss, the rightmost columns are
31
the precision and recall, these are the indicators of how well the algorithm predicts the
object. These show that classes used like fire weapons are accurately recognized during
the training process. The model is suitable for detecting accidental fires and wildlife fires,
it performs well in open environments and can be used for presence of fire or in frame to
be classified as Anomaly.
32
6. CHAPTER 6
CONCLUSION AND FUTURE SCOPE
The code provides an efficient and effective crash detection system that uses object
detection and linear assignment optimization. The system can be run on a webcam stream
or a video file, making it suitable for a wide range of applications. The code can be
further optimized and improved by adjusting the detection thresholds and fine-tuning the
YOLOv4-tiny model for specific use cases. In future we can also build a frontend using a
multiprocessing system to combine the two modules using multiprocessing to achieve
better results.Despite training the model for only a few epochs it was observed that the
model still performed fairly well.During the evaluation of the trained model, an issue was
identified where the model incorrectly predicted red pandas as fire. This misclassification
could be attributed to the limited number of negative samples in the training dataset. To
address this problem and enhance the model's performance, a potential solution is to
incorporate additional images that contain non-labeled fire objects as negative samples.
By including such images, the model can learn to differentiate between fire and other
objects that may share similar visual characteristics. The authors of the YOLOv5 model
recommend utilizing approximately 0-10% of the dataset as background images to
mitigate false positive predictions.
By incorporating more diverse and representative negative samples, the model can better
understand the distinguishing features of fire and improve its ability to accurately detect
and classify fire objects. This refinement process helps to enhance the overall
performance and reliability of the object detection system.
33
APPENDIX A
(Code)
import cv2
import numpy as np
import argparse
import math
import os
parser = argparse.ArgumentParser()
args = parser.parse_args()
def load_yolo():
layer_names = net.getLayerNames()
unconnected_out_layers = net.getUnconnectedOutLayers()
34
def start_webcam():
cap = cv2.VideoCapture(0)
return cap
def start_video(video_path):
cap = cv2.VideoCapture(video_path)
return cap
return cost_matrix
vehicle_positions = []
prev_vehicle_positions = []
frame_count = 0
35
crash_count = 0
if not os.path.exists("crash_frames"):
os.makedirs("crash_frames")
while True:
if not ret:
break
blob = cv2.dnn.blobFromImage(
net.setInput(blob)
outs = net.forward(output_layers)
class_ids = []
confidences = []
boxes = []
36
for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
boxes.append([x, y, w, h])
confidences.append(float(confidence))
class_ids.append(class_id)
vehicle_positions = [
cost_matrix = calculate_cost_matrix(
37
prev_vehicle_positions, vehicle_positions)
prev_pos = prev_vehicle_positions[row]
current_pos = vehicle_positions[col]
print("Crash detected")
crash_count += 1
crash_frame_path = f"crash_frames/crash_{crash_count:04d}.png"
cv2.imwrite(crash_frame_path, frame)
break
38
prev_vehicle_positions = vehicle_positions
frame_count += 1
cv2.imshow("Frame", frame)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
webcam = args.webcam
video_path = args.video_path
if webcam:
39
cap = start_webcam()
else:
cap = start_video(video_path)
cv2.destroyAllWindows()
Weapon Detection
import cv2
import numpy as np
import argparse
import os
parser = argparse.ArgumentParser()
args = parser.parse_args()
40
def load_yolo():
classes = []
layers_names = net.getLayerNames()
def load_image(img_path):
img = cv2.imread(img_path)
def start_webcam():
41
cap = cv2.VideoCapture(0)
return cap
def display_blob(blob):
for b in blob:
cv2.imshow(str(n), imgb)
net.setInput(blob)
outputs = net.forward(output)
boxes = []
confs = []
class_ids = []
class_id = np.argmax(scores)
conf = scores[class_id]
w = int(detect[2] * width)
h = int(detect[3] * height)
x = int(center_x - w/2)
y = int(center_y - h / 2)
boxes.append([x, y, w, h])
confs.append(float(conf))
class_ids.append(class_id)
if not os.path.exists("weapon_frames"):
os.makedirs("weapon_frames")
43
indexes = cv2.dnn.NMSBoxes(boxes, confs, 0.5, 0.4)
font = cv2.FONT_HERSHEY_PLAIN
for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
print("Weapon detected")
weapon_count += 1
weapon_frame_path = f"weapon_frames/weapon_{weapon_count:04d}.png"
cv2.imwrite(weapon_frame_path, img)
cv2.imshow("Image", img)
return weapon_count
44
def webcam_detect():
cap = start_webcam()
while True:
_, frame = cap.read()
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
def start_video(video_path):
cap = cv2.VideoCapture(video_path)
while True:
45
ret, frame = cap.read()
if not ret:
break
key = cv2.waitKey(1)
break
cap.release()
if __name__ == '__main__':
webcam = args.webcam
video_play = args.play_video
if webcam:
if args.verbose:
if video_play:
video_path = args.video_path
if args.verbose:
start_video(video_path)
cv2.destroyAllWindows()
Fire Detection
import torch
import os
import glob
get_ipython().run_line_magic('cd', 'yolov5')
47
from utils.plots import plot_results
plot_results('runs/train/exp/results.csv')
images = glob.glob('runs/detect/exp/*.jpg')
display(Image(filename=imageName, width=400))
import cv2
vidcap = cv2.VideoCapture('runs/detect/exp2/input.mp4')
success,image = vidcap.read()
images = []
while success:
success,image = vidcap.read()
if success:
images.append(image)
rc('animation', html='jshtml')
48
def create_animation(ims):
plt.axis('off')
im = plt.imshow(ims[0])
def animate_func(i):
im.set_array(ims[i])
return [im]
create_animation(images)
image_path = "../datasets/fire/val/images/004dec94c5de631f.jpg"
display(Image(filename=image_path, width=400))
display(Image(filename="runs/detect/exp3/004dec94c5de631f/
stage23_C3_features.png")
49
References
[1]YOLO Real-Time Object Detection Source: https://pjreddie.com/darknet/yolo/
[7]Fire and Smoke Dataset used in combination with Fire and Gun Dataset:
https://www.kaggle.com/datasets/dataclusterlabs/fire-and-smoke-dataset
[14] Fire and smoke detection system using Jetson nano & Yolov5 with image dataset
from getty images : https://github.com/nikhilgawai/Fire_Detection
[17]Early Fire detection system using deep learning and OpenCV - customized
InceptionV3 and CNN architectures for indoor and outdoor fire detection. 980 images for
training and 239 images for validation, training accuracy of 98.04 and a validation
accuracy of 96.43, openCV used for live detection on webcam - code
https://towardsdatascience.com/early-fire-detection-system-using-deep-learning-and-
opencv-6cb60260d54a.
51