-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
122 additions
and
122 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,121 +1,121 @@ | ||
import cv2 | ||
import torch | ||
import os | ||
from facenet_pytorch import MTCNN, InceptionResnetV1 | ||
import torchvision.transforms as transforms | ||
|
||
def mosaic(video_path, image_paths): | ||
# YOLOv5 모델 로드 | ||
# model = torch.hub.load('./pytorch/yolov5', 'custom', path='./pytorch/best.pt', source='local') | ||
model = torch.hub.load('ultralytics/yolov5', 'custom', path='./pytorch/best.pt') | ||
output_video_path = os.path.join('tmp', video_path) | ||
# 특정 사람의 얼굴 이미지 로드 | ||
# person_image = face_recognition.load_image_file("goognyoo.png") | ||
# person_encoding = face_recognition.face_encodings(person_image)[0] | ||
|
||
# MTCNN과 SphereFace 모델 로드 | ||
mtcnn = MTCNN() | ||
resnet = InceptionResnetV1(pretrained='vggface2').eval() | ||
|
||
# 얼굴 인코딩을 저장할 리스트 | ||
encodings = [] | ||
|
||
# 각 이미지에서 얼굴을 인코딩하여 리스트에 추가 | ||
for image_path in image_paths: | ||
# 이미지 파일 로드 | ||
image = cv2.imread(image_path) | ||
# 얼굴 인코딩 | ||
results = model(image) | ||
|
||
# 감지된 객체 중에서 사람만 처리 | ||
for result in results.xyxy[0]: | ||
if result[5] == 0: # 클래스 인덱스가 0일 때(사람을 의미하는 클래스) | ||
x1, y1, x2, y2 = result[:4].int().tolist() | ||
# 얼굴 영역 추출 | ||
face_roi = image[y1:y2, x1:x2] | ||
|
||
# PIL 이미지로 변환 | ||
face_image = transforms.ToPILImage()(face_roi) | ||
|
||
face_image_tensor = transforms.ToTensor()(face_image) | ||
|
||
# 얼굴 인코딩 | ||
encoding = resnet(face_image_tensor.unsqueeze(0)) | ||
#encodings.append(encoding.detach().numpy()) | ||
encodings.append(encoding) | ||
|
||
# 모자이크 처리할 사이즈 정의 | ||
block_size = 10 | ||
|
||
# 동영상 파일 열기 | ||
cap = cv2.VideoCapture(video_path) | ||
|
||
# 결과 동영상 파일 생성 | ||
fps = int(cap.get(cv2.CAP_PROP_FPS)) | ||
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | ||
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | ||
out = cv2.VideoWriter(output_video_path, cv2.VideoWriter.fourcc(*'mp4v'), fps, (frame_width, frame_height)) | ||
|
||
# 동영상 프레임마다 처리 | ||
while cap.isOpened(): | ||
ret, frame = cap.read() | ||
if not ret: | ||
break | ||
|
||
# YOLOv5를 사용하여 객체 감지 | ||
results = model(frame) | ||
|
||
threshold = 0.6 | ||
|
||
# 감지된 얼굴에 모자이크 처리 | ||
for result in results.xyxy[0]: | ||
if result[5] == 0: # 클래스 인덱스가 0일 때(사람 얼굴을 의미하는 클래스) | ||
x1, y1, x2, y2 = result[:4].int().tolist() | ||
# 얼굴 영역 추출 | ||
face_roi = frame[y1:y2, x1:x2] | ||
|
||
# 얼굴 이미지 크기 조정 | ||
face_roi_resized = cv2.resize(face_roi, (224, 224)) | ||
|
||
# PIL 이미지로 변환 | ||
face_image = transforms.ToPILImage()(face_roi_resized) | ||
|
||
# PIL 이미지를 Tensor로 변환 | ||
face_image_tensor = transforms.ToTensor()(face_image) | ||
|
||
# 얼굴 인코딩 | ||
encoding = resnet(face_image_tensor.unsqueeze(0)) | ||
#encoding_np = encoding.detach().numpy() | ||
|
||
# 특정 사람과의 얼굴 일치 여부 확인 | ||
match = False | ||
for enc in encodings: | ||
# 각 얼굴의 특징 벡터를 비교하여 유사성 판단 | ||
similarity = torch.nn.functional.cosine_similarity(encoding, enc, dim=1) | ||
if similarity > threshold: # 유사성이 임계값보다 크면 얼굴이 일치한다고 판단 | ||
match = True | ||
break | ||
|
||
if match: # 특정 사람과 일치하지 않는 경우에만 모자이크 처리 | ||
# 얼굴 영역에 모자이크 처리 | ||
continue | ||
|
||
blurred_face = cv2.resize(face_roi, (block_size, block_size)) | ||
blurred_face = cv2.resize(blurred_face, (x2 - x1, y2 - y1), interpolation=cv2.INTER_AREA) | ||
frame[y1:y2, x1:x2] = blurred_face | ||
|
||
# 모자이크 처리된 프레임 결과 동영상에 추가 | ||
out.write(frame) | ||
|
||
# 종료 | ||
cap.release() | ||
out.release() | ||
cv2.destroyAllWindows() | ||
|
||
return output_video_path | ||
|
||
# if __name__ == "__main__": | ||
# import sys | ||
# video_path = sys.argv[1] | ||
# image_paths = ["train/Gongyoo/img.png", "train/Gongyoo/img_1.png", "train/Gongyoo/goognyoo.png", "train/Gongyoo/gongyoo2.jpg", "train/Gongyoo/img_2.png"] | ||
# mosaic(video_path, image_paths) | ||
# import cv2 | ||
# import torch | ||
# import os | ||
# from facenet_pytorch import MTCNN, InceptionResnetV1 | ||
# import torchvision.transforms as transforms | ||
# | ||
# def mosaic(video_path, image_paths): | ||
# # YOLOv5 모델 로드 | ||
# # model = torch.hub.load('./pytorch/yolov5', 'custom', path='./pytorch/best.pt', source='local') | ||
# model = torch.hub.load('ultralytics/yolov5', 'custom', path='./pytorch/best.pt') | ||
# output_video_path = os.path.join('tmp', video_path) | ||
# # 특정 사람의 얼굴 이미지 로드 | ||
# # person_image = face_recognition.load_image_file("goognyoo.png") | ||
# # person_encoding = face_recognition.face_encodings(person_image)[0] | ||
# | ||
# # MTCNN과 SphereFace 모델 로드 | ||
# mtcnn = MTCNN() | ||
# resnet = InceptionResnetV1(pretrained='vggface2').eval() | ||
# | ||
# # 얼굴 인코딩을 저장할 리스트 | ||
# encodings = [] | ||
# | ||
# # 각 이미지에서 얼굴을 인코딩하여 리스트에 추가 | ||
# for image_path in image_paths: | ||
# # 이미지 파일 로드 | ||
# image = cv2.imread(image_path) | ||
# # 얼굴 인코딩 | ||
# results = model(image) | ||
# | ||
# # 감지된 객체 중에서 사람만 처리 | ||
# for result in results.xyxy[0]: | ||
# if result[5] == 0: # 클래스 인덱스가 0일 때(사람을 의미하는 클래스) | ||
# x1, y1, x2, y2 = result[:4].int().tolist() | ||
# # 얼굴 영역 추출 | ||
# face_roi = image[y1:y2, x1:x2] | ||
# | ||
# # PIL 이미지로 변환 | ||
# face_image = transforms.ToPILImage()(face_roi) | ||
# | ||
# face_image_tensor = transforms.ToTensor()(face_image) | ||
# | ||
# # 얼굴 인코딩 | ||
# encoding = resnet(face_image_tensor.unsqueeze(0)) | ||
# #encodings.append(encoding.detach().numpy()) | ||
# encodings.append(encoding) | ||
# | ||
# # 모자이크 처리할 사이즈 정의 | ||
# block_size = 10 | ||
# | ||
# # 동영상 파일 열기 | ||
# cap = cv2.VideoCapture(video_path) | ||
# | ||
# # 결과 동영상 파일 생성 | ||
# fps = int(cap.get(cv2.CAP_PROP_FPS)) | ||
# frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) | ||
# frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) | ||
# out = cv2.VideoWriter(output_video_path, cv2.VideoWriter.fourcc(*'mp4v'), fps, (frame_width, frame_height)) | ||
# | ||
# # 동영상 프레임마다 처리 | ||
# while cap.isOpened(): | ||
# ret, frame = cap.read() | ||
# if not ret: | ||
# break | ||
# | ||
# # YOLOv5를 사용하여 객체 감지 | ||
# results = model(frame) | ||
# | ||
# threshold = 0.6 | ||
# | ||
# # 감지된 얼굴에 모자이크 처리 | ||
# for result in results.xyxy[0]: | ||
# if result[5] == 0: # 클래스 인덱스가 0일 때(사람 얼굴을 의미하는 클래스) | ||
# x1, y1, x2, y2 = result[:4].int().tolist() | ||
# # 얼굴 영역 추출 | ||
# face_roi = frame[y1:y2, x1:x2] | ||
# | ||
# # 얼굴 이미지 크기 조정 | ||
# face_roi_resized = cv2.resize(face_roi, (224, 224)) | ||
# | ||
# # PIL 이미지로 변환 | ||
# face_image = transforms.ToPILImage()(face_roi_resized) | ||
# | ||
# # PIL 이미지를 Tensor로 변환 | ||
# face_image_tensor = transforms.ToTensor()(face_image) | ||
# | ||
# # 얼굴 인코딩 | ||
# encoding = resnet(face_image_tensor.unsqueeze(0)) | ||
# #encoding_np = encoding.detach().numpy() | ||
# | ||
# # 특정 사람과의 얼굴 일치 여부 확인 | ||
# match = False | ||
# for enc in encodings: | ||
# # 각 얼굴의 특징 벡터를 비교하여 유사성 판단 | ||
# similarity = torch.nn.functional.cosine_similarity(encoding, enc, dim=1) | ||
# if similarity > threshold: # 유사성이 임계값보다 크면 얼굴이 일치한다고 판단 | ||
# match = True | ||
# break | ||
# | ||
# if match: # 특정 사람과 일치하지 않는 경우에만 모자이크 처리 | ||
# # 얼굴 영역에 모자이크 처리 | ||
# continue | ||
# | ||
# blurred_face = cv2.resize(face_roi, (block_size, block_size)) | ||
# blurred_face = cv2.resize(blurred_face, (x2 - x1, y2 - y1), interpolation=cv2.INTER_AREA) | ||
# frame[y1:y2, x1:x2] = blurred_face | ||
# | ||
# # 모자이크 처리된 프레임 결과 동영상에 추가 | ||
# out.write(frame) | ||
# | ||
# # 종료 | ||
# cap.release() | ||
# out.release() | ||
# cv2.destroyAllWindows() | ||
# | ||
# return output_video_path | ||
# | ||
# # if __name__ == "__main__": | ||
# # import sys | ||
# # video_path = sys.argv[1] | ||
# # image_paths = ["train/Gongyoo/img.png", "train/Gongyoo/img_1.png", "train/Gongyoo/goognyoo.png", "train/Gongyoo/gongyoo2.jpg", "train/Gongyoo/img_2.png"] | ||
# # mosaic(video_path, image_paths) |