Keras/TensorFlow PlatoBlockchain Data Intelligence를 사용한 이미지 분류를 위한 RandAugment. 수직 검색. 일체 포함.

Keras/TensorFlow를 사용한 이미지 분류를 위한 RandAugment

데이터 증강은 오랫동안 "정적" 데이터 세트를 변형된 변형으로 대체하는 수단으로 사용되어 불변성을 강화했습니다. 컨볼 루션 신경망 (CNN), 그리고 일반적으로 입력에 대한 견고성으로 이어집니다.

참고 : 불변성은 결정을 내릴 때 모델이 특정 섭동에 대해 눈이 멀게 만드는 것으로 귀결됩니다. 고양이 이미지는 미러링하거나 회전하면 여전히 고양이 이미지입니다.

우리가 사용하던 형식의 데이터 증대는 인코딩을 수행하지만 결핍 객체 감지, 의미 및 인스턴스 분할 등에 중요한 번역 분산에 대한 지식 – 불변 그것은 종종 분류 모델에 유리하며, 따라서 증강은 분류 모델에 더 일반적이고 더 적극적으로 적용됩니다.

증강의 유형

확대는 작은 회전, 수평 및 수직 뒤집기, 대비 또는 밝기 변동 등 매우 간단하기 시작했습니다. 최근 몇 년 동안 다음을 포함한 더 정교한 방법이 고안되었습니다. 차단 (입력 이미지에서 무작위로 검은색 사각형을 도입하는 공간적 드롭아웃) 및 섞다 (이미지의 일부를 혼합하고 레이블 비율을 업데이트함) 및 그 조합 – 컷믹스. 새로운 증강 방법은 실제로 레이블을 설명하며 CutMix와 같은 방법은 레이블 비율을 변경하여 혼합되는 각 클래스의 부분이 차지하는 이미지의 비율과 동일하게 합니다.

가능한 증강 목록이 늘어남에 따라 일부는 임의의 증강 세트가 모델의 견고성을 강화하고 원래 세트를 훨씬 더 큰 입력 이미지의 공간. 여기는 RandAugment 킥!

KerasCV 및 RandAugment

케라스CV 별도의 패키지이지만 여전히 Keras 팀에서 개발한 Keras에 공식적으로 추가되었습니다. 즉, 기본 패키지와 동일한 수준의 세련미와 직관성을 제공하지만 일반 Keras 모델 및 해당 레이어와도 매끄럽게 통합됩니다. 당신이 알아차릴 수 있는 유일한 차이점은 전화를 거는 것뿐입니다. keras_cv.layers... 대신 keras.layers....

KerasCV는 작성 시점에서 아직 개발 중이며 이미 27개의 새로운 전처리 레이어가 포함되어 있습니다. RandAugment, CutMixMixUp 그들 중 일부가 되는 것. 적용하는 방법을 살펴보겠습니다. RandAugment 이미지에 대해 그리고 무작위 증대를 사용하거나 사용하지 않고 분류기를 훈련하는 방법.

먼저, 설치 keras_cv:

$ pip install keras_cv

참고 : KerasCV가 작동하려면 TensorFlow 2.9가 필요합니다. 아직 없으면 실행 $ pip install -U tensorflow 먼저.

이제 Imagenette에 쉽게 액세스할 수 있도록 TensorFlow 데이터 세트와 함께 TensorFlow, Keras 및 KerasCV를 가져옵니다.

import tensorflow as tf
from tensorflow import keras
import keras_cv
import tensorflow_datasets as tfds

이미지를 로드하고 원래 형식으로 표시해 보겠습니다.

import matplotlib.pyplot as plt
import cv2

cat_img = cv2.cvtColor(cv2.imread('cat.jpg'), cv2.COLOR_BGR2RGB)
cat_img = cv2.resize(cat_img, (224, 224))
plt.imshow(cat_img)

자 이제 신청을 해보자 RandAugment 몇 번이고 결과를 살펴보십시오.

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255))(cat_img)
    
    ax.imshow(aug_img.numpy().astype('int'))

Keras/TensorFlow PlatoBlockchain Data Intelligence를 사용한 이미지 분류를 위한 RandAugment. 수직 검색. 일체 포함.

