제퍼넷 로고

데이터 과학 경력을 급증시키는 세 가지 컴퓨터 비전 프로젝트!

시간

이 기사는 데이터 과학 Blogathon

대부분의 사람들은 데이터 과학 및 기계 학습을 배우기 시작할 때 데이터 과학 파이프라인의 여러 단계에서 작업할 수 있는 일부 실제 프로젝트에서 흥미로운 코드를 사용할 기회가 없으면 종종 지루해합니다. 프로젝트 수명 주기.

그래서 이 글에서는 3가지 데이터 과학 또는 기계 학습 프로젝트를 코드로 설명했습니다. 이 프로젝트는 데이터 과학 초보자와 실무자 모두에게 적합하며, 여기에서 그들은 이러한 프로젝트를 구현하고 데이터 과학 프로젝트 구현에서 손을 더럽힐 수 있습니다.

  • Pytorch와 함께 DCGAN(Deep Convolutional Generative Adversarial Networks)을 사용한 얼굴 이미지 생성
  • OpenCV, Keras 및 StreamLit을 사용하여 안면 마스크 감지기 시스템 개발 및 배포
  • Keras에서 AutoEncoder(Encoder-Decoder 네트워크) 및 U-Net 아키텍처를 사용한 이미지 노이즈 제거

첫 번째 것부터 시작하겠습니다.

Pytorch와 함께 DCGAN(Deep Convolutional Generative Adversarial Networks)을 사용한 얼굴 이미지 생성

GAN

의 아키텍처를 보여주는 그림 GAN (Generative Adversarial Network)

이미지 1 

이 프로젝트에서 우리는 훈련 Deep Convolutional Generative Adversarial 네트워크 (DCGAN) 모델 CelebFaces 속성(CelebA) 가능한 한 실제처럼 보이는 사람 얼굴의 새로운 이미지를 생성하는 데 도움이 되는 Generator Network를 얻는 것을 목표로 하는 데이터 세트입니다. 필요한 데이터 세트를 다운로드하려면 다음을 사용하십시오. 링크.

GAN 및 DCGAN 뒤에 있는 이론에 대해 알아보려면 다음을 참조하세요. 기사

간단히 말해서 GAN을 다음과 같이 정의할 수 있습니다.

GAN은 다음과 같이 이해할 수 있습니다. XNUMX인 플레이(예: 생성기 및 판별기) 각 플레이어가 해당 비용 함수를 최소화하려는 비협조적 게임.

Google Colab에 Google 드라이브 마운트

google.colab에서 드라이브 가져오기 drive.mount('/content/drive')

이 프로젝트에서 우리는 CelebFaces 속성 데이터 세트(CelebA) 이미지가 잘려서 결국 얼굴이 포함되지 않은 이미지 부분이 제거되고 그 후에 크기 조정 프로세스가 다음 크기로 발생했습니다. 64x64x3 차원 NumPy 이미지.

가공-CelebA-small zip 압축 풀기

!unzip "/content/drive/MyDrive/processed-celeba-small.zip"

데이터 디렉토리 제공

data_dir = 'processed_celeba_small/'

필요한 종속성 또는 라이브러리 가져오기

numpy를 np로 가져오기 matplotlib.pyplot을 plt로 가져오기 피클을 pkl로 가져오기 %matplotlib 인라인

CelebA 데이터 시각화

이 데이터세트에는 다음이 포함됩니다. 200,000개의 유명인 이미지 주석 또는 레이블이 있습니다. 이러한 이미지는 기본적으로 각각 3개의 색상 채널(RGB)이 있는 컬러 이미지입니다. x 및 y 차원에서 이미지는 정사각형 크기의 Tensor여야 합니다. (이미지_크기 x 이미지_크기).

! pip 설치 토치 토치 비전

필요한 Pytorch 모듈 가져오기

토치비전에서 토치 가져오기 토치비전에서 데이터셋 가져오기 변환 가져오기

데이터 로더를 사용한 배치 신경망

이제 일괄적으로 이미지에 액세스하기 위해 데이터로더.

def get_dataloader(batch_size, image_size, data_dir='processed_celeba_small/'): transform = transforms.Compose([transforms.Resize(image_size),transforms.ToTensor()]) image_dataset = dataset.ImageFolder(data_dir, transform = transform) 반환 토치 .utils.data.DataLoader(image_dataset, batch_size = batch_size, shuffle=True)

DataLoader 하이퍼파라미터

  • 합리적인 선택을 할 수 있습니다. 배치 _ 크기 자신의 매개변수를 기반으로 합니다.
  • 그러나 이미지 크기 32여야 합니다. 데이터 크기를 조정하면 더 작은 크기의 이미지(더 적은 수의 픽셀)가 모델의 더 빠른 훈련으로 이어지면서도 여전히 설득력 있는 얼굴 이미지를 생성합니다.
batch_size = 64 # 하이퍼파라미터 img_size = 32 # batch_size 및 img_size가 있는 데이터 로더 celeba_train_loader = get_dataloader(batch_size, img_size)

Tensor 이미지를 NumPy 유형으로 변환한 다음 차원을 전치하여 이미지를 표시합니다.

def imshow(img): npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) dataiter = iter(celeba_train_loader) images, _ = dataiter.next() # 플로팅 배치의 이미지 fig = plt.Figure(figsize=(20,4)) np.arange(plot_size)의 idx에 대한 plot_size=20: ax = fig.add_subplot(2, plot_size/2, idx+1, xticks=[ ], yticks=[]) imshow(이미지[idx])

출력:

출력 | 컴퓨터 비전 프로젝트

-1에서 1까지의 범위로 이미지 크기 조정(가정 – 입력 x는 0-1에서 조정됨)

