딥러닝 팀프로젝트 시작!

김하진·2022년 5월 18일
0

오늘부터 딥러닝 팀프로젝트가 시작 되었다. 그동안 배운 머신러닝과 딥러닝 강의들을 이제 웹개발에 녹여내야 한다.

여러가지 아이디어가 나오고 어떻게 웹개발에 녹아낼 수 있을까 하다가 우리는 스포츠 사이트를 만들기로 했다.

유저가 회원가입을 하면 스포츠 사진을 하나 받는다.
그것을 yolov5 로 인식해서 카테고리 별로 분류해준다.

메인페이지에서 카테고리별로 처음에는 무작위로 맴버 카드가 나오는데, 카테고리를 누르면 같은 카테고리별로 멤버 카드가 나온다.

거의 대부분의 기능들은 회원가입시 등록한 사진에 의해서 구현된다고 보면 된다. 그 사진으로 카테고리별로 분류.

https://www.notion.so/5b71a53b88384832821955cbc575e87f

우선 오늘 하루동안 기획한 우리팀의 노션 페이지 이다.

  • DB설계와 API 설계작업은 중요한 것 같다

왜냐하면 오늘 DB설계와 API설계를 하면서 느낀점인데, 저번 프로젝트에서는 이부분을 좀 대충하고 넘어간 것 같다. 또한 잘 이해가 가지 않아서 우선 하자는 대로 했던 기억이 있다.

하지만 저번프로젝트에서 DB와, API를 조금 접해보면서 설계를 어떻게 해야하고, 어떤 요청을 받아올지, 어떻게 뿌려질지 등 설계과정이 머리속으로 그려저서 프로젝트 진행시 어떻게 작업해야 할지 감이 많이 잡힌 것 같다.

  • 역시 기획은 탄탄하게.

그래도 저번 보다는 기획을 탄탄하게 잡고 가려해서 인지 오늘은 프로젝트를 시작조차 못하고 계속 회의를 반복했다. 하지만 프로젝트를 빨리 시작하는 것 보다, 기획을 제대로 잡고 가는게 프로젝트가 산으로 안가는 좋은 방법이라고 생각한다.

  • yolov5 실습

기획 회의후 팀원들과 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)
profile
진킴

0개의 댓글