Классификация изображений с использованием предварительно обученной модели нейронной сети Inception v3 Convolution.

Введение

Сегодня мы собираемся создать программу на Python, которая будет классифицировать изображения, используя предварительно обученнуюмодель Inception-v3.

Что такое предварительно обученная модель?

Предварительно обученная модель – это модель, созданная кем-то другим для решения аналогичной задачи. Вместо создания модели с нуля для решения аналогичной проблемы вы используете в качестве отправной точки модель, обученную другой проблеме.

Таким образом, вместо того, чтобы создавать модель классификации изображений с нуля, мы можем просто использовать некоторую предварительно обученную модель для нашего проекта. В Keras доступно несколько различных предварительно обученных моделей, ссылка.

Что такое Inception-v3?

Inception-v3 – это предварительно обученная модель сверточной нейронной сети с 48-уровневой глубиной.

Это широко используемая модель распознавания изображений, которая, как было показано, обеспечивает точность более 78,1 % в наборе данных ImageNet. Модель — это кульминация многих идей, разработанных несколькими исследователями на протяжении многих лет.

Эта предварительно обученная сеть может классифицировать изображения по 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. Исходный размер 299 на 299.

Архитектура начала-v3

Подробнее о модели Inception-v3 можно прочитать здесь ссылка.

Теперь давайте начнем с кода.

Импортируйте необходимые модули

Мы собираемся использовать TensorFlow v2.x

import tensorflow as tf
import numpy as np
import pandas as pd
import keras
import requests

Загрузить и импортировать начальную версию 3

Мы собираемся загрузить и импортировать inception-v3 из keras.applications.

inception = tf.keras.applications.InceptionV3()

Скачать удобочитаемый текст для предсказания

Мы загружаем удобочитаемый текст для Image-Net и разделяем их.

response = requests.get("https://git.io/JJkYN")
label = response.text.split('\n')

Функция классификации изображений

Пользователь введет изображение, и функция изменит изображение на 299 на 299 и три канала, поскольку входной размер начальной модели составляет 299 на 299, и передаст изображение в предварительно обученную начальную версию-v3, которая даст прогноз, и функция вернет первые 1000 прогнозируемых значений.

def classify(image):
    image = image.reshape((-1, 299, 299, 3))
    image=tf.keras.applications.inception_v3.preprocess_input(image)
    prediction = inception.predict(image).flatten()
    return {label[i]: float(prediction[i]) for i in range(1000)}

Функция прогнозирования

В функции prediction пользователь будет передавать изображение, и с помощью opencv-python функция будет читать и изменять размер изображения и передавать изображение в функцию классификатора изображений. Функция вернет 1000 значений, в которых их много не требуется, и для получения единственного прогноза с наибольшим значением мы будем использовать Счетчик из коллекцийmodules, которые будут сортировать каталог и давать прогноз с наибольшим значением.

По умолчанию дается только прогноз с наивысшим значением, но пользователь может получить столько лучших прогнозов, сколько захочет, просто передав значение n.

from collections import Counter
import cv2 
def prediction(image, n=1):
    image = cv2.imread(image)
    image = cv2.resize(image, (299, 299), 3)
    label = classify(image)
    k = Counter(label)
    high = k.most_common(n)
    for i in high:
        print ("{} : {}".format(i[0], i[1]))

Прогноз

Мы собираемся дать модели неизвестное изображение и проверить верхнее предсказанное значение.

image = 'unknown.jpg'
prediction(image)

Давайте проверим фактическое изображение.

import matplotlib.pyplot as plt
img = cv2.imread(image1)
plt.imshow(img)

Как мы видим, классификация моделей была правильной.

Мы можем экспериментировать с моделью с разными типами объектов и изображений животных и предсказывать метку.

Спасибо за прочтение статьи.

~ Счастливого обучения