코드 수정

투기 행위가 감지되지 않더라도 BBOX, Skeleton 그려지게 변경

투기 행위 감지 알고리즘은, GPU에서 연산 된 여러개의 바운딩 박스 중 일정 confidence 이하의 BBOX를 1차적으로 걸러낸 뒤, 그 중 가장 높은 confidence를 가진 BBOX를 뽑아 threshold와 비교하여 투기행위로 분류하는 알고리즘이다. 1차적으로 걸러낸 뒤 뽑힌 BBOX의 confidence들은 result_scores에 저장되며, 최대 confidence를 갖는 BBOX의 index가 best_score_idx에 저장된다.

기존 코드는 best_score_idx가 None이 아닐때만 BBOX와 스켈레톤이 그려지게 설계되어 있었는데, 만약 해당 사진에서 투기 행위가 감지되지 않는다면 1차적으로 모든 BBOX가 걸러져서 best_score_idx가 None이 된다. 따라서 객체가 투기행위를 하는 것으로 감지되지 않으면 바운딩박스와 스켈레톤을 볼 수 없었다. 하지만 테스트 기준에서 사람 검출률과 행위 탐지는 별개로 취급하기 때문에, BBOX와 스켈레톤을 그려주는 코드를 해당 if문 밖으로 꺼내주었다. 따라서 best_score_idx가 None이어도 BBOX와 스켈레톤이 그려진다.


모델에 이미지 넣는 과정 자동화

test 이미지 디렉토리 구조는 다음과 같다.

/img
    /img/09_01
        /img/09_01/img1.jpg
        /img/09_01/img2.jpg
        /img/09_01/img3.jpg
    /img/09_02
        /img/09_02/img1.jpg
        /img/09_02/img2.jpg
        /img/09_02/img3.jpg    
    /img/09_03
        /img/09_03/img1.jpg
        /img/09_03/img2.jpg
        /img/09_03/img3.jpg

하위 디렉토리에 있는 모든 이미지를 전부 모델에 넣어주기 위해 os의 listdir로 하위 dir를 전부 뽑아주어 foreach문을 돌렸다. 그 후 os.path의 join으로 상위 디렉토리와 결합하고 os의 walk를 사용하여 하위 디렉토리의 모든 jpg 파일을 받아왔다.

TEST_IMAGES_PATH = '경로/test_image'
SAVE_DIR = '경로/output_image'

for dir in os.listdir(TEST_IMAGES_PATH):
    PATH = os.path.join(TEST_IMAGES_PATH, dir)
    os.mkdir(os.path.join(SAVE_DIR, dir))

    for (root, dirs, files) in os.walk(PATH):
        for file in files:
            file_name, file_ext = os.path.splitext(file)
            if file_ext == '.jpg':
                test_image = cv2.imread(os.path.join(PATH, file), ...)

                ...


자잘한 코드 수정

  • 투기 행위 감지 시 폰트 색 변경

투기행위가 감지되면 폰트 색이 변경되도록 수정하였다.

if best_score_idx != None and result_classid[best_score_idx] == 0:
    color = (255, 0, 0)
cv2.putText(
    image, '투기행위 Conf.', 좌표, cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, ...
)            
  • 손 위치에 바운딩 박스 추가
cv2.rectangle(image, 좌상단_꼭짓점, 우하단_꼭짓점, RGB_COLOR...)


Output Image

image

댓글남기기