renwu.py 75 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471
  1. from pathlib import Path
  2. import matplotlib.path as mat
  3. from ultralytics.models.utils import ops
  4. from utils.general import strtolstl
  5. from utils.general import compute_IOU
  6. from torchvision import transforms
  7. from PIL import Image
  8. import torch
  9. import torch.nn.functional as F
  10. import numpy as np
  11. import torch.nn as nn
  12. from ultralytics.engine.results import Results
  13. from shapely.geometry import Point
  14. from shapely.geometry.polygon import Polygon
  15. from pydantic import BaseModel
  16. mean, std = [0.485, 0.456, 0.406], [0.229, 0.224, 0.225]
  17. test = transforms.Compose([transforms.Resize((224,224)),
  18. #transforms.CenterCrop(224),
  19. transforms.ToTensor(),
  20. transforms.Normalize(mean=mean, std=std)
  21. ])
  22. def clapre(modelcla,claimg,clapoint):
  23. imgten = torch.stack(claimg,dim=0)
  24. clapoint = torch.stack(clapoint,dim=0)
  25. imgten = imgten.to(0)
  26. result = modelcla(imgten)
  27. result = F.softmax(result)
  28. print(result)
  29. index = result.argmax(1)
  30. index = index.cpu().numpy()
  31. index = np.argwhere(index<5)
  32. index = index.reshape(-1)
  33. print(index)
  34. if len(index)>0:
  35. print(clapoint[index])
  36. return clapoint[index]
  37. else:
  38. return None
  39. class Model(nn.Module):
  40. def __init__(self, A, nnode, nfeature, nclass):
  41. super().__init__()
  42. self.fc1 = nn.Linear(nnode * nfeature, 512)
  43. self.fc2 = nn.Linear(512, nclass)
  44. def forward(self, x):
  45. x = x.view(-1, int(x.size(1) * x.size(2)))
  46. x = F.relu(self.fc1(x))
  47. x = F.dropout(x, 0.7, training=self.training)
  48. return self.fc2(x)
  49. class GetKeypoint(BaseModel):
  50. NOSE: int = 0
  51. LEFT_EYE: int = 1
  52. RIGHT_EYE: int = 2
  53. LEFT_EAR: int = 3
  54. RIGHT_EAR: int = 4
  55. LEFT_SHOULDER: int = 5
  56. RIGHT_SHOULDER: int = 6
  57. LEFT_ELBOW: int = 7
  58. RIGHT_ELBOW: int = 8
  59. LEFT_WRIST: int = 9
  60. RIGHT_WRIST: int = 10
  61. LEFT_HIP: int = 11
  62. RIGHT_HIP: int = 12
  63. LEFT_KNEE: int = 13
  64. RIGHT_KNEE: int = 14
  65. LEFT_ANKLE: int = 15
  66. RIGHT_ANKLE: int = 16
  67. def extract_keypoint(get_keypoint, keypoint):
  68. # nose
  69. nose_x, nose_y = keypoint[get_keypoint.NOSE]
  70. # eye
  71. # left_eye_x, left_eye_y = keypoint[get_keypoint.LEFT_EYE]
  72. # right_eye_x, right_eye_y = keypoint[get_keypoint.RIGHT_EYE]
  73. # # ear
  74. # left_ear_x, left_ear_y = keypoint[get_keypoint.LEFT_EAR]
  75. # right_ear_x, right_ear_y = keypoint[get_keypoint.RIGHT_EAR]
  76. # shoulder
  77. left_shoulder_x, left_shoulder_y = keypoint[get_keypoint.LEFT_SHOULDER]
  78. right_shoulder_x, right_shoulder_y = keypoint[get_keypoint.RIGHT_SHOULDER]
  79. # elbow
  80. left_elbow_x, left_elbow_y = keypoint[get_keypoint.LEFT_ELBOW]
  81. right_elbow_x, right_elbow_y = keypoint[get_keypoint.RIGHT_ELBOW]
  82. # wrist
  83. left_wrist_x, left_wrist_y = keypoint[get_keypoint.LEFT_WRIST]
  84. right_wrist_x, right_wrist_y = keypoint[get_keypoint.RIGHT_WRIST]
  85. # hip
  86. left_hip_x, left_hip_y = keypoint[get_keypoint.LEFT_HIP]
  87. right_hip_x, right_hip_y = keypoint[get_keypoint.RIGHT_HIP]
  88. # knee
  89. left_knee_x, left_knee_y = keypoint[get_keypoint.LEFT_KNEE]
  90. right_knee_x, right_knee_y = keypoint[get_keypoint.RIGHT_KNEE]
  91. # ankle
  92. left_ankle_x, left_ankle_y = keypoint[get_keypoint.LEFT_ANKLE]
  93. right_ankle_x, right_ankle_y = keypoint[get_keypoint.RIGHT_ANKLE]
  94. return [
  95. nose_x, nose_y,
  96. left_shoulder_x, left_shoulder_y,
  97. right_shoulder_x, right_shoulder_y,
  98. left_elbow_x, left_elbow_y,
  99. right_elbow_x, right_elbow_y,
  100. left_wrist_x, left_wrist_y,
  101. right_wrist_x, right_wrist_y,
  102. left_hip_x, left_hip_y,
  103. right_hip_x, right_hip_y,
  104. left_knee_x, left_knee_y,
  105. right_knee_x, right_knee_y,
  106. left_ankle_x, left_ankle_y,
  107. right_ankle_x, right_ankle_y
  108. ]
  109. class Helmet:
  110. def __init__(self):
  111. self.flag = False
  112. def getflag(self,det,persondet,annotator,fence=0,point=None,names=None,rname=None,num=1):
  113. #print(type(det))
  114. self.flag = False
  115. for *xyxy, conf, cls in reversed(det):
  116. c = int(cls)
  117. labelname = names[c]
  118. if labelname in rname:
  119. if fence == 1:
  120. pointa = strtolstl(point)
  121. for poi in pointa:
  122. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  123. xyxy[3].cpu().item())
  124. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  125. xyxy[3].cpu().item())
  126. pt = [p1, p2]
  127. inflag = mat.Path(poi).contains_points(pt)
  128. if inflag.any():
  129. if persondet is None:
  130. self.flag = True
  131. # c = int(cls) # integer class
  132. # label = f'{self.names[c]} {conf:.2f}'
  133. label = None
  134. annotator.box_label(xyxy, None, color=(0, 0, 255))
  135. else:
  136. for person in persondet:
  137. personinflag = mat.Path(person).contains_points(pt)
  138. if personinflag.any():
  139. annotator.box_label(xyxy, None, color=(0, 0, 255))
  140. self.flag = True
  141. else:
  142. if persondet is None:
  143. self.flag = True
  144. # c = int(cls) # integer class
  145. # label = f'{self.names[c]} {conf:.2f}'
  146. label = None
  147. annotator.box_label(xyxy, None, color=(0, 0, 255))
  148. else:
  149. for person in persondet:
  150. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  151. xyxy[3].cpu().item())
  152. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  153. xyxy[3].cpu().item())
  154. pt = [p1, p2]
  155. personinflag = mat.Path(person).contains_points(pt)
  156. if personinflag.any():
  157. annotator.box_label(xyxy, None, color=(0, 0, 255))
  158. self.flag = True
  159. return self.flag
  160. class Uniform:
  161. def __init__(self):
  162. self.flag = False
  163. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  164. self.flag = False
  165. for *xyxy, conf, cls in reversed(det):
  166. c = int(cls)
  167. labelname = names[c]
  168. if labelname in rname:
  169. if fence == 1:
  170. pointa = strtolstl(point)
  171. for poi in pointa:
  172. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  173. xyxy[3].cpu().item())
  174. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  175. xyxy[3].cpu().item())
  176. pt = [p1, p2]
  177. inflag = mat.Path(poi).contains_points(pt)
  178. if inflag.any():
  179. if persondet is None:
  180. self.flag = True
  181. # c = int(cls) # integer class
  182. # label = f'{self.names[c]} {conf:.2f}'
  183. label = None
  184. annotator.box_label(xyxy, None, color=(0, 0, 255))
  185. else:
  186. for person in persondet:
  187. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  188. xyxy[3].cpu().item())
  189. p2 = (
  190. int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  191. xyxy[3].cpu().item())
  192. pt = [p1, p2]
  193. personinflag = mat.Path(person).contains_points(pt)
  194. if personinflag.any():
  195. annotator.box_label(xyxy, None, color=(0, 0, 255))
  196. self.flag = True
  197. else:
  198. if persondet is None:
  199. self.flag = True
  200. # c = int(cls) # integer class
  201. # label = f'{self.names[c]} {conf:.2f}'
  202. label = None
  203. annotator.box_label(xyxy, None, color=(0, 0, 255))
  204. else:
  205. for person in persondet:
  206. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  207. xyxy[3].cpu().item())
  208. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  209. xyxy[3].cpu().item())
  210. pt = [p1, p2]
  211. personinflag = mat.Path(person).contains_points(pt)
  212. if personinflag.any():
  213. annotator.box_label(xyxy, None, color=(0, 0, 255))
  214. self.flag = True
  215. return self.flag
  216. class Fall:
  217. def __init__(self):
  218. self.flag = False
  219. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  220. self.flag = False
  221. for *xyxy, conf, cls in reversed(det):
  222. c = int(cls)
  223. labelname = names[c]
  224. if labelname in rname:
  225. if fence == 1:
  226. pointa = strtolstl(point)
  227. for poi in pointa:
  228. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  229. xyxy[3].cpu().item())
  230. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  231. xyxy[3].cpu().item())
  232. pt = [p1, p2]
  233. inflag = mat.Path(poi).contains_points(pt)
  234. if inflag.any():
  235. if persondet is None:
  236. self.flag = True
  237. # c = int(cls) # integer class
  238. # label = f'{self.names[c]} {conf:.2f}'
  239. label = None
  240. annotator.box_label(xyxy, None, color=(0, 0, 255))
  241. else:
  242. for person in persondet:
  243. personinflag = mat.Path(person).contains_points(pt)
  244. if personinflag.any():
  245. annotator.box_label(xyxy, None, color=(0, 0, 255))
  246. self.flag = True
  247. else:
  248. if persondet is None:
  249. self.flag = True
  250. # c = int(cls) # integer class
  251. # label = f'{self.names[c]} {conf:.2f}'
  252. label = None
  253. annotator.box_label(xyxy, None, color=(0, 0, 255))
  254. else:
  255. for person in persondet:
  256. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  257. xyxy[3].cpu().item())
  258. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  259. xyxy[3].cpu().item())
  260. pt = [p1, p2]
  261. personinflag = mat.Path(person).contains_points(pt)
  262. if personinflag.any():
  263. annotator.box_label(xyxy, None, color=(0, 0, 255))
  264. self.flag = True
  265. return self.flag
  266. class newFall:
  267. def __init__(self):
  268. self.flag = False
  269. self.pose_classfier_model = Model(None, 13, 2, 2)
  270. self.pose_classfier_model.load_state_dict(torch.load("posefallcls.pt"))
  271. self.pose_classfier_model.eval()
  272. self.pose_classfier_model.to(0)
  273. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1,imshape=None):
  274. self.flag = False
  275. kptshape = [17,3]
  276. pred_kpts = det[:, 6:].view(len(det), *kptshape) if len(det) else det[:, 6:]
  277. pred_kpts = ops.scale_coords(imshape, pred_kpts, annotator.result().shape)
  278. results =Results(annotator.result(), path=None, names=names, boxes=det[:, :6], keypoints=pred_kpts)
  279. print(results.boxes)
  280. if len(point) > 1:
  281. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  282. print(self.polygon_areas)
  283. else:
  284. self.polygon_areas = None
  285. tmppersondet = []
  286. if self.polygon_areas is not None:
  287. for person in persondet:
  288. polygon_box = Polygon(
  289. [(person[0], person[1]), (person[2], person[3]), (person[4], person[5]), (person[6], person[7])])
  290. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in
  291. self.polygon_areas]
  292. if sum(intersection_areas) == 0:
  293. continue
  294. intersection_areas_ratio = sorted(
  295. [intersection_area / polygon_box.area for intersection_area in intersection_areas])
  296. # print(intersection_areas_ratio)
  297. if intersection_areas_ratio[-1] < 0.9:
  298. continue
  299. tmppersondet.append(person)
  300. persondet = tmppersondet
  301. boxes = results.boxes.xyxy.cpu().numpy().tolist()
  302. confs = results.boxes.conf.cpu().numpy().tolist()
  303. all_keypoints = results.keypoints.data.cpu().numpy().tolist()
  304. pose_classfier_results = []
  305. for box, conf, keypoints in zip(boxes, confs, all_keypoints):
  306. iouflag = False
  307. for personbox in persondet:
  308. iou, _ = compute_IOU(box, personbox)
  309. print(f'judgeiou = {iou}')
  310. if iou > 0.5:
  311. iouflag = True
  312. break;
  313. if not iouflag:
  314. break
  315. x1, y1, x2, y2 = box
  316. x, y, w, h = x1, y1, x2 - x1, y2 - y1
  317. n_keypoints = [[(kp[0] - x) / w - 0.5, (kp[1] - y) / h - 0.5] if kp[0] > 0 and kp[1] > 0 else kp[:2] for kp
  318. in keypoints]
  319. n_keypoints = extract_keypoint(self.get_keypoint, n_keypoints)
  320. if n_keypoints[-12:].count(0) >= 2 * 2:
  321. continue
  322. if n_keypoints.count(0) >= 4 * 2:
  323. continue
  324. if w < h:
  325. continue
  326. pose_data = torch.Tensor([n_keypoints]).to(self.device)
  327. pose_data = pose_data.reshape(1, 13, 2)
  328. with torch.no_grad():
  329. p = self.pose_classfier_model(pose_data)
  330. prob = F.softmax(p)
  331. index = prob.argmax()
  332. if index == 0:
  333. score = float(prob[0][index].cpu().numpy())
  334. pose_classfier_results.append(box)
  335. if len(pose_classfier_results)>0:
  336. for xyxy in pose_classfier_results:
  337. annotator.box_label(xyxy, None, color=(0, 0, 255))
  338. self.flag = True
  339. return self.flag
  340. class Personcount:
  341. def __init__(self):
  342. self.flag = False
  343. def getflag(self, det,persondet, annotator, fence=0, point=None, names=None, rname=None,num=1):
  344. self.flag = False
  345. detnum = 0
  346. for *xyxy, conf, cls in reversed(det):
  347. c = int(cls)
  348. labelname = names[c]
  349. if labelname in rname:
  350. if fence == 1:
  351. pointa = strtolstl(point)
  352. for poi in pointa:
  353. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  354. xyxy[3].cpu().item())
  355. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  356. xyxy[3].cpu().item())
  357. pt = [p1, p2]
  358. inflag = mat.Path(poi).contains_points(pt)
  359. if inflag.any():
  360. if persondet is None:
  361. #self.flag = True
  362. detnum = detnum+1
  363. # c = int(cls) # integer class
  364. # label = f'{self.names[c]} {conf:.2f}'
  365. label = None
  366. annotator.box_label(xyxy, None, color=(0, 0, 255))
  367. else:
  368. for person in persondet:
  369. personinflag = mat.Path(person).contains_points(pt)
  370. if personinflag.any():
  371. detnum = detnum+1
  372. annotator.box_label(xyxy, None, color=(0, 0, 255))
  373. #self.flag = True
  374. else:
  375. if persondet is None:
  376. #self.flag = True
  377. detnum = detnum+1
  378. # c = int(cls) # integer class
  379. # label = f'{self.names[c]} {conf:.2f}'
  380. label = None
  381. annotator.box_label(xyxy, None, color=(0, 0, 255))
  382. else:
  383. for person in persondet:
  384. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  385. xyxy[3].cpu().item())
  386. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  387. xyxy[3].cpu().item())
  388. pt = [p1, p2]
  389. personinflag = mat.Path(person).contains_points(pt)
  390. if personinflag.any():
  391. detnum = detnum+1
  392. annotator.box_label(xyxy, None, color=(0, 0, 255))
  393. #self.flag = True
  394. if detnum >= num:
  395. self.flag = True
  396. return self.flag
  397. class Arm:
  398. def __init__(self):
  399. self.flag = False
  400. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  401. self.flag = False
  402. for *xyxy, conf, cls in reversed(det):
  403. c = int(cls)
  404. labelname = names[c]
  405. if labelname in rname:
  406. if fence == 1:
  407. pointa = strtolstl(point)
  408. for poi in pointa:
  409. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  410. xyxy[3].cpu().item())
  411. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  412. xyxy[3].cpu().item())
  413. pt = [p1, p2]
  414. inflag = mat.Path(poi).contains_points(pt)
  415. if inflag.any():
  416. if persondet is None:
  417. self.flag = True
  418. # c = int(cls) # integer class
  419. # label = f'{self.names[c]} {conf:.2f}'
  420. label = None
  421. annotator.box_label(xyxy, None, color=(0,0,255))
  422. else:
  423. for person in persondet:
  424. personinflag = mat.Path(person).contains_points(pt)
  425. if personinflag.any():
  426. annotator.box_label(xyxy, None, color=(0, 0, 255))
  427. self.flag = True
  428. else:
  429. if persondet is None:
  430. self.flag = True
  431. # c = int(cls) # integer class
  432. # label = f'{self.names[c]} {conf:.2f}'
  433. label = None
  434. annotator.box_label(xyxy, None, color=(0, 0, 255))
  435. else:
  436. for person in persondet:
  437. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  438. xyxy[3].cpu().item())
  439. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  440. xyxy[3].cpu().item())
  441. pt = [p1, p2]
  442. personinflag = mat.Path(np.array(person).reshape(-1,2)).contains_points(pt)
  443. if personinflag.any():
  444. annotator.box_label(xyxy, None, color=(0, 0, 255))
  445. self.flag = True
  446. return self.flag
  447. class Bag:
  448. def __init__(self):
  449. self.flag = False
  450. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  451. self.flag = False
  452. for *xyxy, conf, cls in reversed(det):
  453. c = int(cls)
  454. labelname = names[c]
  455. if labelname in rname:
  456. if fence == 1:
  457. pointa = strtolstl(point)
  458. for poi in pointa:
  459. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  460. xyxy[3].cpu().item())
  461. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  462. xyxy[3].cpu().item())
  463. pt = [p1, p2]
  464. inflag = mat.Path(poi).contains_points(pt)
  465. if inflag.any():
  466. if persondet is None:
  467. self.flag = True
  468. # c = int(cls) # integer class
  469. # label = f'{self.names[c]} {conf:.2f}'
  470. label = None
  471. annotator.box_label(xyxy, None, color=(0, 0, 255))
  472. else:
  473. for person in persondet:
  474. personinflag = mat.Path(person).contains_points(pt)
  475. if personinflag.any():
  476. annotator.box_label(xyxy, None, color=(0, 0, 255))
  477. self.flag = True
  478. else:
  479. if persondet is None:
  480. self.flag = True
  481. # c = int(cls) # integer class
  482. # label = f'{self.names[c]} {conf:.2f}'
  483. label = None
  484. annotator.box_label(xyxy, None, color=(0, 0, 255))
  485. else:
  486. for person in persondet:
  487. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  488. xyxy[3].cpu().item())
  489. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  490. xyxy[3].cpu().item())
  491. pt = [p1, p2]
  492. personinflag = mat.Path(person).contains_points(pt)
  493. if personinflag.any():
  494. annotator.box_label(xyxy, None, color=(0, 0, 255))
  495. self.flag = True
  496. return self.flag
  497. class Cross:
  498. def __init__(self):
  499. self.flag = False
  500. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  501. self.flag = False
  502. detnum = 0
  503. for *xyxy, conf, cls in reversed(det):
  504. c = int(cls)
  505. labelname = names[c]
  506. if labelname in rname:
  507. if fence == 1:
  508. pointa = strtolstl(point)
  509. for poi in pointa:
  510. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  511. xyxy[3].cpu().item())
  512. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  513. xyxy[3].cpu().item())
  514. pt = [p1, p2]
  515. inflag = mat.Path(poi).contains_points(pt)
  516. if inflag.any():
  517. if persondet is None:
  518. detnum = detnum+1
  519. self.flag = True
  520. # c = int(cls) # integer class
  521. # label = f'{self.names[c]} {conf:.2f}'
  522. label = None
  523. annotator.box_label(xyxy, None, color=(0, 0, 255))
  524. else:
  525. for person in persondet:
  526. personinflag = mat.Path(person).contains_points(pt)
  527. if personinflag.any():
  528. detnum = detnum+1
  529. annotator.box_label(xyxy, None, color=(0, 0, 255))
  530. self.flag = True
  531. else:
  532. if persondet is None:
  533. self.flag = True
  534. # c = int(cls) # integer class
  535. # label = f'{self.names[c]} {conf:.2f}'
  536. detnum = detnum+1
  537. label = None
  538. annotator.box_label(xyxy, None, color=(0, 0, 255))
  539. else:
  540. for person in persondet:
  541. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  542. xyxy[3].cpu().item())
  543. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  544. xyxy[3].cpu().item())
  545. pt = [p1, p2]
  546. personinflag = mat.Path(person).contains_points(pt)
  547. if personinflag.any():
  548. detnum = detnum +1
  549. annotator.box_label(xyxy, None, color=(0, 0, 255))
  550. self.flag = True
  551. return self.flag
  552. class Extinguisher:
  553. def __init__(self):
  554. self.flag = False
  555. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  556. self.flag = False
  557. for *xyxy, conf, cls in reversed(det):
  558. c = int(cls)
  559. labelname = names[c]
  560. if labelname in rname:
  561. if fence == 1:
  562. pointa = strtolstl(point)
  563. for poi in pointa:
  564. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  565. xyxy[3].cpu().item())
  566. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  567. xyxy[3].cpu().item())
  568. pt = [p1, p2]
  569. inflag = mat.Path(poi).contains_points(pt)
  570. if inflag.any():
  571. if persondet is None:
  572. self.flag = True
  573. # c = int(cls) # integer class
  574. # label = f'{self.names[c]} {conf:.2f}'
  575. label = None
  576. annotator.box_label(xyxy, None, color=(0, 0, 255))
  577. else:
  578. for person in persondet:
  579. personinflag = mat.Path(person).contains_points(pt)
  580. if personinflag.any():
  581. annotator.box_label(xyxy, None, color=(0, 0, 255))
  582. self.flag = True
  583. else:
  584. if persondet is None:
  585. self.flag = True
  586. # c = int(cls) # integer class
  587. # label = f'{self.names[c]} {conf:.2f}'
  588. label = None
  589. annotator.box_label(xyxy, None, color=(0, 0, 255))
  590. else:
  591. for person in persondet:
  592. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  593. xyxy[3].cpu().item())
  594. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  595. xyxy[3].cpu().item())
  596. pt = [p1, p2]
  597. personinflag = mat.Path(person).contains_points(pt)
  598. if personinflag.any():
  599. annotator.box_label(xyxy, None, color=(0, 0, 255))
  600. self.flag = True
  601. return self.flag
  602. def calculate_iou(box1, box2):
  603. # 计算交集区域 也就是找到次左上 次右下
  604. x1_int = max(box1[0], box2[0])
  605. y1_int = max(box1[1], box2[1])
  606. x2_int = min(box1[2], box2[2])
  607. y2_int = min(box1[3], box2[3])
  608. # 交集区域的宽高
  609. width_int = max(0, x2_int - x1_int)
  610. height_int = max(0, y2_int - y1_int)
  611. area_int = width_int * height_int
  612. # 计算两个框的面积
  613. area_box1 = (box1[2] - box1[0]) * (box1[3] - box1[1])
  614. area_box2 = (box2[2] - box2[0]) * (box2[3] - box1[1])
  615. # 计算并集面积
  616. area_union = area_box1 + area_box2 - area_int
  617. # 计算IoU
  618. iou = area_int / area_union if area_union > 0 else 0
  619. return iou
  620. def check_cls4_overlap(person_box, target_box, cls4_boxes):
  621. """
  622. 检查是否有 cls4 物体在目标框与人物框交集区域内,并计算交集面积与 cls4 物体面积的重叠比率。
  623. 返回重叠比率最大值以及其对应的交集区域坐标和 cls4 框。
  624. 参数:
  625. person_box (tuple): 人物框 (x_min, y_min, x_max, y_max)
  626. target_box (tuple): 目标框 (x_min, y_min, x_max, y_max)
  627. cls4_boxes (list): cls4 物体框的列表,每个框为 (x_min, y_min, x_max, y_max)
  628. 返回:
  629. tuple:
  630. - 最大的重叠比率 (float),如果没有符合条件的物体则为 None。
  631. - 最大重叠比率对应的交集区域的坐标 (inter_x1, inter_y1)。
  632. - 对应的 cls4 框 (tuple),如果没有符合条件的物体则为 None。
  633. """
  634. # 计算目标框与人物框的交集区域
  635. min_x = max(person_box[0], target_box[0])
  636. min_y = max(person_box[1], target_box[1])
  637. max_x = min(person_box[2], target_box[2])
  638. max_y = min(person_box[3], target_box[3])
  639. target_area = (min_x, min_y, max_x, max_y) # 交集区域
  640. max_overlap_ratio = -1 # 用于存储最大的重叠比率 这设置为-1有助于区别是否计算了
  641. best_inter_x1 = 0 # 用于存储最大重叠比率对应的交集坐标
  642. best_inter_y1 = 0
  643. best_cls4_box = [] # 用于存储对应的 cls4 框 不能初始化为整数0 整数不可迭代 后序不能添加
  644. # 检查是否有 cls4 物体在交集区域内
  645. for cls4_box in cls4_boxes:
  646. # 判断 cls4 框是否与交集区域有交集
  647. inter_x1 = max(cls4_box[0], target_area[0])
  648. inter_y1 = max(cls4_box[1], target_area[1])
  649. inter_x2 = min(cls4_box[2], target_area[2])
  650. inter_y2 = min(cls4_box[3], target_area[3])
  651. if inter_x1 < inter_x2 and inter_y1 < inter_y2:
  652. # 计算交集区域的面积
  653. intersection_area = (inter_x2 - inter_x1) * (inter_y2 - inter_y1)
  654. #print("交集的面积", intersection_area)
  655. # 计算 cls4_box 的面积
  656. cls4_area = (cls4_box[2] - cls4_box[0]) * (cls4_box[3] - cls4_box[1])
  657. #print("cls4_area的面积是", cls4_area)
  658. # 计算交集区域占 cls4_box 面积的比例
  659. overlap_ratio = intersection_area / cls4_area
  660. # 更新最大重叠比率及其相关信息
  661. if max_overlap_ratio == 0 or overlap_ratio > max_overlap_ratio:
  662. max_overlap_ratio = overlap_ratio
  663. best_inter_x1 = inter_x1
  664. best_inter_y1 = inter_y1
  665. best_cls4_box = cls4_box
  666. return max_overlap_ratio, (best_inter_x1, best_inter_y1), best_cls4_box
  667. class Persontre1:
  668. def __init__(self):
  669. self.flag = False
  670. self.classifier_model = torch.load('/home/h3c/yolo/persontrecls.pt')
  671. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1,im0=None):
  672. self.flag = False
  673. dirp = {}
  674. dirf = {}
  675. for *xyxy, conf, cls in reversed(det):
  676. c = int(cls)
  677. labelname = names[c]
  678. if labelname in rname:
  679. if fence == 1:
  680. pointa = strtolstl(point)
  681. for poi in pointa:
  682. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  683. xyxy[3].cpu().item())
  684. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  685. xyxy[3].cpu().item())
  686. pt = [p1, p2]
  687. inflag = mat.Path(poi).contains_points(pt)
  688. if inflag.any():
  689. if persondet is None:
  690. self.flag = True
  691. # c = int(cls) # integer class
  692. # label = f'{self.names[c]} {conf:.2f}'
  693. label = None
  694. if c==0:
  695. dirp.setdefault(0,[])
  696. dirp[0].append(xyxy)
  697. elif c in [1,2]:
  698. dirp.setdefault(1,[])
  699. dirp[1].append(xyxy)
  700. dirf.setdefault(1,[])
  701. dirf[1].append(xyxy)
  702. elif c==3:
  703. dirp.setdefault(1,[])
  704. dirp[1].append(xyxy)
  705. elif c==4:
  706. dirf.setdefault(0,[])
  707. dirf[0].append(xyxy)
  708. #annotator.box_label(xyxy, None, color=(0, 0, 255))
  709. else:
  710. for person in persondet:
  711. personinflag = mat.Path(person).contains_points(pt)
  712. if personinflag.any():
  713. #annotator.box_label(xyxy, None, color=(0, 0, 255))
  714. #self.flag = True
  715. if c==0:
  716. dirp.setdefault(0,[])
  717. dirp[0].append(xyxy)
  718. elif c in [1,2]:
  719. dirp.setdefault(1,[])
  720. dirp[1].append(xyxy)
  721. dirf.setdefault(1,[])
  722. dirf[1].append(xyxy)
  723. elif c==3:
  724. dirp.setdefault(1,[])
  725. dirp[1].append(xyxy)
  726. elif c==4:
  727. dirf.setdefault(0,[])
  728. dirf[0].append(xyxy)
  729. else:
  730. if persondet is None:
  731. #self.flag = True
  732. # c = int(cls) # integer class
  733. # label = f'{self.names[c]} {conf:.2f}'
  734. #label = None
  735. #annotator.box_label(xyxy, None, color=(0, 0, 255))
  736. if c==0:
  737. dirp.setdefault(0,[])
  738. dirp[0].append(xyxy)
  739. elif c in [1,2]:
  740. dirp.setdefault(1,[])
  741. dirp[1].append(xyxy)
  742. dirf.setdefault(1,[])
  743. dirf[1].append(xyxy)
  744. elif c==3:
  745. dirp.setdefault(1,[])
  746. dirp[1].append(xyxy)
  747. elif c==4:
  748. dirf.setdefault(0,[])
  749. dirf[0].append(xyxy)
  750. else:
  751. for person in persondet:
  752. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  753. xyxy[3].cpu().item())
  754. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  755. xyxy[3].cpu().item())
  756. pt = [p1, p2]
  757. personinflag = mat.Path(person).contains_points(pt)
  758. if personinflag.any():
  759. #annotator.box_label(xyxy, None, color=(0, 0, 255))
  760. #self.flag = True
  761. if c==0:
  762. dirp.setdefault(0,[])
  763. dirp[0].append(xyxy)
  764. elif c in [1,2]:
  765. dirp.setdefault(1,[])
  766. dirp[1].append(xyxy)
  767. dirf.setdefault(1,[])
  768. dirf[1].append(xyxy)
  769. elif c==3:
  770. dirp.setdefault(1,[])
  771. dirp[1].append(xyxy)
  772. elif c==4:
  773. dirf.setdefault(0,[])
  774. dirf[0].append(xyxy)
  775. if len(dirp.keys()) == 2:
  776. claimg = []
  777. clapoint = []
  778. for person in dirp[0]:
  779. for other in dirp[1]:
  780. iou, newxyxy = compute_IOU(person, other)
  781. if iou>0.1:
  782. print(newxyxy)
  783. imgtmp = im0[int(newxyxy[1]):int(newxyxy[3]),int(newxyxy[0]):int(newxyxy[2])]
  784. imgtmp = imgtmp[...,::-1]
  785. imgtmp = Image.fromarray(imgtmp)
  786. imgten1 = test(imgtmp)
  787. claimg.append(imgten1)
  788. clapoint.append((newxyxy))
  789. result = clapre(self.classifier_model,claimg,clapoint)
  790. #imgten = imgten1[None]
  791. #imgten = imgten.to(0)
  792. #result = modelcla(imgten)
  793. #result = F.softmax(result, dim=1)
  794. #cla = result.argmax(1)
  795. if result is not None:
  796. self.flag = True
  797. for res in result:
  798. print(res)
  799. annotator.box_label(res, None, color=(0,0,255))
  800. if len(dirp.keys()) == 2:
  801. claimg = []
  802. clapoint = []
  803. for person in dirp[0]:
  804. for other in dirp[1]:
  805. iou, newxyxy = compute_IOU(person, other)
  806. if iou>0.1:
  807. print(newxyxy)
  808. imgtmp = im0[int(newxyxy[1]):int(newxyxy[3]),int(newxyxy[0]):int(newxyxy[2])]
  809. imgtmp = imgtmp[...,::-1]
  810. imgtmp = Image.fromarray(imgtmp)
  811. imgten1 = test(imgtmp)
  812. claimg.append(imgten1)
  813. clapoint.append((newxyxy))
  814. result = clapre(self.classifier_model,claimg,clapoint)
  815. #imgten = imgten1[None]
  816. #imgten = imgten.to(0)
  817. #result = modelcla(imgten)
  818. #result = F.softmax(result, dim=1)
  819. #cla = result.argmax(1)
  820. if result is not None:
  821. self.flag = True
  822. for res in result:
  823. print(res)
  824. annotator.box_label(res, None, color=(0,0,255))
  825. return self.flag
  826. class Persontree:
  827. def __init__(self):
  828. self.flag = False
  829. self.classifier_model = torch.load('/home/h3c/yolo/persontrecls.pt')
  830. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1,im0=None):
  831. self.flag = False
  832. target_classes = [1, 2, 3]
  833. results = Results(annotator.result(),path=None,names=names,boxes=det)
  834. boxes = results.boxes
  835. person_boxes = []
  836. target_boxes = []
  837. cls4_boxes = []
  838. # 处理检测结果
  839. for i in range(len(boxes)):
  840. cls = int(boxes.cls[i].item())
  841. con = boxes.conf[i].item()
  842. if cls == 0 and con > 0.1: # 如果是 "person" 类别
  843. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  844. person_boxes.append([x1, y1, x2, y2])
  845. if cls in target_classes and con > 0.1: # 目标类别(bag, box, cart)
  846. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  847. target_boxes.append([x1, y1, x2, y2])
  848. if cls == 4 and con > 0.1: # 如果是 "cls 4" 类别
  849. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  850. cls4_boxes.append([x1, y1, x2, y2])
  851. # 如果检测到 "person" 类别和目标框,计算IoU
  852. if person_boxes and target_boxes:
  853. for i, person_box in enumerate(person_boxes):
  854. person_center_y = (person_box[1] + person_box[3]) / 2
  855. for j, target_box in enumerate(target_boxes):
  856. target_center_y = (target_box[1] + target_box[3]) / 2
  857. # 判断目标框的中心点是否在person框的下方
  858. if target_center_y + 20 > person_center_y: # 根据需要调整此阈值
  859. iou = calculate_iou(person_box, target_box)
  860. if iou > 0: # IoU大于0,进入新的判断
  861. # 创建一个包围person和target框的区域 本来思路是判断脚是否在这个大框框里面 但是这个不合理 应该判断脚是不是在这个交集里面,再检测脚和人与物交集有没有交集
  862. min_x = max(person_box[0], target_box[0])
  863. min_y = max(person_box[1], target_box[1])
  864. max_x = min(person_box[2], target_box[2])
  865. max_y = min(person_box[3], target_box[3])
  866. target_area = (min_x, min_y, max_x, max_y)
  867. # 检查是否有cls 4物体在这个区域内
  868. for cls4_box in cls4_boxes: #比较巧妙 提前存储这个变量 然后检测这个物体是不是在这里面
  869. # 判断cls 4框是否与这个区域有交集
  870. inter_x1 = max(cls4_box[0], target_area[0])
  871. inter_y1 = max(cls4_box[1], target_area[1])
  872. inter_x2 = min(cls4_box[2], target_area[2])
  873. inter_y2 = min(cls4_box[3], target_area[3])
  874. if inter_x1 < inter_x2 and inter_y1 < inter_y2:
  875. # 计算交集区域的面积
  876. intersection_area = (inter_x2 - inter_x1) * (inter_y2 - inter_y1)
  877. # 计算 cls4_box 的面积
  878. cls4_area = (cls4_box[2] - cls4_box[0]) * (cls4_box[3] - cls4_box[1])
  879. # 计算交集区域占 cls4_box 面积的比例
  880. overlap_ratio = intersection_area / cls4_area
  881. if overlap_ratio > 0.5:
  882. self.flag = True
  883. return self.flag
  884. class Persontre:
  885. def __init__(self):
  886. self.flag = False
  887. self.classifier_model = torch.load('/home/h3c/yolo/persontrecls.pt')
  888. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1,im0=None):
  889. self.flag = False
  890. cls3 =3 #对cart单独一类
  891. cls4 = 4 # 新增加的类别编号(假设为 4)
  892. target_classes = [1, 2, 3]
  893. results = Results(annotator.result(),path=None,names=names,boxes=det)
  894. boxes = results.boxes
  895. person_boxes = [] # 人 车子 脚 以及 指定区域内的脚
  896. cls3_boxes = []
  897. cls4_boxes = []
  898. best_cls4_box = []
  899. # 处理检测结果
  900. for i in range(len(boxes)):
  901. cls = int(boxes.cls[i].item())
  902. con = boxes.conf[i].item()
  903. if cls == 0 and con > 0.1: # 如果是 "person" 类别 先把对应类别添加上去 先把每一个识别物体输入上去
  904. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  905. person_boxes.append([x1, y1, x2, y2])
  906. if cls == cls3 and con > 0.1: # 目标类别 cart
  907. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  908. cls3_boxes.append([x1, y1, x2, y2])
  909. if cls == cls4 and con > 0.1: # 如果是 "cls 4" 类别
  910. x1, y1, x2, y2 = boxes.xyxy[i].tolist()
  911. cls4_boxes.append([x1, y1, x2, y2])
  912. # 如果检测到 "person" 类别和目标框,计算IoU
  913. if person_boxes and cls3_boxes: # 先查看这俩个类别有没有
  914. for i, person_box in enumerate(person_boxes):
  915. for j, cls3_box in enumerate(cls3_boxes):
  916. # 判断目标框的中心点是否在person框的下方
  917. iou = calculate_iou(person_box, cls3_box)
  918. # 踩的逻辑 一个是要求车子和人有交并比 其次判断脚是不是在这个交并比内 并且比重不能太低
  919. if iou > 0.2: # 用来判断坐 如果iou足够高 就视为是坐
  920. # 加载图像并绘制标注
  921. # 看看这个值大概有多少 好衡量一下
  922. #print(f"这个iou大于0.2的 这是第{frame_idx},iou是{iou}") # 写入介绍
  923. annotator.box_label(person_box, None, color=(0, 0, 255))
  924. annotator.box_label(cls3_box, None, color=(0, 0, 255))
  925. self.flag = True
  926. #print("这是坐",f"{saved_image_path}")
  927. elif iou > 0 : # IoU大于0,进入新的判断 代表不是坐
  928. # 创建一个包围person和target框的区域 本来思路是判断脚是否在这个大框框里面 但是这个不合理 应该判断脚是不是在这个交集里面,再检测脚和人与物交集有没有交集
  929. overlap_ratio, inter_xy, best_cls4_box1 = check_cls4_overlap(person_box, cls3_box,cls4_boxes)
  930. best_cls4_box.extend(best_cls4_box1) #拿到这四个点的坐标
  931. inter_x1, inter_y1 = inter_xy
  932. # 如果占比大于某个阈值,可以执行进一步的操作
  933. if overlap_ratio > 0.2:
  934. annotator.box_label(person_box, None, color=(0, 0, 255))
  935. annotator.box_label(cls3_box, None, color=(0, 0, 255))
  936. annotator.box_label(best_cls4_box, None, color=(0, 0, 255))
  937. self.flag = True
  938. class Danager:
  939. def __init__(self):
  940. self.flag = False
  941. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  942. self.flag = False
  943. for *xyxy, conf, cls in reversed(det):
  944. c = int(cls)
  945. labelname = names[c]
  946. if labelname in rname:
  947. if fence == 1:
  948. pointa = strtolstl(point)
  949. for poi in pointa:
  950. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 2),
  951. int(xyxy[1].cpu().item() + (xyxy[3].cpu().item() - xyxy[1].cpu().item()) / 2))
  952. #p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  953. #xyxy[3].cpu().item())
  954. pt = [p1]
  955. inflag = mat.Path(poi).contains_points(pt)
  956. if inflag.any():
  957. if persondet is None:
  958. self.flag = True
  959. # c = int(cls) # integer class
  960. # label = f'{self.names[c]} {conf:.2f}'
  961. label = None
  962. annotator.box_label(xyxy, None, color=(0, 0, 255))
  963. else:
  964. for person in persondet:
  965. personinflag = mat.Path(person).contains_points(pt)
  966. if personinflag.any():
  967. annotator.box_label(xyxy, None, color=(0, 0, 255))
  968. self.flag = True
  969. else:
  970. if persondet is None:
  971. self.flag = True
  972. # c = int(cls) # integer class
  973. # label = f'{self.names[c]} {conf:.2f}'
  974. label = None
  975. annotator.box_label(xyxy, None, color=(0, 0, 255))
  976. else:
  977. for person in persondet:
  978. p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  979. xyxy[3].cpu().item())
  980. p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  981. xyxy[3].cpu().item())
  982. pt = [p1, p2]
  983. personinflag = mat.Path(person).contains_points(pt)
  984. if personinflag.any():
  985. annotator.box_label(xyxy, None, color=(0, 0, 255))
  986. self.flag = True
  987. return self.flag
  988. class CarHelmetBelt:
  989. def __init__(self):
  990. self.flag = False
  991. def selectNoBeltPerson(self, person_objs, belt_objs):
  992. objs = []
  993. polygon_person = [Polygon(
  994. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  995. polygon_belt = [Polygon(
  996. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in belt_objs]
  997. for person_obj, person in zip(person_objs, polygon_person):
  998. with_belt = False
  999. for belt in polygon_belt:
  1000. if person.intersection(belt).area / belt.area > 0.5:
  1001. with_belt = True
  1002. break
  1003. if not with_belt:
  1004. objs.append(person_obj)
  1005. return objs
  1006. def selectWithPersonHead(self, person_objs, head_objs):
  1007. objs = []
  1008. polygon_person = [Polygon(
  1009. [(left, top), (right, top), (right, top + (bottom - top)/2), (left, top + (bottom - top)/2)]) for left, top, right, bottom, _, _ in person_objs]
  1010. polygon_head = [Polygon(
  1011. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in head_objs]
  1012. for head_obj, head in zip(head_objs, polygon_head):
  1013. with_person = False
  1014. for person in polygon_person:
  1015. print('head')
  1016. if person.intersection(head).area / head.area > 0.5:
  1017. with_person = True
  1018. break
  1019. if with_person:
  1020. objs.append(head_obj)
  1021. return objs
  1022. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1023. self.flag = False
  1024. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1025. person_objs = []
  1026. head_objs = []
  1027. belt_objs = []
  1028. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1029. for result in results:
  1030. boxes = result.boxes
  1031. for box in boxes:
  1032. #print(box.conf.cpu())
  1033. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1034. polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1035. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1036. if sum(intersection_areas) == 0:
  1037. continue
  1038. intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1039. if intersection_areas_ratio[-1] < 0.9:
  1040. continue
  1041. conf = box.conf.cpu().numpy().tolist()[0]
  1042. cls = box.cls.cpu().numpy().tolist()[0]
  1043. if cls == 0:
  1044. person_objs.append([left, top, right, bottom, conf, names[cls]])
  1045. elif cls == 1:
  1046. head_objs.append([left, top, right, bottom, conf, names[cls]])
  1047. elif cls == 3:
  1048. belt_objs.append([left, top, right, bottom, conf, names[cls]])
  1049. #print(head_objs)
  1050. #print(person_objs)
  1051. illegal_objs = self.selectNoBeltPerson(person_objs, belt_objs) + self.selectWithPersonHead(person_objs, head_objs)
  1052. if len(illegal_objs)>0:
  1053. for obj in illegal_objs:
  1054. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1055. self.flag = True
  1056. return self.flag
  1057. class newUniformi1:
  1058. def __init__(self):
  1059. self.flag = False
  1060. def selectNoUniformPerson(self, person_objs, uniform_objs):
  1061. objs = []
  1062. print(person_objs)
  1063. print(uniform_objs)
  1064. polygon_person = [Polygon(
  1065. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1066. polygon_uniform = [Polygon(
  1067. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in uniform_objs]
  1068. for person_obj, person in zip(person_objs, polygon_person):
  1069. with_uniform = False
  1070. for uniform in polygon_uniform:
  1071. if person.intersection(uniform).area / uniform.area > 0.3:
  1072. with_uniform = True
  1073. break
  1074. if not with_uniform:
  1075. print(f'illperson_obj {person_obj} illpolygon_uniform {polygon_uniform}')
  1076. objs.append(person_obj)
  1077. return objs
  1078. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1079. self.flag = False
  1080. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1081. print(results.boxes)
  1082. person_objs = []
  1083. uniform_objs = []
  1084. #belt_objs = []
  1085. if len(point)>1:
  1086. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1087. else:
  1088. self.polygon_areas = None
  1089. if persondet is not None:
  1090. if self.polygon_areas is not None:
  1091. for left, top, right,top,right, bottom,left,bottom in persondet:
  1092. polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1093. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in
  1094. self.polygon_areas]
  1095. if sum(intersection_areas) == 0:
  1096. continue
  1097. intersection_areas_ratio = sorted(
  1098. [intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1099. print(f'inter = {intersection_areas_ratio}')
  1100. if intersection_areas_ratio[-1] >= 0.3:
  1101. print("person in check space!!!")
  1102. width = right - left
  1103. height = bottom - top
  1104. print(f'{left}, {top}, {right},{top},{right}, {bottom},{left},{bottom}')
  1105. print(f'hw = {width* height}')
  1106. if width * height > 10000:
  1107. person_objs.append([left, top, right, bottom, 0.25, 'person'])
  1108. for result in results:
  1109. boxes = result.boxes
  1110. for box in boxes:
  1111. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1112. # if self.polygon_areas is not None :
  1113. # if persondet is None and box.cls.cpu().numpy().tolist()[0] == 4:
  1114. # polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1115. #
  1116. # intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1117. # if sum(intersection_areas) == 0:
  1118. # continue
  1119. #
  1120. # intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1121. # print(f'inter = {intersection_areas_ratio}')
  1122. # if intersection_areas_ratio[-1] < 0.3:
  1123. # continue
  1124. conf = box.conf.cpu().numpy().tolist()[0]
  1125. cls = box.cls.cpu().numpy().tolist()[0]
  1126. # if persondet is not None:
  1127. # if cls == 4 and conf >=0.7:
  1128. # width = right - left
  1129. # height = bottom - top
  1130. # if width * height >10000:
  1131. # person_objs.append([left, top, right, bottom, conf, names[cls]])
  1132. if cls in [1,2]:
  1133. #width = right - left
  1134. #height = bottom - top
  1135. #if width * height >4096:
  1136. uniform_objs.append([left, top, right, bottom, conf, names[cls]])
  1137. print(f'personobjs = {person_objs}')
  1138. print(f'uniformobjs = {uniform_objs}')
  1139. illegal_objs = self.selectNoUniformPerson(person_objs, uniform_objs)
  1140. if len(illegal_objs)>0:
  1141. for obj in illegal_objs:
  1142. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1143. self.flag = True
  1144. return self.flag
  1145. class newHelmet:
  1146. def __init__(self):
  1147. self.flag = False
  1148. def selectNoHelmetPerson(self, person_objs, head_objs):
  1149. objs = []
  1150. polygon_person = [Polygon(
  1151. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1152. polygon_head = [Polygon(
  1153. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in head_objs]
  1154. for person_obj, person in zip(person_objs, polygon_person):
  1155. with_head = False
  1156. for head in polygon_head:
  1157. print('head')
  1158. if person.intersection(head).area / head.area > 0.3:
  1159. with_head = True
  1160. break
  1161. if with_head:
  1162. objs.append(person_obj)
  1163. return objs
  1164. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1165. self.flag = False
  1166. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1167. person_objs = []
  1168. head_objs = []
  1169. helmet_objs = []
  1170. headtmp = []
  1171. #belt_objs = []
  1172. if len(point)>1:
  1173. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1174. else:
  1175. self.polygon_areas = None
  1176. for result in results:
  1177. boxes = result.boxes
  1178. for box in boxes:
  1179. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1180. if self.polygon_areas is not None:
  1181. polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1182. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1183. if sum(intersection_areas) == 0:
  1184. continue
  1185. intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1186. if intersection_areas_ratio[-1] < 0.9:
  1187. continue
  1188. conf = box.conf.cpu().numpy().tolist()[0]
  1189. cls = box.cls.cpu().numpy().tolist()[0]
  1190. #print(f'{conf} {cls}')
  1191. #print(cls in [5,6,7,8,9,10])
  1192. if cls == 4 and conf >=0.7:
  1193. width = right - left
  1194. height = bottom - top
  1195. if width * height >4096:
  1196. person_objs.append([left, top, right, bottom, conf, names[cls]])
  1197. elif cls == 0 and conf >= 0.5:
  1198. #width = right - left
  1199. #height = bottom - top
  1200. #if width * height >4096:
  1201. print('------')
  1202. headtmp.append([left, top, right, bottom, conf, names[cls]])
  1203. elif cls in [5,6,7,8,9,10]:
  1204. helmet_objs.append([(left, top), (right, top), (right, bottom), (left, bottom)])
  1205. print(f'headtmp= {headtmp}')
  1206. print(f'helmet_objs = {helmet_objs}')
  1207. for left, top, right, bottom, conf, name in headtmp:
  1208. flag = False
  1209. pt = [(int((left+right)/2),int((top+bottom)/2))]
  1210. for helmet in helmet_objs:
  1211. pflag = mat.Path(helmet).contains_points(pt)
  1212. if pflag.any():
  1213. flag = True
  1214. break
  1215. if not flag:
  1216. head_objs.append([left, top, right, bottom, conf, name])
  1217. illegal_objs = self.selectNoHelmetPerson(person_objs, head_objs)
  1218. if len(illegal_objs)>0:
  1219. for obj in illegal_objs:
  1220. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1221. self.flag = True
  1222. return self.flag
  1223. class newHelmetn:
  1224. def __init__(self):
  1225. self.flag = False
  1226. def selectNoHelmetPerson(self, person_objs, head_objs):
  1227. objs = []
  1228. polygon_person = [Polygon(
  1229. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1230. polygon_head = [Polygon(
  1231. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in head_objs]
  1232. for person_obj, person in zip(person_objs, polygon_person):
  1233. with_head = False
  1234. for head in polygon_head:
  1235. if person.intersection(head).area / head.area > 0.3:
  1236. with_head = True
  1237. break
  1238. if with_head:
  1239. objs.append(person_obj)
  1240. return objs
  1241. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1242. self.flag = False
  1243. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1244. person_objs = []
  1245. head_objs = []
  1246. #belt_objs = []
  1247. if len(point)>1:
  1248. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1249. else:
  1250. self.polygon_areas = None
  1251. for result in results:
  1252. boxes = result.boxes
  1253. for box in boxes:
  1254. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1255. if self.polygon_areas is not None:
  1256. polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1257. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1258. if sum(intersection_areas) == 0:
  1259. continue
  1260. intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1261. if intersection_areas_ratio[-1] < 0.9:
  1262. continue
  1263. conf = box.conf.cpu().numpy().tolist()[0]
  1264. cls = box.cls.cpu().numpy().tolist()[0]
  1265. if cls == 4:
  1266. width = right - left
  1267. height = bottom - top
  1268. if width * height >4096:
  1269. person_objs.append([left, top, right, bottom, conf, names[cls]])
  1270. elif cls == 0:
  1271. #width = right - left
  1272. #height = bottom - top
  1273. #if width * height >4096:
  1274. head_objs.append([left, top, right, bottom, conf, names[cls]])
  1275. illegal_objs = self.selectNoHelmetPerson(person_objs, head_objs)
  1276. if len(illegal_objs)>0:
  1277. for obj in illegal_objs:
  1278. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1279. self.flag = True
  1280. return self.flag
  1281. class newUniformt:
  1282. def __init__(self):
  1283. self.flag = False
  1284. def selectNoUniformPerson(self, person_objs, uniform_objs):
  1285. objs = []
  1286. print(person_objs)
  1287. print(uniform_objs)
  1288. polygon_person = [Polygon(
  1289. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1290. polygon_uniform = [Polygon(
  1291. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in uniform_objs]
  1292. for person_obj, person in zip(person_objs, polygon_person):
  1293. with_uniform = False
  1294. for uniform in polygon_uniform:
  1295. if person.intersection(uniform).area / uniform.area > 0.3:
  1296. with_uniform = True
  1297. break
  1298. if not with_uniform:
  1299. print(f'illperson_obj {person_obj} illpolygon_uniform {polygon_uniform}')
  1300. objs.append(person_obj)
  1301. return objs
  1302. def selectHeadPerson(self, person_objs, head_objs):
  1303. objs = []
  1304. print(person_objs)
  1305. print(head_objs)
  1306. #personlist = []
  1307. polygon_person = [Polygon(
  1308. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1309. polygon_head = [Polygon(
  1310. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in uniform_objs]
  1311. for person_obj, person in zip(person_objs, polygon_person):
  1312. #with_uniform = False
  1313. for head in polygon_head:
  1314. if person.intersection(head).area / head.area > 0.3:
  1315. #with_uniform = True
  1316. #break
  1317. #if not with_uniform:
  1318. # print(f'illperson_obj {person_obj} illpolygon_uniform {polygon_uniform}')
  1319. objs.append(person_obj)
  1320. break
  1321. return objs
  1322. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1323. self.flag = False
  1324. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1325. print(results.boxes)
  1326. person_objs = []
  1327. uniform_objs = []
  1328. head_objs = []
  1329. #belt_objs = []
  1330. if len(point)>1:
  1331. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1332. else:
  1333. self.polygon_areas = None
  1334. for result in results:
  1335. boxes = result.boxes
  1336. for box in boxes:
  1337. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1338. if self.polygon_areas is not None:
  1339. polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1340. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1341. if sum(intersection_areas) == 0:
  1342. continue
  1343. intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1344. if intersection_areas_ratio[-1] < 0.9:
  1345. continue
  1346. conf = box.conf.cpu().numpy().tolist()[0]
  1347. cls = box.cls.cpu().numpy().tolist()[0]
  1348. if cls == 4:
  1349. width = right - left
  1350. height = bottom - top
  1351. if width * height >4096:
  1352. person_objs.append([left, top, right, bottom, conf, names[cls]])
  1353. elif cls in [1,2]:
  1354. #width = right - left
  1355. #height = bottom - top
  1356. #if width * height >4096:
  1357. uniform_objs.append([left, top, right, bottom, conf, names[cls]])
  1358. elif cls != 3:
  1359. head_objs.append([left, top, right, bottom, conf, names[cls]])
  1360. person_objs = self.selectNoUniformPerson(person_objs, head_objs)
  1361. illegal_objs = self.selectNoUniformPerson(person_objs, uniform_objs)
  1362. if len(illegal_objs)>0:
  1363. for obj in illegal_objs:
  1364. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1365. self.flag = True
  1366. return self.flag
  1367. class newUniform:
  1368. def __init__(self):
  1369. self.flag = False
  1370. def selectNoUniformPerson(self, person_objs, uniform_objs):
  1371. objs = []
  1372. print(person_objs)
  1373. print(uniform_objs)
  1374. polygon_person = [Polygon(
  1375. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in person_objs]
  1376. polygon_uniform = [Polygon(
  1377. [(left, top), (right, top), (right, bottom), (left, bottom)]) for left, top, right, bottom, _, _ in uniform_objs]
  1378. for person_obj, person in zip(person_objs, polygon_person):
  1379. with_uniform = False
  1380. for uniform in polygon_uniform:
  1381. if person.intersection(uniform).area / uniform.area > 0.3:
  1382. with_uniform = True
  1383. break
  1384. if not with_uniform:
  1385. print(f'illperson_obj {person_obj} illpolygon_uniform {polygon_uniform}')
  1386. objs.append(person_obj)
  1387. return objs
  1388. def getflag(self, det, persondet,annotator, fence=0, point=None, names=None, rname=None,num=1):
  1389. self.flag = False
  1390. results = Results(annotator.result(),path=None,names=names,boxes=det)
  1391. print(results.boxes)
  1392. person_objs = []
  1393. uniform_objs = []
  1394. print(f'persondet = {persondet}')
  1395. #belt_objs = []
  1396. if len(point)>1:
  1397. self.polygon_areas = [Polygon(strtolstl(point)[0])]
  1398. print(self.polygon_areas)
  1399. else:
  1400. self.polygon_areas = None
  1401. tmppersondet = []
  1402. if self.polygon_areas is not None:
  1403. for person in persondet:
  1404. polygon_box = Polygon([(person[0], person[1]), (person[2], person[3]), (person[4], person[5]), (person[6], person[7])])
  1405. intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1406. if sum(intersection_areas) == 0:
  1407. continue
  1408. intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1409. #print(intersection_areas_ratio)
  1410. if intersection_areas_ratio[-1] < 0.9:
  1411. continue
  1412. tmppersondet.append(person)
  1413. persondet = tmppersondet
  1414. print(f'tmppersondet = {tmppersondet}')
  1415. #persondet = tmppersondet
  1416. for result in results:
  1417. boxes = result.boxes
  1418. for box in boxes:
  1419. left, top, right, bottom = box.xyxy.cpu().numpy().tolist()[0]
  1420. conf = box.conf.cpu().numpy().tolist()[0]
  1421. cls = box.cls.cpu().numpy().tolist()[0]
  1422. #if self.polygon_areas is not None and cls == 4:
  1423. # polygon_box = Polygon([(left, top), (right, top), (right, bottom), (left, bottom)])
  1424. # intersection_areas = [polygon_area.intersection(polygon_box).area for polygon_area in self.polygon_areas ]
  1425. # if sum(intersection_areas) == 0:
  1426. # continue
  1427. # intersection_areas_ratio = sorted([intersection_area / polygon_box.area for intersection_area in intersection_areas])
  1428. # if intersection_areas_ratio[-1] < 0.9:
  1429. # continue
  1430. #conf = box.conf.cpu().numpy().tolist()[0]
  1431. #cls = box.cls.cpu().numpy().tolist()[0]
  1432. print(conf)
  1433. print(cls)
  1434. if cls == 4 and conf >=0.7:
  1435. width = right - left
  1436. height = bottom - top
  1437. print(width*height)
  1438. if width * height >10000:
  1439. for person in persondet:
  1440. #p1 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3),
  1441. #xyxy[3].cpu().item())
  1442. #p2 = (int(xyxy[0].cpu().item() + (xyxy[2].cpu().item() - xyxy[0].cpu().item()) / 3 * 2),
  1443. # xyxy[3].cpu().item())
  1444. personcenterx = int((person[0]+person[2])/2)
  1445. personcentery = int((person[1]+person[7])/2)
  1446. p1 = (personcenterx,personcentery)
  1447. print(p1)
  1448. pt = [p1]
  1449. print(f'p1 = {p1}')
  1450. print(f'person = {person}')
  1451. personinflag = mat.Path([(left, top), (right, top), (right, bottom), (left, bottom)]).contains_points(pt)
  1452. if personinflag.any():
  1453. person_objs.append([left, top, right, bottom, conf, names[cls]])
  1454. elif cls in [1,2]:
  1455. #width = right - left
  1456. #height = bottom - top
  1457. #if width * height >4096:
  1458. uniform_objs.append([left, top, right, bottom, conf, names[cls]])
  1459. illegal_objs = self.selectNoUniformPerson(person_objs, uniform_objs)
  1460. if len(illegal_objs)>0:
  1461. for obj in illegal_objs:
  1462. annotator.box_label(obj[:4], None, color=(0, 0, 255))
  1463. self.flag = True
  1464. return self.flag