ch0nny_log

[빅데이터분석] 딥러닝_17.영상 속에서 사물인식하기 본문

빅데이터 분석(with 아이티윌)/deep learning

[빅데이터분석] 딥러닝_17.영상 속에서 사물인식하기

chonny 2024. 10. 28. 14:04

https://cafe.daum.net/oracleoracle/SpOP/370

 

Daum 카페

 

cafe.daum.net

 

지금 하는 내용은 1000개의 클래스를 인식하는 신경망을 이용해서 사진과 영상에서 사물 검출을 해 볼 겁니다.

 

1. google drive에 인식할 파일을 넣고 마운트하기

from google.colab import drive
drive.mount('/content/drive')

 

2. 필요 모듈 설치

pip install ultralytics

 

3. 사물 탐지 수행 후 office3_detected 결과 저장

from ultralytics import YOLO
import cv2
import matplotlib.pyplot as plt

# YOLOv8 모델 로드 (YOLOv8n, YOLOv8s, YOLOv8m, YOLOv8l, YOLOv8x 등 다양한 모델 크기 선택 가능)
model = YOLO('yolov8n.pt')  # 'yolov8n.pt'는 YOLOv8 nano 모델, 더 높은 성능을 원하면 다른 가중치 사용 가능

# 이미지 로드
image_path = '/content/drive/MyDrive/data19/office3.jpg'
image = cv2.imread(image_path)

# YOLOv8 모델로 사물 탐지 수행
results = model(image)

# 결과 시각화
annotated_image = results[0].plot()

# 결과 출력
plt.imshow(cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)) # BGR -> RGB 변환
plt.axis('off') # 사진에서 축 없애기
plt.show()

# 결과 저장
output_path = '/content/drive/MyDrive/data19/office3_detected.jpg'
cv2.imwrite(output_path, annotated_image)
print(f"Detection results saved to {output_path}")

 

4. 동영상 사물인식 수행

from ultralytics import YOLO
import cv2

# YOLOv8 모델 로드
model = YOLO('yolov8n.pt')  # Nano 버전. 성능이 더 필요하면 'yolov8s.pt', 'yolov8m.pt' 등을 사용할 수 있음

# 동영상 파일 경로 설정
input_video_path = '/content/drive/MyDrive/data19/cut_video.mp4'  # 업로드된 동영상 경로
output_video_path = '/content/drive/MyDrive/data19/cut_video_detected.mp4'  # 디텍션 결과가 저장될 동영상 경로

# 동영상 파일 열기
cap = cv2.VideoCapture(input_video_path)

# 동영상 저장을 위한 설정
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # mp4 코덱 설정
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))

# 각 프레임에 대해 YOLOv8로 객체 탐지 수행
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # YOLOv8로 객체 탐지 수행
    results = model(frame)
    annotated_frame = results[0].plot()  # 탐지된 결과를 시각화

    # 시각화된 프레임을 동영상으로 저장
    out.write(annotated_frame)

# 리소스 해제
cap.release()
out.release()

print(f"Detection video saved at {output_video_path}")

 

 

 


https://cafe.daum.net/oracleoracle/SpOP/375

▣  얼굴인식 신경망 만들기 

얼굴 인식이 필요한 분야 ?  

1. 상권 분석시  유동인구 행인 얼굴 모자이크 처리
2. 경찰청에서 cctv 의 범인 찾는데 활용
3. 미아나 치매 노인들을 cctv 로 찾는데 활용
4. 기타 여러 아이디어들

 

https://cafe.daum.net/oracleoracle/SpOP/371

 

Daum 카페

 

cafe.daum.net

https://colab.research.google.com/drive/1CU3JozS8XQRLBvCKOq5PDh1-OHrAi2mc

 

Google Colab Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

1. 모듈 임포트

!git clone https://github.com/heartkilla/yolo-v3.git

%cd /content/yolo-v3
!pip install -r /content/yolo-v3/requirements.txt

import  tensorflow  as  tf
print ( tf.__version__)

%cd /content/yolo-v3
!wget -P /content/yolo-v3/weights https://pjreddie.com/media/files/yolov3.weights

import tensorflow as tf

tf.__version__

!python /content/yolo-v3/load_weights.py

%cd /content/yolo-v3
!apt install ffmpeg libopencv-dev libgtk-3-dev python-numpy python3-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libv4l-dev libtbb-dev qtbase5-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip

!pip install face_recognition

import cv2
import face_recognition

 

