Intel Neural Compute Stick 2 (NCS2)를 사용한 이미지 분류 파이프 라인

이 완전한 가이드를 사용하여 데이터 세트에서 NCS2로 이미지 분류로 이동

이미지는 Oleksii Sheremet이 Adobe Photoshop으로 제작했습니다.

소개

이 이야기에서 다룰 내용 :

  • Ubuntu 용 OpenVINO 툴킷 설치.
  • Google Colab을 사용한 데이터 사전 처리 및 모델 학습.
  • TensorFlow 모델을 프로토콜 버퍼 (pb) 형식으로 저장합니다.
  • TensorFlow 모델을 중간 표현으로 변환.
  • 훈련 된 모델 실행 및 NCS2 장치로 예측 획득.

종종 산업 기업에서는 데이터 분석 및 처리를 위해 워크 스테이션을 사용할 기회가 없습니다. 따라서 기존 장비 (대부분 산업용 마이크로 컴퓨터)에 쉽게 연결할 수있는 특수 장치가 필요합니다. 계산 모듈 NCS2 는 이러한 장치 중 하나입니다.

우리 회사 AI Labs 는 기계 학습과 관련된 일부 산업 문제를 해결하기위한 요청을 주기적으로받습니다. 얼마 전까지 만해도 NCS2에서 제공하는 기회를 활용할 수있었습니다. 그 결과 NCS2를 사용하여 이미지 분류를위한 파이프 라인을 개발했습니다. 이 작업의 결과를 독자들과 공유하고 싶습니다.

Ubuntu 용 OpenVINO 툴킷 설치

먼저 OpenVINO 의 현재 버전을 다운로드하여 설치해야합니다 . 여기 에서 OpenVINO를 얻을 수 있습니다 . 여기 에서 자세한 설치 가이드를 찾을 수 있습니다 . 빠른 설치 가이드 :

  1. 다운로드 한 아카이브 가있는 폴더 (예 : 다운로드 )로 이동합니다.

cd ~/Downloads/

tar -xvzf l_openvino_toolkit_p_<version>.tgz

cd l_openvino_toolkit_p_<version>

sudo ./install.sh

cd ~
nano .bashrc

source /opt/intel/openvino/bin/setupvars.sh
source .bashrc

Google Colab을 사용한 데이터 전처리 및 모델 학습

분류 문제를 해결하기 위해 Animals-10 데이터 세트를 사용했습니다. 문제를 단순화하기 위해 Animals-10에서 고양이, 개, 닭, 말, 양의 5 가지 클래스 (동물 종)를 선택했습니다. 각 클래스와 관련된 이미지는 해당 폴더 ( '고양이', '개', '닭', '말', '양')로 그룹화됩니다. 이 모델은 Google Colab에서 학습되었습니다. 자세히 살펴 보겠습니다.

먼저 NCS2 작업에 적합한 TensorFlow 버전을 설치해야합니다.

!pip install tensorflow==1.15.2

import tensorflow.compat.v1 as tf
import tensorflow_hub as hub
import matplotlib.pylab as plt
import numpy as np

from google.colab import drive
drive.mount(‘/content/drive’)

%cd ‘drive/My Drive/animals’
이미지는 Oleksii Sheremet이 tree 명령으로 생성합니다.

클래스 (라벨) 목록을 만듭니다.

image_dir = 'animals'
import os
class_labels = []
for x in tf.gfile.Walk(image_dir):
    try:
        y = os.path.basename(x[0])
        if y != 'animals':
            class_labels.append(y)
    except:
        pass
print(class_labels)

[‘cat’, ‘chicken’, ‘dog’, ‘horse’, ‘sheep’]

이미지 크기 (224 x 224)를 설정합니다. 우리는 사용 ImageDataGenerator을 모델을 훈련 할 때 폴더에서 이미지의 흐름을 만들 수 있습니다.

IMAGE_SIZE = (224,224)
image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255, validation_split=0.2)
training_set = image_generator.flow_from_directory(str(image_dir),                                              target_size=IMAGE_SIZE, subset='training')
validation_set = image_generator.flow_from_directory(str(image_dir),                                              target_size=IMAGE_SIZE, subset='validation')

