제퍼넷 로고

Flask를 사용하여 이미지 분류기 개발 및 배포: 1부

시간

이 기사는 데이터 과학 Blogathon.

얘들 아,

모두 잘 지내고 있기를 바랍니다.

이 기사에서는 플라스크를 사용하여 이미지 분류기를 개발하고 배포하는 방법을 배웁니다. 내 다른 기사와 마찬가지로 이 기사는 코드에 대한 실습 경험을 제공할 것이며 이 기사의 끝에서 이미지를 분류할 간단하고 효과적인 플라스크 API를 만들 수 있을 것입니다. 이 기사는 처음에 이론 부분을 포함하고 그 다음 코딩 부분을 포함합니다. 이 문서의 뒷부분에서 번거로움을 덜어줄 코드에 대한 링크를 제공할 것입니다. 따라서 학습에 집중합시다. 다시 말하지만 이 기사는 완전히 PYTHON을 기반으로 합니다.

이 문서는 모든 범주의 뷰어(초급, 중급, 고급)에게 열려 있습니다. 아래는 이 기사의 목차이므로 이미 익숙한 부분은 건너뛰어도 됩니다.

이 부분은 플라스크를 사용하는 이미지 분류기에 초점을 맞출 것입니다. 두 번째 부분을 찾을 수 있습니다 여기에서 지금 확인해 보세요. 플라스크 API 생성에만 관심이 있는 경우.

내용의 표

  1. 이미지 분류 란 무엇입니까?
    1. 1. 컨볼루션 신경망
    1. 2. 전이 학습
  2.  이미지 분류기를 위한 코딩
  3. 결론

이미지 분류

이미지 분류는 특정 규칙에 따라 이미지 내의 픽셀 또는 벡터 그룹을 분류하고 레이블을 지정하는 프로세스입니다. 평신도 용어로 관련 이미지 또는 유사한 이미지를 함께 그룹화하려고 합니다.
이미지 분류 기술은 크게 Unsupervised 및 Supervised 이미지 분류의 두 가지 유형으로 나뉩니다. 여기서는 지도 이미지 분류 기법을 사용할 것입니다. 나는 그것에 대해 더 깊이 파고 들지 않을 것입니다.

이미지 분류를 위한 최신 기술은 CNN(Convolutional Neural Networks)으로 알려진 딥 러닝을 기반으로 합니다.

컨볼 루션 신경망

CNN으로 넘어가기 전에 신경망을 살펴보겠습니다.

신경망: 이는 인간 두뇌의 작업과 유사한 프로세스를 통해 데이터 세트의 기본 패턴/관계를 인식하는 일련의 알고리즘입니다. 딥 러닝: 패턴 인식에 매우 뛰어나지만 일반적으로 많은 양의 데이터가 필요한 기계 학습 알고리즘의 하위 집합입니다.

현지 시간 Convnet이라고도 하는 특별한 유형의 신경망은 시작 부분에 컨볼루션 레이어가 있다는 점을 제외하고 일반 신경망과 동일한 방식으로 작동합니다.

왜 CNN을 사용합니까?

  1. 단순 피드포워드 신경망은 입력에서 어떤 순서도 볼 수 없습니다. 모든 이미지를 같은 방식으로 섞는다면 신경망은 섞이지 않은 이미지에 대해 훈련할 때와 동일한 성능을 보일 것입니다.
  2. 이미지의 로컬 공간 일관성을 활용합니다. 이것은 인접한 픽셀이 함께 의미가 있기 때문에 인접한 픽셀의 패치에 컨볼루션을 사용하여 이미지를 처리하는 데 필요한 작업 수를 크게 줄일 수 있음을 의미합니다.
  3. 풀링 레이어라는 것을 사용하여 이미지를 다운샘플링합니다.

아래 이미지는 CNN의 전형적인 예를 보여줍니다.

Flask를 사용한 이미지 분류기

CNN의 VIP 용어

회선: 여기에는 입력 이미지의 하위 집합으로 입력을 받는 필터/커널 집합(가중치 집합)이 포함됩니다. 이미지의 하위 집합에는 일반적으로 이미지보다 크기가 작은 필터가 곱해집니다. 아래 이미지는 Convolutional 레이어에 대한 통찰력을 얻는 데 도움이 될 것입니다.

