8-я Китайская конференция разработчиков Python PyConChina 2018, инициированная PyChina.org, была организована 30 организаторами из таких сообществ, как CPyUG/TopGeek, и почти 150 волонтерами из Пекина, Шанхая, Шэньчжэня, Ханчжоу, Чэнду и других городов. Стремится содействовать развитию и применению различных технологий, связанных с Python, в Интернете, корпоративных приложениях и других областях.
Code Doctor Studio имеет честь принять приглашение и принять участие в специальной сессии этой конференции в Пекине. На встрече он в основном поделился «Обмен практическими примерами искусственного интеллекта — обработка изображений и численный анализ».
Некоторые из кейсов, которыми поделились на встрече, в основном взяты из книги «Питон увлекает меня — введение, продвинутый уровень, бизнес-практика» и книги «TensorFlow для глубокого обучения: введение, принципы и продвинутая практика». Кроме того, несколько других случаев были расширены. В качестве дополнения к этой статье другие кейсы, которыми будут делиться, будут дополнены подробной графикой и исходным кодом. Он разделен на 4 серии.
Вызов модели PNASNet с тонким
Тонкая настройка модели PNASNet с помощью тонкого
Атака на модель PNASNet состязательными примерами
Пример обнаружения вредоносного доменного имени
Используйте модель ИИ, чтобы определить, является ли изображение столом, кошкой, собакой или чем-то еще.
В этой главе будет продемонстрирован пример применения модели ИИ для распознавания изображений. На этом примере читатели могут по-настоящему ощутить мощь ИИ и рабочий процесс использования модели.
Описание случая
Загрузите существующую модель через код, классифицируйте и распознайте любое изображение и наблюдайте за результатом распознавания.
В этом случае используется модель PNASNet, обученная на наборе данных ImgNet. В настоящее время модель PNASNet является одной из лучших моделей распознавания изображений. После обучения на наборе данных ImgNet модель может распознавать изображения в 1000 категориях. Для выполнения этого кейса вам необходимо скачать модуль моделей в TensorFlow и соответствующую обучающую модель. Ниже приводится подробное введение.
Среда кода и подготовка модели
Чтобы дать возможность читателям быстро завершить пример и интуитивно почувствовать способность модели к распознаванию, они могут напрямую использовать ресурсы, представленные в этой книге. И поместите его в каталог того же уровня кода.
Если вы хотите испытать ручное построение с нуля, вы также можете подготовить среду кода и предварительно скомпилированную модель в соответствии со следующими методами.
1. Загрузите модуль моделей TensorFlow.
Модуль моделей TensorFlow содержит различные модели, созданные с использованием фреймворка TensorFlow, которые можно использовать напрямую. Вторичная разработка в модуле моделей TensorFlow может сделать разработку проектов ИИ простой и быстрой. Перейдите по следующему URL-адресу:
Вы можете клонировать код через 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:
После открытия ссылки вы можете найти адрес загрузки «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», и система автоматически загрузит файлы и контент в модель.
Уведомление:
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
Всего выводятся две строки, первая строка — это английская этикетка, а вторая — китайская этикетка.
Реализация кода: определение структуры сети
В коде определяется заполнитель 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"
Если вы найдете эту статью полезной
Можно поделиться с другими друзьями