이제 모델 정의를 시작하기 전에, 훈련하는 동안 사용할 -1에서 1까지의 픽셀 범위로 이미지 데이터를 확장하는 함수를 작성할 것입니다. 활성화된 쌍곡선 탄젠트 생성기의 출력이 -1에서 1 사이의 범위에 있는 픽셀 값을 포함하고 지금처럼 [-1,1] 범위에서 훈련 이미지의 크기를 조정해야 하기 때문에 이 작업을 수행합니다. 범위 0-1.

def scale(x, feature_range=(-1, 1)): min , max = feature_range x = x * (최대 - 최소) + 최소 반환 x
img = images[0] scaled_img = scale(img) print('Min: ', scaled_img.min()) # 크기가 조정된 img의 범위가 -1에서 1 사이인지 확인합니다. print('Max: ', scaled_img.max ())

모델 정의

GAN은 두 개의 적대적 네트워크로 구성되며, 판별자발전기 각각.

판별 자

판별자는 최대 풀링 레이어가 없는 컨볼루션 분류기입니다. 판별기에 대한 입력은 32x32x3 텐서 이미지이고 출력 결과는 이미지가 진짜인지 가짜인지를 나타내는 단일 값이 됩니다.

토치.nn을 nn으로 가져오기 토치.nn.기능을 F로 가져오기
def conv (in_channels, out_channels, kernel_size, stride=2, padding=1, batch_norm = True): layer =[]layers.append(nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, bias= False)) if (batch_norm): layers.append(nn.BatchNorm2d(out_channels)) 반환 nn.Sequential(*layers)
class Discriminator(nn.Module): def __init__(self, conv_dim): """ conv_dim - 첫 번째 컨볼루션 계층의 깊이 """ super(Discriminator, self).__init__() self.conv_dim =conv_dim self.conv1 = conv( 3, conv_dim, 4, batch_norm= False) # 3 conv 레이어 다음에 완전히 연결된 레이어 self.conv2 = conv (conv_dim, conv_dim*2, 4) self.conv3 = conv (conv_dim*2, conv_dim*4, 4) self.fc = nn.Linear(conv_dim*4*4*4, 1) def forward(self, x): """ x - 신경망에 대한 입력은 판별자 logits(출력) """를 반환합니다. y = F .leaky_relu(self.conv1(x), 0.2) y = F.leaky_relu(self.conv2(y), 0.2) y = F.leaky_relu(self.conv3(y), 0.2) out = y.view(-1 , self.conv_dim*4*4*4) # flattening out = self.fc(out) # 출력 레이어 반환

발전기

GAN의 이 구성 요소는 판별자의 피드백을 포함하여 가짜 데이터를 생성하고 판별자가 실제 출력을 분류하도록 돕는 방법을 학습합니다. 네트워크의 이 구성 요소는 입력을 업샘플링하고 훈련 데이터와 동일한 크기의 새 이미지를 생성하는 데 도움이 됩니다. 32x32x3. 입력은 특정 길이의 벡터입니다. z_크기 출력은 32x32x3 모양의 이미지입니다.

def deconv (in_channels, out_channels, kernel_size, stride=2, padding=1, batch_norm = True): 레이어 =[]layers.append(nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, bias= False)) if(batch_norm):layers.append(nn.BatchNorm2d(out_channels)) nn.Sequential(*layers) 반환
class Generator(nn.Module): def __init__(self, z_size, conv_dim): """ z_size - 입력 잠재 벡터의 길이 z conv_dim - 위도 전치 변환 레이어에 대한 입력 깊이 """ super(Generator, self ).__init__() self.conv_dim = conv_dim self.fc2 = nn.Linear(z_size, conv_dim*4*4*4) self.t_conv1 = deconv(conv_dim*4, conv_dim*2, 4) self.t_conv2 = deconv( conv_dim*2, conv_dim, 4) self.t_conv3 = deconv (conv_dim, 3, 4, batch_norm= False) def forward(self, x): """ x - 입력 출력 - 32x32x3 텐서 이미지 """ y = self. fc2(x) y = y.view(-1,self.conv_dim*4, 4,4) z = F.relu(self.t_conv1(y)) z = F.relu(self.t_conv2(z)) z = 토치.tanh(self.t_conv3(z)) 반환 z

무게 초기화

모델이 최대한 빨리 수렴되도록 돕기 위해 다음을 기반으로 모델의 컨볼루션 및 선형 레이어의 가중치를 초기화했습니다. 원본 DCGAN 종이, 즉 - "모든 가중치는 0.02의 표준 편차를 갖는 XNUMX 중심 정규 분포에서 초기화됩니다."

def weights_init_normal(m): """ 가중치는 N(0,0.02) 분포 m: 계층 """ classname = m.__class__.__name__ if hasattr(m, 'weight') 및 classname.find('Conv' ) 또는 classname.find('선형') != -1: m.weight.data.normal_(0.0, 0.02) m.bias.data.fill_(0)

완전한 네트워크 구축

네트워크를 구축하기 위해 모델 하이퍼파라미터를 정의하고 모델 정의 안내

# 판별자와 생성기를 인스턴스화합니다. def complete_network(d_conv_dim, g_conv_dim, z_size): D = Discriminator(d_conv_dim) G = Generator(z_size=z_size, conv_dim=g_conv_dim) D.apply(weights_init_normal) # 모델 가중치 초기화 G.apply ) print(D) print(G) return D, G

# 모델 하이퍼파라미터 d_conv_dim = 64 g_conv_dim = 64 z_size = 100 D, G = complete_network(d_conv_dim, g_conv_dim, z_size)
import torch train_on_gpu = torch.cuda.is_available() if not train_on_gpu: # 가능한 경우 GPU에서 훈련을 보장하기 위해 print('No GPU') else: print('GPU Available.Training...')

손실 계산 - 판별자 및 생성 손실

