만든 계기:
공부할 목적도잇고 이러한 비슷한 유형의 오픈소스도 많지만 저는 참고를 안하고 이 것을 생각하게 된 계기가 미션 임파셔블 영화를 보고 거기서 주인공 톰크루즈가 범인을 찾을때 범인 사진을 주고 그 길거리에서 범인 찾는것을 보고 아 만들어 보자 재미겟다 하고 프로젝트를 시행햇고 그결과 나름 괜찮은 모델이 만들어 졋으며, 길거리에서 나를 찾아주는것을 하고 싶지만 다른사람의 개인 정보 노출인것 같아서 해보지 못햇습니다 그렇지만 나중에 기회가 되면 한번 해보고 싶은 테스트 입니다
첫번째로는 제 얼굴 데이터를 가져오는게 첫번쨰 엿고
그리고 두번쨰로는 제 이미지와 다른 이미지 얼굴을 비교할 이미지엿습니다
이때 제가 이미지를 가져올때 사용한 모듈은 openCV이고 이것을 활용해서 제 이미지와 유투브에 볼수잇는 사람 얼굴 이미지를 가져왓습니다
이미지를 가져왓다는 기준에서 이미지를 전처리하고 학습하는 과정입니다
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
import torchvision
import torchvision.transforms as transforms
import torchvision.utils as utils
import numpy as np
import pandas as pd
import os
import glob
from tqdm import tqdm_notebook
from PIL import Image
from torch.utils.data import TensorDataset
import cv2
이미지 파일을 저장한 파일 이름
dir_path ='image/'
이미지 파일을 가져 코드 입니다
class selfness(Dataset):
def __init__(self,path,transform =None):
self.Name = os.listdir(path)
self.files = [f"{path}/{x}"for x in self.Name]
self.path = [glob.glob(f"{x}/***.jpg")for x in self.files]
self.transform = transform
files = []
for i, className in enumerate(self.Name):
for fileName in self.path[i]:
files.append([i, className, fileName])
self.path = files
print(self.path[-2:])
files=None
def __len__(self):
return len(self.path)
def __getitem__(self,idx):
className = self.path[idx][0]
fileName = self.path[idx][2]
im = Image.open(fileName)
if self.transform:
im = self.transform(im)
return im,className
이미지를 가져오고 그 이미지를 ToTensor 화를 시켜 데이터셋으로 만듭니다
mean = [0.5, 0.5, 0.5]
std = [0.5, 0.5, 0.5]
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean, std)])
dataset = selfness(dir_path,transform=transform)
print(len(dataset))
[[1, 'train', 'image//train\\train_img98.jpg'], [1, 'train', 'image//train\\train_img99.jpg']] 5636
이 데이터 셋을 DataLoader를 통해 데이터 로드화를 시킵니다
Batsize = 100
dataloader = DataLoader(dataset=dataset,batch_size=Batsize,shuffle=True)
print(dataloader)
<torch.utils.data.dataloader.DataLoader object at 0x0000022480D08EB8>
model 만들기
class Detect(nn.Module):
def __init__(self):
super(Detect,self).__init__()
#64*64
self.layer1 = nn.Sequential(
nn.Conv2d(1,16,kernel_size=3,stride=1,padding=1),
nn.Conv2d(16,16,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(2,2),
)
#32*32
self.layer2 = nn.Sequential(
nn.Conv2d(16,32,kernel_size=3,stride=1,padding=1),
nn.Conv2d(32,32,kernel_size=3,stride=1,padding=1),
nn.Conv2d(32,32,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(32),
nn.ReLU(),
nn.MaxPool2d(2,2),
)
#16*16
self.layer3 = nn.Sequential(
nn.Conv2d(32,64,kernel_size=3,stride=1,padding=1),
nn.Conv2d(64,64,kernel_size=3,stride=1,padding=1),
nn.Conv2d(64,64,kernel_size=3,stride=1,padding=1),
nn.Conv2d(64,64,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.MaxPool2d(2,2),
)
#8*8
self.layer4 = nn.Sequential(
nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),
nn.Conv2d(128,128,kernel_size=3,stride=1,padding=1),
nn.Conv2d(128,128,kernel_size=3,stride=1,padding=1),
nn.Conv2d(128,128,kernel_size=3,stride=1,padding=1),
nn.Conv2d(128,128,kernel_size=3,stride=1,padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.MaxPool2d(2,2),
)
#4*4*128
self.fc = nn.Sequential(
nn.Linear(4*4*128,1024),
nn.ReLU(),
nn.Linear(1024,1024),
nn.ReLU(),
nn.Linear(1024,128),
nn.ReLU(),
nn.Linear(128,2),
)
def forward(self,x):
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = x.view(-1,4*4*128).squeeze(0)
output = self.fc(x)
return output
모델을 불러오고 이게 이진 분류이기떄문에 cross Entropy를 사용하엿습니다
옵티마이저는 SGD 를 사용하엿고요
Epoch = 22
correct1 =0
size = len(dataset)
for epoch in range(Epoch):
correct1 =0
for i,data in enumerate(dataloader):
model.zero_grad()
x,y = data
input = Variable(x)
labels = Variable(y)
output = model(input)
_, output_index1 = torch.max(output, 1)
loss = criterion(output,labels)
correct1 += (output_index1 == labels).sum().float()
if i %3 ==0:
print(output_index1[:10])
print(labels[:10])
print(i,output[0], loss)
loss.backward()
optimizer.step()
if correct1/size > 0.7:
torch.save(model,'result4/detect_model_%s_%s.pkl' %(epoch,(correct1/size)))
if correct1/size > 0.96: break
print('***********'*10)
print(epoch,(correct1/size))
print('***********'*10)
detect_box= { 0:'Other', 1:'me'}
import cv2
cap = cv2.VideoCapture(0)
frame_size = (int(cap.get(3)),
int(cap.get(4)))
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out1 = cv2.VideoWriter('detect(onlyme)3.mp4',fourcc,20.0,frame_size)
while True:
ret,img = cap.read()
if not ret:
break
gray1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray =gray1.copy()
faces = face_cascade.detectMultiScale(gray, 1.2, 5)
if len(faces)>=1:
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
img1 = gray[y:y+h, x:x+w+20]
img1 = cv2.resize(img1, (64, 64))
gray1 = np.array(img1).reshape(1, 1, 64, 64)
gray_Z = torch.from_numpy(gray1)
gray_Y = torch.from_numpy(np.ones(1))
gray_test = TensorDataset(gray_Z,gray_Y)
grayloader = DataLoader(dataset=gray_test, batch_size=1)
for data in grayloader:
image,_ = data
img111 = Variable(image.float())
outputs = model(img111)
key_box = int(torch.argmax(outputs))
if key_box == 1:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.putText(img, detect_box[1]+'(JONGWON)', (x,y+h), cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 255))
else:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(img, detect_box[0], (x,y+h), cv2.FONT_HERSHEY_PLAIN, 2, (255, 255, 255))
else:
pass
cv2.imshow('detect', img)
out1.write(img)
if cv2.waitKey(27) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
'이미지 처리' 카테고리의 다른 글
SRCNN 저화질 화질 고화질로 변환 (0) | 2019.03.15 |
---|---|
대학생 1학년이 이해하는 kaggle Art Images 이미지 분류 (1) | 2019.01.08 |