제퍼넷 로고

누적 사전 훈련 모델을 사용하는 CNN 기반 개 품종 분류기

시간

이 기사는 데이터 과학 Blogathon

이 기사에서는 누적된 사전 훈련된 모델을 사용하여 이미지의 세부 사항을 기반으로 이미지를 분류하여 최대 정확도를 얻는 방법을 배웁니다. TensorFlow.

개요

안녕하세요 여러분, 이미지 분류를 하기 바랍니다. TensorFlow or TensorFlow또는 다른 CNN 사전 훈련된 모델을 사용하고 이미지를 분류하는 방법에 대해 어느 정도 알고 있을 수 있지만 세부적인 개체(개 품종, 고양이 품종, 잎 질병)를 분류할 때 이 방법은 좋은 결과를 제공하지 않습니다. 이 경우 대부분의 세부 정보를 캡처하기 위해 모델 스태킹을 선호합니다. 기술적인 부분으로 바로 들어가 보겠습니다.

데이터 세트에는 120개의 개 품종이 있으며 누적된 사전 훈련된 모델(TensorFlow, 덴세넷121)에 대해 훈련된 이미지넷. 함께 쌓는 모델에 따라 정확도를 높이기 위해 이러한 모델에서 추출한 병목 현상 기능을 스택할 것입니다.

누적 사전 학습 모델은 어떻게 작동합니까?

분류 문제에 대해 작업할 때 최대 풀 기능에 주로 초점을 맞추는 분류기를 사용하는 경향이 있습니다. 이것이 우리가 강조 표시된 물체와 미세한 물체의 세부 사항을 기반으로 이미지를 쉽게 분류하는 데 도움이 되는 스택형 모델을 사용하는 이유입니다.

스택 모델을 생성하려면 Resnet, Vgg, Densenet 등과 같은 두 개 이상의 분류 아키텍처를 사용해야 합니다. 이러한 분류기는 이미지를 입력으로 사용하고 아키텍처를 기반으로 기능 매트릭스를 생성합니다. 일반적으로 각 분류기는 특징 벡터를 생성하기 위해 다음 단계를 진행합니다.

1. 컨볼루션: 이미지의 가장자리, 선명도 등과 같은 다양한 이미지별 특징을 나타내는 특징 맵을 생성하는 프로세스입니다.

2. 최대 풀링: 이 프로세스에서 강조 표시된 피쳐는 컨볼루션 프로세스를 사용하여 생성되는 피쳐 맵에서 추출됩니다.

3. 평평하게 하기: 이 과정에서 최종 특징 맵은 특징 벡터로 변환됩니다.

다른 모델에서 특징 벡터를 얻은 후 특징 행렬을 만들기 위해 함께 쌓습니다. 이 행렬을 최종 신경망 모델의 입력으로 사용하여 이 행렬을 데이터의 최종 클래스로 분류합니다.

스택 모델의 작동 방식을 알았으므로 이제 Vgg16 및 Resnet 아키텍처를 사용하여 스택 모델을 설계해 보겠습니다.

계속 진행하기 전에 병목 현상 기능을 얻기 위해 모델을 스택하는 방법을 살펴보겠습니다.

누적 사전 훈련된 모델 설계
출처: Kaggle.com

위의 이미지에서 VGG16과 Resnet이라는 두 개의 분류기 모델이 특징 추출기로 사용된 다음 함께 쌓여 분류에 사용되는 최종 특징 세트가 있음을 분명히 알 수 있습니다.

다음 아키텍처를 생성하는 코드를 작성해 보겠습니다.

keras.applications.resnet_v2에서 가져오기 ResNet50V2, preprocess_input을 resnet_preprocess로 keras.applications.densenet에서 가져오기 DenseNet121, preprocess_input을 keras.layers.merge에서 densenet_preprocess로 가져오기 extract concatenateinput_shapein = (331,331,3) preprocessor_resnet = Lambda(resnet_preprocess)(input_layer) resnet50v2 = ResNet50V2(weights = 'imagenet', include_top = False,input_shape = input_shape,pooling ='avg')(preprocessor_resnet)preprocessor_densenet = Lambda(densenet121sNetsweight50densenet_preprocess) = 'imagenet', include_top = False,input_shape = input_shape,pooling ='avg')(preprocessor_densenet)merge = concatenate([resnet2vXNUMX,densenet]) stacked_model = Model(입력 = input_layer, 출력 = 병합) stacked_model.summary()
모델 요약
출처: 로컬

여기에 두 모델(Densenet121 및 resnet50V2)이 있습니다. include_top = 거짓 병목 현상만 추출한 다음 병합을 위해 연결 레이어를 사용한다는 의미입니다.

