프로그래밍/데이터 사이언스 공부

YOLOv8 객체 탐지 시 zsh: killed 오류 해결과정

이자다 2023. 9. 18. 21:36
반응형

https://thisisjava.tistory.com/588

 

YOLOv8 객체 탐지 시 zsh: killed 오류

yolov8의 모델로 비디오 객체탐지 시 위와 같이 실행 중 프로세스가 죽어버리는 오류가 지속적으로 발생한다. https://stackoverflow.com/questions/66295155/zsh-killed-python3-on-m1-macbook-pro zsh: killed python3 on M1 MacB

thisisjava.tistory.com

위 글의 오류 해결 과정이다

 

 

 

 

위 사진들에서 메모리 사용량을 보면 yolov8 객체탐지 과정에서 메모리 소모량이 매우 극심하다.

 

이유는 객체 탐지 과정에서 사용한 model.predict 함수는 영상 객체를 탐지할 때 프레임 단위로 나온 결과값을 메모리에 누적하여 저장하기 때문이다. 때문에 results = model.predict()를 수행하고 나면 results 변수에 영상 객체 탐지 결과가 전부 저장되어 이를 활용할 수 있는 것이고.

 

이 때문에 양이 많지 않은 사진 탐지는 정상적으로 수행되었으나 영상은 계속 탐지되다가 중간에 프로세스가 죽어버리는 것이다.

 

그러면 현재 사용중인 모델은 'yolov8s.pt' 를 파인튜닝한 것이니 이보다 크기가 작은 'yolov8n.pt'를 사용하면 괜찮을까 해서 해당 모델로 객체탐지를 시도해 보았다.

 

 

 

결과는 보다시피 똑같이 프로세스가 종료되었다.

 

모델 크기가 아니라 결과값을 메모리에 저장하는 부분이 문제라서 그런 것 같다.

 

혹시 조금이라도 메모리 부담을 줄여줄 수 있을까 해서 hide_conf 옵션을 True로 했는데 별 의미는 없었다.

 

 

 

 

 

model.predict를 사용할 수 없으니 나는 현재 yolov8을 이용해서 영상 객체 탐지의 결과영상을 얻을 수 없는 상태다.

 

하지만 결과 영상을 얻지는 못하더라도 프레임 단위로 식별된 값을 얻을 수는 있다.

 

https://docs.ultralytics.com/modes/predict/#key-features-of-predict-mode

 

Predict

Discover how to use YOLOv8 predict mode for various tasks. Learn about different inference sources like images, videos, and data formats.

docs.ultralytics.com

 

위 링크의 글을 참고하였다. predict 메소드를 사용하지 않고 그냥 model에 stream = True 옵션을 주면 객체 탐지 결과값을 메모리에 적재하지 않고 바로 없애버린다.

 

영상 객체를 탐지할 때 n번째 프레임에서 탐지한 값을 n+1번째 프레임을 탐지할 때는 지워버리는 식으로 메모리 부담을 줄인다.

 

메모리에 부담은 가지 않지만 results 변수에 반환할 결과가 남아있지 않아서 이를 활용할 수 없고, 결과로 출력되는 객체 탐지 영상도 얻을 수 없다.

 

results를 print(results)로 출력해보면 실제로 아무 값도 들어있지 않아서 '<generator object BasePredictor.stream_inference at 0x179ff1120>' 가 출력된다.

 

 

 

현재 목적은 객체 탐지 영상이 아니라 객체 추적으로 한 객체가 이동할 경로를 몇가지로 정의하고 집계하는 것인데 stream으로 메모리에 저장된 값을 다 날려버리면 이게 불가능하지 않을까 생각된다. 

 

https://docs.ultralytics.com/modes/predict/#streaming-source-for-loop

 

Predict

Discover how to use YOLOv8 predict mode for various tasks. Learn about different inference sources like images, videos, and data formats.

docs.ultralytics.com

 

위 링크를 참고하여 작성한 아래의 opencv를 이용하는 코드로 연속된 프레임을 탐지해 화면에 출력할 수 있는데 내가 opencv를 잘 못해서 이 코드를 더 발전시켜서 영상을 추출해낼 수 있을지 모르겠다.

# Load the YOLOv8 model
model = YOLO('best.pt')

# Open the video file
video_path = "/Users/user/Desktop/vscodeProject/YOLOv8_Practice/12.MP4"
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLOv8 inference on the frame
        results = model(frame)

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Display the annotated frame
        cv2.imshow("YOLOv8 Inference", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

 

어쨌든 현재 목적은 객체 경로 추적 후 집계이니까 이걸 구현해보면서 더 고민해봐야겠다.

반응형