Showing
1 changed file
with
45 additions
and
6 deletions
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 | ... | ... |
-
Please register or login to post a comment