레이어는 magnitude 인수, 기본값은 0.5 증강 효과를 높이거나 낮추도록 변경할 수 있습니다.

fig = plt.figure(figsize=(10,10))
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)
    aug_img = keras_cv.layers.RandAugment(value_range=(0, 255), magnitude=0.1)(cat_img)
    ax.imshow(aug_img.numpy().astype('int'))

다음과 같이 낮은 값으로 설정하면 0.1 – 훨씬 덜 공격적인 증강을 볼 수 있습니다.

Keras/TensorFlow PlatoBlockchain Data Intelligence를 사용한 이미지 분류를 위한 RandAugment. 수직 검색. 일체 포함.

레이어가 됨 - 모델 내에서 또는 다음에서 사용할 수 있습니다. tf.data 데이터 세트를 생성하는 동안 파이프라인. 이것은 만든다 RandAugment 꽤 유연하다! 추가 인수는 augmentations_per_imagerate 함께 작동하는 주장.

럭셔리 0...augmentations_per_image, 레이어는 이미지에 적용할 파이프라인에 임의의 전처리 레이어를 추가합니다. 디폴트의 ​​경우 3 – 세 가지 다른 작업이 파이프라인에 추가됩니다. 그런 다음 파이프라인의 각 증가에 대해 난수가 샘플링됩니다. rate (기본값은 주변 0.9) – 보강이 적용됩니다.

본질적으로 – 파이프라인의 각 (무작위) 증강이 이미지에 적용될 확률이 90%입니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

이것은 자연스럽게 모든 보강이 적용되어야 하는 것은 아님을 의미합니다. rate. 다음을 통해 허용되는 작업을 사용자 지정할 수도 있습니다. RandomAugmentationPipeline 레이어, RandAugment 의 특별한 경우입니다. 에 대한 별도의 가이드 RandomAugmentationPipeline 곧 게시됩니다.

RandAugment를 사용하거나 사용하지 않고 분류기 훈련

데이터 준비/로드 측면을 단순화하고 RandAugment, 사용하자 tfds Imagenette의 일부에 로드하려면:

(train, valid_set, test_set), info = tfds.load("imagenette", 
                                           split=["train[:70%]", "validation", "train[70%:]"],
                                           as_supervised=True, with_info=True)

class_names = info.features["label"].names
n_classes = info.features["label"].num_classes
print(f'Class names: {class_names}') 
print('Num of classes:', n_classes) 

print("Train set size:", len(train)) 
print("Test set size:", len(test_set)) 
print("Valid set size:", len(valid_set)) 

더 적은 에포크에서 데이터 세트를 과적합하기 쉽게 하기 위해 훈련 데이터의 일부만 로드했습니다(실제로 실험이 더 빠르게 실행되도록 함). Imagenette의 이미지는 크기가 다르기 때문에 preprocess() 데이터 세트를 매핑하기 위해 크기를 조정하는 함수와 augment() 이미지를 확대하는 기능 tf.data.Dataset:

def preprocess(images, labels):
  return tf.image.resize(images, (224, 224)), tf.one_hot(labels, 10)
  
def augment(images, labels):
  inputs = {"images": images, "labels": labels}
  outputs = keras_cv.layers.RandAugment(value_range=(0, 255))(inputs)
  return outputs['images'], outputs['labels']

이제 레이블을 원-핫 인코딩했습니다. 반드시 그럴 필요는 없었지만, CutMix 라벨과 그 비율을 변경하려면 그렇게 해야 합니다. 당신이 그들을뿐만 아니라 적용하고 싶을 수도 있기 때문에 RandAugment 강력한 분류기를 만들기 위해 그들과 정말 잘 작동합니다. 원-핫 인코딩은 그대로 두겠습니다. 또한, RandAugment 이 때문에 정확히 이미지와 레이블이 있는 사전을 가져옵니다. 추가할 수 있는 일부 기능 보강은 실제로 레이블을 변경하므로 필수입니다. 증강 이미지와 라벨을 추출할 수 있습니다. outputs 사전을 쉽게 사용할 수 있으므로 이것은 추가적이지만 간단한 단계로 기능 보강 중에 수행할 수 있습니다.

