-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
64 lines (57 loc) · 2.01 KB
/
app.py
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
import torch
import pandas
import cv2
from os import listdir, remove
model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # getting the model from torch hub
folder = "./data/"
imglist = listdir(folder)
deleted = 0
i = 0
for v in imglist: # convert first frame in vids to image
if (".mp4" in v):
f = cv2.VideoCapture(folder + v)
rval, frame = f.read()
cv2.imwrite(folder + str(v) + ".jpg", frame)
imglist[i] = str(v) + ".jpg"
i+= 1
imgs = [folder + f for f in imglist] # batch of images
# Inference
results = model(imgs)
for i, (im, pred) in enumerate(zip(results.imgs, results.pred)):
imgX = im.shape[0]
imgY = im.shape[1]
people = 0
largestX = 1
largestY = 1
for c in pred[:, -1].unique():
n = (pred[:, -1] == c).sum() # detections per class
if results.names[int(c)] == 'person':
people = int(n)
for *box, conf, cls in reversed(pred):
if results.names[int(cls)] == "person":
width = int(box[2]) - int(box[0])
height = int(box[3]) - int(box[1])
if (width * height) > (largestX * largestY):
largestX = width
largestY = height
# area comparison vs image size
dimvsbb = (largestX * largestY) / (imgX * imgY)
print("dim vs bounding box: " + str(dimvsbb) + " (need 0.1)")
print("for " + imglist[i] + ", found " + str(people))
if people == 0 or people > 3 or dimvsbb < 0.1:
print("deleting " + imglist[i] + "...")
try:
remove(folder + imglist[i])
if (".mp4" in imglist[i]):
mp4file = imglist[i].replace(".jpg", "")
remove(folder + mp4file)
print("deleted " + imglist[i])
deleted += 1
except:
print("failed to delete " + imglist[i])
elif (".mp4" in imglist[i]): # remove .jpg frame if video passed
try:
remove(folder + imglist[i])
except:
pass
print("deleted " + str(deleted) + " items")