오늘부터 딥러닝 팀프로젝트가 시작 되었다. 그동안 배운 머신러닝과 딥러닝 강의들을 이제 웹개발에 녹여내야 한다.
여러가지 아이디어가 나오고 어떻게 웹개발에 녹아낼 수 있을까 하다가 우리는 스포츠 사이트를 만들기로 했다.
유저가 회원가입을 하면 스포츠 사진을 하나 받는다.
그것을 yolov5 로 인식해서 카테고리 별로 분류해준다.
메인페이지에서 카테고리별로 처음에는 무작위로 맴버 카드가 나오는데, 카테고리를 누르면 같은 카테고리별로 멤버 카드가 나온다.
거의 대부분의 기능들은 회원가입시 등록한 사진에 의해서 구현된다고 보면 된다. 그 사진으로 카테고리별로 분류.
https://www.notion.so/5b71a53b88384832821955cbc575e87f
우선 오늘 하루동안 기획한 우리팀의 노션 페이지 이다.
왜냐하면 오늘 DB설계와 API설계를 하면서 느낀점인데, 저번 프로젝트에서는 이부분을 좀 대충하고 넘어간 것 같다. 또한 잘 이해가 가지 않아서 우선 하자는 대로 했던 기억이 있다.
하지만 저번프로젝트에서 DB와, API를 조금 접해보면서 설계를 어떻게 해야하고, 어떤 요청을 받아올지, 어떻게 뿌려질지 등 설계과정이 머리속으로 그려저서 프로젝트 진행시 어떻게 작업해야 할지 감이 많이 잡힌 것 같다.
그래도 저번 보다는 기획을 탄탄하게 잡고 가려해서 인지 오늘은 프로젝트를 시작조차 못하고 계속 회의를 반복했다. 하지만 프로젝트를 빨리 시작하는 것 보다, 기획을 제대로 잡고 가는게 프로젝트가 산으로 안가는 좋은 방법이라고 생각한다.
기획 회의후 팀원들과 yolov5 에 대한 실습을 조금 하였다. 우리가 쓸 모델과 우리가 필요한 부분들을 테스트 해보았다. 일단 작동은 제대로 되는 것 같은데, 계속 응용하면서, 많은 연구가 필요 할 것 같다.
import numpy as np
import cv2
# step 1 - load the model
net = cv2.dnn.readNet('config_files/yolov5s.onnx')
# step 2 - feed a 640x640 image to get predictions
def format_yolov5(frame):
row, col, _ = frame.shape
_max = max(col, row)
result = np.zeros((_max, _max, 3), np.uint8)
result[0:row, 0:col] = frame
return result
image = cv2.imread('misc/123123.jpg')
input_image = format_yolov5(image) # making the image square
blob = cv2.dnn.blobFromImage(input_image , 1/255.0, (640, 640), swapRB=True)
net.setInput(blob)
predictions = net.forward()
# step 3 - unwrap the predictions to get the object detections
class_ids = []
confidences = []
boxes = []
output_data = predictions[0]
image_width, image_height, _ = input_image.shape
x_factor = image_width / 640
y_factor = image_height / 640
for r in range(25200):
row = output_data[r]
confidence = row[4]
if confidence >= 0.4:
classes_scores = row[5:]
_, _, _, max_indx = cv2.minMaxLoc(classes_scores)
class_id = max_indx[1]
if (classes_scores[class_id] > .25):
if class_id == 34:
confidences.append(confidence)
class_ids.append(class_id)
x, y, w, h = row[0].item(), row[1].item(), row[2].item(), row[3].item()
left = int((x - 0.5 * w) * x_factor)
top = int((y - 0.5 * h) * y_factor)
width = int(w * x_factor)
height = int(h * y_factor)
box = np.array([left, top, width, height])
boxes.append(box)
elif class_id == 35:
confidences.append(confidence)
class_ids.append(class_id)
x, y, w, h = row[0].item(), row[1].item(), row[2].item(), row[3].item()
left = int((x - 0.5 * w) * x_factor)
top = int((y - 0.5 * h) * y_factor)
width = int(w * x_factor)
height = int(h * y_factor)
box2 = np.array([left, top, width, height])
boxes.append(box2)
class_list = []
with open("config_files/classes.txt", "r") as f:
class_list = [cname.strip() for cname in f.readlines()]
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.25, 0.45)
result_class_ids = []
result_confidences = []
result_boxes = []
for i in indexes:
result_confidences.append(confidences[i])
result_class_ids.append(class_ids[i])
result_boxes.append(boxes[i])
for i in range(len(result_class_ids)):
box = result_boxes[i]
class_id = result_class_ids[i]
cv2.rectangle(image, box, (0, 255, 255), 2)
cv2.rectangle(image, (box[0], box[1] - 20), (box[0] + box[2], box[1]), (0, 255, 255), -1)
cv2.putText(image, class_list[class_id], (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, .5, (0,0,0))
# cv2.imwrite("misc/kids_detection.png", image)
# cv2.imshow("output", image)
# cv2.waitKey()
x = box[0] + box[2]
y = box[1] + box[3]
x2 = box2[0] + box2[2]
y2 = box2[1] + box2[3]
dst_photo = image[box[1]:y, box[0]:x].copy()
dst_photo2 = image[box2[1]:y2, box2[0]:x2].copy()
# print(dst_photo)
cv2.imshow('cut image', dst_photo)
cv2.waitKey()
cv2.imshow('cut image', dst_photo2)
cv2.waitKey()
import os
try:
os.mkdir('save_image')
except:
pass
cv2.imwrite('save_image/1212.jpg', dst_photo2)
cv2.imwrite('save_image/1211.jpg', dst_photo)