반환된 기존 데이터 세트를 매핑해 보겠습니다. tfds 와 더불어 preprocess() 함수를 배치하고 훈련 세트만 증가시킵니다.

valid_set = valid_set.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set = train.map(preprocess).batch(32).prefetch(tf.data.AUTOTUNE)
train_set_aug = train.map(preprocess).map(augment_data, 
                                          num_parallel_calls=tf.data.AUTOTUNE).batch(32).prefetch(tf.data.AUTOTUNE)

네트워크를 훈련시키자! keras_cv.models 와 유사한 일부 내장 네트워크가 있습니다. keras.applications. 목록은 아직 짧지만 시간이 지남에 따라 확장되어 인계될 것입니다. keras.applications. API는 매우 유사하므로 대부분의 실무자에게 코드 이식이 매우 쉽습니다.


effnet = keras_cv.models.EfficientNetV2B0(include_rescaling=True, include_top=True, classes=10)
          
effnet.compile(
    loss='categorical_crossentropy',
    optimizer='adam',
    metrics=['accuracy']
)

history = effnet.fit(train_set, epochs=25, validation_data = valid_set)

또는 현재를 사용할 수 있습니다. keras.applications:

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)

effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history1 = effnet.fit(train_set, epochs=50, validation_data=valid_set)

결과적으로 매우 잘 수행되지 않는 모델이 생성됩니다.

Epoch 1/50
208/208 [==============================] - 60s 238ms/step - loss: 2.7742 - accuracy: 0.2313 - val_loss: 3.2200 - val_accuracy: 0.3085
...
Epoch 50/50
208/208 [==============================] - 48s 229ms/step - loss: 0.0272 - accuracy: 0.9925 - val_loss: 2.0638 - val_accuracy: 0.6887

이제 증강 데이터 세트에서 동일한 네트워크 설정을 훈련해 보겠습니다. 각 배치는 개별적으로 증가하므로 동일한 이미지 배치(다음 에포크에서)가 올 때마다 서로 다른 증가를 갖게 됩니다.

effnet = keras.applications.EfficientNetV2B0(weights=None, classes=10)
effnet.compile(
  loss='categorical_crossentropy',
  optimizer='adam',
  metrics=['accuracy']
)

history2 = effnet.fit(train_set_aug, epochs=50, validation_data = valid_set)
Epoch 1/50
208/208 [==============================] - 141s 630ms/step - loss: 2.9966 - accuracy: 0.1314 - val_loss: 2.7398 - val_accuracy: 0.2395
...
Epoch 50/50
208/208 [==============================] - 125s 603ms/step - loss: 0.7313 - accuracy: 0.7583 - val_loss: 0.6101 - val_accuracy: 0.8143

훨씬 낫다! 다음과 같은 다른 기능 보강을 적용하고 싶을 때 CutMixMixUp, 네트워크의 정확도를 극대화하기 위한 다른 훈련 기술과 함께 – 단지 RandAugment 상당한 도움이 되었으며 더 긴 보강 파이프라인과 비교할 수 있습니다.

훈련을 포함한 훈련 곡선을 비교하면 검증 곡선 – 얼마나 RandAugment 도움 :

Keras/TensorFlow PlatoBlockchain Data Intelligence를 사용한 이미지 분류를 위한 RandAugment. 수직 검색. 일체 포함.

비증강 파이프라인에서 네트워크 과적합(훈련 정확도가 최대치에 도달) 및 검증 정확도가 낮게 유지됩니다. 증강 파이프라인에서, 훈련 정확도는 처음부터 끝까지 검증 정확도보다 낮게 유지됩니다..

훈련 손실이 높을수록 네트워크는 여전히 저지르는 실수를 훨씬 더 잘 인식하고 변환에 불변하도록 더 많은 업데이트를 수행할 수 있습니다. 전자는 업데이트할 필요가 없다고 생각하는 반면 후자는 업데이트할 필요가 없으며 잠재력의 한도를 높입니다.

결론

케라스CV 별도의 패키지이지만 여전히 Keras 팀이 개발한 Keras에 공식 추가된 것으로, Keras 프로젝트에 업계 최고의 CV를 제공하는 것을 목표로 합니다. KerasCV는 작성 시점에서 아직 개발 중이며 이미 27개의 새로운 전처리 레이어가 포함되어 있습니다. RandAugment, CutMixMixUp 그들 중 일부가 되는 것.

