ch0nny_log

[빅데이터분석] 딥러닝_18. 자연어 처리 신경망을 만들기 위한 작은 세미 프로젝트 (유동인구 카운트) 본문

카테고리 없음

[빅데이터분석] 딥러닝_18. 자연어 처리 신경망을 만들기 위한 작은 세미 프로젝트 (유동인구 카운트)

chonny 2024. 10. 30. 09:44

유동인구 카운트하는 욜로 구현

 

  • 영상 딥러닝 프로젝트 관련 수업
    • 80개의 사물을 검춯하는 욜로 모델을 불러와서 007 영상과 일반 사진 사물검출을 했음
    • 얼굴 인식 신경망을 불러와서 블랙핑크 멤버중 지수를 인식하는 사물검출 신경망
    • 유동인구 카운트하는 욜로 구현 (https://cafe.daum.net/oracleoracle/SpOP/314)
    • 담 넘는 도둑 감지
    • 자연어 처리 (코사인 유사도 , 자카드 유사도)
  1. 원하는 영상 다운

https://www.youtube.com/watch?v=ZEcwuJ9Pr_cwww.ssyoutube.com 해주면 다운 가능

 

2. 뷰르(vrew)를 다운 후 설치

  • 음성 분석 안함 으로 설정해주기
  • 20초 분량으로 영상 앞부분만 잘라서 생성

3. 코랩 실행해서 구글 드라이브를 마운트 시킨 뒤 yolonew 폴더 생성

 

거리사람 카운트.ipynb

Colab notebook

colab.research.google.com

4. 아래의 구글 드라이브에서 newyork.mp4 영상을 다운 받고 yolonew에 업로드

newyork.mp4 - Google Drive

 

newyork.mp4

 

drive.google.com

5. 아래 코드 실행

from google.colab import drive
drive.mount('/content/drive')
!pip install ultralytics
import cv2
from ultralytics import YOLO
import numpy as np
from google.colab.patches import cv2_imshow #코랩에서 이미지를 보여주기 위해 필요 
from collections import deque # file 입력과 출력 관련한 자료구조 (사람 카운트)

# YOLOv8 모델 불러오기
model = YOLO('yolov8n.pt') #욜로 나노 버전인데 80개의 클래스를 자동 인식 

# 비디오 캡처 초기화
cap = cv2.VideoCapture("/content/drive/MyDrive/yolonew/newyork.mp4")

# 비디오 저장 설정
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("/content/drive/MyDrive/yolonew/output2_with_counts.mp4", fourcc, 30.0,
                      (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))

# 카운팅 변수 초기화
total_in_count = 0  # 누적 입장 수
total_out_count = 0  # 누적 퇴장 수
detected_ids = {} #객체 id 와 좌표를 저장할 딕셔너리
next_id = 0 #새로운 객체에 부여할 고유 id
exit_buffer = 30  # ID가 삭제되기 전까지 유지되는 프레임 수
id_buffer = deque(maxlen=50)  # 최근 ID 기록용

while cap.isOpened(): #비디오가 열려있는 동안 루프를 반복
    ret, frame = cap.read() #프레임을 하나씩 읽어오기 ret은 읽기 성공여부
    if not ret: #프레임이 없으면 루프를 중단 
        break

    # 객체 탐지 수행
    results = model(frame)

    current_ids = set()  # 현재 프레임에서 감지된 ID를 저장할 집합

    for det in results[0].boxes: #감지된 객체 각각에 대해 반복 처리 하기 
        x1, y1, x2, y2 = map(int, det.xyxy[0])  # 박스 좌표 <- 도둑 잡아내는 모델에서는 굉장히 중요한 파트
        conf = det.conf[0].item()  # 박스에 있는 물체가 사람일 확률에 대한 신뢰도
        cls = int(det.cls[0].item())  # 클래스

        if cls == 0 and conf > 0.5:  # 클래스 0은 사람, 이걸 조절하면 사람이라고 카운트 하는 것을 늘릴 수 있음 

            # 중심 좌표 계산
            center_x = int((x1 + x2) / 2)
            center_y = int((y1 + y2) / 2)

            # ID 생성 및 관리
            object_id = None #객체 id를 초기화 
            #같은 사람이 걸어다녀도 같은 사람임을 확인하는 코드 
            for id, (prev_x, prev_y, frames) in detected_ids.items():
                if abs(prev_x - center_x) < 50 and abs(prev_y - center_y) < 50:
                    object_id = id
                    detected_ids[id] = (center_x, center_y, exit_buffer)  # 프레임 수 초기화
                    break

            if object_id is None: # 다시 새로운 사람이면 
                object_id = next_id
                detected_ids[object_id] = (center_x, center_y, exit_buffer)
                next_id += 1 # 기존 객체 번호에 1을 더해서 객체 번호 부여 
                total_in_count += 1  # 새 ID 감지 시 입장으로 간주

            current_ids.add(object_id)  # 현재 프레임에 감지된 ID 추가

            # 경계 상자와 ID 표시
            cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
            cv2.putText(frame, f'ID: {object_id}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    # 이전 프레임에서 존재했지만 현재 프레임에 없는 ID의 프레임 수 감소
    # 특정 사람이 다른 물체에 가려졌을 때도 계속 같은 사람임을 나타내기 위한 코드 
    for id in list(detected_ids.keys()):
        if id not in current_ids:
            prev_x, prev_y, frames = detected_ids[id]
            if frames > 0:
                detected_ids[id] = (prev_x, prev_y, frames - 1)
            else:
                del detected_ids[id]
                total_out_count += 1  # ID가 사라진 경우 퇴장으로 간주

    # 누적 카운트 표시
    cv2.putText(frame, f'Total In: {total_in_count}', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.putText(frame, f'Total Out: {total_out_count}', (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 비디오에 현재 프레임 저장
    out.write(frame)

    # Colab 환경에서 현재 프레임 표시
    #cv2_imshow(frame)

    if cv2.waitKey(1) & 0xFF == ord('q'): #키보드 q 를 누르면 멈추게  하는 코드 
        break

# 모든 작업 완료 후 자원 해제
cap.release()
out.release()
cv2.destroyAllWindows()

 

문제1. 앞에서 개인적으로 만들었던 영상 또는 지금 다시 만들 영상을 가지고 인원수를 제대로 카운트하는지 확인하기
from google.colab import drive
drive.mount('/content/drive')​
!pip install ultralytics
import cv2
from ultralytics import YOLO
import numpy as np
from google.colab.patches import cv2_imshow #코랩에서 이미지를 보여주기 위해 필요 
from collections import deque # file 입력과 출력 관련한 자료구조 (사람 카운트)

# YOLOv8 모델 불러오기
model = YOLO('yolov8n.pt') #욜로 나노 버전인데 80개의 클래스를 자동 인식 

# 비디오 캡처 초기화
cap = cv2.VideoCapture("/content/drive/MyDrive/yolonew/videoplayback_exported.mp4")

# 비디오 저장 설정
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter("/content/drive/MyDrive/yolonew/videoplayback_exported_output.mp4", fourcc, 30.0,
                      (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))))

# 카운팅 변수 초기화
total_in_count = 0  # 누적 입장 수
total_out_count = 0  # 누적 퇴장 수
detected_ids = {} #객체 id 와 좌표를 저장할 딕셔너리
next_id = 0 #새로운 객체에 부여할 고유 id
exit_buffer = 30  # ID가 삭제되기 전까지 유지되는 프레임 수
id_buffer = deque(maxlen=50)  # 최근 ID 기록용

while cap.isOpened(): #비디오가 열려있는 동안 루프를 반복
    ret, frame = cap.read() #프레임을 하나씩 읽어오기 ret은 읽기 성공여부
    if not ret: #프레임이 없으면 루프를 중단 
        break

    # 객체 탐지 수행
    results = model(frame)

    current_ids = set()  # 현재 프레임에서 감지된 ID를 저장할 집합

    for det in results[0].boxes: #감지된 객체 각각에 대해 반복 처리 하기 
        x1, y1, x2, y2 = map(int, det.xyxy[0])  # 박스 좌표 <- 도둑 잡아내는 모델에서는 굉장히 중요한 파트
        conf = det.conf[0].item()  # 박스에 있는 물체가 사람일 확률에 대한 신뢰도
        cls = int(det.cls[0].item())  # 클래스

        if cls == 0 and conf > 0.5:  # 클래스 0은 사람, 이걸 조절하면 사람이라고 카운트 하는 것을 늘릴 수 있음 

            # 중심 좌표 계산
            center_x = int((x1 + x2) / 2)
            center_y = int((y1 + y2) / 2)

            # ID 생성 및 관리
            object_id = None #객체 id를 초기화 
            #같은 사람이 걸어다녀도 같은 사람임을 확인하는 코드 
            for id, (prev_x, prev_y, frames) in detected_ids.items():
                if abs(prev_x - center_x) < 50 and abs(prev_y - center_y) < 50:
                    object_id = id
                    detected_ids[id] = (center_x, center_y, exit_buffer)  # 프레임 수 초기화
                    break

            if object_id is None: # 다시 새로운 사람이면 
                object_id = next_id
                detected_ids[object_id] = (center_x, center_y, exit_buffer)
                next_id += 1 # 기존 객체 번호에 1을 더해서 객체 번호 부여 
                total_in_count += 1  # 새 ID 감지 시 입장으로 간주

            current_ids.add(object_id)  # 현재 프레임에 감지된 ID 추가

            # 경계 상자와 ID 표시
            cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
            cv2.putText(frame, f'ID: {object_id}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    # 이전 프레임에서 존재했지만 현재 프레임에 없는 ID의 프레임 수 감소
    # 특정 사람이 다른 물체에 가려졌을 때도 계속 같은 사람임을 나타내기 위한 코드 
    for id in list(detected_ids.keys()):
        if id not in current_ids:
            prev_x, prev_y, frames = detected_ids[id]
            if frames > 0:
                detected_ids[id] = (prev_x, prev_y, frames - 1)
            else:
                del detected_ids[id]
                total_out_count += 1  # ID가 사라진 경우 퇴장으로 간주

    # 누적 카운트 표시
    cv2.putText(frame, f'Total In: {total_in_count}', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.putText(frame, f'Total Out: {total_out_count}', (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    # 비디오에 현재 프레임 저장
    out.write(frame)

    # Colab 환경에서 현재 프레임 표시
    #cv2_imshow(frame)

    if cv2.waitKey(1) & 0xFF == ord('q'): #키보드 q 를 누르면 멈추게  하는 코드 
        break

# 모든 작업 완료 후 자원 해제
cap.release()
out.release()
cv2.destroyAllWindows()
문제2. 이력서에 추가할 포트폴리오 깃허브 주소를 만들 깃허브를 생성하기

1. 유동인구 카운트 yolo 영상
2. 폐결절 찾는 신경망 만들기


# 포트폴리오 프로젝트 모음

이 저장소에는 다양한 YOLO 신경망 활용 파일럿 프로젝트가 포함되어 있습니다. 각 프로젝트는 실시간 객체 탐지, 추적, 분석 등을 목표로 합니다.

---

## 프로젝트 목록

### 1. 유동인구 카운트 YOLO 영상 파일럿 프로젝트
- **프로젝트 설명**: YOLO 모델을 사용하여 영상 속 유동인구를 실시간으로 감지하고, 입장 및 퇴장 수를 카운트하는 시스템.
- **주요 기능**: 사람 객체 탐지, 입장 및 퇴장 카운팅, 누적 인원 계산.
- **관련 링크**:
  - [YOLO 모델 다운로드](https://github.com/ultralytics/yolov5)
  - [OpenCV 공식 문서](https://docs.opencv.org/)
- **시연 영상**:  
[![유동인구 카운트 영상](https://github.com/oracleyu01/pilot/blob/main/sjk.jpg)](https://github.com/oracleyu01/pilot/blob/main/sjk_with_counts_vrew_exported.mp4)

---

### 2. 도둑감지 YOLO 신경망 활용 파일럿 프로젝트
- **프로젝트 설명**: 무인 감시 시스템을 위한 도둑 감지 기능. YOLO 모델을 통해 특정 위치에서의 불법 침입자를 실시간으로 탐지.
- **주요 기능**: 실시간 침입자 감지, 위험 알림, 비상 조치 기능.
- **관련 링크**:
  - [YOLO 모델 다운로드](https://github.com/ultralytics/yolov5)
  - [알림 시스템 API 문서](https://your-api-link.com/)
- **시연 영상**:  
  ![도둑 감지 영상](https://user-images.githubusercontent.com/yourusername/your-video-file2.mp4)

---

### 3. 차량 흐름 분석 파일럿 프로젝트
- **프로젝트 설명**: 도로 영상에서 차량 객체를 감지하고, 차량 흐름을 분석하여 교통 밀집도를 예측.
- **주요 기능**: 차량 객체 탐지, 밀집도 분석, 실시간 데이터 시각화.
- **관련 링크**:
  - [교통 데이터 API](https://traffic-api.com/)
- **시연 영상**:  
  ![차량 흐름 분석 영상](https://user-images.githubusercontent.com/yourusername/your-video-file3.mp4)

---

### 4. 얼굴 인식 출입 시스템 파일럿 프로젝트
- **프로젝트 설명**: YOLO와 얼굴 인식 모델을 이용한 출입 관리 시스템.
- **주요 기능**: 얼굴 인식을 통한 출입 허가, 기록 관리, 출입 로그.
- **관련 링크**:
  - [얼굴 인식 모델 다운로드](https://facerecognition-model.com/)
- **시연 영상**:  
  ![얼굴 인식 시스템 영상](https://user-images.githubusercontent.com/yourusername/your-video-file4.mp4)

---

### 5. 안전 헬멧 착용 감지 파일럿 프로젝트
- **프로젝트 설명**: 작업 현장에서 안전 헬멧 착용 여부를 감지하여 안전 규정을 준수하는지 확인.
- **주요 기능**: 헬멧 착용 감지, 안전 경고, 실시간 알림.
- **관련 링크**:
  - [헬멧 감지 데이터셋](https://helmet-dataset.com/)
- **시연 영상**:  
  ![헬멧 착용 감지 영상](https://user-images.githubusercontent.com/yourusername/your-video-file5.mp4)

---

## 설치 및 실행 방법

1. 필요한 라이브러리 설치:
   ```bash
   pip install opencv-python-headless ultralytics numpy​


commit 하면 이렇게 나옴

이부분 url을 바꿔주기

파일 업로드하기

영상과 썸네일 둘다 주소 복사하기

썸네일 / 영상 순으로 주사 바꿔주기
결과~
코랩 주소 복사해서 readme 바꿔놓기



 


  • 언어를 인식하는 신경망 생성 2가지?
    • 직접 수 많은 빅데이터의 텍스트들을 수집해서 언어모델 생성
    • 만들어진 언어 모델을 파인 튜닝 (fine tuning)해서 나만의 언어 모델 생성내가 구현하고 싶은 언어 모델을 위한 좋은 데이터를 생성하는 것이 중요함
    • 리마 같은 LLM 을 파인 튜닝함
    • 내가 던진 질문에 대해서 적절한 답을 할 수 있으려면 신경망이 학습한 질문과 얼마나 유사한지 계산하는 방법을 공부
      • 코사인 유사도
      • 자카드 유사도

언어 챗봇 만들기1. 코싸인 유사도

# 필요한 라이브러리 설치 (Colab이나 Jupyter 환경에서 실행 시 필요)
!pip install -q sentence-transformers

# 라이브러리 임포트
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer

# SentenceTransformer 모델 초기화
model = SentenceTransformer('all-MiniLM-L6-v2')

# 단어 'france'와 'french'의 임베딩 생성
embedding_a = model.encode("france").reshape(1, -1)
embedding_b = model.encode("french").reshape(1, -1)

# 코사인 유사도 계산
cosine_sim = cosine_similarity(embedding_a, embedding_b)[0][0]

# 결과 출력
print("Cosine Similarity between 'france' and 'french':", cosine_sim)

 

실습1. french 와 france 의 유사도를 구하기
# 필요한 라이브러리 설치 (Colab이나 Jupyter 환경에서 실행 시 필요)
#!pip install -q sentence-transformers #문자를 임베딩하는 클래스 

# 라이브러리 임포트
import numpy as np #배열을 다루는 수학 라이브러리
from sklearn.metrics.pairwise import cosine_similarity #코사인 유사도
from sentence_transformers import SentenceTransformer #문장을 임배딩

# SentenceTransformer 모델 초기화
model = SentenceTransformer('all-MiniLM-L6-v2') #간결하면서 높은 성능을 보이는 사전에 훈련된 언어 모델 

# 단어 'france'와 'french'의 임베딩 생성

#france 를 벡터로 변환하고 reshape로 2차원으로 변환
embedding_a = model.encode("france").reshape(1, -1)
#french 를 벡터로 변환하고 reshape로 2차원으로 변환
embedding_b = model.encode("french").reshape(1, -1)

print( embedding_a)

# 코사인 유사도 계산
cosine_sim = cosine_similarity(embedding_a, embedding_b)[0][0]

# 결과 출력
print("Cosine Similarity between 'france' and 'french':", cosine_sim)​

Cosine Similarity between 'france' and 'french': 0.74060774

오늘의 마지막 문제. 다음의 질문을 심리 상담 언어 모델에게 했을 때 적절한 답을 할 수 있도록 a 변수의 문장과 코싸인 유사도가 높은것이 b와 c 중 무엇인지 파이썬 코드로 출력하기

a = '하루 종일 우울해요' b = '남편만 보면 화가 치밀어 오르고 감정 조절이 안돼요' c = '오전에 우울하다 오후가 되면 괜찮아요'

# 필요한 라이브러리 설치 (Colab이나 Jupyter 환경에서 실행 시 필요)
#!pip install -q sentence-transformers #문자를 임베딩하는 클래스 

# 라이브러리 임포트
import numpy as np #배열을 다루는 수학 라이브러리
from sklearn.metrics.pairwise import cosine_similarity #코사인 유사도
from sentence_transformers import SentenceTransformer #문장을 임배딩

# SentenceTransformer 모델 초기화
model = SentenceTransformer('all-MiniLM-L6-v2') #간결하면서 높은 성능을 보이는 사전에 훈련된 언어 모델 

# 단어 'france'와 'french'의 임베딩 생성

#france 를 벡터로 변환하고 reshape로 2차원으로 변환
embedding_a = model.encode('하루 종일 우울해요').reshape(1, -1)
#french 를 벡터로 변환하고 reshape로 2차원으로 변환
embedding_b = model.encode('남편만 보면 화가 치밀어 오르고 감정 조절이 안돼요').reshape(1, -1)
embedding_c = model.encode('오전에 우울하다 오후가 되면 괜찮아요').reshape(1, -1)

#print( embedding_a)

# 코사인 유사도 계산
cosine_sim = cosine_similarity(embedding_a, embedding_b)[0][0]
cosine_sim2 = cosine_similarity(embedding_a, embedding_c)[0][0]

# 결과 출력
print("a와 b의 유사도", cosine_sim)
print("a와 c의 유사도", cosine_sim2)​