본문으로 바로가기

오전에 머신러닝 퀴즈 진행했다.

퀴즈를 거의다 풀었지만 문제가 몇가지 있었다. 파이썬 for문을 이용을 하는게 시작부터 어려웠고 한사람이 아닌 다섯명의 사람들을 인식하고 각자의 크롭된 사진을 얻는게 힘들었다. 크롭된 사진을 얻더라도 직사각형이 그려진 사진으로 크롭을 하다보니 각각 인식된 사람이 크롭되었을때 옆사람의 노란색 직사각형이 사진에 나타나는 문제가 있었다.

사실상 데이터가 어떤 형식으로 오는지도 몰랐기에 print(result)를 찍어가며 공부를 했다.

import torch
import cv2
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)

img = cv2.imread('test.jpg')
results = model(img)
results.crop("person")

result = results.pandas().xyxy[0].to_numpy()
result = [item for item in result if item[6]=='person']

print(result) 의 결과는 아래와 같았다.

 

[array([432.42706298828125, 155.5716094970703, 631.0242919921875, 804.8375854492188, 0.9132899045944214, 0, 'person'], dtype=object), array([620.9994506835938, 154.44674682617188, 790.0961303710938, 806.7844848632812, 0.9080604910850525, 0, 'person'], dtype=object), array([762.9304809570312, 127.3348388671875, 951.8087768554688, 813.9844970703125, 0.8943580389022827, 0, 'person'], dtype=object), array([274.86883544921875, 174.7273712158203, 457.47015380859375, 805.7644653320312, 0.8802735805511475, 0, 'person'], dtype=object), array([98.1433334350586, 109.3958969116211, 310.70220947265625, 816.4163208007812, 0.8792232871055603, 0, 'person'], dtype=object)]
432.42706298828125

 

아래의 코드와 비교해가면서 어떤식으로 사용을 할 수 있을지 생각했고 적용했다.

for c,d in enumerate(result):
    cropped = tmp_img[int(d[1]):int(d[3]), int(d[0]):int(d[2])] #행, 열
    cv2.imwrite(f"crop{c}.png", cropped) #자른걸 이미지 다시 불러주겠다.
    cv2.rectangle(tmp_img2, (int(d[0]), int(d[1])), (int(d[2]), int(d[3])), (0,255,255))
cv2.imwrite('rectangle.png', tmp_img2)

 

    cropped = tmp_img[int(d[1]):int(d[3]), int(d[0]):int(d[2])] #행, 열
    cv2.rectangle(tmp_img2, (int(d[0]), int(d[1])), (int(d[2]), int(d[3])), (0,255,255)

처음에는  위에 있는 각각의 코드가 따로 작동하는 것을 모르고 순서를 바꿔서 해보기도하고 아래의 코드처럼 변수를 하나로 지정하고 해보기도 했다. 그리고 직사각형이 그려진 사진으로 corp을 진행해서 잘린사진에서 직사각형이 나타나기도 했다.

tmp_img = cv2.imread('test.jpg')

제일 처음 인지한 오류는처음에는 for문 안에 cv2.imwrite('rectangle.png', tmp_img2) 코드를 넣고 for문을 돌리면서 결과물이 사진 한장 이지만 코드를 다섯번이나 돌린다는것이였다. 결국 전역변수를 두개를 지정하고 for문에서 cv2.imwrite('rectangle.png', tmp_img2) 코드를 빼면서 결국 문제를 해결했다. 그리고 코드를 깔끔하게 리팩토링 할 수 있었다.

tmp_img = cv2.imread('test.jpg')
tmp_img2 = cv2.imread('test.jpg')

for c,d in enumerate(result):
    cropped = tmp_img[int(d[1]):int(d[3]), int(d[0]):int(d[2])] #행, 열
    cv2.imwrite(f"crop{c}.png", cropped) #자른걸 이미지 다시 불러주겠다.
    cv2.rectangle(tmp_img2, (int(d[0]), int(d[1])), (int(d[2]), int(d[3])), (0,255,255))
cv2.imwrite('rectangle.png', tmp_img2)

총 다섯번의 업데이트와 리펙토링을 진행하면서 터미널만 사용해서 깃허브와 연동했고 익숙해지려고 노력했다. 결과물은 의도한대로 잘 나온 것 같다.

초심을 찾으려고 노력한 하루였다. 수영도 다녀오고 바로 스터디카페에서 공부를 하니까 훨씬 나았다. 내일도 꾸준하게 화이팅!!