이 짧은 가이드에서는 RandAugment 적용된 변환 목록에서 여러 무작위 변환을 적용하고 모든 Keras 교육 파이프라인에 포함하는 것이 얼마나 쉬운지 확인합니다.

더 나아가기 – 컴퓨터 비전을 위한 실용적인 딥 러닝

당신의 호기심 많은 성격이 당신을 더 멀리 가고 싶게 만드나요? 다음을 확인하는 것이 좋습니다. 코스: “파이썬을 이용한 컴퓨터 비전을 위한 실용적인 딥러닝”.

Keras/TensorFlow PlatoBlockchain Data Intelligence를 사용한 이미지 분류를 위한 RandAugment. 수직 검색. 일체 포함.

또 다른 컴퓨터 비전 과정?

우리는 MNIST 숫자나 MNIST 패션의 분류를 하지 않을 것입니다. 그들은 오래전에 자신의 역할을 다했습니다. 고급 블랙박스 아키텍처가 성능 부담을 짊어지게 하기 전에 너무 많은 학습 리소스가 기본 데이터 세트와 기본 아키텍처에 집중하고 있습니다.

우리는 집중하고 싶다 신비화, 실용적인 사항, 이해, 직관실제 프로젝트. 배우고 싶다 방법 당신은 변화를 만들 수 있습니다? 우리는 뇌가 이미지를 처리하는 방식부터 유방암에 대한 연구 수준의 딥 러닝 분류기를 작성하고 "환각"하는 딥 러닝 네트워크에 이르기까지, 실제 작업을 통해 원리와 이론을 가르치고, 컴퓨터 비전을 해결하기 위해 딥러닝을 적용하는 전문가가 되기 위한 노하우와 도구.

안에 무엇입니까?

  • 비전의 첫 번째 원칙과 컴퓨터가 "보는" 방법을 가르칠 수 있는 방법
  • 컴퓨터 비전의 다양한 작업 및 응용
  • 작업을 더 쉽게 만들어줄 무역 도구
  • 컴퓨터 비전용 데이터세트 찾기, 생성 및 활용
  • 컨볼루션 신경망의 이론과 응용
  • 데이터 세트의 도메인 이동, 동시 발생 및 기타 편향 처리
  • Transfer Learning 및 다른 사람의 교육 시간 및 계산 리소스를 귀하의 이익을 위해 활용
  • 최첨단 유방암 분류기 구축 및 교육
  • 주류 아이디어에 건강한 회의론을 적용하고 널리 채택된 기술의 의미를 이해하는 방법
  • t-SNE 및 PCA를 사용하여 ConvNet의 "개념 공간" 시각화
  • 기업이 더 나은 결과를 얻기 위해 컴퓨터 비전 기술을 사용하는 방법에 대한 사례 연구
  • 적절한 모델 평가, 잠재 공간 시각화 및 모델의 관심 식별
  • 도메인 연구 수행, 자체 데이터 세트 처리 및 모델 테스트 설정
  • 최첨단 아키텍처, 아이디어의 진행, 독창적인 요소 및 구현 방법
  • KerasCV – 최첨단 파이프라인 및 모델 생성을 위한 WIP 라이브러리
  • 논문을 구문 분석하고 읽고 직접 구현하는 방법
  • 용도에 따른 모델 선택
  • 엔드 투 엔드 머신 러닝 파이프라인 만들기
  • Faster R-CNN, RetinaNets, SSD 및 YOLO를 통한 물체 감지에 대한 풍경 및 직관
  • 인스턴스 및 시맨틱 분할
  • YOLOv5를 사용한 실시간 객체 인식
  • YOLOv5 객체 감지기 훈련
  • KerasNLP(업계 최강의 WIP 라이브러리)를 사용하여 Transformers 작업
  • Transformer를 ConvNet과 통합하여 이미지 캡션 생성
  • Deepdream
  • 컴퓨터 비전을 위한 딥 러닝 모델 최적화

타임 스탬프 :

더보기 스택카부스