코딩헤딩

[YOLO] Object Detection 켄타우로스는 사람일까 동물일까? 본문

뻘짓

[YOLO] Object Detection 켄타우로스는 사람일까 동물일까?

멈머이 2024. 1. 10. 22:09
728x90

https://coding-heading.tistory.com/104

 

Deep learning[딥러닝] YOLO 객체탐지 네트워크 가중치 모델 사용

https://coding-heading.tistory.com/103 Deep learning[딥러닝] YOLO 객체탐지 네트워크 기초 - "욜로"라고 칭한다. - 한 개의 네트워크(계층, 모델 같은 의미로 칭함)에서 객체(물체, 사물)를 탐지 - 탐지된 개체의

coding-heading.tistory.com

 

* 위 글의 가중치 모델을 이용해서 객체(자동차) Detection 하는 코드를 함수로 만들어 보았다.

def predict_yolo(img_path) :
    """이미지 데이터 가져오기"""
    img = cv2.imread(img_path)
    """BGR을 RGB로 변환하기"""
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    height, width, channels = img.shape

    blob = cv2.dnn.blobFromImage(
            img, 
            1/256, 
            (416, 416),
            (0, 0, 0),
            swapRB = True,
            crop = False
    )

    """Yolo 모델에 입력 데이터로 넣어주기"""
    net.setInput(blob)
    outs = net.forward(output_layer)

    ### ----------------------------------------
    """인식된 객체(물체)의 인덱스 번호를 담을 변수"""
    class_ids = []
    """인식된 객체의 인식률(정확도)를 담을 변수"""
    confidences = []
    """인식된 객체의 좌표값을 담을 변수"""
    boxes = []
    
    """출력계층이 반환한 값들을 처리하기 위하여 반복문 사용"""
    for out in outs :
        # print(out)
        """인식된 객체에 대한 정보가 담겨 있음"""
        for detection in out :
            # print(detection)
            """인식된 객체에 대한 정보 추출하기(클래스=레이어 명칭) 확률 정보"""
            scores = detection[5:]
            # print(len(scores), scores)
    
            """scores값이 가장 큰 인덱스 번호 찾기
              - 0은 인식 못했다는 의미
              - 가장 큰 인덱스 값 : 레이블 명칭(이름)이 있는 리스트 배열의 인덱스 값을 의미함
            """
            class_id = np.argmax(scores)
            ### print(class_id)
    
            """score 값이 가장 큰 위치의 인덱스 번호에 해당하는 값은 인식률(정확도)를 의미
            """
            confidence = scores[class_id]
            ### print(confidence)
    
            """정확도(인식률, 탐지율) 50% 이상인 데이터에 대해서 처리하기"""
            if confidence > 0.5 : 
    
                """바운딩 박스의 상태적 중심 x, y 좌표 비율 추출하여
                   - 실제 중심점 길이 좌표(절대 좌표)로 변환하기 
                """
                """실제 중심점 x 좌표"""
                center_x = int(detection[0] * width)
                """실제 중심점 y 좌표"""
                center_y = int(detection[1] * height)
                print(center_x, center_y)
    
                """바운딩 박스의 상대적 너비와 높이 비율 추출하기"""
                """ - 실제 너비로 변환"""
                w = int(detection[2] * width)
                """ - 실제 높이로 변환"""
                h = int(detection[3] * height)
                print(w, h)
    
                """시작점 좌표 계산하기"""
                x = int(center_x - w / 2)
                y = int(center_y - h / 2)
                # print(x, y)
    
                """이미지 좌표계
                  - 좌상단이 0, 0 입니다.
                  - 그래프 좌표계는 좌하단이 0, 0
                """
    
                """실제 x, y, 너비, 높이 값을 리스트로 담기"""
                boxes.append([x, y, w, h])
    
                """객체 인식률(정확도) 실수형 타입으로 담기"""
                confidences.append(float(confidence))
    
                """레이블 명칭(이름) 인덱스 담기"""
                class_ids.append(class_id)
                
    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)   

    ### -------------------------------------------------
    """
    <폰트 스타일 지정>
    """
    font = cv2.FONT_HERSHEY_PLAIN
    
    """
    <바운딩 박스의 색상 지정하기>"""
    colors = np.random.uniform(0, 255, size=(len(boxes), 3))
    
    """인식된 객체가 있는 경우"""
    if len(indexes) > 0 :
        """무조건 1차원으로 변환"""
        # print(indexes.flatten())
        for i in indexes.flatten() : 
            """x, y, w, h 값 추출하기"""
            x, y, w, h = boxes[i]
            # print(x, y, w, h)
    
            """실제 레이블 명칭(이름) 추출하기"""
            label = str(classes[class_ids[i]])
            # print(label)
    
            """인식률(정확도) 추출하기"""
            confidence = str(round(confidences[i], 2))
            # print(confidence)
    
            """바운딩 박스의 색상 추출하기"""
            color = colors[i]
            # print(color)
    
            """바운딩 박스 그리기
                - 마지막 값 2 : 바운딩 박스 선의 굵기
            """
            cv2.rectangle(img, (x, y), ((x+w), (y+h)), color, 2)
    
            """ 인식된 객체의 레이블 명칭(이름)과 정확도 넣기(그리기)"""
            cv2.putText(img, label + " " + confidence,
                        (x, y+20), font, 2, (0, 255, 0), 2)
    
        plt.imshow(img)
        
    ### 인식된 객체가 없는 경우
    else :
        print("인식된 객체가 없습니다!!!")
import glob

paths = glob.glob("./yolo/new_img/can.jpg")

"""함수 호출하기"""
predict_yolo(paths)

결과 :

 

켄타우로스는 사람으로 분류합니다.

728x90

'뻘짓' 카테고리의 다른 글

정보처리기사 정리(21.08.14 기출)  (1) 2024.01.31
자소서 | 포트폴리오  (0) 2024.01.12
[python] 일반방식 VS 이터레이터 방식  (0) 2023.11.16