Flask를 사용한 이미지 분류기
이미지는 https://cs231n.github.io/convolutional-networks/에서 가져왔습니다.

풀링 : 이 레이어는 이미지를 다운샘플링하는 데 도움이 됩니다. 행렬에 대해 필터를 실행하고 그 위에 함수를 적용하여 출력을 생성합니다. MAXPOOL은 아래 그림과 같이 최대값으로 출력하는 기능입니다.

풀링 | Flask를 사용한 이미지 분류기

이미지는 https://cs231n.github.io/convolutional-networks/에서 가져왔습니다.

릴루

Rectified Linear Activation Function 또는 줄여서 ReLU는 입력이 양수이면 직접 출력하고 그렇지 않으면 XNUMX을 출력하는 조각별 선형 함수입니다. 이를 사용하는 모델이 훈련하기 쉽고 종종 더 나은 성능을 달성하기 때문에 많은 유형의 신경망에 대한 기본 활성화 함수가 되었습니다.

탈락

이 계층은 신경망에서 특정 노드를 무작위로 삭제하고 나머지를 예측에 사용하여 모델의 과적합을 방지하는 데 도움이 됩니다. CNN이 특정 노드에만 의존하지 않고 구성 요소를 가지거나 모든 노드에서 말하도록 강제하는 정규화 기술입니다.

완전 연결 계층

완전 연결 계층의 뉴런은 이전 계층의 모든 활성화에 대해 완전 연결을 갖습니다. 따라서 이들의 활성화는 행렬 곱셈과 바이어스 오프셋으로 계산할 수 있습니다.

자세한 내용을 읽을 수 있습니다 여기를 클릭해 문의해주세요.

전학 학습 

전이 학습은 새로운 문제에 대해 이전에 학습된 모델을 재사용하는 것입니다. 이러한 기술을 사용하여 유사한 새로운 문제를 해결할 때 많은 수고를 덜어주기 때문에 Computer Vision에서 가장 많이 사용되는 기술입니다. 예를 들어 고양이와 원숭이를 분류하는 모델을 만들었는데 호랑이와 고릴라를 분류하는 데 사용할 수 있나요? 전이 학습을 통해 우리는 확실히 할 수 있습니다.

모델을 생성하는 동안 전이 학습도 사용할 것입니다. 이미지 분류에 사용되는 전이 학습 모델의 예로는 Resnet50, MobileNet, VGG16, VGG19, DenseNet이 있습니다.

전이 학습에 대해 자세히 알아보기 여기를 클릭해 문의해주세요.

이론으로 충분합니다 SHOW ME THE CODE!

이미지 분류기를 위한 코딩 

이미지 분류기에는 TensorFlow, PyTorch, fastai 등과 같은 많은 모듈이 있습니다. 이 블로그에서는 다음을 사용할 것입니다. 텐서플로우. 

라이브러리 가져오기: 

# 도우미 라이브러리 import os import numpy as np import matplotlib.pyplot as plt
# Tensorflow는 tf로 tensorflow를 가져옵니다.

tensorflow.keras.applications.imagenet_utils에서 preprocess_input, decode_predictions 가져오기

tensorflow.keras.models에서 load_model , model_from_json 가져오기, 모델

tensorflow.keras.preprocessing에서 tensorflow에서 이미지 가져오기 keras 가져오기 from keras.preprocessing.image import ImageDataGenerator

데이터 세트 만들기

용도에 따라 변수를 선언하고 변경해야 합니다.

# 변수 선언 train_data_dir = 'v_data/train' validation_data_dir = 'v_data/test' nb_train_samples =400 nb_validation_samples = 100 epochs = 10 batch_size = 16
img_width, img_height = 224, 224 input_shape = (img_width, img_height, 3)

시대: 1 Epoch는 완전한 데이터 세트가 신경망을 통해 한 번만 앞뒤로 전달되는 때입니다.
배치 크기: 전체 데이터 세트를 앞뒤로 전달하면 계산 비용이 증가하므로 네트워크를 통해 전파될 샘플 수로 정의되는 배치 크기를 사용합니다.

train_datagen = ImageDataGenerator(rescale=1. / 255, 전단 범위=0.2, zoom_range=0.2, horizontal_flip=True) test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory(train_data_dir, target_size), im_g batch_size=batch_size, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode='binary')