누적 사전 훈련 모델을 사용하여 개 품종 분류기 구축

스택 모델을 생성하는 방법을 알았으므로 이제 Dog Breed Classifier 생성을 시작할 수 있습니다.

훈련 | 누적된 사전 훈련된 모델
출처: kaggle.com

위의 다이어그램은 분류기를 훈련하고 추론하는 워크플로를 보여줍니다. 이미지에서 누적 모델을 훈련하여 특징 행렬을 생성한 다음 다른 신경망에서 개 품종을 분류하기 위해 입력 특징으로 사용할 것입니다.

이제 접근 방식이 작동하는 방식에 대한 높은 수준의 그림을 얻었습니다. 학습 및 추론을 위한 단계별 절차를 살펴보겠습니다.

데이터 세트 로드 중

여기(https://www.kaggle.com/c/dog-breed-identification)에서 찾을 수 있는 Kaggle의 데이터 세트를 사용합니다. 우리는 다음이라는 이름의 pandas 데이터 프레임에 데이터를 로드할 것입니다. label_dataframe 그리고 각각을 변환할 것입니다 y 숫자 값으로 레이블을 지정합니다.

우리는 모든 개 품종 레이블을 일부 숫자로 매핑했습니다.

#데이터 경로
train_dir = '/kaggle/input/개 품종 식별/기차/'
label_dataframe = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')
dog_breeds = sorted(list(set(labels_dataframe['breed']))) n_classes = len(dog_breeds)
class_to_num = dict(zip(dog_breeds, 범위(n_classes)))
labels_dataframe['file_path'] =labels_dataframe['id'].apply(lambda x:train_dir+f"{x}.jpg")
label_dataframe['번식'] = labels_dataframe.breed.map(class_to_num)
라벨 이미지
출처: 로컬

이제 품종 열을 다음으로 변환해야 합니다. y_train 사용 to_카테고리.

keras.utils에서 가져오기 to_categorical y_train = to_categorical(labels_dataframe.breed)

누적 사전 훈련된 모델에서 병목 현상 추출

이 단계에서는 stacked_model 병목 특징 추출을 위해 방금 설계했으며 이러한 추출된 특징은 엑스트레인 우리의 훈련을 위해. OOM(메모리 부족) 문제가 발생하지 않도록 일괄 처리를 사용하고 있습니다.

# feature_extraction의 경우 데이터 프레임은 file_path 및 유형 열을 포함해야 합니다. def feature_extractor(df): img_size = (331,331,3) data_size = len(df) batch_size = 20 X = np.zeros([data_size,3072], dtype=np. uint8) datagen = ImageDataGenerator() # 여기서 우리는 예측 기능이므로 이미지 확대를 수행할 필요가 없습니다. generator = datagen.flow_from_dataframe(df, x_col = 'file_path', class_mode = None, batch_size=20, shuffle = False,target_size = (img_size[:2]),color_mode = 'rgb') i = 0 for input_batch in tqdm(generator): input_batch = stacked_model.predict(input_batch) X[i * batch_size : (i + 1) * batch_size] = input_batch i += 1 if i * batch_size >= data_size: break return XX_train = feature_extractor(labels_dataframe)

여기에서 지금 확인해 보세요. 엑스트레인 (사전 훈련된 모델에서 추출한 모든 기능 포함)은 우리의 새로운 엑스트레인 최종 모델에 사용할 것입니다.

훈련을 위한 예측 모델 생성

이제 우리는 다음과 같은 간단한 모델을 만들 것입니다. 엑스트레인 (스택 모델에서 추출한 기능) 및 y_train (범주형 값) 최종 예측 모델이 됩니다.

import keraspredictor_model = keras.models.Sequential([ InputLayer(X.shape[1:]), Dropout(0.7), Dense(n_classes, activation='softmax') ])predictor_model.compile(optimizer='adam', loss= 'categorical_crossentropy', 메트릭=['정확도'])
keras.callbacks에서 EarlyStopping, ModelCheckpoint, ReduceLROnPlateau 가져오기
#콜백 준비
EarlyStop_callback = keras.callbacks.EarlyStopping(monitor='val_loss', 인내=10, restore_best_weights=True) 체크포인트 = ModelCheckpoint('/kaggle/working/checkpoing', 모니터 = 'val_loss', 모드 = 'min',save_best_only= True ) lr = ReduceLROnPlateau(모니터 = 'val_loss', factor = 0.5, 인내 = 3, min_lr = 0.00001) my_callback=[EarlyStop_callback, 체크포인트]

이 코드 블록은 최고의 시대를 자동으로 저장합니다.
조기에 중단하고 더 이상 진행하지 않으면 학습률이 감소합니다.
훈련의 향상이 보입니다.

모델 훈련

이제 우리는 훈련할 것이다 예측 모델 on 엑스트레인 과 y_train & X_테스트y_test 자동으로 가져갑니다. 검증_분할. 

#추출된 특징에 대한 간단한 DNN 훈련.# 여기서 X는 누적된 사전 훈련된 모델을 사용하여 추출한 병목 현상입니다. history_graph = predictor_model.fit(X_train , y_train, batch_size=128, epochs=60, validation_split=0.1 , callbacks = my_callback)

사용 유효성 검사_분할 = 0.1, 데이터 세트를 훈련(90%)과 테스트(10%)로 분할합니다.

결과 플롯

우리는 훈련의 역사를 플롯하고 우리의 성과를 알아낼 것입니다. 여기 역사_그래프 는 모든 에포크에 대한 히스토리를 플롯하는 데 사용할 히스토리 객체입니다.

matplotlib.pyplot을 plt fig로 가져오기, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 12)) ax1.plot(history_graph.history['val_loss'],color = 'r',label = 'val_loss') ax1.set_xticks(np.arange(1, 60, 1)) ax1.set_yticks(np.arange(0, 1, 0.1)) ax1.legend(['손실', 'val_loss'], 그림자 = 참) ax2.plot(history_graph.history['accuracy'],color = 'green',label = 'accuracy') ax2.plot(history_graph.history['val_accuracy'],color = 'red',label = ' val_accuracy') ax2.legend(['정확도','발_정확도'],그림자 = 참)
# ax2.set_xticks(np.arange(1, 60, 1))
# ax2.set_yticks(np.arange(0, 60, 0.1))
plt.show() ax1.plot(history_graph.history['손실'],색상 = 'b',라벨 = '손실')
정확도 플롯 | 누적된 사전 훈련된 모델
출처: 로컬

