Серийный номер 1: PyCon2018|Вызов модели PNASNet с помощью slim (с исходным кодом)

машинное обучение TensorFlow Python
8-я Китайская конференция разработчиков Python PyConChina 2018, инициированная PyChina.org, была организована 30 организаторами из таких сообществ, как CPyUG/TopGeek, и почти 150 волонтерами из Пекина, Шанхая, Шэньчжэня, Ханчжоу, Чэнду и других городов. Стремится содействовать развитию и применению различных технологий, связанных с Python, в Интернете, корпоративных приложениях и других областях.

Code Doctor Studio имеет честь принять приглашение и принять участие в специальной сессии этой конференции в Пекине. На встрече он в основном поделился «Обмен практическими примерами искусственного интеллекта — обработка изображений и численный анализ».

Некоторые из кейсов, которыми поделились на встрече, в основном взяты из книги «Питон увлекает меня — введение, продвинутый уровень, бизнес-практика» и книги «TensorFlow для глубокого обучения: введение, принципы и продвинутая практика». Кроме того, несколько других случаев были расширены. В качестве дополнения к этой статье другие кейсы, которыми будут делиться, будут дополнены подробной графикой и исходным кодом. Он разделен на 4 серии.

  1. Вызов модели PNASNet с тонким

  2. Тонкая настройка модели PNASNet с помощью тонкого

  3. Атака на модель PNASNet состязательными примерами

  4. Пример обнаружения вредоносного доменного имени


Используйте модель ИИ, чтобы определить, является ли изображение столом, кошкой, собакой или чем-то еще.

В этой главе будет продемонстрирован пример применения модели ИИ для распознавания изображений. На этом примере читатели могут по-настоящему ощутить мощь ИИ и рабочий процесс использования модели.

Описание случая

Загрузите существующую модель через код, классифицируйте и распознайте любое изображение и наблюдайте за результатом распознавания.

В этом случае используется модель PNASNet, обученная на наборе данных ImgNet. В настоящее время модель PNASNet является одной из лучших моделей распознавания изображений. После обучения на наборе данных ImgNet модель может распознавать изображения в 1000 категориях. Для выполнения этого кейса вам необходимо скачать модуль моделей в TensorFlow и соответствующую обучающую модель. Ниже приводится подробное введение.

Среда кода и подготовка модели

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

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

1. Загрузите модуль моделей TensorFlow.

Модуль моделей TensorFlow содержит различные модели, созданные с использованием фреймворка TensorFlow, которые можно использовать напрямую. Вторичная разработка в модуле моделей TensorFlow может сделать разработку проектов ИИ простой и быстрой. Перейдите по следующему URL-адресу:

GitHub.com/tensorflow/…

Вы можете клонировать код через git, а можете загрузить его вручную (подробности см. в разделе 8.5.2 книги «TensorFlow для глубокого обучения: введение, принципы и продвинутая практика»).

2. Разверните тонкий модуль TensorFlow.

После распаковки скопируйте папку slim по пути \models-master\research (как показано на рисунке 1) в путь того же уровня локального кода.


Рис. 1. Путь к тонкой библиотеке кода

Тонкая библиотека, также известная как TF-slim, представляет собой новый облегченный высокоуровневый интерфейс API, запущенный после TensorFlow 1.0. Многие распространенные функции TensorFlow инкапсулированы дважды, чтобы сделать код более лаконичным.

Модуль TF-slim также предоставляет большое количество кодов структуры сетевой модели, написанных на TF-slim, а также файлы моделей, обученные с помощью этого кода. В этом примере используется обученный файл модели PNASNet в модуле TF-slim.

3. Загрузите модель PNASNet.

Посетите следующий веб-сайт, чтобы загрузить обученную модель PNASNet:

GitHub.com/tensorflow/…

После открытия ссылки вы можете найти адрес загрузки «pnasnet-5_large_2017_12_13.tar.gz», как показано на рисунке 2.


Рис. 2 Страница загрузки модели PNASNet

После загрузки разархивируйте его, вы получите файловую структуру, показанную на рисунке 3 ниже.

Рис. 3. Файл модели PNASNet