feature_extractor = tf.keras.applications.MobileNet(weights='imagenet', 
                                include_top=False,
                                input_shape=(IMAGE_SIZE+(3,))) 
feature_extractor.trainable=False

try:
    del model
except:
    pass
x=feature_extractor.output
x=tf.keras.layers.GlobalAveragePooling2D()(x)
classifier=tf.keras.layers.Dense(label_batch.shape[1],activation='softmax')(x)
model=tf.keras.Model(inputs=feature_extractor.input,outputs=classifier)
model.build((None,)+IMAGE_SIZE+(3,))
model.summary()

model.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),
    metrics=['acc'])

class CollectBatchStats(tf.keras.callbacks.Callback):
  def __init__(self):
    self.batch_losses = []
    self.batch_acc = []
    self.validation_losses = []
    self.validation_acc = []
def on_train_batch_end(self, batch, logs=None):
    self.batch_losses.append(logs['loss'])
    self.batch_acc.append(logs['acc'])
    try:
        self.validation_losses.append(logs['val_loss'])
        self.validation_acc.append(logs['val_acc'])
    except:
        self.validation_losses.append(None)
        self.validation_acc.append(None)
    self.model.reset_metrics()

steps_per_epoch = np.ceil(training_set.samples/training_set.batch_size)
batch_stats_callback = CollectBatchStats()
history = model.fit_generator(training_set, epochs=5,
                              steps_per_epoch=steps_per_epoch,
                              validation_data=validation_set,
                              callbacks = [batch_stats_callback])

for image_batch, label_batch in validation_set:
    print("Image batch shape: ", image_batch.shape)
    print("Label batch shape: ", label_batch.shape)
    break

Image batch shape:  (32, 224, 224, 3)
Label batch shape:  (32, 5)

predictions = model.predict(image_batch)
predicted_class = np.argmax(predictions, axis=-1)

plt.figure(figsize=(12,10))
plt.subplots_adjust(hspace=0.5)
for n in range(30):
    plt.subplot(6,5,n+1)
    plt.imshow(image_batch[n])
    plt.title(f'pred: {class_labels[predicted_class[n]]}\norig: {class_labels[np.array(label_batch[n]).argmax()]}')
    plt.axis('off')
_ = plt.suptitle("Animals")
Image is created by Oleksii Sheremet with matplotlib module

모델 고정 및 저장 :

from tensorflow.compat.v1.keras import backend as K
session = K.get_session()
graph = session.graph
with graph.as_default():
    freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference([]))
    output_names = [out.op.name for out in model.outputs]
    output_names += [v.op.name for v in tf.global_variables()]
    input_graph_def = graph.as_graph_def()
    for node in input_graph_def.node:
        node.device = ""
    frozen_graph = tf.graph_util.convert_variables_to_constants(session, input_graph_def, output_names, freeze_var_names)
tf.train.write_graph(frozen_graph, "animals", "animals.pb", as_text=False)

TensorFlow 모델을 중간 표현으로 변환

TensorFlow 모델 변환에 대한 자세한 자습서 가 있습니다 . 훈련 된 모델을 변환하려면 아래 설명 된 작업을 수행해야합니다.

model_optimizer 폴더로 이동 합니다 ( mo_tf.py 필요 ).

cd ~/intel/openvino/deployment_tools/model_optimizer

python mo_tf.py --input_model <path_to_model>/animals.pb --batch 1 --scale 255

[ SUCCESS ] Generated IR version 10 model.
[ SUCCESS ] XML file: /home/user_name/intel/openvino_2020.4.287/deployment_tools/model_optimizer/./animals.xml
[ SUCCESS ] BIN file: /home/user_name/intel/openvino_2020.4.287/deployment_tools/model_optimizer/./animals.bin
[ SUCCESS ] Total execution time: 31.81 seconds.
[ SUCCESS ] Memory consumed: 370 MB.

훈련 된 모델 실행 및 NCS2 장치로 예측 획득