우리는 모델을 효율적으로 훈련했고 약 85%의 유효성 검사 정확도를 얻었습니다. 글쎄, 우리는 그것을 더 향상시킬 수 있습니다. 우리는 마지막에 그것에 대해 이야기 할 것입니다.

모델 저장

마지막으로, 나중에 추론에 사용하기 위해 사전 훈련된 모델을 저장합니다.

dnn.save('/kaggle/working/dogbreed.h5') stacked_model.save('/kaggle/working/feature_extractor.h5') 

모델에서 추론 얻기

먼저 test_images의 병목 현상을 다음과 같이 추출합니다. stacked_model 그런 다음 추출된 기능을 예측 모델 클래스 값을 가져옵니다.

img = load_img(img_path, target_size=(331,331)) img = img_to_array(img) img = np.expand_dims(img,axis = 0) # 이것은 tensor(4Dimension)를 생성하고 있습니다. extract_features = stacked_model.predict(img) y_model.pred = 예측(extracted_features)

y_pred 모양의 예측 배열(1,120)입니다. y_pred는 각 클래스의 확률을 갖는 배열입니다. 이제 확률이 가장 높은 클래스 레이블을 찾은 다음 다음을 사용하여 클래스 번호를 클래스 레이블로 변환해야 합니다.
사전 class_to_num 우리가 이미 정의한 것입니다.

def get_key(val): 키, 값 in class_to_num.items(): val == value: 반환 키 pred_codes = np.argmax(y_pred, axis = 1)predicted_dog_breed = get_key(pred_codes)
출력 | 누적된 사전 훈련된 모델

출처: 로컬

결론

이 기사에서는 스택형(densenet121, resnet50v2)을 사용하여 개 품종 분류기를 구축했으며 85% 이상의 유효성 검사 정확도를 얻었습니다. 그럼에도 불구하고 우리는 이 정확도를 더욱 향상시킬 수 있습니다.

정확도 향상

  • 다른 deep layered pre-trained 모델(VGG19, VGG16 등)을 스택해 보십시오.
  • 특징 추출 전에 데이터 증대 수행 

이제 서로 다른 사전 훈련된 모델을 사용하여 이미지 분류에 더 잘 작동하는 여러 다른 분류기 모델을 만들 수 있다는 것을 알게 되었습니다. 계속 진행하여 사용 사례에 대한 고유한 스택 모델을 만들 수 있습니다.

이 기사를 읽어주셔서 감사합니다. 새로운 것을 배웠다면 언제든지 댓글을 남겨주세요. 다음에 뵙겠습니다!!! ❤️ 

누적 사전 훈련 모델에 대한 이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

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

출처: https://www.analyticsvidhya.com/blog/2021/09/cnn-based-dog-breed-classifier-using-stacked-pretrained-models/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

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