Поместите всю папку pnasnet-5_large_2017_12_13 в каталог того же уровня локального кода. При его использовании нужно только указать путь к модели: «pnasnet-5_large_2017_12_13», и система автоматически загрузит файлы и контент в модель.

Уведомление:

На рисунке 2 видно, что помимо модели PNASNet, используемой в этом примере, существует множество других моделей. Также широко используется модель mobilenet_v2_1.0_224.tgz в предпоследней строке, эта модель небольшого размера и быстрая в работе, часто используется в мобильных устройствах.

4. Подготовьте метки набора данных ImgNet.

Поскольку модель предварительного обучения PNASNet, используемая в этом примере, является моделью, обученной на наборе данных ImgNet, при использовании этой модели для классификации также требуется соответствующий файл метки. В slim операция получения файла этикетки была напрямую инкапсулирована в код, который можно вызывать напрямую. Поскольку файл этикетки классифицируется на английском языке, его не очень удобно читать. Переведенный файл классификации китайских этикеток "Chinese Label.csv" представлен здесь. Он также находится в вспомогательных ресурсах синхронизации книг.

После того, как первые четыре элемента готовы, общая структура каталогов показана на рис. 4.


Рис. 4 Пример 1 файловой структуры

На рисунке 4 вы увидите, что есть еще три файла изображений «72.jpg», «hy.jpg», «ps.jpg», эти три файла являются изображениями, используемыми для тестирования, читатели могут заменить их тем, что они хотят. для идентификации документа.

Реализация кода: инициализация переменных среды и загрузка тегов ImgNet

Во-первых, загрузите локальный слим как справочную библиотеку в переменную окружения системы. Затем тег ImgNet загружается и отображается.

  import sys                                                 #初始化环境变量
  nets_path = r'slim'
  if nets_path not in sys.path:
     sys.path.insert(0,nets_path)
  else:
     print('already add slim')
 
  import tensorflow as tf                                   #引入头文件
  from PIL import Image
 from matplotlib import pyplot as plt
 from nets.nasnet import pnasnet
 import numpy as np
 from datasets import imagenet
 slim = tf.contrib.slim

 tf.reset_default_graph()                       
 
 image_size = pnasnet.build_pnasnet_large.default_image_size       #获得图片输入尺寸
 labels = imagenet.create_readable_names_for_imagenet_labels()     #获得数据集标签
 print(len(labels),labels)                                             #显示输出标签

 def getone(onestr):
    return onestr.replace(',',' ')

 with open('中文标签.csv','r+') as f:                             #打开文件               
    labels =list( map(getone,list(f))  )
    print(len(labels),type(labels),labels[:5]) 

Используйте модели ИИ для распознавания изображений

Код предусматривает две метки на английском и китайском языках. Китайские этикетки используются в практических приложениях. После запуска программы вывод выглядит следующим образом:

1001 {0: 'фон', 1: 'линь, Tinca tinca', 2: 'золотая рыбка, Carassius auratus', 3: 'большая белая акула, белая акула, людоед, акула-людоед, Carcharodon carcharias', 4 : 'тигровая акула, Galeocerdo cuvieri', 5: 'акула-молот, акула-молот',..., 994: 'гиромитра', 995: 'вонючка, трупный гриб', 996: 'земляная звезда', 997: 'курица' the' -woods, курица лесная, Polyporus frondosus, Grifola frondosa', 998: 'подберезовик', 999: 'ухо, колосок, capitulum', 1000: 'туалетная бумага, туалетная бумага, туалетная бумага'}

1001 ['фон известен\n', 'линь\n', 'золотая рыбка\n', 'большая белая акула\n', 'тигровая акула\n']

Всего выводятся две строки, первая строка — это английская этикетка, а вторая — китайская этикетка.

Реализация кода: определение структуры сети

