Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 그래프 생성 문법
- 회귀분석
- count
- 데이터분석가
- 순위출력
- difftime
- if문 작성법
- 총과 카드만들기
- loop 문
- 팀스파르타
- sqld
- 히스토그램 그리기
- merge
- 여러 데이터 검색
- %in%
- 회귀분석 알고리즘
- 데이터분석
- 상관관계
- 막대그래프
- max
- 빅데이터분석
- Sum
- 빅데이터
- 단순회귀 분석
- 정보획득량
- Dense_Rank
- 그래프시각화
- sql
- 불순도제거
- Intersect
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] 딥러닝_18. 자연어 처리 신경망을 만들기 위한 작은 세미 프로젝트 (유동인구 카운트) 본문
유동인구 카운트하는 욜로 구현
- 영상 딥러닝 프로젝트 관련 수업
- 80개의 사물을 검춯하는 욜로 모델을 불러와서 007 영상과 일반 사진 사물검출을 했음
- 얼굴 인식 신경망을 불러와서 블랙핑크 멤버중 지수를 인식하는 사물검출 신경망
- 유동인구 카운트하는 욜로 구현 (https://cafe.daum.net/oracleoracle/SpOP/314)
- 담 넘는 도둑 감지
- 자연어 처리 (코사인 유사도 , 자카드 유사도)
- 원하는 영상 다운
https://www.youtube.com/watch?v=ZEcwuJ9Pr_c ← www.ssyoutube.com 해주면 다운 가능
2. 뷰르(vrew)를 다운 후 설치
- 음성 분석 안함 으로 설정해주기
- 20초 분량으로 영상 앞부분만 잘라서 생성
3. 코랩 실행해서 구글 드라이브를 마운트 시킨 뒤 yolonew 폴더 생성
4. 아래의 구글 드라이브에서 newyork.mp4 영상을 다운 받고 yolonew에 업로드
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)