NCS2에서 모델의 성능을 확인하려면 OpenVINO (/home/user_name/intel/openvino/deployment_tools/inference_engine/samples/python/classification_sample/classification_sample.py)에 포함 된 classification_sample.py 스크립트를 사용하면 됩니다 . 이 스크립트를 훈련 된 3 개의 모델 파일 ( animals.xml, animals.bin, animals.mapping ) 이있는 폴더에 복사하십시오 . 또한 기능을 확인하기 위해 여러 이미지 (예 : 001.jpeg002.jpeg )를 동일한 폴더에 복사 할 수 있습니다 .

USB에 연결 NCS2의 이동 test_folder (및 실행 무수한의 NCS2에 모델을 실행 키) :

python classification_sample.py -m animals.xml -i 001.jpeg -d MYRIAD
이미지는 Oleksii Sheremet이 Adobe Photoshop으로 제작했습니다.

python classification_sample.py -m animals.xml -i 002.jpeg -d MYRIAD
Image is created by Oleksii Sheremet with Adobe Photoshop

결론

제시된 파이프 라인을 사용하면 데이터 전처리 및 모델 학습에서 NCS2 모듈을 기반으로하는 테스트에 이르기까지 모든 단계를 빠르게 진행할 수 있습니다. 실습에서 알 수 있듯이 NCS2는 이미지 분류 작업에 잘 대처하며 간단한 산업 분류 작업을 해결하는 데 권장 될 수 있습니다.

참고 문헌

인텔 ® Neural Compute Stick 2

OpenVINO 툴킷

MobileNets : 모바일 비전 애플리케이션을위한 효율적인 컨볼 루션 신경망

MobileNet

Suggested posts

캐시 도구를 코딩 해 보겠습니다.

캐시 도구를 코딩 해 보겠습니다.

좋아, 누군가가 Alembic 캐시 또는 Yeti 캐시를 만들라고 요청했고 소프트웨어 엔지니어링 및 소프트웨어 아키텍처 모범 사례를 따르는 방법을 전혀 모르기 때문에 여기에 계신 것 같습니다. 다른 방법을 알고 있거나 발견했거나이 이야기의 일부에 동의하지 않는 경우 알려주세요! 때로는 많은 캐시 기능을 코딩하는 것이 지루하고 유지 관리가 어렵지 않습니까?

디지털 이미지 처리 Part-3

디지털 이미지 처리 Part-3

참고 :이 책은 Digital Image Processing, 4th Edition Rafael C. Gonzalez, University of Tennessee Richard E.

Related posts

Spotify의 마법 성분 : 기계 학습

Spotify의 마법 성분 : 기계 학습

면책 조항 :이 기사는 Spotify와 관련이 없으며 Spotify 및 현재 관련이 없을 수있는 과거 구조에 대한 확인되지 않은 정보로 구성 될 수 있습니다. 음악은 표현의 한 형태, 예술의 형태, 전체적인 문화 활동입니다.

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

2021 년 2 월에 읽을 4 가지 딥 러닝 논문

신경 과학에서 자동 분화, 신경망 이론 및 신경 과정의 과소 적합에 이르기까지 현재 추구되고있는 다양한 딥 러닝 연구 흐름에 대한 더 나은 개요를 얻고 싶으십니까? 합리적으로 통과하기에는 열려있는 arXiv 탭이 너무 많습니까? 전체 동영상을 볼 시간이 너무 적습니까? 논문의 핵심 아이디어와 개념에 대한 간략한 요약 만 있다면. 그런 다음 '머신-러닝-콜라주'시리즈를 소개하게되어 기쁩니다.

내부의 관심 네트워크 그래프

수학에서 NumPy까지 단계별 가이드

내부의 관심 네트워크 그래프

그래프 신경망 (GNN)은 그래프 데이터에서 학습 할 수있는 표준 도구 상자로 등장했습니다. GNN은 콘텐츠 추천 또는 신약 발견과 같은 다양한 분야에서 영향이 큰 문제를 개선 할 수 있습니다.

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

분할에 대한 고정 2 부 : Python으로 이미지 분할을 수행하는 방법

안녕하세요! 이미지 분할에 대한이 짧은 시리즈의 첫 번째 부분을 읽지 않았다면 여기에서 읽으십시오. 이전 이야기에서 임계 값 및 색상 분할에 대해 논의 했으므로 2 부에서는 색도 분할과 이미지 차이에 중점을 둘 것입니다.