В коде определяется заполнитель input_imgs для ввода распознаваемого изображения. Затем определите end_points сетевого узла для подключения к выходному узлу предварительно обученной модели. end_points — это словарь, а значение, соответствующее Predictions, — это окончательный результат вывода. В это значение помещается массив из 1000 элементов, представляющих вероятность предсказанного изображения в этих 1000 категориях. Конечный результат преобразуется функцией tf.argmax, и получается индекс наибольшего числа в массиве, что и является классификацией изображения.

 sample_images = ['hy.jpg', 'ps.jpg','72.jpg']                   #定义待测试图片路径

 input_imgs = tf.placeholder(tf.float32, [None, image_size,image_size,3]) #定义占位符

 x1 = 2 *( input_imgs / 255.0)-1.0                                 #归一化图片

 arg_scope = pnasnet.pnasnet_large_arg_scope()                  #获得模型命名空间
 with slim.arg_scope(arg_scope):
    logits, end_points = pnasnet.build_pnasnet_large(x1,num_classes = 1001, is_training=False)   
    prob = end_points['Predictions']
    y = tf.argmax(prob,axis = 1)                                  #获得结果的输出节点

Использование моделей ИИ для распознавания изображений (продолжение)

arg_scope в строке 34 означает пространство имен. Разные тензоры с одинаковыми именами в TensorFlow разделены по пространству имен. Дополнительные сведения о пространствах имен см. в разделе 4.3 книги «TensorFlow для глубокого обучения: введение, принципы и расширенная практика».

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

Реализация кода: загрузить модель для распознавания

Укажите предварительно обученную модель для загрузки и установите сеанс для распознавания изображений.

 checkpoint_file = r'pnasnet-5_large_2017_12_13\model.ckpt'       #定义模型路径
 saver = tf.train.Saver()                                                #定义saver,用于加载模型
 with tf.Session() as sess:                                              #建立会话
    saver.restore(sess, checkpoint_file)                            #载入模型

    def preimg(img):                                    #定义图片预处理函数
        ch = 3
        if img.mode=='RGBA':                            #兼容RGBA图片
            ch = 4 

        imgnp = np.asarray(img.resize((image_size,image_size)), 
                          dtype=np.float32).reshape(image_size,image_size,ch)
        return imgnp[:,:,:3] 

    #获得原始图片与预处理图片
    batchImg = [ preimg( Image.open(imgfilename) ) for imgfilename in sample_images ]
    orgImg = [  Image.open(imgfilename)  for imgfilename in sample_images ]

    yv,img_norm = sess.run([y,x1], feed_dict={input_imgs: batchImg})    #输入到模型

    print(yv,np.shape(yv))                                              #显示输出结果         
    def showresult(yy,img_norm,img_org):                            #定义显示图片函数
        plt.figure()  
        p1 = plt.subplot(121)
        p2 = plt.subplot(122)
        p1.imshow(img_org)                                        #显示图片
        p1.axis('off') 
        p1.set_title("organization image")

        p2.imshow(img_norm)                                        #显示图片
        p2.axis('off') 
        p2.set_title("input image")  

        plt.show()
        print(yy,labels[yy])

    for yy,img1,img2 in zip(yv,batchImg,orgImg):                    #显示每条结果及图片
        showresult(yy,img1,img2)

Использование моделей ИИ для распознавания изображений (продолжение)

В TensorFlow модель работает с концепцией графа. В этом примере исходная структура сети определяется в статическом графе, а затем текущий код подключается к статическому графу путем установления сеанса (строка 41). Вызовите функцию запуска в sess, чтобы ввести данные в статическое изображение и вернуть результат для реализации распознавания изображения.

Перед распознаванием модели все изображения унифицируются до фиксированного размера (код 49) и нормализуются (код 32). Этот процесс называется предварительной обработкой изображения. Предварительно обработанные изображения помещаются в модель для получения точных результатов.

После выполнения кода вывод выглядит следующим образом:


Результат показывает в общей сложности 3 изображения и 3 абзаца текста. Текст в следующей строке каждого изображения является результатом, распознаваемым моделью. На каждом рисунке слева — исходное изображение, а справа — предварительно обработанное изображение.

конец

Код в тексте можно использовать напрямую. Если вы не хотите создавать его вручную, вы также можете загрузить вспомогательный код для этой статьи.

[Получение кода]: Обратите внимание на общедоступный номер:xiangyuejiqirenОтветить в публичный аккаунт"pycon1"

Если вы найдете эту статью полезной

Можно поделиться с другими друзьями