본문 바로가기

프로젝트/Data_Analysis_Track_33_FinalProject

FinalProject_06(개별 Action 수행, sequential img inference)

회의 내용

  • 라바콘, 박스 등의 아이콘으로 지도에 나타낼 수 있겠음
  • 오늘 보여준 웹 UI를 바탕으로 일단 개발해 보는 것으로 함 → 개발하다가 아이디어가 있으면 추가하면 될 듯
  • aws 를 서버로 이용하기로 함 → 조사를 해서 발표하기(저장소 쓰는 법, 모델학습하는 방법 등등…)
        - 최소한으로 비용이 발생할 수 있는 방법을 조사하기
  • 이미지는 클라우드 말고 로컬에 저장해서 불러오는 것으로 → 폴더 안에 max file 숫자를 정해야함
  • 폴더 안에는 이미지를 200개 이상 저장할 때 못 담는다, 200개가 넘으면 새로운 폴더를 만들도록 → 저장할 때 logic을 이렇게 짜면 됨
  • 200개씩 짤라서 폴더를 만들면, 속도가 느려지지는 않음
  • 이미지를 순차적으로 가져와서 달리는 것 같은 영상처럼 보이게 하는 코드 작성하기 → 웹캠보다는 sequential한 이미지를 띄워서 detecting 하는 코드 작성해 주세요 (프로토타입 용인것 같음)

 

이미지를 순차적으로 가져와서 달리는 것 같은 영상처럼 보이게 하는 코드

(local 환경 너무 느려서 colab 환경에서 진행)

 

import os
os.chdir('/content/drive/MyDrive/finalproject')
os.getcwd()

 

 

ultralytics 설치

!pip install ultralytics

 

 

모델 지정

- 지금은 미리 코드 작성을 위해 yolo모델을 썼지만 나중에 웹에 올라갈 모델은 커스텀모델을 사용

from ultralytics import YOLO

# 모델 생성
model = YOLO("yolov8n.pt") # 객체 생성시 pretrained 모델파일의 경로를 지정. (없으면 다운로드)
                                  # task => 설정한 모델 파일에 따라서 결정.

 

 

사진 디렉토리 안에 사진 개수 확인

# 디렉토리 내의 파일 개수 확인
folder_path = "/content/drive/MyDrive/finalproject/sequential img inference/sequential image" # sequential image들의 개수
file_list = os.listdir(folder_path)
file_count = len(file_list)
print(file_count)

 

 

이미지들을 리스트로 묶기

# /* -> sequential image 디렉토리 안의 모든 jpg파일을 지정
from glob import glob
img_list = glob("/content/drive/MyDrive/finalproject/sequential img inference/sequential image/*.jpg")
img_list

 

 

리스트로 묶인 이미지들 inference

# 리스트로 여러장 추론
r = model(img_list, save=True)

 

 

결과 sequential image들을 화면에 출력

import cv2
import os
from google.colab.patches import cv2_imshow

# 이미지가 저장된 디렉토리 경로
image_folder_path = "/content/drive/MyDrive/finalproject/runs/detect/predict"

# 디렉토리 내의 모든 이미지 파일 가져오기
image_files = [os.path.join(image_folder_path, file) for file in os.listdir(image_folder_path) if file.lower().endswith(('.png', '.jpg', '.jpeg'))]

# 이미지를 순차적으로 읽어들이고 화면에 표시
for image_file in image_files:
    # 이미지 읽기
    img = cv2.imread(image_file)

    # 이미지 표시
    cv2_imshow(img)
    cv2.waitKey(500)  # 500 milliseconds (adjust as needed)

cv2.destroyAllWindows()

 

-> 웹 UI에 올라가려면 사진이 영상처럼 출력되어야 할텐데 지금 위의 코드는 여러장의 사진이 같은 틀에서 영상처럼 움직이는게 아니라 한 장마다 스크롤이 내려가며 생성됨

 

Sequential_Image2Video

import cv2
import os

# 이미지가 저장된 디렉토리 경로
image_folder_path = "/content/drive/MyDrive/finalproject/runs/detect/predict"

# 디렉토리 내의 모든 이미지 파일 가져오기
image_files = [os.path.join(image_folder_path, file) for file in os.listdir(image_folder_path) if file.lower().endswith(('.png', '.jpg', '.jpeg'))]

# 첫 번째 이미지를 기준으로 비디오 프레임 크기 설정
first_image = cv2.imread(image_files[0])
height, width, layers = first_image.shape

video_path = "Sequential_img_inference_video.avi"
video_writer = cv2.VideoWriter(video_path, cv2.VideoWriter_fourcc(*"DIVX"), 10, (width, height)) # 10 -> FPS

# 이미지를 순차적으로 읽어들여 비디오로 저장
for image_file in image_files:
    img = cv2.imread(image_file)
    video_writer.write(img)

video_writer.release()

# # 저장된 비디오 파일 재생
# cap = cv2.VideoCapture(video_path)

# while True:
#     ret, frame = cap.read()
#     if not ret:
#         break

#     cv2_imshow(frame)
#     if cv2.waitKey(500) & 0xFF == 27:  # 500 milliseconds (adjust as needed), ESC to exit
#         break

# cap.release()
# cv2.destroyAllWindows()

# 저장된 비디오 파일 삭제 (선택 사항)
# os.remove(video_path)