모델 생성

model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))

여기에서 모델의 구조를 만들었습니다.

model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])

위의 코드는 손실 함수, 옵티마이저 as adam 및 모델 평가를 포함하는 컴파일 함수를 생성합니다.

전이 학습 모델

tensorflow.keras.applications.mobilenet_v2에서 MobileNetV2 모델 가져오기 = MobileNetV2(weights='imagenet')

이 코드는 imagenet 가중치가 로드된 MobileNetV2의 구조로 모델을 생성합니다.

미세 조정 전이 학습 모델

문제에 대해 사전 훈련된 신경망을 조정하려면 데이터 세트에서 훈련해야 합니다. 이미지 분류 모델의 끝에 추가 레이어를 추가할 수도 있습니다.

keras.applications에서 가져오기 Resnet50 base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(IMG_SIZE, IMG_SIZE, 3))
output_categories = 2 # 최종 레이어의 카테고리 수. add_model = Sequential() add_model.add(Flatten(input_shape=base_model.output_shape[1:])) add_model.add(Dropout(0.3)) add_model.add(Dense(128, 활성화='relu')) add_model.add( Dropout(0.3)) add_model.add(Dense(output_categories, activation='softmax')) model = Model(inputs=base_model.input, output=add_model(base_model.output))

여기서 우리는 Resnet50을 사전 훈련된 모델로 사용한 다음 모델 끝에 몇 가지 레이어를 추가하여 사례에 맞게 미세 조정할 수 있습니다.

교육 모델

model.fit_generator( train_generator, steps_per_epoch=nb_train_samples // batch_size, epochs=epochs, validation_data=validation_generator, validation_steps=nb_validation_samples // 배치 크기)

모델을 사용한 예측 

def model_predict(img, 모델): img = img.resize((224, 224))
 # 이미지 전처리 x = image.img_to_array(img) # x = np.true_divide(x, 255) x = np.expand_dims(x, axis=0)
 # 훈련된 모델이 입력을 처리하는 방식에 주의하십시오. # 그렇지 않으면 올바른 예측을 하지 않습니다! x = preprocess_input(x, 모드='tf')
 preds = model.predict(x) preds 반환

모델 저장

model_json = model.to_json() with open("ImageClassifier.json", "w") as json_file: json_file.write(model_json) # 가중치를 HDF5로 직렬화 model.save_weights("ImageClassifier.h5")

위치는 시스템에 따라 변경됩니다.

모델 로드 중

model_json = open(path_to_model_json, 'r') loaded_model_json = model_json.read() model_json.close() 모델 = model_from_json(loaded_model_json) model.load_weights(path_to_model_wieght)

혼란스러워서 코드를 보거나 복사하고 싶은 경우. 이미지 분류기에 대한 참조 여기에서 지금 확인해 보세요..

결론

이것은 플라스크를 사용하는 이미지 분류기의 끝입니다. 이미지 분류기를 만드는 방법과 전이 학습을 적용하고 이를 사용하여 컴퓨터 비전 문제에 대한 더 나은 결과를 얻는 방법에 대한 아이디어를 얻었기를 바랍니다. 후속 기사에서는 이미지 분류기를 보유하고 배포하는 API를 생성할 것입니다. 이 튜토리얼의 전체 코드는 이미 아래 GitHub 리포지토리에 저장했습니다.

코드 찾기 여기를 클릭해 문의해주세요. 

나에 대해서 

저는 컴퓨터 과학 및 공학 학사 학위를 취득하려는 IIIT의 마지막 해 학생입니다. 저는 Deep and Machine Learning에 대해 더 많이 탐구하고 시도하는 것을 좋아합니다. 협업을 원하시면 아래 링크를 사용하세요.

링크드 : 클릭 해주세요

Github에서 : 클릭 해주세요

캐글: 클릭 해주세요

저에게 메일 : [이메일 보호]

Flask를 사용하는 이미지 분류기에 대한 내 기사가 마음에 드셨기를 바랍니다. 읽어 주셔서 감사합니다!

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

출처: https://www.analyticsvidhya.com/blog/2022/01/develop-and-deploy-image-classifier-using-flask-part-1/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

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