판별자 – 총 손실 = loss_real-image + loss_fake-image Discriminator의 경우 출력은 실제 이미지의 경우 1이고 가짜 이미지의 경우 0입니다. Generator Loss는 판별자가 실제 이미지를 생성하도록 합니다.

def real_loss(D_out): ''' D_out - 판별자 로지트 출력 실수 손실 ''' batch_size = D_out.size(0) labels = torch.ones(batch_size)*0.9 # train_on_gpu:labels = labels.cuda인 경우 단면 레이블 평활화 () criteria = nn.BCEWithLogitsLoss() # 로짓이 있는 이진 교차 엔트로피 loss loss = criteria(D_out.squeeze(), labels) # 손실 계산 return loss def fake_loss(D_out): ''' D_out: 판별자 로짓 출력 - 가짜 loss ''' batch_size = D_out.size(0) 레이블 = torch.zeros(batch_size) # 가짜 레이블 = 0 if train_on_gpu: 레이블 = labels.cuda() 기준 = nn.BCEWithLogitsLoss() 손실 = 기준(D_out.squeeze() ), 레이블) # 손실 계산 반환 손실

import torch.optim as optim # params lr_d = 0.0002 lr_g = 0.0002 beta1= 0.5 beta2=0.999 #default # Adam Optimizer 사용 d_optimizer = optim.Adam(D.parameters(), lr_d, [beta1, beta2]) g_optimizer 아담(G.parameters(), lr_g, [베타1, 베타2])

모델 훈련

훈련하는 동안 우리는 b/w 판별자와 생성자를 교대로 사용합니다. 여기서 우리가 사용할 진짜 손실 가짜 손실 Discriminator와 Generator의 손실을 계산하는 함수.

  • 첫째, 사람 얼굴의 실제 이미지와 가짜 이미지를 번갈아 가며 판별자를 훈련합니다.
  • 그런 다음 생성기 구성 요소는 판별자를 속이려고 시도하고 반대 손실 함수를 가져야 합니다.
