강세희

[UPDATE] 프레임 당 합칠 두 객체 선정

1 -import time
2 import math 1 import math
3 import cv2 2 import cv2
4 import numpy as np 3 import numpy as np
4 +from copy import deepcopy
5 from model.yolo_model import YOLO 5 from model.yolo_model import YOLO
6 6
7 class Point2D: 7 class Point2D:
...@@ -56,17 +56,25 @@ if __name__ == '__main__': ...@@ -56,17 +56,25 @@ if __name__ == '__main__':
56 x, y, w, h = box 56 x, y, w, h = box
57 name = all_classes[cl] 57 name = all_classes[cl]
58 size = int(w*h) 58 size = int(w*h)
59 +
59 if size <= 4000: # 사이즈가 너무 작아 썸네일로 적합하지 않은 경우 60 if size <= 4000: # 사이즈가 너무 작아 썸네일로 적합하지 않은 경우
60 continue 61 continue
61 if x <= 0 or x+w >= image.shape[1] or y <= 0 or y+h >= image.shape[0]: # 검출된 객체가 프레임 밖으로 나간 경우 62 if x <= 0 or x+w >= image.shape[1] or y <= 0 or y+h >= image.shape[0]: # 검출된 객체가 프레임 밖으로 나간 경우
62 continue 63 continue
64 +
63 # 얼마나 가운데인지 확인하는 알고리즘 65 # 얼마나 가운데인지 확인하는 알고리즘
64 - object = Point2D(width= x + h/2, height= y + w/2) 66 + object = Point2D(width= x + w/2, height= y + h/2)
65 a = image.shape[1]/2 - object.width 67 a = image.shape[1]/2 - object.width
66 b = image.shape[0]/2 - object.height 68 b = image.shape[0]/2 - object.height
67 coordinatevalue = int(math.sqrt((a*a)+(b*b))) 69 coordinatevalue = int(math.sqrt((a*a)+(b*b)))
70 +
71 + top = max(0, np.floor(x + 0.5).astype(int))
72 + left = max(0, np.floor(y + 0.5).astype(int))
73 + right = min(image.shape[1], np.floor(x + w + 0.5).astype(int))
74 + bottom = min(image.shape[0], np.floor(y + h + 0.5).astype(int))
75 +
68 # 객체 정보 및 계산 값 저장 76 # 객체 정보 및 계산 값 저장
69 - detectionInfo.append([i, name, size, coordinatevalue, int(x), int(y), int(w), int(h)]) 77 + detectionInfo.append([i, name, size, coordinatevalue, top, left, right, bottom])
70 78
71 f = open("detectionInfo.txt", 'w') 79 f = open("detectionInfo.txt", 'w')
72 for i in range(len(detectionInfo)): 80 for i in range(len(detectionInfo)):
...@@ -117,10 +125,41 @@ if __name__ == '__main__': ...@@ -117,10 +125,41 @@ if __name__ == '__main__':
117 125
118 126
119 # 계획2 : 프레임별로 나온 객체 겹치는 부분 제외하고 넓이 구해 큰거 Indexlist에 넣기 127 # 계획2 : 프레임별로 나온 객체 겹치는 부분 제외하고 넓이 구해 큰거 Indexlist에 넣기
128 + # 모든 프레임에 적용하지 않고 여러 객체가 나온 프레임 선정, 프레임 인덱스 저장하는 best 딕셔너리
129 + best = list(list(zip(*detectionInfo))[0])
130 + bestList= {}
131 + for i in range(len(detectionInfo)):
132 + if best.count(detectionInfo[i][0]) == 2:
133 + if detectionInfo[i][0] in bestList:
134 + bestList[detectionInfo[i][0]].append(detectionInfo[i][1:])
135 + else:
136 + bestList[detectionInfo[i][0]] = [detectionInfo[i][1:]]
137 + elif best.count(best[i]) > 2:
138 + if best[i] in bestList:
139 + bestList[best[i]].append([i, detectionInfo[i][3]])
140 + else:
141 + bestList[best[i]] = [[i, detectionInfo[i][3]]]
142 +
143 + for key, value in bestList.items():
144 + if len(value[0]) == 2:
145 + tmpValue = deepcopy(value)
146 + first, second = 0, 0
147 + indexList = list(list(zip(*tmpValue))[0])
148 + coordiList = list(list(zip(*tmpValue))[1])
149 + minCordi = coordiList.index(min(coordiList))
150 + first = indexList[minCordi]
151 + coordiList[minCordi] = 99999
152 + minCordi = coordiList.index(min(coordiList))
153 + second = indexList[minCordi]
154 + print(first, second)
155 + bestList[key] = [detectionInfo[first][1:], detectionInfo[second][1:]]
156 +
157 + # beOverlap 에서 선정된 두 객체의 top, left, right, bottom 값 비교하여 두 객체의 합산 size 계산, 이를 overlapped에 저장
158 + # 이 때, value는 항상 두 가지 값만을 가짐
159 + #for key, value in bestList.items():
160 + # a_top, a_left, a_right, a_bottom = value[0][4:]
161 + # b_top, b_left, b_right, b_bottom = value[1][4:]
120 162
121 - # 모든 프레임에 적용하지 않고 베스트 컷 10컷 정도 선정
122 -
123 - # 선정된 프레임 내에서 일정 크기 이상의 객체 중, 겹치는 객체 선정해서 하나의 검출물로 처리
124 163
125 # 정리된 검출 리스트 output3 에 출력 164 # 정리된 검출 리스트 output3 에 출력
126 165
......