2. 코드 돌리기

# 필요한 라이브러리 임포트
import face_recognition
import cv2
import numpy as np

# 비디오와 얼굴 이미지 로드
input_movie = cv2.VideoCapture("/content/drive/MyDrive/data19/blackpink2_exported.mp4")
length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))
image = face_recognition.load_image_file("/content/drive/MyDrive/data19/sample2.jpg")
face_encoding = face_recognition.face_encodings(image)[0]

# 알려진 얼굴 설정
known_faces = [face_encoding]

# 변수 초기화
face_locations = []
face_encodings = []
face_names = []
frame_number = 0

# 비디오 설정
video_size = (1280, 720)
output_size = (1280, 720)
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
output_movie = cv2.VideoWriter('videolisa2.mp4', fourcc, 30, output_size)

# 각 프레임 처리
while True:
    ret, frame = input_movie.read()
    if not ret:
        break

    frame_number += 1
    img_bgr = cv2.resize(frame, video_size)
    rgb_frame = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

    # 얼굴 위치와 인코딩 탐지
    face_locations = face_recognition.face_locations(rgb_frame, model="cnn")

    # 각 프레임의 얼굴 인코딩을 가져옴
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    face_names = []
    res = []

    # 알려진 얼굴과 매칭 확인
    for face_encoding in face_encodings:
        match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.60)
        res.append(sum(match))

        name = "lisa" if match[0] else None
        face_names.append(name)

    try:
        confi = round(sum(res) / len(res), 3) if res else 0
    except ZeroDivisionError:
        continue

    # 결과에 라벨 표시
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        if not name:
            continue

        # 얼굴 주위에 상자 그리기
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 얼굴 아래에 이름이 있는 라벨 그리기
        cv2.rectangle(frame, (left, bottom - 25), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name + str(confi), (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

    # 결과 프레임을 비디오 파일에 저장
    print(f"Writing frame {frame_number} / {length}")
    output_movie.write(frame)

# 완료
input_movie.release()
output_movie.release()
print("비디오 저장이 완료되었습니다.")

정확률 무엇 ㅋㅋ

 

 

3. 다시 확률을 조정할 수 있는 전체 코드_블랙핑크

# 필요한 라이브러리 임포트
import face_recognition
import cv2
import numpy as np

# 비디오와 얼굴 이미지 로드
input_movie = cv2.VideoCapture("/content/drive/MyDrive/samples7/blackpink.mp4")
length = int(input_movie.get(cv2.CAP_PROP_FRAME_COUNT))
image = face_recognition.load_image_file("/content/drive/MyDrive/samples7/lisa.png")
face_encoding = face_recognition.face_encodings(image)[0]

# 알려진 얼굴 설정
known_faces = [face_encoding]

# 변수 초기화
face_locations = []
face_encodings = []
face_names = []
frame_number = 0

# 비디오 설정
video_size = (1280, 720)
output_size = (1280, 720)
fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V')
output_movie = cv2.VideoWriter('videolisa2.mp4', fourcc, 30, output_size)

# 각 프레임 처리
while True:
    ret, frame = input_movie.read()
    if not ret:
        break

    frame_number += 1
    img_bgr = cv2.resize(frame, video_size)
    rgb_frame = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)

    # 얼굴 위치와 인코딩 탐지
    face_locations = face_recognition.face_locations(rgb_frame, model="cnn")

    # 각 프레임의 얼굴 인코딩을 가져옴
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    face_names = []
    res = []

    # 알려진 얼굴과 매칭 확인
    for face_encoding in face_encodings:
        match = face_recognition.compare_faces(known_faces, face_encoding, tolerance=0.5)
        distance = face_recognition.face_distance(known_faces, face_encoding)[0]  # 유사도 계산
        res.append(distance)

        if match[0] and distance < 0.4:  # 유사도 기준을 추가하여 필터링
            name = f"lisa ({distance:.2f})"
        else:
            name = None

        face_names.append(name)

    # 결과에 라벨 표시
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        if not name:
            continue

        # 얼굴 주위에 상자 그리기
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # 얼굴 아래에 이름이 있는 라벨 그리기
        cv2.rectangle(frame, (left, bottom - 25), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)

    # 결과 프레임을 비디오 파일에 저장
    print(f"Writing frame {frame_number} / {length}")
    output_movie.write(frame)

# 완료
input_movie.release()
output_movie.release()
print("비디오 저장이 완료되었습니다.")