def train(D, G, n_epochs, print_every=50): ''' D - 판별자 네트워크 G - 생성자 네트워크 n_epochs - 에포크 수 print_every - 모델을 인쇄하고 기록하는 간격 손실 출력 - D 및 G 손실 '' ' if train_on_gpu: D.cuda() G.cuda() # 손실 및 생성된 "가짜" 샘플 손실 = [] 샘플 = [] # 샘플링을 위한 데이터는 고정됨 - 훈련 내내 일정함 # 모델의 성능 검사에도 도움 sample_size=16 fixed_z = np.random.uniform(-1, 1, size=(sample_size, z_size)) fixed_z = torch.from_numpy(fixed_z).float() if train_on_gpu: fixed_z = fixed_z.cuda() 범위 내 epoch (n_epochs): # 배치_i에 대한 신기원, (real_images, _) in enumerate(celeba_train_loader): # 배치 트레인 루프 batch_size = real_images.size(0) real_images = scale(real_images) if train_on_gpu: real_images = real_images.cuda() d_optimizer. zero_grad() if train_on_gpu: real_images = real_images.cuda() out_real = D(real_images) d_loss_real = real_loss(out_real) z = np.random.uniform(-1, 1, size=(batch) _size, z_size)) z = torch.from_numpy(z).float() if train_on_gpu: z = z.cuda() fake_out =G(z) out_fake = D(fake_out) d_loss_fake = fake_loss(out_fake) d_loss = d_loss_real + d_ d_loss.backward() d_optimizer.step() g_optimizer.zero_grad() z = np.random.uniform(-1, 1, size=(batch_size, z_size)) z = torch.from_numpy(z).float() if train_on_gpu : z = z.cuda() fake_out_g = G(z) G_D_out = D(fake_out_g) g_loss = real_loss(G_D_out) g_loss.backward() g_optimizer.step() if (batch_i % print_every == 0):loss.append( (d_loss.item(), g_loss.item())) # D 및 G 추가 loss # 통계 출력 print('Epoch [{:5d}/{:5d}] | d_loss: {:6.4f} | g_loss: {:6.4f}'.format(epoch+1, n_epochs, d_loss.item(), g_loss.item()) G.eval() # 샘플 생성 samples_z = G(fixed_z) samples.append(samples_z) G.train() with open('train_samples.pkl', 'wb') as f: #pkl file pkl.dump(samples, f) 반환 손실

n_epochs = 30 # Epoch 손실 수 = train(D, G, n_epochs=n_epochs) #훈련

각 에포크 후 판별자 및 생성자 손실 플로팅

fig, ax = plt.subplots() 손실 = np.array(losses) plt.plot(losses.T[0], label='Discriminator') plt.plot(losses.T[1], label='Generator' ) plt.title("열차 손실") plt.legend()

출력:

손실 플롯 | 컴퓨터 비전 프로젝트

훈련에서 샘플 생성

# 샘플에서 전달된 목록 보기 def view_samples(epoch, samples): fig, axes = plt.subplots(figsize=(20,4), nrows=2, ncols=8, sharex=True,sharey=True) for ax, zip(axes.flatten(), samples[epoch])의 img: img = img.detach().cpu().numpy() img = np.transpose(img, (1, 2, 0)) img = ( (img + 1)*255 / (2)).astype(np.uint8) ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) im = ax.imshow(img.reshape((32,32,3, 삼)))
f로 open('train_samples.pkl', 'rb') 사용: samples = pkl.load(f) v_s = view_samples(-1, samples)

출력:

출력 | 컴퓨터 비전 프로젝트

결론

출력을 보면 우리 모델이 가능한 한 사실적으로 보이는 가짜 인간 얼굴의 새로운 이미지를 생성할 수 있음을 관찰할 수 있습니다. 또한 모든 이미지는 음영이 더 밝고 갈색 얼굴도 약간 더 밝습니다. 그 이유는 셀레바 데이터 세트는 대부분 흰색인 "연예인" 얼굴로 구성되어 있기 때문에 다소 편향되어 있습니다. 마지막으로 DCGAN 모델은 단순한 노이즈로부터 거의 실제 이미지를 성공적으로 생성합니다.

당신은 또한 확인할 수 있습니다 내 Github 레포 이 프로젝트에 대해서도.

👇 두 번째 프로젝트로 이동합니다.

OpenCV, Keras 및 StreamLit을 사용하여 안면 마스크 감지기 시스템 개발 및 배포

요약 : COVID-19 위기에서 우리는 마스크 착용이 공중 보건과 전염병의 확산을 통제하기 위해 절대적으로 필요함을 보았습니다. 기계 학습 학생으로서 주변 사람들이 이러한 안전 조치를 준수하는지 여부를 모니터링할 수 있는 시스템을 만들면 어떨까요? 그래서 이 프로젝트에서 우리는 사람이 마스크를 쓰고 있는지 여부를 감지하는 안면 마스크 감지기 시스템을 만들려고 노력할 것이며 이 모델을 웹 앱 형태로 배포하여 프로덕션에서도 사용할 수 있도록 할 것입니다. .

AI를 이용한 안면 마스크 감지 시스템 | 컴퓨터 비전 프로젝트

                                                            이미지 2 

모델 아키텍처 및 교육

이 프로젝트에서 내가 사용한 전학 학습, 그 매우 간단한 작업입니다. 여기서 내가 사용한 모바일넷V2 내 분류기 네트워크를 구축하기 위한 모델입니다.

Transfer Learning을 사용하여 사전 훈련된 MobileNetV2의 기능 감지 기능을 사용하고 이를 다소 단순한 모델에 적용하고 있습니다. MobileNetV2 다음에는 DNN이 다음과 같은 레이어로 구성됩니다. GlobalAveragePooling, 밀집,탈락. 우리의 것은 이진 분류 문제이므로 최종 레이어에는 2개의 뉴런과 소프트맥스 활성화가 있습니다.

또한, 나는 사용의 일반적인 아이디어를 따릅니다 아담 옵티마이저 와 함께 categorical_crossentropy 옵티마이저와 손실 함수의 조합이 내 네트워크에 가장 최적화된 가중치로 수렴되기 때문에 loss가 잘 작동합니다.

필요한 패키지 가져오기

tensorflow.keras.preprocessing.image에서 ImageDataGenerator 가져오기 tensorflow.keras.layers에서 MobileNetV2 가져오기 tensorflow.keras.layers에서 AveragePooling2D 가져오기 tensorflow.keras.layers에서 Dropout 가져오기 tensorflow.keras.layers에서 Flatten 가져오기 Dense tensorflow.keras.layers에서 가져오기 tensorflow.keras.models에서 입력 가져오기 tensorflow.keras.optimizers에서 모델 가져오기 tensorflow.keras.applications.mobilenet_v2에서 Adam 가져오기 tensorflow.keras.preprocessing.image에서 preprocess_input 가져오기 tensorflow.keras.preprocessing에서 img_to_array 가져오기 .image import load_img from tensorflow.keras.utils import to_categorical from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from imutils 가져오기 경로 import matplotlib.pyplot as plt import numpy as importnp import osarg

인수 파서를 구성하고 인수를 구문 분석합니다.

ap = argparse.ArgumentParser() ap.add_argument("-d", "--dataset", required=True, help="입력 데이터 세트 경로") ap.add_argument("-p", "--plot", type=str, default="plot.png", help="출력 손실/정확도 플롯 경로") ap.add_argument("-m", "--model", type=str, default="mask_detector.model" , help="안면 마스크 감지기 모델을 출력하는 경로") args = vars(ap.parse_args())

Learning Rate, Epoch 수, Batch Size 값 초기화

INIT_LR = 1e-4 EPOCHS = 20 BS = 32

데이터 및 클래스 이미지 목록을 초기화하기 위해 데이터세트 디렉토리에서 이미지 목록을 찾습니다.

print("[INFO] 이미지 로드 중...") imagePaths = list(paths.list_images(args["dataset"])) 데이터 = [] 레이블 = []

이미지 경로를 반복합니다.

for imagePath in imagePaths: # 파일 이름에서 클래스 레이블을 가져옵니다. label = imagePath.split(os.path.sep)[-2] # 224x224 차원의 입력 이미지를 로드하고 사전 처리합니다. image = load_img(imagePath, target_size=(224) , 224)) image = img_to_array(image) image = preprocess_input(image) # 데이터 및 레이블 목록에 대한 업데이트 발생 data.append(image) labels.append(label)

데이터 및 레이블을 NumPy 배열 형식으로 변환

데이터 = np.array(데이터, dtype="float32") 레이블 = np.array(레이블)

레이블에 대한 원-핫 인코딩 수행

lb = LabelBinarizer() 레이블 = lb.fit_transform(labels) 레이블 = to_categorical(labels)

데이터의 75%를 훈련용으로 사용하고 나머지 25%를 테스트용으로 사용하여 데이터를 훈련 및 테스트 분할로 분할합니다.

(trainX, testX, trainY, testY) = train_test_split(데이터, 레이블, test_size=0.20, stratify=labels, random_state=42)

Data Augmentation을 위한 학습 이미지 생성기 구성

20월 = ImageDataGenerator(회전 범위=0.15, 확대/축소 범위=0.2, 너비_시프트_범위=0.2, 높이_시프트_범위=0.15, 전단_범위=XNUMX, 수평_플립=참, 채우기 모드="가까운")

MobileNetV2 네트워크를 로드하여 헤드 완전 연결 레이어 세트가 꺼져 있는지 확인합니다.

baseModel = MobileNetV2(weights="imagenet", include_top=False, input_tensor=Input(shape=(224, 224, 3)))

베이스 모델 위에 배치할 모델의 머리 부분을 만듭니다.

headModel = baseModel.output headModel = AveragePooling2D(pool_size=(7, 7))(headModel) headModel = Flatten(name="flatten")(headModel) headModel = Dense(128, activation="relu")(headModel) headModel = Dropout(0.5)(headModel) headModel = Dense(2, activation="softmax")(headModel)

헤드 완전 연결 모델을 기본 모델 위에 배치합니다(학습할 실제 모델이 됨).

모델 = 모델(입력=baseModel.input, 출력=headModel)

기본 모델의 모든 레이어를 탐색하고 첫 번째 교육 프로세스 중에 업데이트되지 않도록 고정합니다.

baseModel.layers의 레이어: layer.trainable = False

모델 편집

print("[INFO] 컴파일링 모델...") opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS) model.compile(loss="binary_crossentropy", optimizer=opt, metrics=["정확도"])

네트워크 책임자 교육

print("[INFO] 트레이닝 헤드...") H = model.fit( aug.flow(trainX, trainY, batch_size=BS), steps_per_epoch=len(trainX) // BS, validation_data=(testX, testY), validation_steps=len(testX) // BS, epochs=EPOCHS)

테스트 세트에 대한 예측

print("[INFO] 네트워크 평가 중...") predIdxs = model.predict(testX, batch_size=BS)

테스트 세트의 각 이미지에 대해 해당 확률의 가장 큰 예측 값이 있는 레이블의 인덱스를 찾으려고 시도합니다.

predIdxs = np.argmax(predIdxs, 축=1)

분류 보고서 인쇄

print(classification_report(testY.argmax(axis=1), predIdxs, target_names=lb.classes_))

출력:

대체 텍스트

모델을 디스크로 직렬화

print("[INFO] 마스크 감지기 모델 저장 중...") model.save(args["model"], save_format="h5")

훈련 손실 및 정확도 플로팅

N = EPOCHS plt.style.use("ggplot") plt.Figure() plt.plot(np.arange(0, N), H.history["손실"], label="train_loss") plt.plot( np.arange(0, N), H.history["val_loss"], label="val_loss") plt.plot(np.arange(0, N), H.history["정확도"], label="train_acc ") plt.plot(np.arange(0, N), H.history["val_accuracy"], label="val_acc") plt.title("훈련 손실 및 정확도") plt.xlabel("시대 번호") plt.ylabel("손실/정확도") plt.legend(loc="왼쪽 하단") plt.savefig(인수["플롯"])

출력:

줄거리.png | 컴퓨터 비전 프로젝트

일부 테스트 이미지에 대한 출력

이제 이 섹션에서는 이미지를 안면 마스크 감지기 시스템에 입력으로 전달한 후 어떤 유형의 출력을 얻는지 설명하겠습니다.

산출

결론

만세, 우리는 약 99%의 정확도로 안면 마스크 감지기 시스템을 성공적으로 🥳 구축했습니다. 이 모델에 대한 웹 응용 프로그램도 만들었습니다. 내 GitHub에서 해당 코드를 직접 볼 수 있으며 사용자 측에서도 앱을 만들어 프로덕션 환경에서 사용할 수 있습니다.

당신은 또한 확인할 수 있습니다 내 Github 레포 이 프로젝트에 대해서도.

세 번째이자 마지막 프로젝트인 👇

 Keras에서 AutoEncoder(Encoder-Decoder 네트워크) 및 U-Net 아키텍처를 사용한 이미지 노이즈 제거

일반적인 자동 인코더 아키텍처는 다음과 같습니다.

컴퓨터 비전용 자동 인코더 | 컴퓨터 비전 프로젝트

의 아키텍처를 보여주는 그림 오토 인코더 모델

                                             이미지 3

코드 부분으로 직접 이동하기 전에 먼저 다음을 수행하는 것이 좋습니다. 오토인코더에 대한 튜토리얼 그런 다음 이론 및 실제 지식을 더 잘 이해하기 위해 이 프로젝트를 진행합니다.

필요한 종속성 또는 라이브러리 가져오기

먼저, 이 구현에서 사용할 모든 필요한 파이썬 라이브러리 또는 모듈을 가져와야 합니다.

import numpy as np # 행렬 연산 최적화 import matplotlib.pyplot as plt # tensorflow.keras.layers에서 데이터 시각화 import Conv2D, Input, Dense, Reshape, Conv2DTranspose, Activation, BatchNormalization, ReLU, Concatenate, add, LeakyReLU from tensorflow.keras. 모델 가져오기 모델 # tensorflow.keras.callbacks에서 기능 keras 모델 가져오기 ModelCheckpoint # tensorflow.keras.datasets에서 유효성 검사 오류를 기반으로 모델 가중치를 저장하려면 import cifar100, cifar10 # 필수 데이터 세트 이 문제 설명에서 사용 from keras.optimizers import Adam # 손실 함수 최적화를 위한 Optimizer ADAM

Keras에서 직접 CIFAR-100 데이터 세트 로드

이것을 구현하기 위해 우리는 유명한 시파 -100 데이터 세트 입력으로. 이를 위해 Keras 라이브러리에서 직접 가져올 수 있으므로 데이터 세트를 다운로드할 필요가 없습니다.

# CIFAR-100 데이터셋 사용 (train_data_clean, _), (test_data_clean, _) = cifar100.load_data(label_mode='fine')

0과 1 사이의 데이터 정규화

이제 계산을 줄이기 위해 [0,1] 범위에서 데이터를 축소합니다.

# 데이터를 정규화하기 위해 모든 이미지 픽셀을 float(255) train_data_clean = train_data_clean.astype('float32') / 255로 나눕니다. test_data_clean = test_data_clean.astype('float32') / 255.

입력 이미지에 노이즈 추가

이제 노이즈가 있는 이미지를 생성하기 위해 노이즈를 추가해야 합니다. 노이즈를 추가하기 위해 정규 분포를 사용하여 [0,1] 사이의 임의 값을 가진 이미지의 동일한 차원으로 배열을 생성할 수 있습니다. 평균 = 0표준 편차 = 1.

정규 분포를 생성하기 위해 다음을 사용할 수 있습니다. np.random.normal(loc, scale, size). 그런 다음 노이즈를 몇 가지 요소로 조정합니다. 여기에서 사용하고 있습니다. 0.5. 노이즈를 추가한 후 픽셀 값이 범위를 벗어날 수 있으므로 다음을 사용하여 값을 잘라야 합니다. np.clip(arr, arr_min, arr_max).

# 이미지에 노이즈를 추가하고 0과 1 사이의 픽셀 값을 자르는 함수 def add_noise_and_clip_data(data, noise_factor): noise = np.random.normal(loc=0.0, scale=0.1, size=data.shape) data = data + noise_factor * 노이즈 데이터 = np.clip(data, 0., 1.) 반환 데이터 train_data_noisy = add_noise_and_clip_data(train_data_clean, 0.5) test_data_noisy = add_noise_and_clip_data(test_data_clean, 0.5)

노이즈가 있는 이미지로 몇 개의 훈련 이미지 시각화

훈련 데이터가 해당 노이즈 이미지와 함께 어떻게 보이는지 봅시다.

행 = 2 # 번호를 정의합니다. 그림의 행 수 cols = 8 # 번호를 정의합니다. 그림의 열 수 f = plt.Figure(figsize=(2*cols,2*rows*2)) # i in range(rows): for j in range(cols): f.add_subplot(rows* 2,cols, (2*i*cols)+(j+1)) # 각 반복에서 Figure에 서브플롯 추가 plt.imshow(train_data_noisy[i*cols + j]) plt.axis("off") for j in range(cols): f.add_subplot(rows*2,cols,((2*i+1)*cols)+(j+1)) # 각 반복에서 Figure에 subplot 추가 plt.imshow(train_data_clean[i*cols + j]) plt.axis("off") f.suptitle("샘플 교육 데이터", fontsize=20) plt.show()

출력:

샘플 훈련 데이터 | 컴퓨터 비전 프로젝트

간단한 CNN 아키텍처 정의

여기에서 우리는 두 가지 기능을 정의합니다. 하나는 convolution 연산을 위한 것이고 다른 하나는 deconvolution 연산을 위해 우리의 맞춤형 autoencoder 모델에 인코더와 디코더 블록을 포함합니다.

# 모델 아키텍처에 컨볼루션 레이어를 포함하는 함수 def conv_block(x, filters, kernel_size, strides=2): x = Conv2D(filters=filters, kernel_size=kernel_size, strides=strides, padding='same')(x) x = BatchNormalization()(x) x = ReLU()(x) return x # 모델 아키텍처에 디컨볼루션 계층을 포함하는 함수 def deconv_block(x, filters, kernel_size): x = Conv2DTranspose(filters=filters, kernel_size =kernel_size, strides=2, padding='same')(x) x = BatchNormalization()(x) x = ReLU()(x) 반환 x

모델에 이미지 노이즈 제거 기능 부여

이제 이 함수가 입력으로 제공하는 이미지를 노이즈 제거하고 이것이 주어진 문제 설명의 주요 목적이기 때문에 문제 설명의 핵심인 주 기능을 정의합니다.

def denoising_autoencoder(): den_inputs = Input(shape=(32, 32, 3), name='dae_input') conv_block1 = conv_block(den_inputs, 32, 3) conv_block2 = conv_block(conv_block1, 64, conv 3) conv_block3 , 2, 128) conv_block3 = conv_block(conv_block4, 3, 256) conv_block3 = conv_block(conv_block5, 4, 256, 3) deconv_block1 = deconv_block(conv_block1, 5, 256) de_conv_block3 = Concatenate()][) = deconv_block(merge1, 1, 3) merge2 = 연결()([deconv_block1, conv_block128]) deconv_block3 = deconv_block(merge2, 2, 2) merge3 = 연결()([deconv_block2, conv_block64]) deconv_block3m = deconv_block3 , 3) final_deconv = Conv1DTranspose(filters=4, kernel_size=3, padding='same')(deconv_block32) den_outputs = Activation('sigmoid', name='dae_output')(final_deconv) return Model(den_inputs, den_outputs, name= '대')

함수 호출, 모델 컴파일 및 훈련

파이썬에서, 함수 생성 후, 우리는 주어진 일부 지정된 매개변수를 사용하여 해당 함수의 객체를 생성하여 이 함수를 호출해야 합니다. 그런 다음, 우리는 모델을 컴파일하고 훈련합니다. 여기에서 다음과 같은 하이퍼파라미터를 선택할 수 있습니다. 신기원, 배치 크기, 등.

dae = denoising_autoencoder() # 함수 호출 dae.compile(loss='mse', optimizer='adam') # Model Compilation checkpoint = ModelCheckpoint('best_model.h5', verbose=1, save_best_only=True, save_weights_only=True) # 최고의 가중치 저장 # 모델 훈련 또는 피팅 dae.fit(train_data_noisy, train_data_clean, validation_data=(test_data_noisy, test_data_clean), epochs=5, batch_size=128, callbacks=[checkpoint])

위에서 훈련된 모델을 사용하여 모델 가중치를 저장하고 노이즈가 제거된 이미지를 예측합니다.

여기에서 h5 파일에 저장된 최상의 가중치를 로드하고 해당 가중치를 사용하여 테스트 데이터 세트의 출력을 예측합니다.

dae.load_weights('best_model.h5') # 이전 섹션에서 저장한 가중치를 로드합니다. test_data_denoised = dae.predict(test_data_noisy) # 훈련된 최상의 가중치 모델을 사용하여 출력 이미지를 예측합니다.

이미지의 원본, 노이즈 및 노이즈 제거 버전 인쇄

idx = 4 plt.subplot(1,3,1) plt.imshow(test_data_clean[idx]) plt.title('원본') plt.subplot(1,3,2) plt.imshow(test_data_noisy[idx]) plt .title('잡음') plt.subplot(1,3,3) plt.imshow(test_data_denoised[idx]) plt.title('잡음 제거') plt.show()

출력:

출력 | 컴퓨터 비전 프로젝트

MSE를 사용하여 모델 평가

이제 두 이미지의 차이를 계산하는 함수를 정의합니다. 여기서 우리는 평균 제곱 오차를 손실 함수로 사용합니다.

def mse(image_1, image_2): return np.square(np.subtract(image_1, image_2)).mean() noise_clean_mse = mse(test_data_clean, test_data_noisy) # 초기 테스트 데이터와 잡음 테스트 데이터 간의 MSE denoised_clean_mse = mseclean(test_data_denoised) # noise_clean_mse, denoised_clean_mse 모델에 의해 주어진 노이즈와 정리된 테스트 데이터 사이의 MSE # MSE 값 모두 인쇄

CIFAR10 데이터 세트에서 DAE 테스트

이제 모델 교육이 완료되면 모델을 테스트할 차례입니다.

정리된 이미지와 해당 이미지를 비교하려는 입력 간의 손실을 찾습니다.

clean_noisy = mse(cifar10_test, cifar10_test_noisy) clean_denoised = mse(cifar10_test, cifar10_test_denoised) clean_noisy, clean_denoised print("두 이미지의 차이점은 다음과 같습니다.", clean_noisy-clean_denoised)

이제 건너뛰기 연결(즉, U-Net 아키텍처)이 있는 인코더-디코더 네트워크를 설계해 보겠습니다.

스킵 연결은 컨볼루션과 디컨볼루션 작업이 모두 수행되는 네트워크에서 작업하는 동안 매우 중요한 역할을 합니다. 컨볼루션 및 디컨볼루션 중에 손실될 수 있는 정보를 복원하는 데 도움이 됩니다.

U-Net 아키텍처는 다음과 같습니다.

유넷

를 보여주는 그림 유넷 아키텍처

                                     Image4 

이제 코드 부분부터 시작하겠습니다.

size = 32 channel = 3 from keras.layers import Conv2D, Input, Dense, Dropout, MaxPool2D, UpSampling2D # Autoencoder 네트워크의 Encoder 컴포넌트 입력 = Input(shape=(size,size,channel)) x = Conv2D(32, 3 , activation='relu', padding='same')(inputs) x = BatchNormalization()(x) x = MaxPool2D()(x) x = Dropout(0.5)(x) skip = Conv2D(32, 3, 패딩 ='same')(x) # 디코더에 대한 연결 건너뛰기 x = LeakyReLU()(skip) x = BatchNormalization()(x) x = MaxPool2D()(x) x = Dropout(0.5)(x) x = Conv2D( 64, 3, activation='relu', padding='same')(x) x = BatchNormalization()(x)coded = MaxPool2D()(x) # 자동 인코더 네트워크의 디코더 구성 요소 x = Conv2DTranspose(64, 3, activation='relu',strides=(2,2), padding='same')(encoded) x = BatchNormalization()(x) x = Dropout(0.5)(x) x = Conv2DTranspose(32, 3, activation= 'relu', strides=(2,2), padding='same')(x) x = BatchNormalization()(x) x = Dropout(0.5)(x) x = Conv2DTranspose(32, 3, padding='same ')(x) x = add([x,skip]) # 스킵 연결 추가 x = LeakyReLU()(x)x = BatchNormalization()(x) decoded = Conv2DTranspose(3, 3, activation='sigmoid',strides=(2,2), padding='same')(x) autoencoder = Model(inputs, decoded) # 컴파일 model autoencoder.compile(optimizer=Adam(learning_rate=0.001), loss='binary_crossentropy') # 모델 요약 분석 autoencoder.summary()

모델 훈련 또는 피팅

# epochs 및 batch_size 수를 하이퍼파라미터 epochs = 25 batch_size = 256 history = autoencoder.fit(train_data_noisy, train_data_clean, epochs=epochs, batch_size=batch_size, shuffle=True, validation_data=(test_data_noisy), test)_data로 수정합니다.

손실 대 Epoch 수 곡선 그리기

# 그림 정의 f = plt.Figure(figsize=(10,7)) f.add_subplot() # 서브플롯 추가하기 plt.plot(history.epoch, history.history['loss'], label = "loss") # 손실 훈련 집합에 대한 곡선 plt.plot(history.epoch, history.history['val_loss'], label = "val_loss") # 검증 집합에 대한 손실 곡선 plt.title("손실 곡선",fontsize=18) plt.xlabel( "Epochs", fontsize=15) plt.ylabel("손실", fontsize=15) plt.grid(alpha=0.3) plt.legend() plt.savefig("Loss_curve_cifar10.png") plt.show()

몇 개의 무작위 테스트 이미지 선택

# 선택할 이미지의 수 num_imgs = 48 rand = np.random.randint(1, test_data_noisy.shape[0]-48) cifar_test_images = test_data_noisy[rand:rand+num_imgs] # 슬라이싱 cifar_test_denoised =(autoencoder._ 예측하다

노이즈가 제거된 이미지로 테스트 이미지 시각화

행 = 4 # 번호를 정의합니다. 그림의 행 수 cols = 12 # 번호를 정의합니다. 그림의 열 개수 cell_size = 1.5 f = plt.Figure(figsize=(cell_size*cols,cell_size*rows*2)) # 그림 정의 f.tight_layout() for i in range(rows): for j in range(cols ): f.add_subplot(rows*2,cols, (2*i*cols)+(j+1)) # 각 반복에서 Figure에 subplot 추가 plt.imshow(test_data_clean[i*cols + j]) plt.axis ("off") for j in range(cols): f.add_subplot(rows*2,cols,((2*i+1)*cols)+(j+1)) # 각 반복에서 그림에 서브플롯 추가 plt .imshow(test_data_noisy[i*cols + j]) plt.axis("off") f.suptitle("자동 인코더 결과 - Cifar10", fontsize=18) plt.show()

이제 두 이미지의 차이를 계산하는 함수를 정의합니다. 여기서 우리는 평균 제곱 오차를 손실 함수로 사용합니다.

def mse(data_1, data_2): np.square(np.subtract(data_1, data_2)).mean()을 반환합니다. noise_clean_mse = mse(test_data_clean, test_data_noisy) denoised_clean_mse = mse(test_data_denoised, test_data_clean) noise_senoised

이미지의 노이즈 제거 버전 예측

cifar10_test_denoised = autoencoder.predict(cifar10_test_noisy)

이미지의 원본, 노이즈 및 노이즈 제거 버전 인쇄

idx = 6
plt.subplot(1,3,1)
plt.imshow(cifar10_test[idx])
plt.title('original')
plt.subplot(1,3,2)
plt.imshow(cifar10_test_noisy[idx])
plt.title('noisy')
plt.subplot(1,3,3)
plt.imshow(cifar10_test_denoised[idx])
plt.title('denoised')
plt.show()

이미지 사이의 MSE 찾기

clean_noisy = mse(cifar10_test, cifar10_test_noisy) clean_denoised = mse(cifar10_test, cifar10_test_denoised) clean_noisy, clean_denoised print("두 이미지의 차이점은 다음과 같습니다.", clean_noisy-clean_denoised)

지금은 여기까지입니다! 오토인코더를 만들 수 있습니다 😎😎. 더 많은 데이터 세트를 탐색하고 자신만의 오토인코더를 재미있게 훈련하세요.

결론

오토인코더는 강력하고 더 많은 일을 할 수 있습니다. 여기에서 2개의 간단한 모델 예제를 소개했으며 우리 모델이 잡음 제거 작업에서 얼마나 잘 수행되었는지 확인할 수 있습니다. 순차 데이터에 자동 인코더를 사용하는 것과 같은 다른 용도도 있습니다. 그러한 예 중 하나는 변형 자동 인코더(VAE), 이것은 약간 더 진보되고 현대적인 개념입니다. 이미지를 생성하는 데에도 사용할 수 있습니다.

당신은 또한 확인할 수 있습니다 내 Github 레포 이 프로젝트에 대해서도.

이로써 세 가지 프로젝트 모두에 대한 논의가 완료되었습니다! 🥳

특별한 감사합니다!

이 기사에 대해 특별히 감사드립니다. Vetrivel_PS 이러한 유형의 기사는 데이터 과학으로 전환하기를 원하거나 데이터 과학 분야에서 두각을 나타내고자 하는 모든 사람들에게 매우 도움이 되기 때문에 정기적으로 이러한 유형의 기사를 작성하도록 동기를 부여합니다.

Vetrivel의 데이터 과학 커뮤니티에도 참여하고 싶다면 Hackweekly 링크드인 커뮤니티 (https://www.linkedin.com/company/thehackweekly) 그리고 가입하세요.

저자에 관하여

이전 블로그 게시물도 확인할 수 있습니다.

이전 데이터 과학 블로그 게시물.

여기에 내 링크드인 프로필 저와 연결하고 싶다면. 귀하와 연결되어 기쁩니다.

이메일

질문이 있으시면 저에게 메일을 보내주십시오. Gmail.

참조 :

이미지 1 : https://towardsdatascience.com/fake-face-generator-using-dcgan-model-ae9322ccfd65

Image 2: https://www.google.co.in/url?sa=i&url=https%3A%2F%2Fwww.leewayhertz.com%2Fface-mask-detection-system%2F&psig=AOvVaw02aHbLLICPG-G31GnWPnwF&ust=1629113361404000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCKivvrH2svICFQAAAAAdAAAAABAD

Image 3: https://www.google.co.in/url?sa=i&url=https%3A%2F%2Fwww.analyticsvidhya.com%2Fblog%2F2021%2F01%2Fauto-encoders-for-computer-vision-an-endless-world-of-possibilities%2F&psig=AOvVaw1LmmWrE4OS1_Cjr6QO9pmg&ust=1628144426721000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCODNwvHclvICFQAAAAAdAAAAABAI

Image 4 : https://www.google.co.in/url?sa=i&url=https%3A%2F%2Fwww.researchgate.net%2Ffigure%2FThe-architecture-of-Unet_fig2_334287825&psig=AOvVaw2DB1XzXKEZAAf_mzzSwhlC&ust=1628144257443000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCOi1zaHclvICFQAAAAAdAAAAABAD

최종 메모

읽어 주셔서 감사합니다!

나는 당신이 기사를 즐겼기를 바랍니다. 당신이 그것을 좋아한다면, 당신의 친구들과도 공유하십시오. 언급되지 않았거나 생각을 공유하고 싶으신가요? 아래에 댓글을 남겨주시면 답변해 드리겠습니다. 😉

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.analyticsvidhya.com/blog/2021/09/three-computer-vision-projects-to-skyrocket-your-data-science-career/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?