이 코드는 name_file에 지정된 파일에서 클래스 이름 목록을 읽어들이는 방법을 보여주는 파이썬 코드입니다.
먼저, 빈 리스트인 classes를 만듭니다. 이후, name_file을 읽기 모드로 열고 f 변수에 저장합니다.
그 다음, for 루프를 사용하여 파일의 각 라인을 반복하면서, strip() 함수를 사용하여 라인의 양쪽 공백을 제거한 후, 결과를 classes 리스트에 추가합니다.
마지막으로, classes 리스트를 출력하여 name_file에서 읽어들인 클래스 이름 목록을 확인할 수 있습니다.
이 코드는 OpenCV를 사용하여 비디오 파일을 작성하는 함수인 writeFrame(img)을 정의하는 코드입니다.
함수는 이미지 (img)를 인자로 받습니다. 먼저, img의 높이와 너비를 추출합니다. 그런 다음, 전역 변수인 writer를 사용하여 비디오 라이터 객체를 만들고 초기화합니다. 이를 위해, writer가 None이고 output_name이 지정된 경우, MJPG 코덱을 사용하고 프레임 속도는 24fps로 설정하여 비디오 라이터를 만듭니다.
비디오 라이터가 초기화되면 writer 객체를 사용하여 img를 쓰고 비디오 파일을 작성합니다. 쓰기 작업이 성공적으로 수행되면 True가 반환됩니다.
즉, 이 함수는 이미지를 비디오 파일에 쓰기 위한 OpenCV 비디오 라이터 객체를 생성하고 초기화한 다음, 전달받은 이미지를 비디오 파일에 씁니다.
cv2.dnn.blobFromImage() 함수는 입력 이미지를 딥러닝 모델에 입력할 수 있는 형태인 BLOB(binary large object)으로 변환하는 함수입니다. BLOB은 일반적으로 이미지나 비디오 같은 이진 데이터를 다룰 때 사용되는 데이터 형식입니다.
이 함수의 파라미터는 아래와 같습니다.
이 함수는 변환된 BLOB을 반환합니다.
이 코드는 OpenCV의 딥러닝 모듈을 사용하여 객체 검출을 수행하는 함수인 detectAndDisplay(frame)를 정의하는 코드입니다.
함수는 이미지 (frame)를 인자로 받습니다. 먼저, 전역 변수인 frame_count를 증가시킵니다. 그리고 IPython.display.clear_output() 함수를 호출하여 출력 화면을 지우고 대기합니다.
이어서, frame의 높이, 너비 및 채널 수를 추출합니다. 그리고 cv2.dnn.blobFromImage() 함수를 사용하여 입력 이미지를 전처리합니다. 이 함수는 입력 이미지를 블롭(blob) 형태로 변환합니다.
다음, 블롭을 모델의 입력으로 설정하고, 모델의 출력 레이어에서 감지된 객체들을 가져옵니다. 이를 위해, net.setInput() 함수와 net.forward() 함수를 사용합니다.
감지된 객체들의 class ID, 신뢰도(confidence) 및 경계 상자(bounding box) 정보를 추출합니다. 이 정보는 class_ids, confidences 및 boxes 리스트에 저장됩니다.
즉, 이 함수는 이미지를 전처리하고, 딥러닝 모델을 사용하여 객체 검출을 수행하고, 검출된 객체의 class ID, 신뢰도 및 경계 상자 정보를 추출합니다.
for out in outs:
indexes = cv2.dnn.NMSBoxes(boxes, confidences, min_confidence, 0.4)이 코드는 비최대 억제(non-maximum suppression)를 수행하여 겹치는 객체 검출 상자를 제거하는 기능을 제공합니다.
cv2.dnn.NMSBoxes() 함수는 비최대 억제를 수행하고, 객체 검출 상자의 인덱스를 반환합니다.
함수의 네 번째 매개 변수는 IOU(Intersection over Union) 임계값을 나타냅니다. 이 값은 겹치는 상자를 제거하기 위한 IOU 임계값을 나타내며, 일반적으로 0.4 ~ 0.5 사이의 값을 사용합니다.
즉, 0.4는 비최대 억제를 수행할 때, IOU 임계값이 0.4 이상인 객체 검출 상자만 남기고 나머지는 제거하는 값을 나타내며, 이는 일반적으로 사용되는 값 중 하나입니다.
이 코드는 객체 검출 결과를 이용하여 원본 이미지(frame)에 검출된 객체를 표시하는 기능을 제공합니다.
검출된 객체들의 박스 좌표(boxes), 신뢰도(confidences), 클래스 ID(class_ids), 객체 라벨(classes) 정보를 이용하여 객체 검출 상자를 그립니다.
객체 검출 상자를 그리는 과정에서, 비최대 억제를 수행한 결과에 따라, 제거되지 않은 검출 상자만을 대상으로 객체 검출 상자를 그리게 됩니다.
그리고 검출된 객체의 라벨을 검출 상자 근처에 표시합니다.
마지막으로, 해당 프레임이 처리되는 데 걸린 시간을 측정하고 출력합니다. 그리고 cv2_imshow() 함수를 사용하여 이미지를 출력하고, writeFrame() 함수를 사용하여 출력된 이미지를 동영상 파일에 저장합니다.
이 코드는 입력 비디오 파일로부터 프레임을 읽어 들이고, detectAndDisplay() 함수를 이용하여 객체 검출 및 프레임 처리 결과를 도출하는 과정을 반복합니다.
반복문을 통해 프레임이 한 장씩 읽어들이며, 해당 프레임을 detectAndDisplay() 함수의 입력으로 전달합니다.
detectAndDisplay() 함수에서는 입력으로 전달된 프레임에서 객체 검출을 수행하고, 검출된 객체에 대한 정보를 기반으로 객체 검출 상자를 그리는 등의 작업을 수행합니다.
반복문은 입력 비디오 파일의 마지막 프레임을 읽을 때까지 계속됩니다.

| 차선 인식과 자동차 인식 동시에 하기 프로젝트 (0) | 2023.02.14 |
|---|---|
| darknet yolo car detection (0) | 2023.02.12 |
| OpenCV LaneDetection프로젝트 (0) | 2023.02.11 |
| YOLOv3 알고리즘, haar cascade 방식으로 번호판 식별하기 (0) | 2023.02.11 |
| yolo 자동차 인식 프로그램 (0) | 2023.02.11 |