Интеллектуальный мобильный проект TensorFlow: 1–5
Интеллектуальный мобильный проект TensorFlow: 1–5

1. Начало работы с мобильным TensorFlow

В этой главе рассказывается, как настраивать и развивать среду.,киспользовать TensorFlow Построить все iOS или Android приложения, которые обсуждаются в оставшейся части этой книги. Мы не будем подробно обсуждать все поддерживаемые TensorFlow Версия, ОС Версия, Xcode и Android Studio Версия,потому чтодля Можетксуществовать Веб-сайт Тенсор Флоуилипроходить Google。 Напротив,Мы Волясуществовать эту главу кратко обсудим Пример рабочей среды,к便нас能够быстрыйучиться​​Можетиспользоватьокружающая среда Строить Местоиметьвыдающийсяприложение.

Если вы уже установили TensorFlow,Xcode и Android Студия и может запустить тест Пример TensorFlow iOS и Android приложение,И если вы уже установили NVIDIA GPU Для более быстрого обучения модели глубокого обучения вы можете пропустить эту главу. или вы можете сразу перейти к той части понятия «приехать», с которой вы не знакомы.

нас Волясуществоватькнигаглава涵盖к Вниз主вопрос(какнастраивать Raspberry Pi развиватьсреда Волясуществовать Нет. 12 глава,“существовать Raspberry Pi Развивайтесь дальше TensorFlow Приложение"):

  • Настройка Тензор Флоу
  • Настройте Xcode
  • Настройка Android Studio
  • TensorFlow Mobile и TensorFlow Lite
  • Запустите пример приложения TensorFlow для iOS.
  • Запустите образец приложения TensorFlow для Android.

Настройка Тензор Флоу

TensorFlow Это ведущая платформа с открытым исходным кодом для машинного интеллекта. когда Google существовать 2015 Год 11 Лунный генерал TensorFlow Когда проект был выпущен как проект с открытым исходным кодом, уже существовало несколько других подобных фреймворков с открытым исходным кодом для глубокого обучения: Caffe, Torch. и Theano。 существовать 5 луна 10 ежедневно Google I/O 2018 на GitHub на TensorFlow Достиг 99000 звезда,существовать 4 Добавлено в индивидуальнолуна 14k звезда, в то время как Caffe только увеличился 2k к 24k звезда. Два года спустя он стал самым популярным инструментом для обучения и внедрения глубокого обучения (он также очень хорошо поддерживает традиционное машинное обучение). перехватывать 2018 Год 1 луна,TensorFlow существовать GitHub начальстводержатьиметьПочти 85 000 звезд,И остальные трииндивидуальныйведущийизоткрытьисточникглубокое обучениерамка Caffe,CNTK и Mxnet принадлежит отдельно 22k,13k и 12k зернозвезда.

Если вы правда, машинное обучение,глубокое обучение,Машинный интеллект и искусственный интеллект (ИИ) из модных словечек вызывают некоторую путаницу,этот внутрииметьиндивидуальный Краткое изложение: Машинный интеллект и AI Это действительно то же самое. машинное обучение это AI Один из районов и самый популярный район; Глубокое обучение — это особый тип машинного обучения, который также решает такие проблемы, как компьютерное зрение, распознавание речиисинтеза а также обработка естественного языка и другие сложные проблемы современного и наиболее эффективного метода. Поэтому существуют в этой книге, когда мы говорим AI мы в основном имеем в виду глубокое обучение, которое AI Длинная зима приносит лето из спасения звезды. связанный AI Зимнее иглубокое обучениеиз Подробнее,ты Можетк查смотретьэтотвнутрииэтотвнутри

Мы предполагаем, что вы уже знакомы с TensorFlow иметь Понятно基книгаизучиться,Но да, если у тебя нет,пожалуйста, проверьтеначинаяиУчебное пособиечастьили Awesome TensorFlow Учебное пособие。 Две хорошие книги по этой теме — Python. Машинное обучение: Python , scikit-learn и TensorFlow Машинное обучение и глубокое обучение》и《использовать Scikit-Learn и TensorFlow Практическое машинное обучение».

TensorFlow Можетк Установитьсуществовать MacOS,Ubuntu или Windows начальство. нас Воляпредставлятьсуществовать MacOS X El Capitan(10.11.6),macOS Sierra(10.12.6)и Ubuntu 16.04 Установить из исходного кода на TensorFlow 1.4 шаги. Если вы используете другую систему управления или версию, вы можете обратиться к Документация по установке TensorFlowкполучать Дополнительная информация。 когда Обновления могут появиться, пока вы читаете эту книгуиз TensorFlow Версия. хотя у вас все равно должна быть возможность использовать более новую версию исходного кода, но это не гарантируется, поэтому мы существуем. Mac и Ubuntu Использовать на TensorFlow 1.4 начальствоhaicha фильм «приходи и приходи» Настройка Тензор Флоу; Таким образом, вы можете легко протестировать запуск и поиграть с приложениями из книги.

Поскольку мы 2017 Год 12 Поскольку луна написала предыдущий абзац, TensorFlow Вышло четыре новых официальных версии (1.5, 1.6, 1.7). и 1.8),а такжеперехватывать 2018 Год 5 лунаизновый Версия Xcode(9.3),ты Можетксуществоватьк Вниз Расположениескачать, илисуществовать TensorFlow источниккодсклад Библиотека。 TensorFlow Более новая версия (например. 1.8) Поддерживается по умолчанию NVIDIA CUDA и cuDNN из Newer Version (связанный. Дополнительную информацию см. в разделе «существовать». Ubuntu настройки включенына основе GPU из TensorFlow»), и лучше всего следить за официальной версией TensorFlow Документация для установки GPU Поддержите последние TensorFlow Версия. существуют этот глава и следующий глава, мы Воля с конкретным из TensorFlow версия в качестве примера, но будет применяться ко всем iOS,Android и Python код для проверки и существования нужна часовая стрелка, верно, какая из последних TensorFlow,Xcode и Android Studio версия обновлена. книга书изисточниккодсклад Библиотека Кусочек Вэтотвнутри

В целом мы Волясуществовать Mac Использовать на TensorFlow развивать iOS и Android TensorFlow приложение,исуществовать Ubuntu Использовать на TensorFlow тренироватьсяприложениеиспользуется визглубокое обучение Модель.

существовать MacOS начальство Настройка Тензор Флоу

Обычно вы должны использовать VirtualEnv,Docker или Anaconda Установитьсуществоватьодинизсредасередина Установить TensorFlow。 Но поскольку нам приходится использовать TensorFlow Сборка исходного кода iOS и Android TensorFlow приложение, так что можно и от Сборка исходного кода TensorFlow сам по себе, существуетэтот случай,используйте эту единицу PIP Варианты установки могут быть проще других. Если вы хотите попробовать что-то другое TensorFlow версию,мы рекомендуем вам использовать VirtualEnv,Docker и Anaconda вариант один установить другой TensorFlow Версия. существоватьэтотвнутри,Мы Воляиспользоватькнига地 PIP и Python 2.7.10 прямойсуществовать MacOS Установить в систему TensorFlow 1.4。

Выполните следующие действиясуществовать MacOS Загрузите и установите TensorFlow 1.4:

  1. от GitHub на TensorFlow опубликовать страницускачать Исходный код TensorFlow 1.4.0zipилиtar.gz
  2. Разархивироватьскачатьиздокументи Воляtensorflow-1.4.0папкатащитьприезжатьтыиз Домашний каталог
  3. Убедитесь, что он установлен Xcode 8.2.1 или выше Версия (в противном случае сначала прочтите «Настройка» раздел «Xcode»)
  4. Открыть новое окно терминала,Затемщелкнутьcd tensorflow-1.4.0
  5. бегатьxcode-select --installк Установить Инструменты командной строки
  6. Запустить Следующая команда собирается с помощью Установить TensorFlow Необходимыйдругой Инструменты Сумка:
Язык кода:javascript
копировать
sudo pip install six numpy wheel  
brew install automake 
brew install libtool 
./configure 
brew upgrade bazel 
  1. от TensorFlow Сборка исходного кода,толькопоставлять CPU Поддержка (наша Волясуществовать в следующей части, введение) GPU поддерживать),игенерироватьприноситьиметь.whlдокументрасширениеиз PIP Файл пакета:
Язык кода:javascript
копировать
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package 

bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg 
  1. Установите пакет ЦП TensorFlow 1.4.0:
Язык кода:javascript
копировать
sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27m-macosx_10_12_intel.whl

если быть честным,Если во время этого процесса вы столкнулись с какими-либо ошибками,Тогда поиск сообщения об ошибке должен быть лучшим способом исправить ошибку.,Поскольку мы намерены существовать, эта книга фокусируется на нашем долгосрочном накоплении навыков и знаний.,отчасыизстроитьи Практично для отладкииздвигаться TensorFlow Полученные из приложения, их нелегко найти где-либо еще. бегатьsudo pip installКогда командуешь,ты Может能встречасмотретьприезжатьизодининдивидуальныйконкретная ошибкадаOperation not permittedошибка。 Чтобы решить эту проблему, вы можете перезапустить Mac и НажмитеCmd + Rключ Приходить禁использовать Mac изЗащита целостности системыSIP) Чтобы войти в режим восстановления, перезапустите терминал инструмента. Mac Извпередбегатьcsrutil disable。 Если вы заинтересованы в отключении SIP Если вы не удовлетворены, вы можете следовать Документация TensorFlow пробует один из более сложных методов, например. VirtualEnv。

если все пойдет хорошо,тогда вы сможете существовать в окне терминала,Python илибольшинствосуществовать IPython начальствобегать,Затембегатьimport tensorflow as tfиtf.__version__Воля 1.4.0 в качестве вывода.

существовать GPU управляемый Ubuntu начальство Настройка Тензор Флоу

использоватьхорошийизглубокое обучениерамка(Например TensorFlow)из好处Изодиндасуществовать Модельтренироватьсясередина无缝поддерживатьиспользоватьблок обработки изображений в форме картиныGPU) 。 существовать GPU Обучение необыкновенное основе TensorFlow из Модель Чемсуществовать CPU Гораздо быстрее тренироваться и когдавперед NVIDIA поставлять TensorFlow Лучшая и наиболее экономически эффективная поддержка GPU。 Ubuntu это использовать TensorFlow бегать NVIDIA GPU изоптимальныйдействоватьсистема. Вы можете легко купить его за несколько сотен долларов. GPU,Затем Воля Что Установитьсуществоватьприноситьиметь Ubuntu Система из дешевого настольного началства. Вы также можете существовать Windows Установить на NVIDIA графический процессор, но TensorFlow верно Windows поддержка не так хороша, как правда Ubuntu изподдерживать.

для прохождения обучения в приложении к книге и развертывания из Модели мы используем NVIDIA GTX 1070,ты Можетксуществовать Amazon или eBay Примерно 400 Купить по цене в долларах США. Тим Детмерс Dettmers)иметьодининдивидуальныйхорошийизблог,Чтосерединапредставлять Понятноиспользовать Вглубокое обучениеиз GPU。 существоватьполучатьэтот Образециз GPU и Воля Что Установитьсуществовать Ubuntu После установки системы такжесуществовать Установить включить GPU из TensorFlow Прежде чем вам нужно будет установить NVIDIA CUDA 8.0(или 9.0)и cuDNN(CUDA-DeepNeuralNetwork)6.0 (или 7.0), оба TensorFlow 1.4 поддерживать.

использовать TensorFlow настраиватьссебяиз GPU управляемый Ubuntu из另одиндобрыйметоддасуществоватьподдерживать GPU из Облачные сервисы (например. Google Cloud Platform из Cloud ML Engine)используется в TensorFlow。 Каждый вариант имеет преимущества и недостатки. Облачные сервисы обычно даны на основе времени из биллинга. Если ваша цель развернуть Модель на мобильных устройствах, то это означает, что Модель не сложная, а если вы планируете долго обучать машинному обучению, то обладание имеетссиз GPU Более экономически эффективно и сытно.

Выполните следующие действиясуществовать Ubuntu 16.04 Установить на CUDA 8.0 и cuDNN 6.0 (вы сможете скачать и установить аналогичным образом CUDA 9.0 и cuDNN 7.0):

  1. существоватьэтаиндивидуальная страницаНайти вприезжать NVIDIA CUDA 8.0 GA2 Версия,ируководитьк Вниз Экранперехватыватьартинасередина Место示извыбирать:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-24owtE5N-1681653027406) (https://gitcode.net/apachecn/apa). checn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/0e74beec-5ac6-4755-8268-dcf83c27a700.png)]

картина 1.1:Подготовитьсуществовать Ubuntu 16.04 скачать CUDA 8.0

  1. Загрузите базовый Установщик, как показано на следующем скриншоте Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-wQ8ALCmL-1681653027407)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/49296f66-83aa-48a5-973b-a4d9c8dd4348.png)]

картина 1.2: для Ubuntu 16.04 выбирать CUDA 8.0 установочный файл

  1. 打открытьодининдивидуальныйновыйиз Терминаливыполнить следующую команду(тывозвращаться需хотеть Волянаконецдваиндивидуальныйкоманда добавитьприезжать.bashrcдокументсередина,Чтобы две индивидуальные переменные среды вступили в силу при следующем запуске нового терминала):
Язык кода:javascript
копировать
sudo dpkg -i /home/jeff/Downloads/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb  
sudo apt-get update 
sudo apt-get install cuda-8-0 
export CUDA_HOME=/usr/local/cuda 
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
  1. проходитьэтотвнутрискачатьиспользовать В CUDA 8.0 из NVIDIA cuDNN 6.0, вам Воля предлагается сначала бесплатно зарегистрироваться индивидуально NVIDIA просмотреть учетную запись пользователя (бесплатно). ты Можеткскачатьэто,нравиться Внизодининдивидуальный Экранперехватыватьартина Место示(выбирать Выделятьиз cuDNN v6.0 Linux версия):

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-Wl1Sp3ho-1681653027408)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/f8e7636c-a193-4915-8c4f-8a234ffaf788.png)]

картина 1.3:существовать Linux Выше CUDA 8.0 выбирать cuDNN 6.0

  1. 假设скачатьиздокумент Кусочек Впо умолчаниюиз~/Downloadsв каталоге,Пожалуйста, разархивируйте этот документ,Затемтывстречасмотретьприезжатьодининдивидуальныйимядляcudaизпапка,Чтосередина Сумка含дваиндивидуальныйимядляincludeиlib64изребенокпапка
  2. Воля cuDNN includeиlib64документкопироватьприезжатьCUDA_HOMEизlib64иincludeпапкасередина:
Язык кода:javascript
копировать
sudo cp ~/Downloads/cuda/lib64/* /usr/local/cuda/lib64 
sudo cp ~/Downloads/cuda/include/cudnn.h /usr/local/cuda/include 

сейчассуществоватьнас Подготовитьсуществовать Ubuntu Установить включить GPU из TensorFlow 1.4(приведено здесьизвпереддваиндивидуальныйшагисуществовать MacOS начальство Настройка Тензор Флоу Действия такие же, как описано в разделе из):

  1. от GitHub на TensorFlow опубликовать страницускачать Исходный код TensorFlow 1.4.0(zipилиtar.gz
  2. Разархивируйте загрузочный документ и перетащите Воляпапку в основной каталог.
  3. отэтотвнутрискачать bazel Установщик
  4. Открыть новое окно терминала,Затем Запустить Следующая команда собирается с помощью Установить TensorFlow Необходимый Инструменты Сумка:
Язык кода:javascript
копировать
sudo pip install six numpy wheel  
cd ~/Downloads 
chmod +x bazel-0.5.4-installer-linux-x86_64.sh 
./bazel-0.5.4-installer-linux-x86_64.sh --user
  1. от Инструментиметь GPU Поддерживать TensorFlow источникруководитьстроить,игенерироватьприноситьиметь.whlдокументрасширениеиз pip Файл пакета:
Язык кода:javascript
копировать
cd ~/tensorflow-1.4.0 
./configure 
bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package 
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg 
  1. Установите пакет графического процессора TensorFlow 1.4.0:
Язык кода:javascript
копировать
sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27mu-linux_x86_64.whl 

Сейчас существуют, если все пойдет хорошо, можно приступать IPython и введите следующий скрипт для просмотра TensorFlow использоватьиз GPU информация:

Язык кода:javascript
копировать
In [1]: import tensorflow as tf 

In [2]: tf.__version__ 
Out[2]: '1.4.0' 

In [3]: sess=tf.Session() 
2017-12-28 23:45:37.599904: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 
2017-12-28 23:45:37.600173: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:  
name: GeForce GTX 1070 major: 6 minor: 1 memoryClockRate(GHz): 1.7845 
pciBusID: 0000:01:00.0 
totalMemory: 7.92GiB freeMemory: 7.60GiB 
2017-12-28 23:45:37.600186: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 1070, pci bus id: 0000:01:00.0, compute capability: 6.1) 

поздравляю! Сейчас существуют, вы можете тренироваться Приложениеиспользуется в этой книге визглубокое обучение Модель. существоватьнасоткрыть始玩насизновый玩Инструментииспользоватьэто Приходитьтренироватьсянасиз Прохладный Модель Затемсуществуют на мобильных устройствахразвертыватьибегатьиз нихвперед,наспервый Приходитьсмотретьсмотреть Подготовить好развиватьдвигатьсяприложениечто нужно сделать。

Настройте Xcode

Xcode использовать Вразвивать iOS приложение, которое вам нужно Mac Компьютер и бесплатно из Apple ID Скачать и Установить его. Если ты Mac Взаимноверностаршеииспользовать OS X El Капитан (версия 10.11.6),но Можеткотэтотвнутрискачать Xcode 8.2.1。 или, если вы установите macOS Sierra(10.12.6 версия) или выше Версия, скачать ее можно по ссылке отвпередиз Xcode 9.2 или 9.3(перехватывать 2018 Год 5 лунаиз最новый Версия)。 Все в этой книге iOS приложение Всесуществовать Xcode 8.2.1、9.2 и 9.3 Протестировано в .

Чтобы установить Xcode, просто дважды щелкните, чтобы загрузить документ, и следуйте инструкциям на экране, чтобы действовать. Это очень просто. сейчассуществовать,ты Можетксуществовать Xcode Поставляется с iOS Эмулятор или самостоятельно из iOS оборудованиеначальствобегатьприложение. от Xcode 7 Для начала вы можете существовать iOS Бесплатная программа отладки на устройстве iOS приложение,Но если вы хотите распространять или публиковать свое изприложение,Тогда вам нужно К в год 99 долларов США из стоимости участия Apple разработать кадровый план

хотяты Можеткиспользовать Xcode Тесты симулятора проводятся из многих приложений, но для книги из какого-то приложения необходимо использовать реальные возможности. iOS Устройство на камере делает снимки, прежде чем вы сможете пройти мимо TensorFlow Обучение глубокому обучению Модельно его обработка. Кроме того, обычно лучше протестировать Модельиз на реальном устройстве для точной производительности и использования памяти: сущесес Твовать хорошее в эмуляторе из Модель может привести к сбою или существование в реальном устройстве работает слишком медленно. Поэтому настоятельно рекомендуется или попросить вас (если не всегда да) меньше существовать в реальности. iOS Протестировано на устройстве и запущено в этой книге из iOS Применить один раз.

В этой книге предполагается, что вы знакомы с iOS программирование, но если вы новичок в iOS Улучшив, вы сможете реализовать множество отличных линий. Учебное Учитесь в пособии, например Ray Wenderlich из iOS Учебное пособие。 Мы не будем вводить сложное из iOS программирование; Мы, Воля, главная К, ты покажи, как мы существуем из iOS приложениеиспользуется в TensorFlow C++ API Приходитьбегать TensorFlow Поезд имеет возможность выполнять различные интеллектуальные задачи. Apple из Два вида чиновников iOS язык программирования Objective-C и Swift код Воля для и нас с мобильного AI приложениесерединаиз C++ код для взаимодействия.

Настройка Android Studio

Android Studio даразвивать Android приложениеиз лучший инструмент и TensorFlow верно Чтоиспользоватьпоставлятьмощныйизподдерживать. и Xcode По-другому, ты можешь существовать Mac,Windows или Linux Установить наибегать Android Studio。 связанный Подробные системные требования см. Веб-сайт Android-студии。 существоватьэтотвнутри,нас Воляпредставлятькаксуществовать Mac настройки включены Android Studio 3.0 или 3.0.1-Все в этой книгеприложение Всесуществоватьдваиндивидуальный Версияначальство Протестировано。

первый,отвпередлапшаиз Связьскачать Android Studio 3.0.1, если последняя версия 3.0.1 Если вы не против решить возможные незначительные проблемы, скачайте последнюю версию. тытакже Можеткотэтотвнутриизжить档серединаскачать 3.0.1 или 3.0。

Затем,двойной щелчокскачатьиздокументи ВоляAndroid Studio.appкартина标тащить放приезжатьApplications。 Если вы ранее установили Android Studio, система предложит вам использовать более новую версию. Android Studio Замените его. Все, что вам нужно, это выборзаменить.

Далее открываем Android Студия, которая вам нужна Android SDK из пути, если вы установите с помощью вперед Версияиз Android Studio,тогда по умолчанию это Кусочек В~/Library/Android/sdkсередина,Или вы можете открыть текущий проект Android Studio.,Затемизменятьприезжать“существовать MacOS начальство Настройка Тензор Раздел Флоу создан из TensorFlow 1.4 источник Оглавление,Затем打открытьtensorflow/examples/androidпапка。 После этого вы можете применитьщелкнуть Установить сообщение инструмента по ссылке или включить приехать. Android Studio изTools | Android | SDK ManagerПриходитьскачать Android SDK,нравитьсяк Вниз Экранперехватыватьартинапоказано. от SDK Во вкладке «Инструменты» вы можете выбрать конкретную версиюиз. Android SDK 工Инструмент旁边изкоробка,Затемщелкнуть确定кнопкак Установить Должен Версия:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-0zQGe2Xr-1681653027408)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/3b90efdb-6655-4e35-b74a-a44e69e17487.png)]

картина 1.4:Android SDK Менеджер по установке SDK Инструменты NDK

Наконец, из-за TensorFlow Android приложениеиспользовать C++ серединаиз родного TensorFlow Библиотека загружена. TensorFlow Модель, так что вам нужно установить Android Родной развивающий комплектNDK),Вы можете выполнить любое из следующих действий.,от Предыдущий индивидуальный снимок экрана, полученный в Android SDK Manager,илиили напрямуюотэтотвнутрискачать NDK。 NDK Версия r16b и r15c Все они проверены и могут быть использованы в этой книге. Android приложение. Если вы загружаете напрямую NDK,носуществовать打открытьпроективыбирать Android Studio изFile | Project Structureназад,Вам также могут понадобиться настройки Android NDK,нравитьсяк Вниз Экранперехватыватьартина Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-qqIIkRPs-1681653027408)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/1f6a2d74-0be0-4f36-9796-2cf66eb1694f.png)]

картина 1.5:настраиватьпроектсорт Неиз Android NDK Расположение

Установитьинастраивать Понятно Android SDK и NDK После этого вы можете протестировать Запуске образец приложения TensorFlow для Андроид.

TensorFlow Mobile и TensorFlow Lite

существоватьнасоткрыть始бегать Пример TensorFlow iOS и Android Прежде чем подавать заявку, давайте кое-что уточним. TensorFlow когдавпередиметьдвадобрыйсуществоватьдвигатьсяоборудование Развивайтесь дальшеи Развертывание приложения глубокого обученияиз метода: TensorFlow Mobile и TensorFlow Lite。 TensorFlow Mobile от да с самого начала TensorFlow из части, и TensorFlow Lite для улучшения развертывания TensorFlow Это более новый метод, поскольку он имеет лучшую производительность и меньший размер. Но даиметь отдельные ключевые факторы позволяют нам сосредоточиться на существовании в этой книге. TensorFlow Мобильный, хотя еще представлен в разделе существования одининдивидуальныйглава TensorFlow Lite:от TensorFlow 1.8 и 2018 Год 5 лунаиз Google I/O Запуск, Тензор Флоу Lite Все еще существуетразвивать штатный предварительный просмотр. В настоящее время существуют, готовы к запуску в производство на мобильных устройствах TensorFlow Чтобы подать заявку,вы должны следовать Google изпредположениеиспользовать TensorFlow Mobile。

Мы решили сейчас сосредоточиться на TensorFlow Mobile по другой причине, да, хотя TensorFlow Lite Поддерживается только оператор «верно Модель подает», но TensorFlow Mobile Поддерживает настройку для добавления по умолчанию TensorFlow Mobile Нет Поддерживатьновый Операция符,Вы обнаружите, что это случается довольно часто во всех видах приложения Модель среди нас.

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

Запустите пример приложения TensorFlow для iOS.

существуют последние две части этого раздела, нашего тестового проекта «Воля». TensorFlow 1.4 Поставляется с Три примера iOS приложениеи Четыреиндивидуальный Пример Android приложение, чтобы убедиться, что вы правильно перешли на настройку TensorFlow улучшить среду и быстро просмотреть часть ее содержимого TensorFlow Мобильные приложения могут это сделать.

Три примера TensorFlow iOS приложениеизисточниккод Кусочек Вtensorflow/examples/ios: simple,cameraиbenchmark。 для Чтобы успешно реализовать некоторые образцы, вам необходимо сначала скачать индивидуальную версию Google Обучение из модели глубокого обучения, называемой для Inception,использовать Вкартинакартина识Не。 Inception иметьмногоиндивидуальный Версия:v1 приезжать v4,существовать Каждыйиндивидуальный较новыйиз Версиясерединаточный率更высокий。 существоватьэтотвнутри,Мы Воляиспользовать Inception v1 делатьдлядля Чторазвиватьиз Пример。 скачать Модельдокументназад,Воляи Модель Взаимно关издокументкопироватьприезжать Каждыйиндивидуальный Образецкнигаизdataпапкасередина:

Язык кода:javascript
копировать
curl -o ~/graphs/inception5h.zip https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip 
unzip ~/graphs/inception5h.zip -d ~/graphs/inception5h 
cd tensorflow/examples/ios 
cp ~/graphs/inception5h/* simple/data/ 
cp ~/graphs/inception5h/* camera/data/ 
cp ~/graphs/inception5h/* benchmark/data/ 

сейчассуществовать,существовать打открытьибегатьприложение Извперед,изменятьприезжать Каждыйиндивидуальныйappпапкаивыполнить следующую командукскачать Каждыйиндивидуальныйприложение Необходимый Pod:

Язык кода:javascript
копировать
cd simple 
pod install 
open tf_simple_example.xcworkspace 
cd ../camera 
pod install 
open tf_camera_example.xcworkspace 
cd ../benchmark 
pod install 
open tf_benchmark_example.xcworkspace  

Тогда ты сможешь существовать iOS оборудованиеначальствобегатьэтоттрииндивидуальныйприложение,или ВОЗсуществовать iOS Запустить Simple и Benchmark и приложение на эмуляторе. Если вы нажмете кнопку «Проектировать модель» после простого приложения, вы увидите текстовое сообщение о том, что «приехать приезжать» загружено. TensorFlow Inception модель, за которой следуют несколько лучших результатов распознавания и значений достоверности.

Если приложение бенчмарка существует, нажмите Benchmark Model кнопка вы Воля просмотреть приезжатьпроектировать Модель закончилась 20 раз от среднего времени. Например,существоватьяиз iPhone 6 В среднем это занимает около 0.2089 Второй,существовать iPhone 6 В среднем требования к симулятору составляют 0.0359 Второй.

наконец,существовать iOS оборудованиеначальствобегать照Взаимно机приложениеи Воля Чтоверно准Взаимно机Можетк Кты实часпоказывать Долженприложениесмотретьприезжатьи识Неизвернослон。

Запустите образец приложения TensorFlow для Android.

tensorflow/examples/androidсерединаиметь Четыреиндивидуальный Образецкнига TensorFlow Android приложения соответственно TF Классификация, ТФ Обнаружение, ТФ Голос и TF стилизованный. бегатьэтотнекоторый Примериз Самый простой способэто использовать Android Studio существоватьвпередлапшаизпапкасередина打открытьпроект,Как показано в разделе «Настройка Android Studio».,Затемпроходитьредактироватьпроектизbuild.gradleдокумент Порядок прогрессаиндивидуальный Изменять,и Воляdef nativeBuildSystem = 'bazel'Изменятьдляdef nativeBuildSystem = 'none'

сейчассуществовать,Воля Android Подключите устройство к компьютеру, а затем подключите его к компьютеру. Android Studio изRun | Run 'android'строить,Установитьибегать Долженприложение.этотвстречасуществоватьтыизоборудование Установить на Четыреиндивидуальныйимясказатьдля“TF Классификация», «ТФ Обнаружение», «ТФ Голос"и"ТФ стилизованный"из Android приложение. “TF Классификация» похожа на iOS Взаимно机приложениеодин Образец,использовать TensorFlow Inception v1 Камера модельного устройства точно выполняет классификацию изображений в режиме реального времени. “TF Обнаружение”использовать另одиндобрый Модель,сказатьдляОднокадровый многокадровый детекторSSD)и Мобил Нет, это Google Выпущен новый набор инструментов глубокого обучения, специально предназначенных для мобильных и встраиваемых устройств. Выполнить Обнаружение объектов, пожалуйста, найдите значок прибытияизверно, чтобы нарисовать прямоугольник. “TF Речь» использовать еще один вариант глубокого обучения (распознавание речи)Модель Приходить收слушатьи识Неодин Маленькийчастьодин词,НапримерYes,No,Left,Right,StopиStart。 “TF «Стилизовать» используйте другую модель, чтобы изменить внешний вид камеры, подобный стилю проживания в карте. связанныйэтотнекоторыйприложениеиз更многоподробныйинформация,ты Можетксуществоватьэтаиндивидуальная страницасередина查смотреть TensorFlow Android Образец документа.

Подвести итог

существования В этой главе мы объясняем, как существовать Mac и Ubuntu Установить на TensorFlow 1.4,каксуществовать Ubuntu настройки включены Инструментиметь成книгаэффект益из NVIDIA GPU Для более быстрого обучения из Модели также Как переехать AI приложениеразвивать Настройте Xcode и Android Studio。 Мы также покажем вам, как сделать что-то крутое TensorFlow Пример iOS и Android приложение. существоватьиз В оставшейся части книги мы с Волей подробно обсудим, как существоватьна основе GPU из Ubuntu Создавайте и обучайте систему виз Каждыйиндивидуальный Модельа также другие Модель и К. Вы показываете, как существует развертывание Модели в следующей среде. iOS и Android приложение и написанный код для существования мобильного устройства AI приложениеиспользуется в Модель. Теперь мы готовы и нам не терпится отправиться в путь. Это увлекательное путешествие, и мы рады поделиться им с нашими друзьями. Так,что не начинается с наших лучших друзей,Давайте разберемся, что нужно для построения приложения по определению породы собаки?

2. Классифицируйте изображения посредством трансферного обучения

начальствоодинглавасередина描описыватьиз Пример TensorFlow iOS Приложение, Простое и Camera а также Android Применить «ТФ Категория» всеиспользуются Inception v1 модель, которая Google Публикация предоставляет предварительно обученную изкартину, подобную модели глубокой нейронной сети классификации. Должен Модель Иголкаверно ImageNet прошел обучение в ImageNet Одна из самых больших и известных статуй изображений в Библиотеке данных, среди которых более 10 миллионов статуй индивидуальных изображений, помеченных, наверное, категорией слонов. Inception Модель Можетиспользовать ВВолякартинакак классификациядляУкажите одну из 1000 индивидуальных категорий。 этот 1000 Категория «Индивидуальный верный слон» включает в себя множество верных слонов из многих пород собак. Однако точность определения пород собак не очень высока, примерно для 70%,Потому что для Модель обучена распознавать большое количество верных слонов.,А не конкретное изображение, например, порода собаки или что-то в этом роде.

еслинас想提высокийточный率исуществоватьиспользоватьулучшать Модельиз Смартфонначальствостроитьдвигатьсяприложениечто делать,Ну, когда мы гуляем и смотрим на приезжающих, у нас есть забавная собака,Мы можем использовать приложение, чтобы рассказать нам, что это за собака.

существоватькнигаглавасередина,Мы, Воля, сначала обсудим, что такое верно эта и зкартина, например, задачи классификации.,мигрироватьизучатьилипереподготовка После пред-обучениеглубокое обучение Модельда Завершить задачуизсамый экономичныйиметьэффектизметод。 Затем мы, Воля К, покажем вам, как использовать хороший набор данных из собак, действительно одни из лучших изображений, например, классифицированную модель для переобучения, а такжесуществовать Нет. 1 Глава «Мобильный TensorFlow начиная". Кроме того,мы предоставим пошаговые инструкции по конвертации TensorFlow добавить вприезжатьна основе Objective-C или Swift из iOS и Android В приложении.

Подводя итог, мы Волясуществовать в этой главе представлены следующие темы:

  • мигрировать учебу - что и для чего
  • Использование моделей Inception v3 для переобучения
  • Использование моделей MobileNet для переобучения
  • существовать Пример iOS Используйте переобученную модель в своем приложении
  • существовать Пример Android Используйте переобученную модель в своем приложении
  • Добавьте TensorFlow в свои собственные приложения iOS.середина
  • Добавьте TensorFlow в свои приложения для Андроид.

Трансферное обучение – что и почему

Мы, люди, не просто начинаем изучать новые вещи. Вместо этого мы в полной мере используем то, чему научились, сознательно или нет. Искусственный интеллект — это техника, которая учится делать одно и то же, пытаясь сделать одно и то же — техника, которая обычно требует обучения только на небольшом участке большой модели среды. , который затем повторно используется в связанных задачах из новой Модели без необходимости доступа к большим данным обучения и вычислительным ресурсам, необходимым для обучения исходной Модели. В целом, трансферное обучение все еще AI серединаизодининдивидуальный Открытая проблема, потому что длясуществовать Во многих случаях человеку нужно всего лишь несколько раз попробовать несколько индивидуальных примеров, прежде чем он научится освоить что-то новое, и на обучение и обучение уйдет много времени. AI。 Да,существующаякартина поле распознавания изображений,Мигрировать обучение оказалось очень эффективным.

использовать Вкартинакартина识Неизсовременныйглубокое обучение Модельв целостностьглубокая нейронная сеть,или более конкретно,да Инструментиметь许многослойизглубинасверточная нейронная сетьCNN)。 этотдобрый CNN Нижние уровни отвечают за изучение и идентификацию функций более низкого уровня, таких как края, контуры и детали, а последний уровень определяет категории изображения. Для разных типов изображений, таких как породы собак и виды цветов, нам не нужно заново запоминать параметры и веса нижних слоев сети. Фактически, требуется несколько недель обучения, чтобы научиться распознавать современные изображения, такие как картина. CNN иметь вес, обычно миллионы или даже больше. существующаякартина подобна классификации случаев, мигрировать обучение позволяет нам использовать конкретную изкартину, например набор переподготовок, таких CNN изнаконецодинслой,Обычно не приезжать один час,А все остальные слои остаются неизменными,И достигает почти такой же точности, как приезжать,Точно так же, как мы начали обучать всю сеть в течение нескольких недель.

Основные преимущества обучения мигрировать из второго человека, нам нужно лишь небольшое количество переподготовки данных обучения. CNN из Последний слой. Если вам необходимо начать глубокую тренировку CNN из Миллионы индивидуальных параметров требуют большого количества обученных. Например, для нашей переподготовки по породе собак нам нужно только по каждой породе собак. 100 рамка накартинакартина,Вы можете создать более индивидуальное изображение, чем исходное, например, Классификационная Модель из модели классификации пород собак.

Если вы не знакомы с CNN, посмотрите одну из лучших новостей из видео и обзоров, этада Stanford CS231n курс«CNN для визуального распознавания»。 CNN это еще один человек, хорошо известный в источнике активов Michael Nielsen изсуществовать онлайн-книгу "Нейронные сети и глубокое обучение" изth 6 глава

существовать Следующийиздваиндивидуальныйчастьсередина,Мы Воляиспользовать Иголкаверно TensorFlow индивидуальныйлучший из предварительно прошедших обучение CNN Модели отдельных пород собак. Сбор данных для переподготовки модели и создания более точной модели идентификации породы собаки. Первая модель Inception v3, это лучше, чем Inception v1 Более точная модель, оптимизированная для верной точности, но большего размера. Другая модель MobileNet, оптимизированный с учетом размера и эффективности мобильных устройств. TensorFlow Поддерживатьпредварительнотренироваться Модельиз Подробный список Кусочек Вэтотвнутри

Использование моделей Inception v3 для переобучения

существоватьначальствоодинглавасерединанастраиватьиз TensorFlow В исходном коде есть Python 脚книгаtensorflow/examples/image_retraining/retrain.py,Можетиспользовать Впереподготовка Inception v3 или MobileNet Модель. существоватьбегать脚книгакпереподготовка Inception v3 Моделькруководитьсобака品добрый识Не Извперед,нас需хотетьпервыйскачатьСтэнфордский набор данных о собаках,120 индивидуальных пород собак изкартина в таблетках (вам просто нужна существующая ссылка, чтобы скачать таблички с картинкой),Только не отмечайте это знаком да).

существовать~/Downloadsсередина Разархивироватьскачатьизсобакаimages.tarдокумент,ты应Долженсуществовать~/Downloads/Imagesсерединасмотретьприезжатьпапкасписок,нравитьсяк Вниз Экранперехватыватьартинапоказано. Каждый индивидуальный папкаверно должен относиться к одной отдельной породе собак и содержать ок. 150 Изображение изображения (вам не нужно явно помечать изображение длякартины в представлении, поскольку имя длякартины используется для обозначения изображения папки, которое содержит изкартину):

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-BNHjmcvF-1681653027408)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/c8c4fa68-5db2-406d-9444-fbf1fdeb5418.png)]

картина 2.1: Отдельно папкаили собака из пород из набора собак картина лайк

Вы можете скачать набор данных,Затемсуществовать Mac начальствобегатьretrain.py脚книга,потому чтодля Должен脚книгасуществовать Взаимноверно Расположениеначальствобегать Нетвстреча花费太长час间(少Водин Маленькийчас) Небольшой набор данных (всего ок. 20,000 Чжан картина нравится), но да, как упоминалось в предыдущем главе, если вы существуете GPU управляемый Ubuntu Если вы сделаете это, выполнение сценария займет всего несколько минут. Кроме того, для переобучения используются большие изображения, такие как наборы данных. Mac Путешествие по торгу может занять часы и дни, поэтому существовать GPU управляемыйкомпьютерначальствобегатьэтодаиметьзначениеиз。

假设тыуже经создавать Понятно/tf_fileОглавлениеи/tf_file/dogs_bottleneckОглавление,Тогда команда переподготовка Моделиз выглядит следующим образом:

Язык кода:javascript
копировать
python tensorflow/examples/image_retraining/retrain.py  
--model_dir=/tf_files/inception-v3  
--output_graph=/tf_files/dog_retrained.pb  
--output_labels=/tf_files/dog_retrained_labels.txt  
--image_dir ~/Downloads/Images  
--bottleneck_dir=/tf_files/dogs_bottleneck 

этотпятьиндивидуальныйпараметрсуществоватьэтотвнутри需хотетьодиннекоторый解释:

  • --model_dirобозначение应Должен Зависит отretrain.pyсдвигатьсяскачать Inception v3 Путь к каталогу модели, если он еще не находится в существующем каталоге.
  • --output_graphвыражать再тренироваться Модельизимясказатьипуть。
  • --output_labelsда Зависит откартинакартинаданныенаборизпапка(Этикетка)имясказать组成издокумент,Позже Воля переподготовил его и использовал для правильного использования нового изображения изображения, подлежащего засекречиванию.
  • --image_dirдаиспользовать Впереподготовка Inception v3 Модельизкартинакартинаданныенаборизпуть。
  • --bottleneck_dirиспользовать В缓житьсуществоватьузкое место(наконецодинслой Извпередиз那одинслой)начальствогенерироватьизрезультат; Последний слойиспользуетэтот классифицирует эти результаты. Во время существованияпереподготовки используется каждый образ ть несколько раз, но образ узкого места остается прежним, даже если Воля придет перепроектировать сценарий переподготовки и да. поэтому,В первый раз это занимает больше времени,Потому что для этого нужно создать узкое место в результате.

существовать再тренироваться期间,ты Воля Каждый 10 шагсмотретьприезжать 3 значения, итог по умолчанию 4,000 шаг. вперед 20 индивидуальныйшагиназад 20 индивидуальныйшага также Окончательная точность следующая.Показано:

Язык кода:javascript
копировать
INFO:tensorflow:2018-01-03 10:42:53.127219: Step 0: Train accuracy = 21.0% 
INFO:tensorflow:2018-01-03 10:42:53.127414: Step 0: Cross entropy = 4.767182 
INFO:tensorflow:2018-01-03 10:42:55.384347: Step 0: Validation accuracy = 3.0% (N=100) 
INFO:tensorflow:2018-01-03 10:43:11.591877: Step 10: Train accuracy = 34.0% 
INFO:tensorflow:2018-01-03 10:43:11.592048: Step 10: Cross entropy = 4.704726 
INFO:tensorflow:2018-01-03 10:43:12.915417: Step 10: Validation accuracy = 22.0% (N=100) 
... 
... 
INFO:tensorflow:2018-01-03 10:56:16.579971: Step 3990: Train accuracy = 93.0% 
INFO:tensorflow:2018-01-03 10:56:16.580140: Step 3990: Cross entropy = 0.326892 
INFO:tensorflow:2018-01-03 10:56:16.692935: Step 3990: Validation accuracy = 89.0% (N=100) 
INFO:tensorflow:2018-01-03 10:56:17.735986: Step 3999: Train accuracy = 93.0% 
INFO:tensorflow:2018-01-03 10:56:17.736167: Step 3999: Cross entropy = 0.379192 
INFO:tensorflow:2018-01-03 10:56:17.846976: Step 3999: Validation accuracy = 90.0% (N=100) 
INFO:tensorflow:Final test accuracy = 91.0% (N=2109) 

Точность обучения нейронной сети использовалась для обучения изкартины, например, для точности классификации, тогда как точность проверки нейронной сети не использовалась для обучения изкартины, например, для точности проверки. поэтому,Точность валидации да измерения Точность модели является более надежным показателем,и обычно должен быть немного меньше точности обучения,Даеслитренироваться收敛ируководитьпридетсяочень хороший,То есть, да,обучение Модельда否既Нет欠拟合также Нет Проходить拟合。

Если точность обучения высокая, но точность проверки по-прежнему низкая, это означает, что модель переоснащена. Если точность обучения по-прежнему низкая, это указывает на то, что модель не подходит. Аналогично, перекрестная энтропия — это значение функции потерь, которое в целом должно уменьшаться, если переобучение проходит успешно. Наконец, точность теста зависит от изображения, которое не использовалось для обучения и проверки. Обычно с этимда наиболее точно можно сказать «изопереподготовка Модельиз».

Как показано на лицевой стороне вывода,существовать по окончании переподготовки,нассмотретьприезжать Точность проверкиитренироваться精度Взаимно似(90% и 93% по сравнению с первоначальным 3% и 21%), окончательная точность теста 91% 。 Перекрестная энтропия также является отправной точкой. 4.767 Спуск приезжатьластиз 0.379。 поэтому,Мы представляем существующую индивидуальную модель, которая очень хорошо подходит для переобучения модели распознавания пород собак.

для дальнейшего повышения точности,ты Можеткиспользоватьretrain.pyиздругойпараметр(Напримертренироватьсяшаг) (--how_many_training_steps),изучать率(--learning_rate),иданныерасширение(--flip_left_right, --random_crop, --random_scale, --random_brightness). Обычно этада — утомительный процесс, включающий много «грязной работы», этада — один из самых известных экспертов по глубокому обучению. Andrew Ng существоватьониз“приложениеглубокое обучениеиз基книга原理”演讲середина提приезжатьиз(视频Можетсуществоватьк Вниз Расположениепопытаться найтиприезжать)。

ты Можеткиспользовать另одининдивидуальный Python 脚книгаlabel_imageПриходитьвернопройтипереподготовкаиз Модельруководитьбыстрыйтест,ктестссебяизкартинакартина(Например/tmp/lab1.jpgсерединаиз Labrador Retriever картинакартина),ты Можетксуществоватьпервыйверно Чторуководитьнравиться Внизстроитьназадбегать Должен脚книга:

Язык кода:javascript
копировать
bazel build tensorflow/examples/image_retraining:label_image 

bazel-bin/tensorflow/examples/label_image/label_image  
--graph=/tf_files/dog_retrained.pb  
--image=/tmp/lab1.jpg  
--input_layer=Mul  
--output_layer=final_result  
--labels=/tf_files/dog_retrained_labels.txt 

тывстречасмотретьприезжатьик Внизсодержание Взаимно似извпередпятьиндивидуальный Классификациярезультат(Да,Из-за случайных изменений в сети,может быть не совсем таким же) следующим образом:

Язык кода:javascript
копировать
n02099712 labrador retriever (41): 0.75551 
n02099601 golden retriever (64): 0.137506 
n02104029 kuvasz (76): 0.0228538 
n02090379 redbone (32): 0.00943663 
n02088364 beagle (20): 0.00672507 

--input_layer (Mul)и--output_layer (final_result)изценность очень важна–должени Модельсерединаопределениеизценить Взаимно同,этот Образец Классификация才能完全起делатьиспользовать。 Если вам интересно, как их получить (откартина, она же Модель,документdog_retrained.pbсерединаполучать),ноиметьдваиндивидуальный TensorFlow Инструменты могут помочь. Нет.одининдивидуальныйдаподходящийкогда命имяизsummarize_graph。 этот метод построить и реализовать:

Язык кода:javascript
копировать
bazel build tensorflow/tools/graph_transforms:summarize_graph

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=/tf_files/dog_retrained.pb

Ваш вид Воля приезжать похож на следующий из сводных результатов:

Язык кода:javascript
копировать
No inputs spotted.
No variables spotted.
Found 1 possible outputs: (name=final_result, op=Softmax)
Found 22067948 (22.07M) const parameters, 0 (0) variable parameters, and 99 control_edges
Op types used: 489 Const, 101 Identity, 99 CheckNumerics, 94 Relu, 94 BatchNormWithGlobalNormalization, 94 Conv2D, 11 Concat, 9 AvgPool, 5 MaxPool, 1 DecodeJpeg, 1 ExpandDims, 1 Cast, 1 MatMul, 1 Mul, 1 PlaceholderWithDefault, 1 Add, 1 Reshape, 1 ResizeBilinear, 1 Softmax, 1 Sub

иметьодининдивидуальный Может能извыход,имясказатьдляfinal_result。 Неудачная изда,иметьчасsummarize_graph工Инструментбезиметь告诉насвходитьимясказать,потому чтодляэто似乎верноиспользовать Вобучениесмысл узлаприезжатьозадаченный。 удалитьтолькоиспользовать Вобучениеузел(нас Волясуществовать稍назадобсуждать)после,summarize_graph工Инструмент Воля Вернуть правильноизвходитьимясказать。 Еще один по имени TensorBoard Инструмент для нашей модели обеспечивает более полную моделькартины. Если напрямую из бинарного документа Установить TensorFlow, вы должны уметь просто программировать TensorBoard,Потому что по умолчанию,это Установитьсуществовать/usr/local/binсередина。 Но да, если понравится наш форвардисточниккод Установить TensorFlow, вы можете собрать его с помощью следующей команды TensorBoard:

Язык кода:javascript
копировать
git clone https://github.com/tensorflow/tensorboard 
cd tensorboard/ 
bazel build //tensorboard 

сейчассуществовать,убеждатьсяты Инструментиметь/tmp/retrained_logs,существоватьбегатьretrain.pyчассдвигатьсясоздаватьибегать:

Язык кода:javascript
копировать
bazel-bin/tensorboard/tensorboard --logdir /tmp/retrain_logs

Затемсуществовать浏览устройствосерединазапускать URL http://localhost:6006。 первый,Вы, Воля, видите, приезжать точность картина,нравитьсяк Вниз Экранперехватыватьартина Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-GFin3z7h-1681653027409)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/3ae39776-c298-4b42-9125-f25ca84c9ed2.png)]

картина 2.2: Inception v3 переподготовка Модельобучение ипроверка точности

существовать Внизлапшаиз Экранперехватыватьартинасерединаизперекрестная энтропиякартина,инас Извпередверно Вбегатьretrain.pyизвыход Место描описыватьизодин Образец:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-hpiU85KV-1681653027409)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/cd4cea6a-8847-40bd-9ec4-3d9696972a5f.png)]

картина 2.3: Inception v3 переподготовка Модельобучения и валидации перекрестной энтропии

сейчассуществоватьщелкнутьGRAPHSвкладка,ты ВолясмотретьприезжатьодининдивидуальныйимядляMulиздействовать,Еще один по имениfinal_resultиздействовать , как показано ниже:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-K2HEMYPh-1681653027409)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/18aa75d8-28e3-497c-ba8f-145baa6cee37.png)]

картина 2.4:переподготовка МодельсерединаизMulиfinal_resultузел

действительныйначальство,еслиты希望и TensorFlow Для небольшого взаимодействия можно попробовать несколько строк Python код, чтобы узнать выходной слой и входной слой и имя, например iPython Показано взаимодействие:

Язык кода:javascript
копировать
In [1]: import tensorflow as tf 
In [2]: g=tf.GraphDef() 
In [3]: g.ParseFromString(open("/tf_files/dog_retrained.pb", "rb").read()) 
In [4]: x=[n.name for n in g.node] 
In [5]: x[-1:] 
Out[5]: [u'final_result'] 

Обратите внимание, потому что что无法保证узелиззаказ,Поэтому этот абзац не всегда актуален,ноэтов целомвстречадлятыпоставлять Необходимыйинформацияилипроверять。

сейчассуществовать,Готовы обсудить дальнейшую доработку переподготовкаиз Модель.,к便Можетксуществуют на мобильных устройствахразвертыватьибегатьэто。 переподготовкаиз Модельдокументdog_retrained.pbизразмер слишком большой,О 80 МБ, существующие для развертывания на мобильных устройствах, следует оптимизировать в два этапа:

  1. Удалить неиспользуемые узлы:удалить Модельсерединатолькосуществоватьтренироваться期间использоватьносуществоватьрассуждение期间Нет需хотетьизузел。
  2. Количественная модель:Воля Модельпараметриз Местоиметь 32 Кусочек Преобразование чисел с плавающей запятойдля 8 Кусочекценить. Размер этой модели Воля Модель можно уменьшить, приехав в исходный размер из 25% при сохранении примерно той же точности.

Документация TensorFlowпоставлятьсвязанный量化及Что工делать原理из更многоподробныйинформация。

иметьдвадобрыйметод Можетк执ХОРОШОвпередлапшаиздваиндивидуальный Задача:использоватьstrip_unusedИнструментыз旧методииспользоватьtransform_graphИнструментызновыйметод。

让нассмотретьсмотреть旧методиз工делать原理:первыйвыполнить следующую командуксоздаватьодининдивидуальный Модель,Все узлы, которые не были удалены, удаляются:

Язык кода:javascript
копировать
bazel build tensorflow/python/tools:strip_unused 

bazel-bin/tensorflow/python/tools/strip_unused  
  --input_graph=/tf_files/dog_retrained.pb  
  --output_graph=/tf_files/stripped_dog_retrained.pb  
  --input_node_names=Mul  
  --output_node_names=final_result  
     --input_binary=true 

Если вывод изображения существует в проекте в виде кода Python, вы можете найти правильное название места проживания по имени входного слоя:

Язык кода:javascript
копировать
In [1]: import tensorflow as tf 
In [2]: g=tf.GraphDef() 
In [3]: g.ParseFromString(open("/tf_files/ stripped_dog_retrained.pb", "rb").read()) 
In [4]: x=[n.name for n in g.node] 
In [5]: x[0] 
Out[5]: [u'Mul'] 

Теперь используйте следующую команду для количественной оценки модели:

Язык кода:javascript
копировать
python tensorflow/tools/quantization/quantize_graph.py  
   --input=/tf_files/stripped_dog_retrained.pb   
--output_node_names=final_result   
--output=/tf_files/quantized_stripped_dogs_retrained.pb  
   --mode=weights 

после,Можетксуществовать iOS и Android приложениесерединаразвертыватьииспользовать Модельquantized_stripped_dogs_retrained.pb,Мы волясуществовать этого главы рассмотрим возможность проживания в следующем разделе.

Зачистка неразрезанных узлов и Количественная модельиз Другой способэто использоватьсказатьдляtransform_graphиз工Инструмент。 этотда TensorFlow 1.4 Новые методы рекомендованы и могут существовать. Python label_image脚книгасередина正常工делать,Дасуществоватьразвертыватьприезжать iOS и Android Приложение по-прежнему приводит к неправильному распознаванию результата.

Язык кода:javascript
копировать
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph  
  --in_graph=/tf_files/dog_retrained.pb  
  --out_graph=/tf_files/transform_dog_retrained.pb  
  --inputs='Mul'  
  --outputs='final_result'  
  --transforms=' 
    strip_unused_nodes(type=float, shape="1,299,299,3") 
    fold_constants(ignore_errors=true) 
    fold_batch_norms 
    fold_old_batch_norms 
    quantize_weights' 

существоватьтестиспользуется вlabel_image脚книга Можеткправильныйбегатьquantized_stripped_dogs_retrained.pbиtransform_dog_retrained.pb。 Да Толькоиметь Нет.одининдивидуальный Можетксуществовать iOS и Android Приложение работает нормально.

связанныйкартинаизменять换Инструментызподробныйдокумент,Видеть Что GitHub README

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

начальствоодин节Чжуншенгизслезатьи Количественная Размер модели все еще превышает 20MB。 этада для переобучения из готовых Inception v3 Модель Крупномасштабная модель глубокого обучения, имеющая более 2500 Тысячи параметров и Inception v3 Мы не стремимся быть мобильными в первую очередь.

2017 Год 6 луна, Google выпустил MobileNets v1, всего 16 добрый Иголкаверно TensorFlow Модель глубокого обучения Mobile-first. эти несколько моделейиз всего лишь нескольких размеров МБ, с 47 Десять тысяч к 424 10 000 параметров, он по-прежнему обеспечивает хорошую точность (только лучше, чем Inception v3 ниже). связанный Дополнительная информация,ВидетьЧтосописыватьдокумент

начальствоодин节серединаобсуждатьизretrain.py脚книгавозвращатьсяподдерживатьна основе MobileNet Модельизпереподготовка。 Просто запустите следующую команду:

Язык кода:javascript
копировать
python tensorflow/examples/image_retraining/retrain.py  
  --output_graph=/tf_files/dog_retrained_mobilenet10_224.pb  
  --output_labels=/tf_files/dog_retrained_labels_mobilenet.txt  
  --image_dir ~/Downloads/Images  
  --bottleneck_dir=/tf_files/dogs_bottleneck_mobilenet  
  --architecture mobilenet_1.0_224 

генерироватьиз Этикеткадокументdog_retrained_labels_mobilenet.txtдействительныйначальствоииспользовать Inception v3 Модель при переобучении генерировала те же теги, что и документ. --architectureпараметробозначение 16 индивидуальный MobileNet Модель Изодин,И ценностьmobilenet_1.0_224выражатьиспользовать Модельразмердля 1.0 из Модель (верно для других параметров, остальные три человека могут выбирать значения соответственно 0.75、0.50 и 0.25 – 1.0, наоборот, точный, но максимально размерный для 0.25)и 224 Сделайте длякартина размером ввода (остальные три отдельных значения предназначены для 192、160 и 128)。 если Воля_quantizedдобавить вприезжать Значение схемыизконец,Прямо сейчас--architecture mobilenet_1.0_224_quantized,Тогда Модель также квантуется,отв результате чегопереподготовкаиз Модельразмеродля 5.1MB。 Нет Количественная модельизразмеродля 17MB。

ты Можеткв соответствии ск Внизшагтест先впередиспользоватьlabel_imageгенерироватьиз Модель:

Язык кода:javascript
копировать
bazel-bin/tensorflow/examples/label_image/label_image  
--graph=/tf_files/dog_retrained_mobilenet10_224.pb  
--image=/tmp/lab1.jpg  
--input_layer=input  
--output_layer=final_result  
--labels=/tf_files/dog_retrained_labels_mobilenet.txt  
--input_height=224  
--input_width=224  
--input_mean=128  
--input_std=128 

n02099712 labrador retriever (41): 0.824675 
n02099601 golden retriever (64): 0.144245 
n02104029 kuvasz (76): 0.0103533 
n02087394 rhodesian ridgeback (105): 0.00528782 
n02090379 redbone (32): 0.0035457 

пожалуйста, обрати внимание,существоватьбегатьlabel_imageчас,input_layerимядляinput。 Мы можем использовать интерактивный iPython кодили вперед Посмотрите сводную таблицу прибытия, чтобы найти это имя:

Язык кода:javascript
копировать
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph  
--in_graph=/tf_files/dog_retrained_mobilenet10_224.pb 
Found 1 possible inputs: (name=input, type=float(1), shape=[1,224,224,3])  
No variables spotted. 
Found 1 possible outputs: (name=final_result, op=Softmax)  
Found 4348281 (4.35M) const parameters, 0 (0) variable parameters, and 0 control_edges 
Op types used: 92 Const, 28 Add, 27 Relu6, 15 Conv2D, 13 Mul, 13 DepthwiseConv2dNative, 10 Dequantize, 3 Identity, 1 MatMul, 1 BiasAdd, 1 Placeholder, 1 PlaceholderWithDefault, 1 AvgPool, 1 Reshape, 1 Softmax, 1 Squeeze 

Итак, когда же нам следует существовать мобильное устройство? на Inception v3 или MobileNet переподготовкаиз Модель? Если вы хотите получить максимальную точность, вы должны и можете использовать основе Inception v3 изпереподготовка Модель. Если скорость является вашей главной заботой, вам следует учитывать минимальный размер параметра, например размер входных данных. MobileNet Переобучите модель в обмен на некоторую потерю точности.

benchmark_modelдадлятыпоставлять Модельточные данныеизодиндобрый工Инструмент。 Сначала создайте его следующим образом:

Язык кода:javascript
копировать
bazel build -c opt tensorflow/tools/benchmark:benchmark_model

Затем,Иголкавернона основе Inception v3 или MobileNet v1 изпереподготовка Модельбегатьэто:

Язык кода:javascript
копировать
bazel-bin/tensorflow/tools/benchmark/benchmark_model  
--graph=/tf_files/quantized_stripped_dogs_retrained.pb  
--input_layer="Mul"  
--input_layer_shape="1,299,299,3"  
--input_layer_type="float"  
--output_layer="final_result"  
--show_run_order=false  
--show_time=false  
--show_memory=false  
--show_summary=true  

Вы, Воля, получаете довольно длинный вывод и в конечном итоге получаете строку типа Have FLOPS из Оценочная стоимость: 11,42B, это означает, что она Воляиспользована основе Inception v3 изпереподготовка Модельо 11B FLOPS (операции с плавающей запятой) для вывода. iPhone 6 бегать О 2 B FLOPS,поэтомусуществовать iPhone 6 начальствобегать Модель Нужно 5–6 Второй. Другие современные смартфоны могут запускать 10B FLOPS。

проходить Волякартинадокументзаменятьдляна основе MobileNet Модельизпереподготовка Модельdog_retrained_mobilenet10_224.pbи重новыйбегать基准тест工Инструмент,ты Волясмотретьприезжать FLOPS Оценка становится приблизительной. 1.14B, примерно быстро 10 раз.

существовать Пример iOS Используйте переобученную модель в своем приложении

нассуществовать Нет. 1 Глава «Мобильный TensorFlow часть»серединасмотретьпожалуйста, приходите iOS Простой Примериспользовать Понятно Inception v1 Модель. для составления приложенияиспользовать мы прошли переподготовкуиз Inception v3 Модельи MobileNet Модель Чтобы лучше идентифицировать собаку по породам, нам необходимо в приложение внести некоторые изменения. Во-первых, давайте посмотрим на существование iOS Простойприложениеиспользуется впройтипереподготовкаизquantized_stripped_dogs_retrained.pbвстреча发生什么:

  1. двойной щелчокtensorflow/examples/ios/simpleсерединаизtf_simple_example.xcworkspaceдокументк Xcode 打открытьприложение
  2. тащитьдвигатьсянасиспользовать Приходитьтестlabel_image脚книгаизquantized_stripped_dogs_retrained.pbМодельдокумент,dog_retrained_labels.txtЭтикеткадокументиlab1.jpgкартинакартинадокумент,Затем перетащите приезжатьпроектныепапки,И убедитесь, что отмечены флажки «По запросу копироватьпроект» и «Добавить цель проживания».,нравитьсяк Вниз Экранперехватыватьартина Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-sbBZuuPp-1681653027409)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/d2e25f9d-c88d-4fe5-918d-ba7e64420682.png)]

картина 2.5:Воляпереподготовкаиз Модельдокументи Этикеткадокументдобавить вприезжатьприложение

  1. щелкнуть Xco​​de серединаизRunModelViewController.mmдокумент,Должендокументиспользовать TensorFlow C++ API Входные данные процессакартинакартина,проходить Inception v1 Модельбегатьэто,и получите результаты классификации изображений,и измените строку:
Язык кода:javascript
копировать
NSString* network_path = FilePathForResourceName(@"tensorflow_inception_graph", @"pb");
NSString* labels_path = FilePathForResourceName(@"imagenet_comp_graph_label_strings", @"txt");
NSString* image_path = FilePathForResourceName(@"grace_hopper", @"jpg");

Используйте правильное имя документа из Модель, имя документа тега и тестовое изображение, например имя, для следующих операций:

Язык кода:javascript
копировать
NSString* network_path = FilePathForResourceName(@"quantized_stripped_dogs_retrained", @"pb");
NSString* labels_path = FilePathForResourceName(@"dog_retrained_labels", @"txt");
NSString* image_path = FilePathForResourceName(@"lab1", @"jpg");
  1. такой жесуществоватьRunModelViewController.mmсередина,хотеть匹配насиз Inception v3(от v1)переподготовка Модель Необходимыйвходитькартинакартинаразмер,пожалуйста Воляconst int wanted_width = 224;иconst int wanted_height = 224;серединаиз224ценить Изменятьдля299,и同час Воляconst float input_mean = 117.0f;серединаизценить ]иconst float input_std = 1.0f;к128.0f
  2. отк Вниз项Изменятьвходитьивыход Имя узлаизценить:
Язык кода:javascript
копировать
std::string input_layer = "input"; 
std::string output_layer = "output"; 

правильное значение для:

Язык кода:javascript
копировать
std::string input_layer = "Mul"; 
std::string output_layer = "final_result"; 
  1. наконец,ты Можеткредактироватьdog_retrained_labels.txtдокументкудалить Каждый ХОРОШОсерединаизвпередгидnxxxxнить(Например,удалитьn02099712 labrador retrieverсерединаизn02099712)– существовать Mac начальство,ты Можеткпроходить Нажмите и удерживайтеOptionключ Затемруководитьвыбиратьиудалить–отиделать识Нерезультат更Инструмент Может读性

立Прямо сейчасбегатьприложение,Затемщелкнутьбегать Моделькнопка,существует Xcode из окна консоли или поля редактирования приложения,Вы, Воля, увидите следующие результаты распознавания.,ибегатьlabel_image脚книгаизрезультат Нет常один致:

Язык кода:javascript
копировать
Predictions: 41 0.645  labrador retriever 
64 0.195  golden retriever 
76 0.0261  kuvasz 
32 0.0133  redbone 
20 0.0127  beagle 

хотетьиспользовать MobileNet(mobilenet_1.0_224_quantized)тренироваться Модельdog_retrained_mobilenet10_224.pb,Пожалуйста, следуйте инструкциям, аналогичным ийствовать.,исуществоватьшаг 2 и 3 середина,насиспользоватьdog_retrained_mobilenet10_224.pb,Дасуществоватьшаг 4 середина,нас需хотеть保留const int wanted_width = 224;и const int wanted_height = 224;,только Воляconst float input_meanиconst float input_stdИзменятьдля128。 наконец,существоватьшаг 5 середина,насдолжениспользоватьstd::string input_layer = "input";иstd::string output_layer = "final_result";。 этотнекоторыйпараметриdog_retrained_mobilenet10_224.pbизlabel_image脚книгаиспользоватьизпараметр Взаимно同。

Снова запустите приложение, и ваша Воля посмотрит, как приезжает аналогичный лучший результат.

существовать Пример Android Используйте переобученную модель в своем приложении

существовать Android из“TF Классификация”приложениеиспользуется впройтипереподготовкаиз Inception v3 Модельи MobileNet Модель также очень проста. пожалуйстав соответствии с照здесьизшагтестдваиндивидуальныйпереподготовкаиз Модель:

  1. использовать Android Studio 打открыть Кусочек Вtensorflow/examples/androidсерединаиз Пример TensorFlow Android приложение.
  2. Волядваиндивидуальныйпереподготовкаиз Модельquantized_stripped_dogs_retrained .pbиdog_retrained_mobilenet10_224.pbа также Этикеткадокументdog_retrained_labels.txtтащить放приезжать android приложениеизassetsпапкасередина。
  3. 打открытьдокументClassifierActivity.java,киспользовать Inception v3 тренироватьсяназадиз Модель,изаменятьк Внизкод:
Язык кода:javascript
копировать
private static final int INPUT_SIZE = 224; 
private static final int IMAGE_MEAN = 117; 
private static final float IMAGE_STD = 1; 
private static final String INPUT_NAME = "input"; 
private static final String OUTPUT_NAME = "output"; 

этотнекоторый ХОРОШО:

Язык кода:javascript
копировать
private static final int INPUT_SIZE = 299; 
private static final int IMAGE_MEAN = 128; 
private static final float IMAGE_STD = 128; 
private static final String INPUT_NAME = "Mul"; 
private static final String OUTPUT_NAME = "final_result"; 
private static final String MODEL_FILE = "file:///android_asset/quantized_stripped_dogs_retrained.pb"; 
private static final String LABEL_FILE = 
"file:///android_asset/dog_retrained_labels.txt";  
  1. или ВОЗ,хотетьиспользовать MobileNet тренироватьсяназадиз Модель,Пожалуйста, используйте следующую строку кода для замены:
Язык кода:javascript
копировать
private static final int INPUT_SIZE = 224; 
private static final int IMAGE_MEAN = 128; 
private static final float IMAGE_STD = 128; 
private static final String INPUT_NAME = "input"; 
private static final String OUTPUT_NAME = "final_result"; 
private static final String MODEL_FILE = "file:///android_asset/dog_retrained_mobilenet10_224.pb"; 
private static final String LABEL_FILE = "file:///android_asset/dog_retrained_labels.txt";
  1. Воля Android Подключите устройство к компьютеру и запустите на нем приложение. Затем нажмите TF Классификацияприложение,Камера Воля ссылается на фотографии собак,ты Волясуществовать Экранначальствосмотретьприезжатьоптимальныйрезультат.

этот Сразудасуществовать Пример TensorFlow iOS и Android приложениеиспользуется вдваиндивидуальныйпройтипереподготовкаиз Модель Место需хотетьизвсе。 Теперь, когда вы знаете, как существовать Пример Используйте переобученную модель в своем приложение, то вам может быть интересно из Следующее да Как Воля TensorFlow Добавить жилье из дома сейчас иметь iOS или Android приложение, чтобы вы могли начать добавлять AI Верно, у вас есть мощные функции для мобильных приложений. в этом содержании подробно обсуждается остальная часть данных главы Воли.

Добавьте TensorFlow в свои собственные приложения iOS.

существовать TensorFlow из Первые дни Версиясередина,Воля TensorFlow Добавление места проживания в ваше сизприложение очень утомительно и требует использования. TensorFlow из Ручная процесс сборки и др. Ручные настройки. существовать TensorFlow 1.4 , процесс очень простой, но существует TensorFlow Подробные шаги не описаны подробно на веб-сайте. отсутствует из-за чего-то отсутствует, связанный с тем, как существует основе Swift из iOS приложениеиспользуется в TensorFlow издокумент; Пример TensorFlow iOS приложение Всесуществовать Objective-C , они позвонили TensorFlow из C++ API。 Давайте посмотрим, как мы можем добиться большего.

Добавьте TensorFlow в свое iOS-приложение Objective-C.

первый,в соответствии с照к Внизшаг Воля Инструментиметькартинакак классификация Функцияиз TensorFlow Добавить жильевашиз Objective-C iOS приложение (наша Воляот индивидуального нового приложения, но да, если нужно Воля TensorFlow Добавьте жилье сейчас иметьприложение, первый шаг можно пропустить):

  1. существоватьтыиз Xcode середина,щелкнуть"документ | Новый | проект …”,выбирать“Single View App”,Затем выберите следующий из,входитьHelloTensorFlowделатьдля产品имясказать,выбирать Obj-C Создал на языке для, затем щелкнуть далее и выбратьпроектиз Расположение, затем щелкнуть. закрытие Xcode в окне изпроекта (потому что позже мы будем Воляиспользовать Pod чтобы открыть документ рабочей области проекта).
  2. Открыть индивидуальное окно терминала,Прямо сейчасcdприезжатьпроект Местосуществоватьиз Расположение,ЗатемсоздаватьодининдивидуальныйимядляPodfileизновыйдокумент,Его содержание следующее:
Язык кода:javascript
копировать
target 'HelloTensorFlow' 
pod 'TensorFlow-experimental'
  1. бегать Заказpod installскачатьи Установить TensorFlow Pod。
  2. существовать Xcode середина打открытьHelloTensorFlow.xcworkspaceдокумент,Затем Волядваиндивидуальныйдокумент(ios_image_load.mmиios_image_load.h)тащить放приезжать TensorFlow iOS Пример Оглавлениеtensorflow/examples/ios/simpleприезжатьHelloTensorFlowфайлы проекта夹середина。
  3. Волядваиндивидуальный Модельquantized_stripped_dogs_retrained.pbиdog_retrained_mobilenet10_224.pb,label file dog_retrained_labels.txtа также Несколькоиндивидуальныйтесткартинакартинадокументтащить放приезжатьфайлы проекта夹середина,после,Вам следует посмотреть приезжать контент, похожий на:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-KEomP26v-1681653027410)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/b89b3444-a6a9-45b4-bb02-ddf8388a6992.png)]

картина 2.6:добавить в工Инструментдокумент,Модельдокумент,Этикеткадокументикартинакартинадокумент

  1. ВоляViewController.m重命имядляViewController.mm,потому чтодлянас Волясуществовать Должендокументсерединасмешиваниеиспользовать C++ коди Objective-C код для звонка TensorFlow C++ API И обрабатывайте изображение, например ввод и результат вывода. Затем,существовать@interface ViewControllerИзвперед,добавить вк Вниз#includeипрототип функции:
Язык кода:javascript
копировать
#include <fstream> 
#include <queue> 
#include "tensorflow/core/framework/op_kernel.h" 
#include "tensorflow/core/public/session.h" 
#include "ios_image_load.h" 

NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model); 
  1. существоватьViewController.mmизконец,добавить вотtensorflow/example/ios/simple/RunModelViewController.mmкопироватьизк Внизкод,вернофункцияRunInferenceOnImage稍делать Изменять,Чтобы принять разные размеры входных данных и имена входных слоев из разных переобучений. Модель:
Язык кода:javascript
копировать
namespace { 
    class IfstreamInputStream : public ::google::protobuf::io::CopyingInputStream { 
... 
static void GetTopN( 
... 
bool PortableReadFileToProto(const std::string& file_name, 
... 
NSString* FilePathForResourceName(NSString* name, NSString* extension) { 
... 
NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model) { 
  1. все ещесуществоватьviewDidLoadметодизViewController.mmсередина,Сначала добавьте добавить тег изкод,Пользователи use знают, что они могут использовать. Приложение выполняет действие:
Язык кода:javascript
копировать
UILabel *lbl = [[UILabel alloc] init]; 
[lbl setTranslatesAutoresizingMaskIntoConstraints:NO]; 
lbl.text = @"Tap Anywhere"; 
[self.view addSubview:lbl];  

Затем Воля Этикетка置ВЭкрансередина央изо束:

Язык кода:javascript
копировать
NSLayoutConstraint *horizontal = [NSLayoutConstraint constraintWithItem:lbl attribute:NSLayoutAttributeCenterX 
relatedBy:NSLayoutRelationEqual toItem:self.view 
attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; 

NSLayoutConstraint *vertical = [NSLayoutConstraint constraintWithItem:lbl attribute:NSLayoutAttributeCenterY 
relatedBy:NSLayoutRelationEqual toItem:self.view 
attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]; 

[self.view addConstraint:horizontal]; 
[self.view addConstraint:vertical];  

наконец,Существуют Добавьте сюда распознаватель жестов щелчка:

Язык кода:javascript
копировать
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
[self.view addGestureRecognizer:recognizer]; 
  1. существование коснитесь процессора,наспервыйсоздаватьдваиндивидуальныйalertдействовать,кпозволятьиспользовать户выбиратьпереподготовкаиз Модель:
Язык кода:javascript
копировать
UIAlertAction* inceptionV3 = [UIAlertAction actionWithTitle:@"Inception v3 Retrained Model" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
        NSString *result = RunInferenceOnImage(299, 299, "Mul", @"quantized_stripped_dogs_retrained"); 
        [self showResult:result]; 
}]; 
UIAlertAction* mobileNet = [UIAlertAction actionWithTitle:@"MobileNet 1.0 Retrained Model" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
        NSString *result = RunInferenceOnImage(224, 224, "input", @"dog_retrained_mobilenet10_224"); 
        [self showResult:result]; 
}]; 

Затемсоздаватьодининдивидуальныйnoneдействовать,и Воля Местоиметьтрииндивидуальныйalertдействоватьдобавить вприезжатьконтроллер сигнализацииипоказыватьэто:

Язык кода:javascript
копировать
UIAlertAction* none = [UIAlertAction actionWithTitle:@"None" style:UIAlertActionStyleDefault 
        handler:^(UIAlertAction * action) {}]; 

UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Pick a Model" message:nil preferredStyle:UIAlertControllerStyleAlert]; 
[alert addAction:inceptionV3]; 
[alert addAction:mobileNet]; 
[alert addAction:none]; 
[self presentViewController:alert animated:YES completion:nil]; 
  1. сделать выводизрезультатсуществоватьметодshowResultсерединапоказыватьдля另одининдивидуальныйконтроллер сигнализации:
Язык кода:javascript
копировать
-(void) showResult:(NSString *)result { 
    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"Inference Result" message:result preferredStyle:UIAlertControllerStyleAlert]; 

    UIAlertAction* action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; 
    [alert addAction:action]; 
    [self presentViewController:alert animated:YES completion:nil]; 
}  

ивызов TensorFlow Взаимно关изосновнойкодсуществоватьRunInferenceOnImageметодсередина,Долженметодна основе TensorFlow iOS Простое приложение было немного доработано, в том числе сначала создано индивидуальное TensorFlow встречаразговариватьиодининдивидуальныйкартина:

Язык кода:javascript
копировать
tensorflow::Session* session_pointer = nullptr; 
tensorflow::Status session_status = tensorflow::NewSession(options, &session_pointer); 
... 
std::unique_ptr<tensorflow::Session> session(session_pointer); 
tensorflow::GraphDef tensorflow_graph; 
NSString* network_path = FilePathForResourceName(model, @"pb"); 
PortableReadFileToProto([network_path UTF8String], &tensorflow_graph); 
tensorflow::Status s = session->Create(tensorflow_graph); 

Затем загрузите теги документикартина, например документ, и Волякартина, например, конвертировать данные для когдаиз. Tensor данные:

Язык кода:javascript
копировать
NSString* labels_path = FilePathForResourceName(@"dog_retrained_labels", @"txt"); 
... 
NSString* image_path = FilePathForResourceName(@"lab1", @"jpg"); 
std::vector<tensorflow::uint8> image_data = LoadImageFromFile([image_path UTF8String], &image_width, &image_height, &image_channels); 
tensorflow::Tensor image_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, wanted_height, wanted_width, wanted_channels})); 
auto image_tensor_mapped = image_tensor.tensor<float, 4>(); 
tensorflow::uint8* in = image_data.data(); 
float* out = image_tensor_mapped.data(); 
for (int y = 0; y < wanted_height; ++y) { 
    const int in_y = (y * image_height) / wanted_height; 
... 
} 

Наконец, используйтекартину, например вызов имени входного слоя данных тензора. TensorFlow встречаразговариватьизrunметод,Получите возвращенный результат вывода,И действительно, он обрабатывается для получения результата, что значение достоверности превышает пороговое значение, полученное индивидуально:

Язык кода:javascript
копировать
std::vector<tensorflow::Tensor> outputs; 
tensorflow::Status run_status = session->Run({{input_layer, image_tensor}},{output_layer}, {}, &outputs); 
... 
tensorflow::Tensor* output = &outputs[0]; 
const int kNumResults = 5; 
const float kThreshold = 0.01f; 
std::vector<std::pair<float, int> > top_results; 
GetTopN(output->flat<float>(), kNumResults, kThreshold, &top_results); 

существует Остальная часть книги из,нас ВолявыполнитьRunInferenceOnxxxметодиз Нет同Версия,киспользовать Нет同извходить Приходитьбегать Нет同из Модель. Так что не волнуйтесь, если вы не до конца понимаете какой-то код; провести построение большего количества изприложений, вы волядля нового определения изс Модель напишите сизрассуждение логичное и почувствуете, что приезжатьссуществовать.

Кроме того, полная версия приложения HelloTensorFlow для iOS также включена в существующий магазин исходных кодов Библиотека.

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

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-p0nAa1Pm-1681653027410)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/1823f6a6-f212-4ac9-9d78-a978a234c4aa.png)]

картина 2.7:выбирать Нет同из再тренироваться Модельруководитьрассуждение

Затем,Ваша Волясуществоватьвыбирать Модель после просмотра приезжать полученные результаты:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-KS4OFUYg-1681653027410)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/b9de1c02-8b3a-4482-b7f5-4d0d8d3e4692.png)]

картина 2.8: на основе различных переподготовок Модельизрассуждение результатов

Обратите внимание, что MobileNet После обучения из Модельсуществовать в том же стиле iPhone набегать速度хотетьбыстрыйпридетсямного,существовать iPhone 6 чем выше Inception v3 из Модель после тренировки работает примерно на секунду быстрее.

Добавьте TensorFlow в свое приложение Swift для iOS.

с 2014 Год 6 С рождением Луны, Свифт Стал для самого элегантного и современного языка Одна из программ. Поэтому, верно для некоторых продвинутых людей, Воля современная. TensorFlow Комплексное проживание основе Swift изсовременный iOS приложениесередина既иметь Интересныйиметьиспользовать。 этот Образец做изшагина основе Objective-C изприложениеиз Шаги аналогичны, но имеют некоторые особенности Swift Похожие из советов. Если вы следовали Objective-C Некоторые шаги выполняются в режиме действия, вы можете обнаружить, что некоторые шаги повторяются в режиме действия, а те, которые можно пропустить. Objective-C раздел и перейдите непосредственно к Swift из пользователей, все еще выполняет полные шаги:

  1. существоватьтыиз Xcode середина,щелкнуть"документ | Новый | проект…”,выбирать“Single View App”,Тогда следующий из,входитьHelloTensorFlow_Swiftделатьдля产品имясказать,выбирать Swift Волянастраиватьдляязык,Затемщелкнуть Следующийивыбиратьпроектиз Расположение,Создал Затемщелкнуть. закрытие Xcode в окне изпроекта (потому что для дальнейшего Воляиспользовать Pod чтобы открыть документ рабочей области проекта).
  2. Открыть индивидуальное окно терминала,Прямо сейчасcdприезжатьпроект Местосуществоватьиз Расположение,ЗатемсоздаватьодининдивидуальныйимядляPodfileизновыйдокумент,Его содержание следующее:
Язык кода:javascript
копировать
target 'HelloTensorFlow_Swift' 
pod 'TensorFlow-experimental' 
  1. бегать Заказpod installскачатьи Установить TensorFlow Pod;
  2. существовать Xcode середина打открытьHelloTensorFlow_Swift.xcworkspaceдокумент,Затем Волядваиндивидуальныйдокумент(ios_image_load.mmиios_image_load.h)тащить放приезжать TensorFlow iOS Пример Оглавлениеtensorflow/examples/ios/simpleприезжатьHelloTensorFlow_Swiftфайлы проекта夹середина。 когда Волядваиндивидуальныйдокументдобавить вприезжатьпроектсерединачас,ты Волясмотретьприезжатьодининдивидуальныйинформациякоробка,нравитьсяк Вниз Экранперехватыватьартина Место示,询问тыда否хотеть配置 Objective-C Переходной заголовок, Swift кодовый вызов C++ Этот заголовок является обязательным. Objective-C код. Таким образом, щелкнуть создаёт кнопку заголовка моста:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-34n2r9ES-1681653027411)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/afa22723-f59f-4544-8a61-e73ee7c43e85.png)]

картина 2.9: Добавлено C++ Создать связующий заголовок при файле

  1. такой же Воляquantized_stripped_dogs_retrained .pbиdog_retrained_mobilenet10_224.pbэтотдваиндивидуальный Модель,Этикеткадокументdog_retrained_labels.txtи Несколькоиндивидуальныйтесткартинакартинадокументтащить放приезжатьфайлы проекта夹середина–после,Вы должны увидеть нечто похожее на:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-FEDYBpgY-1681653027411)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/8236a55a-15fe-41a1-9ff7-c7280ae6c43f.png)]

картина 2.10:добавить в工Инструментдокумент,Модельдокумент,Этикеткадокументикартинакартинадокумент

  1. использоватьк ВнизкодсоздаватьодининдивидуальныйимядляRunInference.hизновыйдокумент(одининдивидуальный Советыда,насдолженсуществовать Внизодиншагиспользуется в Objective-C класс какRunInferenceOnImageметодиз Упаковка,к便насиз Swift код выполняет косвенные вызовы) 。в противном случае,Воля А произошла ошибка сборки):
Язык кода:javascript
копировать
#import <Foundation/Foundation.h> 
@interface RunInference_Wrapper : NSObject 
    - (NSString *)run_inference_wrapper:(NSString *)name; 
@end
  1. создать еще один по имениRunInference.mmиздокумент,Должендокументкк Внизincludeвернослонипрототипоткрытьголова:
Язык кода:javascript
копировать
#include <fstream> 
#include <queue> 
#include "tensorflow/core/framework/op_kernel.h" 
#include "tensorflow/core/public/session.h" 
#include "ios_image_load.h" 

NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model); 
  1. существоватьк Внизкодсерединадобавить вRunInference.mm,квыполнитьсуществовать Что.hдокументсерединаопределениеизRunInference_Wrapper
Язык кода:javascript
копировать
@implementation RunInference_Wrapper 
- (NSString *)run_inference_wrapper:(NSString *)name { 
    if ([name isEqualToString:@"Inceptionv3"]) 
        return RunInferenceOnImage(299, 299, "Mul", @"quantized_stripped_dogs_retrained"); 
    else 
        return RunInferenceOnImage(224, 224, "input", @"dog_retrained_mobilenet10_224"); 
} 
@end     
  1. существоватьRunInference.mmизконец,добавить ви Objective-C частьсерединаViewController.mm完全Взаимно同изметод,иtensorflow/example/ios/simple/RunModelViewController.mmсерединаизметод略иметь Нет同:
Язык кода:javascript
копировать
class IfstreamInputStream : public namespace { 
    class IfstreamInputStream : public ::google::protobuf::io::CopyingInputStream { 
... 
static void GetTopN( 
... 
bool PortableReadFileToProto(const std::string& file_name, 
... 
NSString* FilePathForResourceName(NSString* name, NSString* extension) { 
... 
NSString* RunInferenceOnImage(int wanted_width, int wanted_height, std::string input_layer, NSString *model) {
  1. сейчассуществовать打открытьviewDidLoad methodконецизViewController.swift,Сначала добавьте добавить тег изкод,Пользователи с помощью приложения знают, что они могут делать:
Язык кода:javascript
копировать
let lbl = UILabel() 
lbl.translatesAutoresizingMaskIntoConstraints = false 
lbl.text = "Tap Anywhere" 
self.view.addSubview(lbl) 

Затем Воля Этикетка置ВЭкрансередина央изо束:

Язык кода:javascript
копировать
let horizontal = NSLayoutConstraint(item: lbl, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0) 

let vertical = NSLayoutConstraint(item: lbl, attribute: .centerY, relatedBy: .equal, toItem: self.view, attribute: .centerY, multiplier: 1, constant: 0) 

self.view.addConstraint(horizontal) 
self.view.addConstraint(vertical) 

наконец,Существуют Добавьте сюда распознаватель жестов щелчка:

Язык кода:javascript
копировать
let recognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapped(_:))) 
self.view.addGestureRecognizer(recognizer) 
  1. существуют крановый процессор,наспервыйдобавить вalertдвигатьсяделать,кпозволятьиспользовать户выбирать Inception v3 После обучения из Модель:
Язык кода:javascript
копировать
let alert = UIAlertController(title: "Pick a Model", message: nil, preferredStyle: .actionSheet) 
alert.addAction(UIAlertAction(title: "Inception v3 Retrained Model", style: .default) { action in 
    let result = RunInference_Wrapper().run_inference_wrapper("Inceptionv3") 

    let alert2 = UIAlertController(title: "Inference Result", message: result, preferredStyle: .actionSheet) 
    alert2.addAction(UIAlertAction(title: "OK", style: .default) { action2 in 
    }) 
    self.present(alert2, animated: true, completion: nil) 

}) 

Затемсуществовать展示Извперед,для MobileNet Тяжелая тренировка Модель создает еще одно индивидуальное действие такжеодининдивидуальныйnoneдвигатьсяделать:

Язык кода:javascript
копировать
alert.addAction(UIAlertAction(title: "MobileNet 1.0 Retrained Model", style: .default) { action in 
    let result = RunInference_Wrapper().run_inference_wrapper("MobileNet") 

    let alert2 = UIAlertController(title: "Inference Result", message: result, preferredStyle: .actionSheet) 
    alert2.addAction(UIAlertAction(title: "OK", style: .default) { action2 in 
    }) 
    self.present(alert2, animated: true, completion: nil) 
}) 
alert.addAction(UIAlertAction(title: "None", style: .default) { action in 
}) 

self.present(alert, animated: true, completion: nil) 
  1. 打открытьHelloTensorFlow_Swift-Bridging-Header.hдокумент,и КЧтосерединадобавить водин ХОРОШОкод:#include "RunInference.h"

сейчассуществовать,существовать模拟устройствосерединабегать Долженприложение,Ваш вид Воля приобрести индивидуальный контроллер сигнализации,хотеть求тывыбирать Модель:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-jnVb7EBf-1681653027411)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/098c0b7a-c32a-4ffc-bf3d-49c1ea80d36f.png)]

картина 2.11:выбиратьодининдивидуальныйпройтиобучение Модельруководитьрассуждение

а также различные переподготовки Модельизрассуждение результатов:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-HA5gG3Tz-1681653027411)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/f3d05b5e-fda7-46d6-8e47-f234a1b4175e.png)]

картина 2.12: Различные переподготовки Модельизрассуждение результатов

Продолжайте теперь, когда вы знаете, что Воля силен из TensorFlow Модельдобавить вприезжать iOS приложение нужно сделать, что бы оно ни было Objective-C все еще Swift Пишу из-за того, что нет причин останавливать тебя, Воля. AI Добавить жильевашиздвигатьсяприложениесередина,除Неттыда Android。 Но ты знаешь, мы позаботимся и об этом. Android。

Добавьте TensorFlow в свои приложения для Android.

Факты доказали, что TensorFlow добавить вприезжатьссебяиз Android приложение Сравнивать iOS легкий. 让нас跳приезжатьшаг:

  1. Если у тебя есть сейчас иметьиз Android приложение, пожалуйста, пропустите этот шаг. в противном случае,существовать Android Studio середина,выбирать"документ | Новый | новыйпроект…”ипринимать Местоиметьпо умолчаниюнастраивать,Затемщелкнуть Заканчивать。
  2. 打открытьbuild.gradleModule: app)документ,исуществовать Зависимости{...};внутреннийиконецдобавить вкомпилировать'org.tensorflow:tensorflow-android:+'
  3. генерироватьgradleдокумент,ты ВолясуществоватьappОглавлениеиз Расположениеapp/build/intermediates/transforms/mergeJniLibs/debug/0/libизребенокпапка内смотретьприезжатьlibtensorflow_inference.so,этотда Java коди Изверноразговариватьиз TensorFlow книга机Библиотека。
  4. еслиэтотдаодининдивидуальныйновыйпроект,но Можеткпроходитьпервыйвыключательприезжать Сумка,Затемверноключщелкнуть Долженприложениеивыбирать“новый建 | папка | assetsпапка”Приходитьсоздаватьassetsпапка。 ,нравитьсяк Вниз Экранперехватыватьартина Место示,Затемот Сумкавыключатель回 Android:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-xTCPEphz-1681653027412)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/6cf6b889-8ecb-4837-9087-19b34d6e68ed.png)]

картина 2.13:Воляматериалпапкадобавить вприезжатьновыйпроект

  1. Волядваиндивидуальныйпереподготовкаиз Модельдокументи Этикеткадокумента также несколько индивидуальных тестовых изображений, таких как перетаскивание, чтобы добраться до папки с активами, как показано ниже:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-SH8Sgc83-1681653027412)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/fff27710-5222-410c-8d40-f451dea548f8.png)]

картина 2.14:Воля Модельдокумент,Этикеткадокументитесткартинакартинадобавить вприезжатьматериал

  1. Удерживайте кнопку выбора,Воляtensorflow/examples/android/src/org/tensorflow/demoиClassifier.javaотtensorflow/examples/android/src/org/tensorflow/demoтащить放приезжатьпроектиз Java папкасередина, как показано ниже:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-kharFPaj-1681653027412)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/7f41c4fe-6454-44e2-82d8-892290761eb5.png)]

картина 2.15: Уилл TensorFlow Классификацияустройстводокументдобавить вприезжатьпроектсередина

  1. 打открытьMainActivity,первыйсоздаватьипереподготовкаиз MobileNet Модель Взаимно关изпостоянный-входитькартинакартинаразмер,Имя узла,Модельдокументимяи Этикеткадокументимя:
Язык кода:javascript
копировать
private static final int INPUT_SIZE = 224; 
private static final int IMAGE_MEAN = 128; 
private static final float IMAGE_STD = 128; 
private static final String INPUT_NAME = "input"; 
private static final String OUTPUT_NAME = "final_result"; 

private static final String MODEL_FILE = "file:///android_asset/dog_retrained_mobilenet10_224.pb"; 
private static final String LABEL_FILE = "file:///android_asset/dog_retrained_labels.txt"; 
private static final String IMG_FILE = "lab1.jpg";
  1. сейчассуществовать,существоватьonCreateметодвнутренний,первыйсоздаватьодининдивидуальныйClassifierПример:
Язык кода:javascript
копировать
Classifier classifier = TensorFlowImageClassifier.create( 
                getAssets(), 
                MODEL_FILE, 
                LABEL_FILE, 
                INPUT_SIZE, 
                IMAGE_MEAN, 
                IMAGE_STD, 
                INPUT_NAME, 
                OUTPUT_NAME);  

Затемотassetsпапкасередина读取насизтесткартинакартина,Отрегулируйте в соответствии с размером, указанным Моделью.,ЗатемвызоврассуждениеметодrecognizeImage

Язык кода:javascript
копировать
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open(IMG_FILE)); 
Bitmap croppedBitmap = Bitmap.createScaledBitmap(bitmap, INPUT_SIZE, INPUT_SIZE, true); 
final List<Classifier.Recognition> results = classifier.recognizeImage(croppedBitmap); 

для Проще говоря, у нас нет Android приложение Добавить любое и UI Связанный исходник, но вы можете получить результат после существования этой строки, настроив индивидуальную точку останова и отладив это приложение; ты Волясмотретьприезжатьк Вниз Экранперехватыватьартина Место示изрезультат:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-XIyeYzNW-1681653027412)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/4c91b3a9-1a32-4288-aa75-205d0b71d584.png)]

изображение 2.16:использовать переобучение MobileNet Модельиз результатов распознавания

еслитыпроходить ВоляMODEL_FILEИзменятьдляquantized_stripped_dogs_retrained.pb,ВоляINPUT_SIZEИзменятьдля299,и ВоляINPUT_NAMEИзменятьдляMulПриходитьиспользовать Inception v3 После обучения из Модель, а затем отладки этого приложения, вы получите результаты, показанные ниже из :

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-1s92KyhD-1681653027412)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/ca49452a-b256-4c9e-8e96-6de4c75effa7.png)]

изображение 2.17:Использовать переобучение Inception v3 Модельиз результатов распознавания

Теперь, когда вы знаете, как TensorFlow ипройтипереподготовкаиз Модельдобавить вприезжатьссебяиз iOS и Android приложение, то если вы хотите добавить не- TensorFlow Соответствующие функции не должны быть слишком сложными. Например, камера телефона фотографирует собаку и определяет ее породу.

Подвести итог

существоватькнигаглавасередина,наспервый简хотетьпредставлять Понятно什么дамигрироватьизучатьа также для Что мы можем и должны использовать Это происходит через предварительную подготовку из глубокого обучения, например классификационную модель. Затем мы покажем, как переподготовка основе Inception v3 из Модельи MobileNet Смоделируйте детали, чтобы мы могли лучше понять и встретиться с нашими лучшими друзьями. После этого мы впервые показали, как существуют TensorFlow Пример iOS и Android Используйте переобученную модель в своем приложение, затем приводит связанный с тем, как Воля TensorFlow Добавить приезжать самому основе Objective-C и Swift из iOS приложениесерединаизшаг за шагом Учебное пособие,а такжетыссебяиз Android приложение.

Теперь у нас есть лучшие друзья,Он содержит несколько хороших и понятных советов.,Мы знаем, что есть много других,К лучшему или к худшему. В следующей главе мы, Воля, узнаем, как стать умнее и как распознавать интересных изверно слонов в картине иметьиметь такжекаксуществовать Смартфонначальство随час随地верно Чторуководить定Кусочек。

3. Обнаружение объектов и их местонахождения

Обнаружение объектов — это шаг вперед по сравнению с обсуждением в предыдущей главе классификации изображений изкартина. Категоризация «картина как» возвращает только теги «картина как из категории», а «Обнаружение» объекты возвращает список значков, указанных в изображении значка изверно Также каждый индивидуальный логотип, как и в ограничительной рамке. Модерн из Обнаружение Алгоритмы объектов используют глубокое обучение для создания различных верных изображений и моделей, которые можно использовать для обнаружения и определенных изображений отдельных индивидуальных карт. существуют в прошлом несколько лет, быстрее и точнее из Обнаружение алгоритмы объектов выходили один за другим.2017 Год 6 луна, Google выпустил TensorFlow Обнаружение объектов API, API Объединяет несколько ведущих из Обнаружение объектовалгоритм。

существоватькнигаглавасередина,нас Воляпервый简хотеть概описывать Обнаружение Объекты: Создание эффектов глубокого обучения. Модель для Обнаружения. объектов,Затемиспользовать Должен Модельруководитьрассуждениеизпроцесс。 Тогда мы подробно обсудим TensorFlow Обнаружение объектов API из工делать原理,какиспользовать Чтомногоиндивидуальный Модельруководитьрассуждениеа такжекакиспользоватьссебяизданныенаборверно Чторуководитьпереподготовка。 Тогда мы, Воля К, покажем вам, как существуют iOS приложениеиспользуется в Предварительное обучениеиз Обнаружение объектов Модельа такжепереподготовкаиз Модель. Мы, Воля, представляем несколько полезных советов, чтобы вы могли Ручная сборкасопределениеиз TensorFlow iOS Библиотека,крешатьиспользовать TensorFlow Pod вопрос; Эта Воля поможет вам подготовиться к решению любой темы, описанной в остальной части этой книги. TensorFlow Поддерживать Модель. существоватькнигаглавасередина,нас Воля Нетпоставлятьиспользовать ВОбнаружение объектовиз Android Примерприложение,потому чтодля TensorFlow исходный код поставляется с индивидуальным очень хорошим примером, можно использовать TensorFlow Обнаружение объектовпредварительнотренироваться Модельа также YOLO модель для работы. Мы Волясуществовать эту главу последнего вступления. Мы, Воля К, покажем вам, как существуют iOS приложениеиспользуется в Другой ведущий из объекта Модель обнаружения YOLO v2。 Подводя итог, мы Волясуществовать в этой главе представлены следующие темы:

  • Обнаружение объектов: обзор быстрого
  • Настройка Тензор Флоу Обнаружение объектов API
  • переподготовка SSD-MobileNet и Быстрее из RCNN Модель
  • существовать iOS используется в Обнаружение объектов Модель
  • использовать YOLO2: Другой тип объекта Модель обнаружения

Обнаружение объектов – краткий обзор

сот 2012 С момента прорыва нейронной сети Года, названной для AlexNet глубоко CNN Модельпроход значительно снижает частоту ошибок победить степень Года. ImageNet Столкнувшись с проблемами визуального распознавания, многие исследователи в области компьютерного зрения и обработки естественного языка начали использовать мощные возможности глубокого обучения. на основеглубокое обучениеизсовременный Обнаружение объектоввсена основе CNN, и строить такие существования, как AlexNet,Google Inception или Другие популярныеиз VGG Сетевое и другое предварительное обучение из Модели начального уровня. этотнекоторый CNN Обычно обучаются сотни Тысячей параметров Вы можете ввести изображение преобразования изображения для набора функций, эти функции можно в дальнейшем использовать, например, в предыдущей главе и классификации изображений зкартина а. также Обнаружение объектова Также Другие задачи, связанные с компьютерным зрением.

2014 Год, предложено последнее из Обнаружение объектовустройство,Должен Обнаружение объектовустройствоиспользоватьсказатьдля RCNN (с CNN Особенности из области) из отметок Обнаружение объектовданныенаборверно AlexNet После обучения по сравнению с традиционным методом обнаружения его точность значительно улучшилась. RCNN Включает метод под названием «Предложение области», который генерирует О. 2,000 индивидуальный Может能изобласть候选ВОЗ,исуществовать Каждыйиндивидуальныйэтотнекоторыйобластьначальствобегать CNN для классификации и прогнозирования ограничивающей рамки. Затем эти результаты объединяются для получения результата обнаружения. RCNN из Процесс обучения очень сложен, занимает несколько дней, рассуждение также очень медленное, существует GPU накартинакартинаначальство花费Понятно Волязакрыватьодинминута.

поднятый RCNN С тех пор производительность стала лучше. объектовалгоритм纷к沓Приходить:быстрый RCNN, быстрее из RCNN, YOLO (видите только один раз), SSD (Однокадровый многокадровый детектор)и YOLO v2。

2014 Год,Андрей Карпатый, правда, RCNN хорошо представил,«Веселье RCNN, усовершенствованный детектор объектов»。 Джастин Джонсон Джонсон) существуют Стэнфордский университет CS231n курссерединапоставлять Понятноодининдивидуальныйочень хорошийиз Видео лекция«Пространственное определение обнаружения Кусочек»,Контент предполагает обнаружение объектов,К ним относятся RCNN,Fast RCNN,Faster RCNN и YOLO из Подробности. YOLO2 веб-сайтдаэтотвнутри

быстрый RCNN проходитьпервыйсуществоватьвсеиндивидуальныйвходитькартинакартинаначальствои Нетда Тысячииндивидуальныйпредположениеизобластьначальствоприложение Затем CNN обрабатывает предложения региона, что значительно сокращает время обучения и обсуждение (10 часов тренировок 2.x (второе решение). Быстрее RCNN Использоватьпользовать региональную сеть предлагается дальнейшее Волярассуждение Увеличение скорости приезжать в режиме реального времени (0,2 Второй),Поэтому существуют после тренировки,Больше нет трудоемкого процесса рекомендации областей.

и RCNN Различные серии обнаружения, SSD и YOLO Оба метода одиночного выстрела, это означает, что они являются одиночными. CNN Приложение полностью содержит входные изображения без использования региональных предложений и региональной классификации. этот оба метода очень быстрые, они имеют среднюю точность (mAP) примерно для 80%, лучше, чем Faster RCNN。

Если вы впервые слышите об этих методах, возможно, вы немного растеряны. Да,делатьдляверноиспользовать AI Для тех, кто заинтересован в расширении возможностей мобильного приложения, вам не нужно знать о настройке архитектуры глубоких нейронных сетей и обучении Обнаружение сведения о свойстве objectModelize; Вы должны просто знать, как использовать также (при необходимости) переподготовка предварительно обученной модели, а такжекаксуществовать iOS и Android приложениеиспользуется в производственный тренинг перепроготовкаиз Модель.

еслиты真изверноглубокое обучение Интерес к исследованиям,и хотите знать, как работает каждый детектор, чтобы решить, какой детектор использовать, подробности,Тогда вам обязательно стоит прочитать каждый метод из бумаги.,ипытатьсяссебякопироватьтренироватьсяпроцесс。 эта Воляда Долгая и прибыльная дорога. Но если ты хочешь послушать Andrej Karpathy из советов: "Не будь героем" (существовать YouTube Искать «Андрей изComputer Vision Deep Learning»), то вы можете «принять наиболее эффективный из имеющихся методов, загрузить предварительно обученную из Модель,Добавить/удалить некоторые его части,Тогда вы сможете это настроить».,этоттакжеданас Волясуществоватьздесьиспользоватьизметод。

существуют Начните исследовать, какой метод лучше TensorFlow вперед, дайте нам знать о наборе данных. иметь 3 индивидуальный主хотетьизданныенабориспользовать Втренироваться Обнаружение объектов:PASCAL VOC,ImageNet и Microsoft COCO,это们Инструментиметьиздобрый数分Недля 20、200 и 80。 TensorFlow Обнаружение объектов API когдавперед Поддерживать大много数предварительнотренироваться Модель Всесуществовать 80 сорт MS COCO данныенаборначальстворуководить Понятнотренироваться(связанныйпредварительнотренироваться Модель及Чтообучениеданныенабориз完всесписок,Видетьэтотвнутри

хотя мы не будем начинать обучение с самого начала,Датывстреча经常提приезжать PASCAL VOC или MS COCO данные Формат,а также Они покрывают из 20 или 80 индивидуальный通использоватьдобрый,это们Вседасуществоватьпереподготовкаилииспользоватьпройтиобучение Модельчасиспользоватьиз。 существоватькнигаглаваизнаконецчасть,нас Воляпытатьсяиспользовать VOC обучение YOLO Модельи COCO обучение Модель.

Настройка Тензор Флоу Обнаружение объектов API

TensorFlow Обнаружение объектов API существовать Чтоофициальный сайтначальствоиметьподробный Записывать,тыодин定хотеть查смотреть Что“быстрыйначиная:использовать Всейчас成изсделать выводиз Jupyter Путеводитель «Блокнот», кратко объясняет, как существовать Python используется визPre-training Модель для обнаружения. Но то, что документ существует на многих разных страницах, трудно понять. существование В этом и следующем разделе мы Воляпроходить реорганизуем существующее множество мест, чтобы записать важные детали и добавить больше. инструкции по рикоду для упрощения официального документа и создания связанного следующего содержания индивидуального пошагового учебного пособия. пособие:

  1. какнастраивать API ииспользовать Чтопредварительнообучение Модельруководитьсейчас成изсделать вывод
  2. какиспользовать Переподготовка API предварительно обученной модели для выполнения более конкретных задач обнаружения.

Быстрая установка и примеры

Выполните следующие шаги, чтобы Установитьипроектобнаружение объектов:

  1. существовать Нет. 1 Глава «Мобильный TensorFlow начиная”серединасоздаватьиз TensorFlow В корне исходников найдите TensorFlow Модель магазина Библиотека, содержащая TensorFlow Обнаружение объектов API Сделайте для одного из своих исследований Модель:
Язык кода:javascript
копировать
git clone https://github.com/tensorflow/models
  1. Установитьmatplotlib,pillow,lxmlиjupyterБиблиотека。 существовать Ubuntu или Mac начальство,Вы можете проектировать:
Язык кода:javascript
копировать
sudo pip install pillow
sudo pip install lxml
sudo pip install jupyter
sudo pip install matplotlib
  1. изменятьприезжатьmodels / researchОглавление,Затемвыполнить следующую команду:
Язык кода:javascript
копировать
protoc object_detection/protos/*.proto --python_out=.

этот Волякомпилироватьobject_detection/protosОглавлениесерединаиз Местоиметь Protobuf для включения TensorFlow Обнаружение объектов API удовлетворить. Protobuf или Protocol Buffer да Автоматическая сериализация и метод извлечения структурированных данных, который лучше, чем XML Легче и эффективнее. ты Место需хотеть做из Сразуда编写одининдивидуальный描описыватьданныеструктураиз.protoдокумент,Затемиспользоватьprotoc(proto Компилятор) генерирует динамический анализ и кодирование. protobuf данныеизкод. Уведомление--python_outпараметробозначение Понятно Местогенерироватькодизязык。 существовать В следующей части этой главы, когда мы обсудим, как существовать iOS используется в Модельчас,Мы Воляиспользоватьприноситьиметь--cpp_outиз协议компилироватьустройство,Таким образом генерируется исходда C++. связанныйProtocol Buffer из полного документа,Видетьэтотвнутри

  1. все ещесуществовать Модель/研究середина,бегатьexport PYTHONPATH=$PYTHONPATH:pwd:pwd/slim,Затембегатьpython object_detection/builders/model_builder_test.pyкпроверятьодин切正常。
  2. запускатьjupyter notebookЗаказисуществовать浏览устройствосередина打открытьhttp://localhost:8888。 первыйщелкнутьobject_detection,Затемвыбиратьobject_detection_tutorial.ipynb笔记книгаи逐индивидуальныйединицабегать Демо。

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

сейчассуществовать让нас Приходитьсмотретьодин Внизиспользоватьпредварительнообучение TensorFlow Обнаружение объектов Модельсуществовать Python Записная книжка несет в себе основные компоненты рассуждениеиз. Сначала определите некоторые ключевые константы:

Язык кода:javascript
копировать
MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'
MODEL_FILE = MODEL_NAME + '.tar.gz'
DOWNLOAD_BASE = 'http://download.tensorflow.org/models/object_detection/'
PATH_TO_CKPT = MODEL_NAME + '/frozen_inference_graph.pb'
PATH_TO_LABELS = os.path.join('data', 'mscoco_label_map.pbtxt')
NUM_CLASSES = 90

笔记книгакодскачатьииспользовать Понятнопредварительнообучение Обнаружение объектов Модельssd_mobilenet_v1_coco_2017_11_17(использовать SSD Метод построения, существующий у нас, представлен в предыдущей статье из MobileNet CNN Выше «Модель существования» была кратко представлена ​​в предыдущем разделе). TensorFlow Модель найти экспонаты в зоопарке TensorFlow Обнаружение объектов API Поддерживатьпредварительнотренироваться Модельиз完всесписок,и大много数Всеэто использовать MS COCO данныенаборруководитьобучение。 использовать Врассуждениеизточный Модельдаfrozen_inference_graph.pbдокумент(существоватьскачатьизssd_mobilenet_v1_coco_2017_11_17.tar.gzдокументсередина),Должен Модельиспользовать Всейчас成израссуждениеа такжепереподготовка。

Кусочек Вmodels/research/object_detection/data/mscoco_label_map.pbtxtсерединаизmscoco_label_map.pbtxtЭтикеткадокумент Инструментиметь 90(NUM_CLASSES)индивидуальныйпроект,использовать Вssd_mobilenet_v1_coco_2017_11_17Модель Можетк Обнаружениеприезжатьизвернослонтип。 В двух индивидуальных проектах:

Язык кода:javascript
копировать
item {
  name: "/m/01g317"
  id: 1
  display_name: "person"
}
item {
  name: "/m/0199g"
  id: 2
  display_name: "bicycle"
}
…
item {
  name: "/m/03wvsk"
  id: 89
  display_name: "hair drier"
}
item {
  name: "/m/012xff"
  id: 90
  display_name: "toothbrush"
}

нассуществоватьвпередлапшаизшаг 3 обсуждалось в Protobuf,描описыватьmscoco_label_map.pbtxtсерединаданныеиз proto документдаstring_int_label_map.proto,Кусочек Вmodels/research/object_detection/protosсередина,Его содержание следующее:

Язык кода:javascript
копировать
syntax = "proto2";
package object_detection.protos;
message StringIntLabelMapItem {
  optional string name = 1;
  optional int32 id = 2;
  optional string display_name = 3;
};

message StringIntLabelMap {
  repeated StringIntLabelMapItem item = 1;
};

поэтому,по сути,协议компилироватьустройствона основеstring_int_label_map.protoсоздаватькод,Затем Можеткиспользовать Долженкодиметьэффект地последовательность列化mscoco_label_map.pbtxtсерединаизданные. 稍назад,когда CNN Обнаруживает объект прибытия и возвращает целое число. ID час,Можетк Воля Чтоизменять换дляnameилиdisplay_nameдля человеческого чтения。

Воля Модель скачать,После распаковки и загрузки приезжать в память,Тег карты документ также Воля загружен,и Кусочек Вmodels/research/object_detection/test_imagesизодиннекоторыйтесткартинакартина Можетксуществовать Чтосерединадобавить втыссебяиз任何тесткартинакартинакруководить Обнаружениетест。 。 Затем определите соответствующие входные и выходные тензоры:

Язык кода:javascript
копировать
with detection_graph.as_default():
  with tf.Session(graph=detection_graph) as sess:
    image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
    detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
    detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
    detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
    num_detections = detection_graph.get_tensor_by_name('num_detections:0')

снова,еслиты想知道этотнекоторыйвходитьивыход Тензоримясказать Приходитьсmodels/research/object_detection/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pbсерединаскачатьидержатьиз SSD Модель, тогда можно существовать iPython используется в следующем коде, чтобы найти:

Язык кода:javascript
копировать
import tensorflow as tf
g=tf.GraphDef()
g.ParseFromString(open("object_detection/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb","rb").read())
x=[n.name for n in g.node]
x[-4:]
x[:5]
The last two statements will return: 
[u'detection_boxes',
 u'detection_scores',
 u'detection_classes',
 u'num_detections']
and
[u'Const', u'Const_1', u'Const_2', u'image_tensor', u'ToFloat']

Другой способэто использоватьначальствоодинглавасередина描описыватьиз Краткое содержаниекартина工Инструмент:

Язык кода:javascript
копировать
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph= models/research/object_detection/ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb

эта Воля генерирует следующий вывод:

Язык кода:javascript
копировать
Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])
No variables spotted. 
Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_scores, op=Identity (name=detection_classes, op=Identity) (name=num_detections, op=Identity)

После загрузки каждого отдельного тестового изображения Воляпроект фактически обнаруживает:

Язык кода:javascript
копировать
image = Image.open(image_path)
image_np = load_image_into_numpy_array(image)
image_np_expanded = np.expand_dims(image_np, axis=0)
(boxes, scores, classes, num) = sess.run(
    [detection_boxes, detection_scores, detection_classes, num_detections],
    feed_dict={image_tensor: image_np_expanded})

наконец,использоватьmatplotlibБиблиотека Воля Обнаружениеприезжатьизрезультат Может视化。 еслииспользоватьtensorflow/modelsхранилище Библиотека Поставляется спо умолчаниюдваиндивидуальныйтесткартинакартина,новстречасуществоватькартина 3.1 Посмотрите на результаты проживания:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-fE74MfCc-1681653027413)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/0df3a5c2-f983-4921-a901-b14c262d34a4.png)]

изображение 3.1: Обнаружение приезжающихизверно объектов и их ограничивающих рамок и оценки достоверности

существовать“существовать iOS используется в Обнаружение ObjectModel часть, Разберемся как существовать iOS оборудование Использовать на той же модели и нарисуйте тот же результат обнаружения.

Вы также можете заказать проживаниеиз Tensorflow Модель обнаружения Zoo Протестируйте другую предтренировочную модель. Например,еслииспользоватьfaster_rcnn_inception_v2_cocoМодель,Воляobject_detection_tutorial.ipynb笔记книгасерединаизMODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'заменятьдляMODEL_NAME = ' faster_rcnn_inception_v2_coco_2017_11_08'(Можетот TensorFlow Модель обнаружения Zoo Страница из URL илиMODEL_NAME = ' faster_rcnn_resnet101_coco_2017_11_08'серединаполучать),Затем вы можете увидеть жилье, похожее на два других индивидуальных на основе Faster RCNN из результатов обнаружения по содержанию.,Даэто们花费изчас间更长。

кроме того,существоватьдваиндивидуальныйfaster_rcnnМодель Использовать наsummarize_graph工Инструментвстречасуществоватьвходитьивыходначальствогенерировать Взаимно同изинформация:

Язык кода:javascript
копировать
Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3]) 
Found 4 possible outputs: (name=detection_boxes, op=Identity) (name=detection_scores, op=Identity) (name=detection_classes, op=Identity) (name=num_detections, op=Identity)

Обычно и другие крупные изна основе Inception или Resnet-CNN увеличенная Модель по сравнению с на основе MobileNet из Модель самая быстрая, но имеет меньшую точность (mAP значение меньше). 顺便说один Вниз,скачатьизssd_mobilenet_v1_coco, faster_rcnn_inception_v2_coco_2017_11_08иfaster_rcnn_resnet101_coco_2017_11_08документизразмер分Недля 76MB,149MB и 593MB。 Позже мы, Воля, смотрим, где жить, на мобильных устройствах, на основе MobileNet из Модель(Напримерssd_mobilenet_v1_coco)бегать速度хотетьбыстрыйпридетсямного,иметьчас,Большой Модель(Напримерfaster_rcnn_resnet101_coco_2017_11_08)Тольковстречасуществоватьстаршеиз iPhone крушение. Надеюсь, вы сможете использоватьна основе MobileNet из Модель,пройтипереподготовкаиз MobileNet Модельили Воля Приходить Можеткпоставлятьболее высокая точностьизssd_mobilenetиз Воля Приходить Версиярешать проблемы,хотяssd_mobilenetиз v1 существования достаточно хорош для многих случаев использования.

Переподготовка моделей SSD-MobileNet и Faster RCNN

После пред-обучение TensorFlow Обнаружение Объекты Моделькогда, безусловно, могут очень хорошо решать определенные проблемы. Даиметьчас候,Вам может понадобиться использоватьсиз с аннотированным изданным набором (существовать, который представляет для вас особый интерес изв. ерно или верно с ограничивающей рамкой вокруг части слона) и переподготовка модели,Чтобы он мог более точно обнаруживать различные коллекции категорий изображений.

Мы Воляиспользовать TensorFlow Обнаружение объектов API веб-сайт записывает то же самое из Oxford-IIIT Pets данныенабор Приходитьпереподготовкакнига地компьютернадваиндивидуальныйсейчасиметь Модель,и Нетэто использоватьдокументсерединапредставлятьиз Google Cloud。 При необходимости мы также добавляем инструкции для каждого отдельного шага. к Вниздасвязанныйкакиспользовать Oxford Oxford Pets Переобучение набора данных TensorFlow Обнаружение Пошаговое руководство по моделиз объектов:

  1. Окно терминала, лучшее существование которого существует у нас из GPU управляемый Ubuntu начальствоcd models/research first,ускорить переподготовкуиз,Затемвыполнить следующую командускачатьданныенабор(images.tar.gzодля 800MB,annotations.tar.gzдля 38MB):
Язык кода:javascript
копировать
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz 
wget http://www.robots.ox.ac.uk/~vgg/data/pets/data/annotations.tar.gz
tar -xvf images.tar.gz
tar -xvf annotations.tar.gz
  1. Запустить Следующая команда конвертирует формат TFRecords в воляданный набор:
Язык кода:javascript
копировать
python object_detection/dataset_tools/create_pet_tf_record.py \
 --label_map_path=object_detection/data/pet_label_map.pbtxt \
 --data_dir=`pwd` \
 --output_dir=`pwd`

Должен Заказ Волясуществоватьmodels/researchОглавлениесерединагенерироватьдваиндивидуальныйимядляpet_train_with_masks.record(268MB)иpet_val_with_masks.record(110MB)из TFRecord документ. TFRecords даA иметь бинарный формат quiz, который содержит TensorFlow приложение можно использовать для обучения или проверки имеющихся, если вы хотите использовать TensorFlow Обнаружение объектов API переподготовкассебяизданныенабор,но TFRecords да Обязательный формат документа.

  1. еслисуществоватьначальствоодин节серединатест Обнаружение объектов笔记книгачасвозвращатьсябезиметьскачатьssd_mobilenet_v1_cocoМодельиfaster_rcnn_resnet101_cocoМодельи Воля Что Разархивироватьприезжатьmodels/researchОглавление,Пожалуйста, выполните следующие действия:
Язык кода:javascript
копировать
wget http://storage.googleapis.com/download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2017_11_17.tar.gz
tar -xvf ssd_mobilenet_v1_coco_2017_11_17.tar.gz
wget http://storage.googleapis.com/download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz
tar -xvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz
  1. заменятьobject_detection/samples/configs/faster_rcnn_resnet101_pets.configдокументсередина出сейчасизPATH_TO_BE_CONFIGUREDпять次,поэтомуэто们变для:
Язык кода:javascript
копировать
fine_tune_checkpoint: "faster_rcnn_resnet101_coco_11_06_2017/model.ckpt"
...
train_input_reader: {
tf_record_input_reader {
input_path: "pet_train_with_masks.record"
}
label_map_path: "object_detection/data/pet_label_map.pbtxt"
}
eval_input_reader: {
tf_record_input_reader {
input_path: "pet_val_with_masks.record"
}
label_map_path: "object_detection/data/pet_label_map.pbtxt"
...
}

faster_rcnn_resnet101_pets.configдокументиспользовать Вобозначение Модельконтрольно-пропускной пунктдокументиз Расположение,Этот файл содержит Модельиз весов после тренировки.,существоватьшаг 2 Сгенерировать для обучения и проверки TFRecords документа такжеобнаружить из 37 Классный питомец из тега item. object_detection/data/pet_label_map.pbtxtиз Нет.один项инаконецодин项нравиться Вниз:

Язык кода:javascript
копировать
item {
id: 1
name: 'Abyssinian'
}
...
item {
id: 37
name: 'yorkshire_terrier'
}
  1. такой же,существоватьobject_detection/samples/configs/ssd_mobilenet_v1_pets.configдокументсередина ИзменятьPATH_TO_BE_CONFIGUREDизпять次出сейчас,поэтомуэто们变для:
Язык кода:javascript
копировать
fine_tune_checkpoint: "object_detection/ssd_mobilenet_v1_coco_2017_11_17/model.ckpt"
train_input_reader: {
tf_record_input_reader {
input_path: "pet_train_with_masks.record"
}
label_map_path: "object_detection/data/pet_label_map.pbtxt"
}
eval_input_reader: {
tf_record_input_reader {
input_path: "pet_val_with_masks.record"
}
label_map_path: "object_detection/data/pet_label_map.pbtxt"
...
}
  1. создаватьодининдивидуальныйновыйизtrain_dir_faster_rcnnОглавление,Затембегатьпереподготовка Заказ:
Язык кода:javascript
копировать
python object_detection/train.py \
   --logtostderr \
   --pipeline_config_path=object_detection/samples/configs/faster_rcnn_resnet101_pets.config \
   --train_dir=train_dir_faster_rcnn

существоватьна основе GPU из системы, из первоначальной потери 5.0 приезжатьпотеря 0.2 О, только не приезжать 25,000 Просто следуйте инструкциям:

Язык кода:javascript
копировать
tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
 name: GeForce GTX 1070 major: 6 minor: 1 memoryClockRate(GHz): 1.7845
 pciBusID: 0000:01:00.0
 totalMemory: 7.92GiB freeMemory: 7.44GiB
 INFO:tensorflow:global step 1: loss = 5.1661 (15.482 sec/step)
 INFO:tensorflow:global step 2: loss = 4.6045 (0.927 sec/step)
 INFO:tensorflow:global step 3: loss = 5.2665 (0.958 sec/step)
 ...
 INFO:tensorflow:global step 25448: loss = 0.2042 (0.372 sec/step)
 INFO:tensorflow:global step 25449: loss = 0.4230 (0.378 sec/step)
 INFO:tensorflow:global step 25450: loss = 0.1240 (0.386 sec/step)
  1. существовать О 20,000 индивидуальныйшаг(О 2 индивидуальный Маленькийчас)назад,в соответствии сCtrl + CЗаканчиватьначальствоописыватьпереподготовка脚книгаизбегать。 создаватьодининдивидуальныйновыйизtrain_dir_ssd_mobilenetОглавление,Затембегать:
Язык кода:javascript
копировать
python object_detection/train.py \
   --logtostderr \
   --pipeline_config_path=object_detection/samples/configs/ssd_mobilenet_v1_pets.config \
   --train_dir=train_dir_ssd_mobilenet

Результаты обучения должны выглядеть так:

Язык кода:javascript
копировать
INFO:tensorflow:global step 1: loss = 136.2856 (23.130 sec/step)
 INFO:tensorflow:global step 2: loss = 126.9009 (0.633 sec/step)
 INFO:tensorflow:global step 3: loss = 119.0644 (0.741 sec/step)
 ...
 INFO:tensorflow:global step 22310: loss = 1.5473 (0.460 sec/step)
 INFO:tensorflow:global step 22311: loss = 2.0510 (0.456 sec/step)
 INFO:tensorflow:global step 22312: loss = 1.6745 (0.461 sec/step)

Вы можете посмотреть приезжать,иFaster_RCNNМодель Взаимно Сравнивать,SSD_MobilenetМодельизпереподготовкасуществоватьоткрыть始и Заканчиватьчасиз损失Все更大。

  1. После ок. 20,000 индивидуальный этап обучения, завершить сценарий переобучения впередиз. Затемсоздаватьодининдивидуальныйновыйизeval_dirОглавлениеибегать评估脚книга:
Язык кода:javascript
копировать
python object_detection/eval.py \
   --logtostderr \
   --pipeline_config_path=object_detection/samples/configs/faster_rcnn_resnet101_pets.config \
   --checkpoint_dir=train_dir_faster_rcnn \
   --eval_dir=eval_dir
  1. Откройте другое окно терминала, существует TensorFlow кореньв каталоге打открытьcd,Затем打открытьmodels/research,Затембегатьtensorboard --logdir=.。 существовать浏览устройствосередина,打открытьhttp://localhost:6006,ты Волясмотретьприезжатьпотерякартина,нравитьсякартина 3.2 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-XV4Jtzdk-1681653027413)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/539aa2c8-da68-42e8-ad74-ad3f2a25e07f.png)]

изображение 3.2: Тенденция общих потерь при обучении Обнаружение объектов Модель

Вы также можете ознакомиться с некоторыми результатами оценки проживания, такими как картина 3.3 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-5hGhPNon-1681653027413)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/ee6c4a9d-473f-429c-a7e2-df3162500502.png)]

изображение 3.3: переподготовка объекта Модель обнаружения при оценке результатов обнаружения изображения изображения

  1. такой же,ты МожеткдляSSD_MobileNetМодельбегать评估脚книга,Затемиспользовать TensorBoard Просмотрите тенденцию потерь и оцените результаты изображения, например:
Язык кода:javascript
копировать
python object_detection/eval.py \
    --logtostderr \
    --pipeline_config_path=object_detection/samples/configs/ssd_mobilenet_v1_pets.config \
    --checkpoint_dir=train_dir_ssd_mobilenet \
    --eval_dir=eval_dir_mobilenet
  1. Вы можете сгенерировать переподготовкуизкартины с помощью следующей команды:
Язык кода:javascript
копировать
python object_detection/export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path object_detection/samples/configs/ssd_mobilenet_v1_pets.config \
    --trained_checkpoint_prefix train_dir_ssd_mobilenet/model.ckpt-21817 \
    --output_directory output_inference_graph_ssd_mobilenet.pb

python object_detection/export_inference_graph.py \
    --input_type image_tensor \
    --pipeline_config_path object_detection/samples/configs/faster_rcnn_resnet101_pets.config \
    --trained_checkpoint_prefix train_dir_faster_rcnn/model.ckpt-24009 \
    --output_directory output_inference_graph_faster_rcnn.pb

ты需хотетьиспользоватьссебяиз特定контрольно-пропускной пунктценитьзаменять--trained_checkpoint_prefixценить(начальствоописывать 21817 и 24009)。

приезжатьэтотдляконец-тысейчассуществоватьдержатьиметьдваиндивидуальныйпройтипереподготовкаиз Обнаружение объектов Модельoutput_inference_graph_ssd_mobilenet.pbиoutput_inference_graph_faster_rcnn.pb,Можетксуществоватьтыиз Python код (из предыдущего раздела) Jupyter 笔记книга)илидвигатьсяприложениеиспользуется в них. Нетиспользовать再тащить延Понятно,Давайте прыгнем в мобильный мир,Посмотрите, как использовать предварительную подготовку и переподготовку модели.

существовать iOS используется в Обнаружение объектов Модель

существоватьначальствоодинглавасередина,нас Кты展示Понятнокакиспользовать TensorFlow Экспериментальные контейнеры будут TensorFlow быстрый Добавить жильевашиз iOS В приложении. TensorFlow Экспериментальный Pod существовать诸нравиться Inception и MobileNet Например, из Модельили, который хорошо работает в переподготовкеиз Модель. Но да, если к менее существовали на момент написания статьи (2018 г.) Год 1 луна)использовать TensorFlow экспериментстручок,ииспользоватьSSD_MobileNetМодель,носуществоватьнагрузкаssd_mobilenetкартинадокументчас Может能встреча收приезжатьк Внизошибкаинформация:

Язык кода:javascript
копировать
Could not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2'

Пока не TensorFlow эксперимент Pod 更новыйдля Сумка括未существоватьздесь注册издействовать,в противном случаерешатьэтотнекоторый问вопросиз唯одинметоддапроходитьот TensorFlow источникbuildсопределение TensorFlow iOS Библиотека, это не то, что вы показываете первым 1 Глава «Мобильный TensorFlow начиная”серединаизсодержание,“какотисточниккодполучатьи Настройка Тензор Флоу”。 Давайте посмотрим на сборку TensorFlow iOS Библиотека и используйте ее для создания уникальных TensorFlow Поддерживатьновый iOS приложениешаги.

Вручную создайте библиотеку TensorFlow iOS.

Просто выполните следующие действия, чтобы создать библиотеку TensorFlow iOS:

  1. Если ты, Воля TensorFlow 1.4 источник zip Разархивируйте ваш домашний каталог, пожалуйста, существует Mac начальство打открытьодининдивидуальныйновый Терминал,Воляcdприезжать TensorFlow источниккорень Оглавление,Прямо сейчас~/tensorflow-1.4.0
  2. бегатьtensorflow/contrib/makefile/build_all_ios.shЗаказ,этотпроцессот 20 Это может варьироваться от минут до часов, в зависимости от ваших потребностей. Mac скорость. После успешного завершения процесса сборки ваша Воля создает три индивидуальные Библиотеки:
Язык кода:javascript
копировать
tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a
tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a
tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a

впереддваиндивидуальный Библиотека处理нас Извпередобсуждатьиз protobuf данные. наконецодининдивидуальный Библиотекада iOS Универсальная статическая библиотека.

Если вы запустите приложение,Пожалуйста, выполните следующие шаги,И столкнулся с ошибкой прибытия в консоли Xcode.,Invalid argument: No OpKernel was registered to support Op 'Less' with these attrs. Registered devices: [CPU], Registered kernels: device='CPU'; T in [DT_FLOAT],ты需хотетьсуществоватьздесь执ХОРОШОшаг 2 Извперед Изменятьtensorflow/contrib/makefile/Makefileдокумент(пожалуйстаженьшень阅Нет. 7 глава,“использовать CNN и LSTM Определите картину «серединаиз» для iOS Определение сборки TensorFlow раздел «Библиотека»). использоватьновый Версияиз TensorFlow Вы можете не увидеть ошибку прибытия.

существоватьприложениеиспользуется в TensorFlow iOS Библиотека

хотетьсуществоватьтыссебяизприложениеиспользуется в Библиотека,Пожалуйста, выполните следующие действия:

  1. существовать Xcode середина,щелкнуть"документ | Новый | проект…”,выбирать“Single View Приложение» и введите TFObjectDetectionAPI Введите название продукта, затем выберите Objective-C для языка (если вы хотите использовать Swift, см. предыдущий главасвязанный Как Воля TensorFlow добавить вприезжатьна основе Swift из iOS приложениеируководитьздесь Место示из必хотеть Изменять),Затемвыбиратьпроектиз Расположениеищелкнуть“создавать”。
  2. существоватьTFObjectDetectionAPIпроектсередина,щелкнутьпроектимясказать,Затемсуществоватьстроитьнастраивать Вниз,щелкнуть+идобавить виспользовать户определениеизнастраивать,ЗатемвходитьTENSORFLOW_ROOTделатьдля TensorFlow источниккореньизпуть(Например$HOME/tensorflow-1.4),нравитьсякартина 3.4 показано. Если вы хотите процитировать более новую версию TensorFlow Приходитьисточник,этотиспользовать户определениеизнастраивать Волясуществоватьдругойнастраиватьиспользуется чтобы потом легко изменить проект обустройства:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-VrTnaK52-1681653027413)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/a8474e70-b35d-4585-a9f9-620aa6cff313.png)]

картина 3.4:добавить вTENSORFLOW_ROOTиспользовать户определениеизнастраивать

  1. щелкнуть Цель,Затемсуществовать“строитьнастраивать”Вниз搜索“другой Связьустройство标志”。 Добавляет следующие значения:
Язык кода:javascript
копировать
-force_load $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/nsync/builds/lipo.ios.c++11/nsync.a

需хотеть Нет.одининдивидуальный–force_load,потому чтодляэтоубеждаться TensorFlow Необходимый C++ 构造устройство Волясвязанный,в противном случае,Вы все еще можете создать приложение,Но вы столкнетесь с тем, что приезжатьсвязанный сеанс не зарегистрирован из-за ошибки.

наконецодининдивидуальный Библиотекаиспользовать Вnsync,этотдаодининдивидуальный C Библиотека,Экспортируемый мьютекс и другие методы синхронизации.。 существоватьновыйиз TensorFlow Представлено в версии.

  1. Найдите «Путь поиска по заголовку» и добавьте следующие значения:
Язык кода:javascript
копировать
$(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/protobuf/src $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/eigen $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/proto

после,тывстречасмотретьприезжатьпохожийкартина 3.5 из Содержания:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-BcQ9PbiI-1681653027414)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/bae0f128-065f-4267-b1cc-b2450650e8d7.png)]

картина 3.5: для цели добавлено хаби TensorFlow Сопутствующие изменениястроительства

  1. Цель существования на «Фазе строительства»,существуют Belt Библиотекаиз Ссылка Бинарный документ Добавить Ускорить рамку,нравитьсякартина 3.6 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-TPYeFSUH-1681653027414)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/3c92f162-ad1d-4718-a72f-07f10ebc71fa.png)]

картина 3.6: Добавьте структуру ускорения

  1. Возврат для сборки TensorFlow iOS Терминал Библиотекаиз,существоватьtensorflow/core/platform/default/mutex.hНайти вприезжатьк Вниздва ХОРОШОкод:
Язык кода:javascript
копировать
#include "nsync_cv.h"
#include "nsync_mu.h"

Затем измените его на:

Язык кода:javascript
копировать
#include "nsync/public/nsync_cv.h"
#include "nsync/public/nsync_mu.h"

Только需Воля Ручная сборкаиз TensorFlow Библиотека TensorFlow добавить вприезжать iOS приложение Прямо сейчас Может。

использоватьот TensorFlow изhigherВерсия (например. 1.4)Ручная сборкаиз TensorFlow Библиотекасуществоватьтыизприложениесерединанагрузка TensorFlow Обнаружение объектов Модельчас,Воля Нетвстреча出сейчасиспользовать TensorFlow Экспериментальный POD илиот Первые дни Версия Строить Руководство Библиотекачас Может能встречасмотретьприезжатьизошибка版。этотдапотому чтодля Кусочек Вtensorflow/contrib/makefileсерединаизимядляtf_op_files.txtиздокументиспользовать Вопределение应для TensorFlow Библиотекастроитьи Сумка括哪некоторыйдействовать,существовать TensorFlow 1.4 Среднее определение «издействовать» встречается чаще, чем предыдущая версия. Например, Тензор Флоу 1.4 серединаизtf_op_files.txtдокументиметьодин ХОРОШОtensorflow/core/kernels/non_max_suppression_op.ccопределение ПонятноNonMaxSuppressionV2действовать,этот Сразуدلا 什么нас电影Ручная сборкаиз Библиотекасередина处理Понятно载是件,防конец出сейчасошибкаCould not create TensorFlow Graph: Not found: Op type not registered 'NonMaxSuppressionV2',Давайте проверим, не возникли ли какие-либо ошибки панели TensorFlow. Волякоме,если遇приезжатьпохожийизOp type not registeredошибка,но Можеткпроходитьсуществоватьtf_op_files.txtдокументсерединадобавить вопределениедействоватьизправильныйизисточниккоддокумент,Потом снова проектbuild_all_ios.shПриходитьремонт Долженошибка。создаватьодининдивидуальныйновыйизlibtensorflow-core.aдокумент.

К iOS приложениедобавить в Обнаружение объектов Функция

Теперь существуют, выполните следующие действия, чтобы воля Модель документа, метка документа Добавьте код Добавитьприложение и спроектировать, чтобы увидеть фактическое из Обнаружение объекты:

  1. тащить放начальствоодин节серединаизтрииндивидуальныйобъект Модель обнаружениякартинаssd_mobilenet_v1_frozen_inference_graph.pb,faster_rcnn_inceptionv2_frozen_inference_graph.pbиfaster_rcnn_resnet101_frozen_inference_graph.pb,а такжеmscoco_label_map.pbtxtЭтикетка映射документи Несколькоиндивидуальныйтесткартинакартина Отправить приезжатьTFObjectDetectionAPIпроект。
  2. Воля TensorFlow iOS Пример простого приложенияили Предыдущая глава Создано из iOS приложениесерединаизios_image_load.mm及Что.hдокументдобавить вприезжатьпроектсередина。
  3. существоватьэтотвнутри(существовать Mac Вышеprotoc-3.4.0-osx-x86_64.zipдокумент)скачать协议缓冲区Версия 3.4.0。 хотетьиспользовать TensorFlow 1.4 Библиотеканужно быть точнымиз 3.4.0 Версия,и更высокий Версияиз TensorFlow Могут потребоваться буферы протокола более высокой версии.
  4. 假设скачатьиздокумент Разархивироватьприезжать~/DownloadsОглавлениесередина,Откройте окно «Терминал» и выполните следующую команду:
Язык кода:javascript
копировать
cd <TENSORFLOW_ROOT>/models/research/object_detection/protos

~/Downloads/protoc-3.4.0-osx-x86_64/bin/protoc string_int_label_map.proto --cpp_out=<path_to_your_TFObjectDetectionAPI_project>, the same location as your code files and the three graph files.
  1. protocкомпилироватьустройство Заказ Заканчиватьназад,ты Волясуществоватьпроектизисточник Оглавлениесерединасмотретьприезжатьдваиндивидуальныйдокумент:string_int_label_map.pb.ccиstring_int_label_map.pb.h。 Волядваиндивидуальныйдокументдобавить вприезжать Xcode проектсередина。
  2. существовать Xcode середина,Как и в существовании в предыдущем,ВоляViewController.m重命имядляViewController.mm,Затемпохожий ВНет. 2 глава,“проходитьмигрироватьизучатьвернокартинакартинаруководить Классификация”изHelloTensorFlowприложениеизViewController.mm,существовать Нажмитеиз处理устройствосерединадлятрииндивидуальный Обнаружение объектов Модельдобавить втрииндивидуальныйUIAlertAction,Мы добавили Воля Модель в приезжатьпроект и Воля для тестирования. Сейчас существуют,完всеизфайлы проекта应нравитьсякартина 3.7 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-Eb4f0Hkz-1681653027414)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/7023289e-ae57-4518-920e-140985314d13.png)]

картина 3.7:TFObjectDetection API файлы проекта

  1. продолжатьсуществоватьViewController.mmсерединадобавить в Что余код. существоватьviewDidLoadсередина,добавить вк编степень方РежимсоздаватьновыйUIImageViewизкод,кпервыйпоказыватьтесткартинакартина,исуществоватьвыбирать Понятно特定Модельксуществоватьтесткартинакартинаначальствобегатьпослепоказывать Обнаружениеприезжатьизрезультат,Затемдобавить вк Внизфункциявыполнить:
Язык кода:javascript
копировать
NSString* FilePathForResourceName(NSString* name, NSString* extension)
int LoadLablesFile(const string pbtxtFileName, object_detection::protos::StringIntLabelMap *imageLabels)
string GetDisplayName(const object_detection::protos::StringIntLabelMap* labels, int index) 
Status LoadGraph(const string& graph_file_name, std::unique_ptr<tensorflow::Session>* session)
void DrawTopDetections(std::vector<Tensor>& outputs, int image_width, int image_height)
void RunInferenceOnImage(NSString *model)

Внизодиншагпосле,Мы, Воля, объясним, что это за некоторые функции, извыполнить,ты Можетксуществовать Должен书изисточниккодсклад Библиотекаизch3/iosпапкасерединаполучать Местоиметьисточниккод.

  1. существовать iOS Эмулятор или устройство запускает приложение. Прежде всего, вы увидите на экране существующую картину. Нажмите на любое расположение, и вы увидите индивидуальное диалоговое окно с предложением выбрать модель. выбиратьSSD MobileNetМодель,существования занимает О одну секунду в эмуляторе,существовать iPhone 6 Потратьте пять секунд на существованиекартина, как на результат обнаружения розыгрыша. Faster RCNN Inception V2 Это занимает больше времени (требуется в эмуляторе 5 Второй,существовать iPhone 6 Это занимает примерно 20 Второй); Должен Модельтакже СравниватьSSD MobileNetболее точный,Можетк捕获SSD MobileNetМодель Упущениеизодининдивидуальныйсобакаобъект。 наконецодининдивидуальный Модель,Быстрее RCNN Resnet 101,существовать iOS Волязакрытие, проведенное в эмуляторе 20 Второй,нопотому что Чторазмерисуществовать iPhone 6 крушение. картина 3.8 Подвести итог Понятнобегатьрезультат:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-T3LUDHYE-1681653027414)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/411e68db-3026-4ba4-964a-3d9a174dce6f.png)]

изображение 3.8: использовать различные из Модельпроектприложения и отображать результаты обнаружения

Вернуться к шагам 7 серединаизфункция,FilePathForResourceNameфункциядаиспользовать В返回资источникдокументпутьиз助手функция:mscoco_label_map.pbtxtдокумент,Должендокументопределение Понятнохотеть Обнаружениеиз 90 индивидуальныйвернослондобрыйиз Идентификатор, внутреннее имя и отображаемое имя. ,Моделькартинадокументитесткартинакартина。 этоизвыполнитьинассуществоватьначальствоодинглаваизHelloTensorFlowприложениесерединасмотретьприезжатьизвыполнить Взаимно同。

LoadLablesFileиGetDisplayNameфункцияиспользовать Google Protobuf API нагрузкаианализироватьmscoco_label_map.pbtxtдокумент,И возвращает отображаемое имя для отображения обнаружения прибытияизверно слона из ID.

LoadGraph пытается загрузить один из трех документов индивидуального пользователя, выбирающих Модель, и возвращает статус загрузки.

этотдваиндивидуальный关ключфункциядаRunInferenceOnImageиDrawTopDetections。 正нравитьсянассуществовать“Настройка Тензор Флоу Обнаружение объектов API”частьсередина Местосмотретьприезжатьиз那Образец,summary_graph工Инструментпоказывать Понятнонассуществоватьприложениеиспользуется виз Три вида предварительной подготовки Обнаружение объектов Модельизк Внизинформация(пожалуйста, обрати вниманиеuint8тип):

Язык кода:javascript
копировать
Found 1 possible inputs: (name=image_tensor, type=uint8(4), shape=[?,?,?,3])

этот Сразудадля什么нас需хотетьиспользоватьuint8создаватьодининдивидуальныйкартинакартина Тензор,и Нетдаfloatтип Приходитьнагрузкаприезжатьнасиз Модель,в противном случаесуществоватьбегать Модельчасвстреча出сейчасошибка。 Также обратите внимание, что при использовании TensorFlow C++ API изSessionизRunметод Воляimage_dataизменять换дляTensorтипизimage_dataчас,нас Нетиспользоватьinput_meanи input_stdСразукартинанассуществоватьиспользоватькартинакак классификация Модельчас Место做из(связанныйподробный Сравнивать较,Видеть Нет. 2 глава,“проходитьмигрироватьизучатьвернокартинакартинаруководить Классификация”из HelloTensorFlow приложениеизRunInferenceOnImageвыполнить)。 нас知道иметь Четыреиндивидуальныйимядляdetection_boxes,detection_scores,detection_classesиnum_detectionsизвыход,поэтомуRunInferenceOnImageИнструментиметьк Внизкод Приходитьдля Модельвходитькартинакартинавходитьиполучать Четыреиндивидуальныйвыход:

Язык кода:javascript
копировать
tensorflow::Tensor image_tensor(tensorflow::DT_UINT8, tensorflow::TensorShape({1, image_height, image_width, wanted_channels}));

auto image_tensor_mapped = image_tensor.tensor<uint8, 4>();
tensorflow::uint8* in = image_data.data();
uint8* c_out = image_tensor_mapped.data();
for (int y = 0; y < image_height; ++y) {
    tensorflow::uint8* in_row = in + (y * image_width * image_channels);
    uint8* out_row = c_out + (y * image_width * wanted_channels);
    for (int x = 0; x < image_width; ++x) {
        tensorflow::uint8* in_pixel = in_row + (x * image_channels);
        uint8* out_pixel = out_row + (x * wanted_channels);
        for (int c = 0; c < wanted_channels; ++c) {
            out_pixel[c] = in_pixel[c];
        }
    }
}
std::vector<Tensor> outputs;
Status run_status = session->Run({{"image_tensor", image_tensor}},
             {"detection_boxes", "detection_scores", "detection_classes", "num_detections"}, {}, &outputs);

хотетьсуществовать Обнаружениеприезжатьизвернослонначальство绘制边界коробка,нас ВоляoutputsТензор К量проходить递给DrawTopDetections,назад ВОЗиспользоватьк ВнизкоданализироватьoutputsК量кполучать Четыреиндивидуальныйвыходизценить,и пройдитесь по каждому обнаружению, чтобы получить значение ограничивающей рамки (слева),начальство,верно,(Вниз) а также Обнаружениеприезжатьизверно Нравится ID из отображаемого имени,поэтомуты Можетк编写кодкиспользоватьк Внизимясказать绘制边界коробка:

Язык кода:javascript
копировать
auto detection_boxes = outputs[0].flat<float>();
auto detection_scores = outputs[1].flat<float>();
auto detection_classes = outputs[2].flat<float>();
auto num_detections = outputs[3].flat<float>()(0);

LOG(INFO) << "num_detections: " << num_detections << ", detection_scores size: " << detection_scores.size() << ", detection_classes size: " << detection_classes.size() << ", detection_boxes size: " << detection_boxes.size();

for (int i = 0; i < num_detections; i++) {
    float left = detection_boxes(i * 4 + 1) * image_width;
    float top = detection_boxes(i * 4 + 0) * image_height;
    float right = detection_boxes(i * 4 + 3) * image_width;
    float bottom = detection_boxes((i * 4 + 2)) * image_height; 
    string displayName = GetDisplayName(&imageLabels, detection_classes(i)); 
    LOG(INFO) << "Detected " << i << ": " << displayName << ", " << score << ", (" << left << ", " << top << ", " << right << ", " << bottom << ")";
    ...
  }

когдавпередлапшаизLOG(INFO)ХОРОШОикартина 3.1 середина из второго индивидуального теста картина как вместе проектировать, когда, а также TensorFlow Object Detection API веб-сайтначальствопоказыватьиз Демокартинакартиначас,Выведет следующую информацию:

Язык кода:javascript
копировать
num_detections: 100, detection_scores size: 100, detection_classes size: 100, detection_boxes size: 400
 Detected 0: person, 0.916851, (533.138, 498.37, 553.206, 533.727)
 Detected 1: kite, 0.828284, (467.467, 344.695, 485.3, 362.049)
 Detected 2: person, 0.779872, (78.2835, 516.831, 101.287, 560.955)
 Detected 3: kite, 0.769913, (591.238, 72.0729, 676.863, 149.322)

этот Сразудасуществовать iOS приложениеиспользуется всейчасиметьиз После пред-обучение Обнаружение объектов Модель Место需хотетьиз。 каксуществовать iOS используется внасизпройтиобучение Обнаружение объектов Модель? Оказывается,этотиииспользовать предварительное обучение Модель практически такая же,существующие обрабатывают переподготовку картина типа классификационной модели,无需картинаначальствоодинглаваодин Образец修改input_size, input_mean, input_stdиinput_name。 Все, что вам нужно сделать, это:

  1. Воля из После обучения из Модель (например,существоватьначальствоодин节серединасоздаватьизoutput_inference_graph_ssd_mobilenet.pbдокумент,использовать ВМодельизобучение Этикетка映射документ,Напримерpet_label_map.pbtxt)добавить вприезжатьTFObjectDetectionAPI проект
  2. существоватьViewController.mmсередина,использоватьпереподготовкаиз МодельвызовRunInferenceOnImage
  3. все ещесуществоватьViewController.mmсередина,существоватьDrawTopDetectionsфункция内вызовLoadLablesFile([FilePathForResourceName(@"pet_label_map", @"pbtxt") UTF8String], &imageLabels);

Вот и все. Запланировать Приложение, как вы можете видеть, приезжать вернопереподготовкаиз Модельверно обнаружение прибытияиз результатов корректировок стало лучше. Например, использоватьпроходитьиспользовать набор данных Oxford Pet для переподготовки при создании извперед-изпереподго. Товка Модель, мы хотим видеть ограничивающую рамку вокруг головы без всего индивидуального тела, и это наша существующаякартина. 3.9 Показанное в тестовом изображении изображение выглядит как приезжать:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-3QdwEhv3-1681653027415)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/ced173a8-1b82-4868-a274-3cdf666556e1.png)]

изображение 3.9: Сравнение результатов обнаружения моделиз перед обучением и повторным обучением

Использование YOLO2 — еще одна модель обнаружения объектов.

Как упоминалось в первой части нашей жизни, приезжатьиз,YOLO2 да另одининдивидуальныйпрохладныйиз Обнаружение объектов Модель,этоиспользовать Понятнои RCNN Серия разных методов. Он использует одну индивидуальную нейронную сеть для ввода изображения, например, деление на регионы фиксированного размера (но не так, как RCNN 系列метод那Образецпоставлятьобластьпредположение),И предсказать каждый отдельный регион по ограничивающей рамке,Категория и Вероятность.

TensorFlow Android Примерприложение Инструментиметьиспользоватьпредварительнообучение YOLO Модельиз Примеркод,нобезиметь iOS Пример。 потому что YOLO2 что удобнее всего из Обнаружения Модель объекта одна и очень точная (посмотрите на существующемвеб-сайте) SSD Модельиз mAP Сравните), поэтому необходимо понять, как существуют iOS приложениеиспользуется в этом.

YOLO использоватьсказатьдля Darknet из уникального открывает источник кадра нейронной сети для обучения своей модели. Также есть Еще один по имени darkflow из Библиотека,Должен Библиотека Можетк Воляиспользовать Darknet обучение YOLO Модельиз Преобразование веса нейронной сетидля TensorFlow картина Формат,ипереподготовкапредварительнообучение Модель.

К TensorFlow Конструкция формата YOLO2 Модель,пожалуйстапервыйотэтотвнутриполучать темный поток. потому что это требует Python3 и TensorFlow 1.0(Python 2.7 и TensorFlow 1.4 или более поздняя версия также может работать), поэтому мы Воляиспользовать Anaconda Приходитьнастраиватьодининдивидуальныйновыйиз Инструментиметь Python3 Поддерживать TensorFlow 1.0 среда:

Язык кода:javascript
копировать
conda create --name tf1.0_p35 python=3.5
source activate tf1.0_p35
conda install -c derickl tensorflow

同часбегатьconda install -c menpo opencv3к Установить OpenCV 3,этотда darkflow из Другая индивидуальная зависимость. сейчассуществовать,Воляcdсдвигк darkflow Оглавление,Затембегатьpip install .Установить darkflow。

Следующий,нас需хотетьскачать После пред-обучение YOLO Модельиз WEIGHTS - Мы Воля пробуем две индивидуальные Tiny-YOLO Модель, они супер быстрые, но не такие полные, как YOLO Модель точная. 同часбегать Tiny-YOLO Модельи YOLO Модельиз iOS код почти такой же, поэтому мы просто покажем вам, как его запускать. Tiny-YOLO Модель.

ты Можетксуществовать YOLO2 официальный сайтскачать крошечный-йоло-вок (по мотивам 20 индивидуальныйвернослондобрыйиз PASCAL VOC dataSET TRAINING)и крошечный йоло (получил 80 индивидуальныйвернослондобрыйиз MS COCO dataSET ОБУЧЕНИЕ)изучите документ о весе и конфигурации. или darkflow склад Библиотека。 сейчассуществовать,выполнить следующую команду Воля权重изменять换для TensorFlow картинадокумент:

Язык кода:javascript
копировать
flow --model cfg/tiny-yolo-voc.cfg --load bin/tiny-yolo-voc.weights --savepb
flow --model cfg/tiny-yolo.cfg --load bin/tiny-yolo.weights --savepb

генерироватьиздваиндивидуальныйдокументtiny-yolo-voc.pbиtiny-yolo.pbВоля Кусочек Вbuilt_graphОглавлениесередина。 сейчассуществовать,изменятьприезжать TensorFlow источниккорень Оглавление,икартинаначальствоодинглаваодин Образецвыполнить следующую команду Приходитьсоздавать量化Модель:

Язык кода:javascript
копировать
python tensorflow/tools/quantization/quantize_graph.py --input=darkflow/built_graph/tiny-yolo.pb --output_node_names=output --output=quantized_tiny-yolo.pb --mode=weights

python tensorflow/tools/quantization/quantize_graph.py --input=darkflow/built_graph/tiny-yolo-voc.pb --output_node_names=output --output=quantized_tiny-yolo-voc.pb --mode=weights

сейчассуществовать,пожалуйстав соответствии с照к Внизшаг查смотретькаксуществоватьнасиз iOS приложениеиспользуется вдваиндивидуальный YOLO Модель:

  1. Воляquantized_tiny-yolo-voc.pbиquantized_tiny-yolo.pbВсетащитьприезжатьTFObjectDetectionAPIпроектсередина
  2. существоватьViewController.mmсерединадобавить вдваиндивидуальныйновыйизтревогадействовать,поэтомусуществоватьбегать Долженприложениечас,ты Воля смотретьприезжать можно использовать для создания модели,нравитьсякартина 3.10 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-xdaWkWrO-1681653027415)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/532a45ca-35ee-452b-b33a-79d557fee667.png)]

картина 3.10:Волядваиндивидуальный YOLO Модельдобавить вприезжать iOS приложение

  1. Добавьте следующий код во входные данные Воли, например, обработку тензора прибытия, для подачи входного узла прибытия и существования, загруженного в YOLO Моделькартинаиз случая запуска TensorFlow сеанс для формирования выходных данных прибора:
Язык кода:javascript
копировать
tensorflow::Tensor image_tensor(tensorflow::DT_FLOAT,tensorflow::TensorShape({1, wanted_height, wanted_width, wanted_channels}));
auto image_tensor_mapped = image_tensor.tensor<float, 4>();
tensorflow::uint8* in = image_data.data();
float* out = image_tensor_mapped.data();
for (int y = 0; y < wanted_height; ++y) {
   ...   
   out_pixel[c] = in_pixel[c] / 255.0f;
}
std::vector<tensorflow::Tensor> outputs;
tensorflow::Status run_status = session->Run({{"input", image_tensor}}, {"output"}, {}, &outputs);

пожалуйста, обрати внимание,здесьизfor-loopиsession->Runиначальствоодинглавасерединаиспользовать Вкартинакак классификацияизкода такжеиспользоватькнигаглававпередлапша Место示издругой Модельруководить Обнаружение объектовизкодсерединажитьсуществовать细微но重хотетьиз区Не(нас未показывать...серединаизкодчасть,потому чтодляиэтотдваиндивидуальный Примерсерединаиз Взаимно同)。 Чтобы правильно преобразовать изображение в данные, вам необходимо знать подробности о Модельиз,илиот. Python,Android или iOS Изиметь Эффективное обучение Примера, конечно, также необходимо для отладки. для Понятноправильныйнастраиватьвходитьивыход Имя узла,Можеткиспользоватьsummarize_graphИнструментылинасмного次показыватьиз Python фрагмент кода.

  1. Волявыходрезультатпроходить递给имядляYoloPostProcessизфункция,Долженфункцияпохожий Вtensorflow/examples/android/src/org/tensorflow/demo/TensorFlowYoloDetector.java Android Примердокументсерединаизназад处理код:
Язык кода:javascript
копировать
tensorflow::Tensor* output = &outputs[0];
std::vector<std::pair<float, int> > top_results;
YoloPostProcess(model, output->flat<float>(), &top_results);

Мы не показываем здесь остальной код. ты Можетксуществоватьисточниккодхранилище Библиотекаизch3/iosсередина检出完всеиз iOS приложение.

  1. бегать Долженприложение,Затемвыбирать YOLO2 Tiny VOC или YOLO2 Tiny COCO,ииспользовать SSD MobileNet v1 Модель Взаимно Сравнивать,Вы увидите подобную скорость,Однако точность результатов испытаний низкая.

Хотя на основе MobileNet из TensorFlow Модельи Tiny YOLO2 Модельиз менее точен, но TensorFlow Обнаружение объектов Модельи YOLO2 Модель существования мобильных устройств работает очень быстро. Больше Faster RNN Модельи完всеиз YOLO2 Модель более точная, но она занимает больше времени и даже не может существовать на мобильном устройстве. Поэтому К переместить приложение добавить быстрое Обнаружение объектыиз лучший методэто использовать SSD MobileNet или Tiny-YOLO2 Модель,илипройтипереподготовкаитонкая настройкаиз Модель. Модельиз Версия, вероятно, будет иметь лучшую производительность и точность в будущем. Зная это введение в «главуиз», вы сможете существовать. iOS приложениесерединабыстрый启использовать Обнаружение объектов。

Подвести итог

существоватькнигаглавасередина,наспервый简хотеть概описывать Понятно各добрый Нет同изна на основе глубокого обученияиз Обнаружение объектовметод。 Затем мы подробно расскажем, как использовать TensorFlow Обнаружение объектов API проходитьпредварительнообучение Модельруководитьсейчас成израссуждение,а такжекаксуществовать Python серединапереподготовкапредварительнообучение TensorFlow Обнаружение объектов Модель. насвозвращатьсяпоставлять Понятносвязанныйкак Вручную создайте библиотеку TensorFlow iOS.,использовать Должен Библиотекасоздаватьновыйиз iOS приложениеа такжекаксуществовать iOS используется в приветствиях и перепереготовкеиз SSD MobileNet и Faster RCNN Модельизподробный Учебник. Наконец, мы представляем существованиетыиз iOS приложениеиспользуется Еще одно мощное из Обнаружение объектов Модель YOLO2 Требуемый контент.

существовать Внизодинглавасередина,этотдаус и компьютерное зрение, связанные с Третьей задачей,нас Воля仔细研究каксуществовать Python и TensorFlow Средняя подготовка и конструкция, интересные и глубокие модели обучения. такжекаксуществовать iOS и Android приложениеиспользуется В него добавлена ​​потрясающая изкартина, похожая на художественный стиль.

4. Преобразуйте изображения с помощью потрясающих художественных стилей.

сот 2012 Годглубокая нейронная сетьсуществовать AlexNet победить ImageNet 挑战назадоткрыть始起飞к Приходить,人工智能研究人员одинпрямойсуществовать Воляглубокое обучениетехнология(Сумка括После пред-обучениеглубина CNN Модель) приложение во все большем количестве проблемных мест. Иметь Что может быть более творческим, чем создавать искусство? одиндобрый想法уже经提出ивыполнить Понятно,для передачи нейронных паттернов,этоделатьты Можетк利использоватьпредварительнообучениеглубокая нейронная сеть Модельипроходить递картинакартинаилилюбой Ван Гогиз Образец Режимили Монеиз杰делать),Например, другая картинка картины (например, индивидуальная аватарка картинакусокили Вам нравится картинка изкартины),отисоздавать Волякартинакусоксодержаниеи杰делать风格融合существоватьодин起изкартинакусок。 действительныйначальство,иметьодининдивидуальныйимядля Prisma из iOS приложениесуществовать 2016 Год получил награду Год за лучшее приложение степени Год. существует Всего за несколько секунд вы сможете выбрать любой стиль и мигрировать фрагмент изкартины.

существоватькнигаглавасередина,нас Воляпервый概описыватьтридобрый神经Образец Режиммигрироватьметод,Один из оригинальных методов,Улучшенный метод,另одиндобрыйда进одиншагулучшатьизметод。 Затем мы, Воля, подробно изучим, как использовать второй метод для обучения быстрому нейронному стилю Мигрировать Модель, какая Модель может существовать из вас. iOS и Android Смартфониспользуется в,квыполнить Prisma из функции. Далее мы Воляактуальносуществовать iOS приложениеи Android приложениеиспользуется В «Модели» проведет вас через заголовок, чтобы начать процесс создания такого индивидуального приложения. Напоследок мы Воля К вас кратко познакомим TensorFlow Magenta Откройте исходный проект, вы можете получить его за основеглубокое обучениестроить更многоизмузыкаи艺术генерироватьприложение,и Кты展示какиспользоватьодининдивидуальныйпредварительнообучение Образец Режиммигрировать Модель, дана основа Нейронный стиль мигрироватьиз был создан на основе последних достижений исследований, в том числе 26 Крутой художественный стиль, который вы можете использовать iOS и Android приложениесерединаполучать Быстреепроизводительностьирезультат. Подводя итог, в этой главе будут рассмотрены следующие темы:

  • Передача нейронного стиля – краткий обзор
  • Обучайте модели переноса быстрых нейронных стилей
  • существовать iOS Использование моделей передачи быстрых нейронных стилей в
  • существовать Android Использование моделей передачи быстрых нейронных стилей в
  • существовать iOS используется в TensorFlow Magenta мультистилевая модель
  • существовать Android используется в TensorFlow Magenta мультистилевая модель

Передача нейронного стиля – краткий обзор

использовать глубокую нейронную сеть Волякартина, например, контент и другую картинку, например, в стиле, объединить оригинальную идею и алгоритм в 2015 Год Опубликовано летомсуществоватьвопросдля«Художественный стиль из нейронного алгоритма»из论文середина。этода 2014 Год ImageNet Картина Как и победитель конкурса, вызов имеет 16 отдельный сверточный слой или отображение объектов, соответственно представляющее содержимое изображения различного типа изкартина. существуетэтот В исходном методе сначала воля окончательно мигрируетизкартина изображения инициализирует для содержимого изображения изображение сливается с белым шумом изображения изображения. содержание损失функцияопределениедлясодержаниекартинакартинаирезультаткартинакартинаизслой сверткиconv4_2начальство Все被馈入 VGG-19 После сети определенный набор представлений объектов представлен квадратом потерь ошибок. Функция потери стиля вычисляет стиль изображения типа и результирующий образ типа существования пятьиндивидуальные различные сверточные слои на основе общей разницы ошибок. Затем Воля общая потеря определяет потерю контента, потерю стиля и общую потерю. существоватьтренироваться期间,Потери будут снижены до минимального уровня.,И сгенерируйте одну индивидуальную карту, например, по содержанию, а другую индивидуальную карту, например, по стилю, смешанную вместе из результата, подобного изображению.

хотя Оригинальный нейронный стиль мигрировать алгоритм из потрясающих результатов,Но его производительность очень низкая — обучение стилю мигрироватькартину похоже на часть процесса генерации,в целомсуществовать GPU Потратьте несколько минут на существование CPU Создание хорошего изображения занимает около часа. результат.

Если вас интересуют подробности оригинального алгоритма,Можетксуществоватьк Вниз Расположениечитать Должен论文а такжедокументполныйиз Python выполнить.нас Нетвстречаобсуждатьэтотдобрыйоригинальныйалгоритм,потому чтодлясуществоватьсотовый телефонначальствобегать Долженалгоритмда Нет Может ХОРОШОиз,Дапытаться Долженалгоритм很иметьинтересныйиметьиспользовать,Можетк更好地учитьсякак Иголкаверно Нет同изкомпьютер视觉Задачаиспользоватьпредварительнообучениеглубина CNN Модель.

естественно,существовать 2016 Год,В статье опубликован новый алгоритм «быстрой сортировки трех индивидуальных количеств».,Прямо сейчас«Передача стиля в реальном времени, сверхвысокое разрешение и потеря восприятия»,делать ВОЗда Justin Johnson ждать. Он разделяет процесс обучения и определяет лучшие функции потерь, которые сами по себе являются глубокими нейронными сетями. После обучения (существовать) В следующем разделе мы Воля посмотрим на проживание, существование. GPU начальство Может能хотеть花费Несколькоиндивидуальный Маленькийчас),использоватьтренироватьсяназадиз Модель Приходитьгенерировать Образец Режиммигрироватьизкартинакартинасуществоватькомпьютерначальство Несколько乎да实часиз,исуществовать Смартфонначальство Только需Несколько Второй钟。

использоватьэтот быстро Алгоритм нейронной миграции по-прежнему индивидуален. Недостатки: Модель можно обучить только для определенных стилей.,поэтому,хотетьсуществоватьтыизприложениеиспользуется В различных стилях эти стили необходимо обучать один за другим, чтобы каждый стиль генерировал индивидуальную модель. 。 2017 Год发表Понятноодин篇имядля«Изучение стилей и художественного выражения»изновый论文,это发сейчасодининдивидуальныйодинодинизглубокая нейронная сеть Модель Можетк概括许много Нет同из Образец Режим。 Проект TensorFlow MagentaСумка括Инструментиметьмногодобрый Образец Режимизпредварительнотренироваться Модель,Мы Волясуществовать этого главы из двух последних отдельных частей, посмотрим на проживание,существовать iOS и Android приложениеиспользуется Этот тип модели позволяет создавать мощные и волшебные художественные эффекты, да насколько они легки.

Обучайте модели переноса быстрых нейронных стилей

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

  1. существовать Mac из Терминала, или лучшее существование GPU управляемый Ubuntu начальство,бегатьgit clone https://github.com/jeffxtang/fast-style-transfer,этотда Johnson избыстрый Образец Режиммигрироватьиз TensorFlow выполнитьизодининдивидуальныйочень хорошийизветвь,Модифицированныйдляпозволятьсуществовать iOS или Android приложениеиспользуется впройтиобучение Модель.
  2. cdприезжатьбыстрый Образец Режиммигрировать Оглавление,Затембегатьsetup.sh脚книгаскачатьпредварительнообучение VGG-19 Модельдокумента также MS COCO тренироватьсяданныенабор,нассуществоватьначальствоодинглавасередина提приезжать Проходить,Обратите внимание, что загрузка большого документа может занять несколько часов.
  3. выполнить следующую команду,использоватьимядляstarry_night.jpgиз Образец Режимкартинакартинаиимядляww1.jpgизсодержаниекартинакартинаруководитьтренироваться,Чтобы создать документ контрольной точки:
Язык кода:javascript
копировать
mkdir checkpoints
mkdir test_dir
python style.py --style images/starry_night.jpg --test images/ww1.jpg --test-dir test_dir --content-weight 1.5e1 --checkpoint-dir checkpoints --checkpoint-iterations 1000 --batch-size 10

imagesОглавлениесерединавозвращатьсяиметьодиннекоторыйдругой Образец Режимизкартинакартина,Можетиспользовать Всоздавать Нет同изконтрольно-пропускной пунктдокумент. здесьиспользоватьизstarry_night.jpgОбразец Режимкартинакусокда Ван Гогизодин幅著имя画делать,нравитьсякартина 4.1 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-LNZjkACR-1681653027415)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/ea1f4494-b7f4-4be2-a897-adfcbc4f0ef4.jpg)]

картина 4.1: Сделать портрет в стиле картины, используя картину Ван Гога из живописи

существовать Нет. 1 глава, "двигаться TensorFlow начиная”серединанастраиватьиз NVIDIA GTX 1070 GPU управляемый Ubuntu В целом индивидуальное обучение О необходимо 5 индивидуальный Маленькийчас,исуществовать CPU Это определенно займет больше времени 。

Этот сценарий изначально был написан для TensorFlow 0.12 Написано из, но позже для TensorFlow 1.1 Были внесены изменения и подтверждено, что они могут существовать. TensorFlow 1.4 из Python 2.7 Обычный бег в окружающей среде.

  1. существовать文книгаредактироватьустройствосередина打открытьevaluate.pyдокумент,Затем取消Комментарийк Вниздва ХОРОШОкод(существовать 158 и 159 ХОРОШО):
Язык кода:javascript
копировать
# saver = tf.train.Saver()
# saver.save(sess, "checkpoints_ios/fns.ckpt")
  1. выполнить следующую команду,квходитькартинакартинаimg_placeholderимигрироватьизкартинакартинаpredsсоздаватьновыйизконтрольно-пропускной пункт:
Язык кода:javascript
копировать
python evaluate.py --checkpoint checkpoints \
 --in-path examples/content/dog.jpg \
 --out-path examples/content/dog-output.jpg
  1. выполнить следующую командукстроитьодининдивидуальный TensorFlow документ, определение документа Волякартина и веса контрольных точек в сочетании с существующими. этот Волясоздаватьодининдивидуальный О 6.7MB из.pbдокумент:
Язык кода:javascript
копировать
python freeze.py --model_folder=checkpoints_ios --output_graph fst_frozen.pb
  1. 假设ты Инструментиметь/tf_filesОглавление,Волягенерироватьизfst_frozen.pbдокументкопироватьприезжать/tf_files,cdпрямойкопироватьприезжать TensorFlow источниккорень Оглавление(Может能да~/tensorflow-1.4.0),Затемвыполнить следующую командукгенерировать Количественная модельиз.pbдокумент(нассуществовать Нет. 2 Количественная оценка вводится в главе «Изучение верных картина изображений для классификации»):
Язык кода:javascript
копировать
bazel-bin/tensorflow/tools/quantization/quantize_graph \
--input=/tf_files/fst_frozen.pb  \
--output_node_names=preds \
--output=/tf_files/fst_frozen_quantized.pb \
--mode=weights

этотвстреча Волязаморозитьизкартинадокументразмерот 6.7MB уменьшатьприезжать 1,7 МБ, это означает, что оно существует, если вы разместили изприложение 50 разные стили 50 индивидуальный Модель,но增加изразмер Воляодля 85MB。 Apple в 2017 Год 9 Луна объявила, что лимит загрузки приложений для сотовой беспроводной сети увеличен 150 МБ, поэтому пользователи по-прежнему смогут загружать инструмент через сотовые сети. 50 многодобрый Неттакой же Режимизприложение.

этот Сразуэто использовать изображение стиля и ввести изображение изображения для обучения и квантования. Быстрое нейронное мигрирование. Моделировать все шаги. Вы можете существовать шаги 3 Чжуншенгиз test_dir Посмотрите сгенерированное изображение изкартины в каталоге, чтобы увидеть эффект мигрировать из стиля. если需хотеть,ты МожеткиспользоватьГиперпараметры записаны в https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style. Для просмотра, а Также надеюсь, что стиль мигрировать работает лучше.

существоватьучитьсякаксуществовать iOS и Android приложениеиспользуется вэтот вперед какой-то модели, важно из маленького да, нужно записать существование 5 шагиспользуется виз,обозначениедля--in-pathценитьизкартинакартинаизточныйкартинакартинаширинаивысокий度параметр,исуществовать iOS или Android кодиспользуется вкартина, например, значение ширины и высоты (как долго вы увидите приезжать), в противном случае появится существующее приложение в модели проекта. Conv2DCustomBackpropInput: Size of out_backprop doesn't match computedошибка 。

существовать iOS Использование моделей передачи быстрых нейронных стилей в

Оказывается, существование состоит из TensorFlow Экспериментальный容устройство Строить iOS приложениесередина,использоватьсуществоватьшаг 7 Чжуншенгизfst_frozen_quantized.pbМодельдокументбезиметь问вопрос,нравиться Нет. 2 глава,“проходитьмигрироватьизучатьвернокартинакак классификация”,но Проект TensorFlow Предварительное обучение в Magenta мультистилевая модельдокумент(нас Волясуществоватькнигаглаваизназад续частьиспользуется в)Воля не последует примеру TensorFlow Pod один起нагрузка(перехватывать 2018 Год 1 луна)—пытатьсянагрузкамультистилевая модельдокумента Воля выдает следующую ошибку:

Язык кода:javascript
копировать
Could not create TensorFlow Graph: Invalid argument: No OpKernel was registered to support Op 'Mul' with these attrs. Registered devices: [CPU], Registered kernels:
  device='CPU'; T in [DT_FLOAT]
   [[Node: transformer/expand/conv1/mul_1 = Mul[T=DT_INT32](transformer/expand/conv1/mul_1/x, transformer/expand/conv1/strided_slice_1)]]

существовать Нет. 3 В главе «Обнаружение верных слонов и их расположение» мы обсуждаем причины такжекакиспользовать Ручная сборкаиз TensorFlow Библиотека Исправьте эту ошибку. потому чтонас Волясуществовать同один iOS приложениеиспользуется это два вида Модели, поэтому наша Воляиспользовать является более мощной в ручном режиме. TensorFlow Библиотекасоздаватьодининдивидуальныйновыйиз iOS приложение.

Добавьте и протестируйте модель быстрой нейронной передачи

Если вы не создали его вручную TensorFlow Библиотека, сначала тебе нужно вернуться к главе. Затем выполните следующие шаги для преобразования TensorFlow поддерживатьибыстрыйиз神经Образец Режиммигрировать Модельдокумент Добавить жильевашиз iOS приложениеитестбегать Долженприложение:

  1. Если вы уже добавили TensorFlow Руководство Библиотекаиз iOS приложение, вы можете пропустить этот шаг. В противном случае создайте новую изну, аналогичную тому, что мы делали в существовании в предыдущей главе. основе Objective-C из iOS приложение,НапримерNeuralStyleTransfer,или ВОЗсуществоватьсейчасиметьприложениесередина,существоватьPROJECTВнизсоздаватьодининдивидуальныйновыйизиспользовать户определениенастраивать,命имядляTENSORFLOW_ROOT,ценитьдля$HOME/tensorflow-1.4.0,предполагалосьсуществовать Там уже Установить TensorFlow 1.4.0,ЗатемсуществоватьTARGETизстроитьнастраиватьсередина,Воля Другие флаги компоновщика
Язык кода:javascript
копировать
-force_load $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/protobuf_ios/lib/libprotobuf-lite.a $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/nsync/builds/lipo.ios.c++11/nsync.a

Затем Воля标вопрос搜索путьнастраиватьдля:

Язык кода:javascript
копировать
$(TENSORFLOW_ROOT) $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/protobuf/src $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/downloads/eigen $(TENSORFLOW_ROOT)/tensorflow/contrib/makefile/gen/proto
  1. Воля fst_frozen_quantized.pb Документы Некоторые тестовые изображения, такие как перетаскивание, приезжатьпроектизпапка. отквпередиз iOS приложениесередина,илиоткнига书источниккодсклад БиблиотекасерединаCh4/iosВнизизNeuralStyleTransferприложениепапкасерединакопироватьнассуществоватьвперед Несколькоглаваиспользуется в Проходитьиз Взаимно同ios_image_load.mmи.hдокументприезжатьпроектсередина。
  2. ВоляViewController.m重命имядляViewController.mmи Воля ЧтозаменятьдляCh4/ios/NeuralStyleTransferсерединаизViewController.hи.mmдокумент. После тестирования запуска приложения мы Воля подробно знакомим с основным фрагментом. кода.
  3. существовать iOS эмулятор iOS На вашем устройстве запустите приложение, вы Воля смотрите фильм «Приехать с собакой», например фильм 4.2 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-bXLQcpNY-1681653027415)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/9bdc2a19-7e59-4f72-b41f-ea3eeba0c5c5.png)]

картина 4.2:приложение Образец Режим Извпередизоригинальныйсобакакартинакусок

  1. Нажмитеквыбиратьбыстрый Образец Режиммигрировать,несколько секунд спустя,Посмотреть новый фильм из приезжать можно в Волясуществоватькартина 4.3.,Среди них уже звездная ночь:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-RdEYvQG1-1681653027416)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/a78207bb-2407-4343-b84d-2f17aacfd4ff.png)]

картина 4.3: Это как если бы Ван Гог нарисовал твою любимую собаку.

Просто выберите изкартины, сделанные по стилю.,Затемв соответствии с照начальствоодин节серединаизшагдействовать,Прямо сейчас Может轻松строить Инструментиметь Неттакой же Режимиздругой Модель. Затем вы можете выполнить действия, описанные в этом разделе. iOS приложениеиспользуется в Модель. Если вы хотите узнать метод обучения Модельиз, вам следует просмотреть предыдущий раздел из GitHub Посмотреть код в магазине Библиотека. Давайте подробнее рассмотрим использование модели Complete Magic из iOS код.

Обзор кода iOS для модели быстрой нейронной передачи

ViewController.mmсерединаиметь Несколькоиндивидуальный关ключкодчасть,Они существуют вводить изображение, например, в результате предварительной обработки, и мигрировать карту, как в результате постобработки, да только из:

  1. существоватьшаг 5 середина,Волядваиндивидуальныйпостоянныйwanted_widthиwanted_heightопределениедляихранилище Библиотекакартинакартинаexamples/content/dog.jpgизкартинакартинаширинаивысокий度Взаимно同изценить:
Язык кода:javascript
копировать
const int wanted_width = 300;
const int wanted_height = 400;
  1. iOS из очереди отправки используется для существования не UI Загрузка в тред и запустить избыстрый NERV мигрировать Модели и существа После создания образа «Мигрировать изкартина» в стиле ать изображение Волякартина отправляется приезжать. UI Отображаются темы:
Язык кода:javascript
копировать
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    UIImage *img = imageStyleTransfer(@"fst_frozen_quantized");
    dispatch_async(dispatch_get_main_queue(), ^{
        _lbl.text = @"Tap Anywhere";
        _iv.image = img;
    });
});
  1. Определяет индивидуальное число с плавающей запятой из трехмерного тензора, которое используется для преобразования входных данных Воли, таких как данные, в:
Язык кода:javascript
копировать
tensorflow::Tensor image_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({wanted_height, wanted_width, wanted_channels}));
auto image_tensor_mapped = image_tensor.tensor<float, 3>();
  1. Отправить приезжать TensorFlow Session->Runметодизвходить Имя узлаивыход Имя узлаопределениедляитренироваться Модельчас Взаимно同:
Язык кода:javascript
копировать
std::string input_layer = "img_placeholder";
std::string output_layer = "preds";
std::vector<tensorflow::Tensor> outputs;
tensorflow::Status run_status = session->Run({{input_layer, image_tensor}} {output_layer}, {}, &outputs);
  1. Модель завершает проект и отправляет обратно выходной тензор (который содержит 0 приезжать 255 В пределах диапазона RGB ценить)назад,нас需хотетьвызоводининдивидуальныйимядляtensorToUIImageиз实использоватьфункция,к Воля Тензорданныепервыйизменять换для RGB Буфер:
Язык кода:javascript
копировать
UIImage *imgScaled = tensorToUIImage(model, output->flat<float>(), image_width, image_height);

static UIImage* tensorToUIImage(NSString *model, const Eigen::TensorMap<Eigen::Tensor<float, 1, Eigen::RowMajor>, Eigen::Aligned>& outputTensor, int image_width, int image_height) {
    const int count = outputTensor.size();
    unsigned char* buffer = (unsigned char*)malloc(count);

    for (int i = 0; i < count; ++i) {
        const float value = outputTensor(i);
        int n;
        if (value < 0) n = 0;
        else if (value > 255) n = 255;
        else n = (int)value;
        buffer[i] = n;
    }
  1. Затем,нас Воля缓冲区изменять换дляUIImageПример,Затем再调все Чторазмери返回к供показывать:
Язык кода:javascript
копировать
UIImage *img = [ViewController convertRGBBufferToUIImage:buffer withWidth:wanted_width withHeight:wanted_height];
UIImage *imgScaled = [img scaleToSize:CGSizeMake(image_width, image_height)];
return imgScaled;

完всеизкодиприложениестепень​​последовательность Кусочек ВCh4/ios/NeuralStyleTransferпапкасередина。

существовать Android Использование моделей передачи быстрых нейронных стилей в

существовать Нет. 2 Глава, «Проходитьмигрировать Обучение верной картине изображений для классификации» мы описываем, как добавить TensorFlow в свои приложения для Андроид., но ничего нет UI。 Давайте создадим нового человека Android приложение,киспользоватьнас Извпередтренироватьсяисуществовать iOS используется визбыстрый Образец Режиммигрировать Модель.

потому чтоэтот Android приложениепоставлять Понятноодининдивидуальныйочень хорошийиз机встреча Приходитьиспользоватьнаименееиз TensorFlow Связанный код, Android UI Резьбовой код поставляется в комплекте TensorFlow Модельуправляемыйприложение, поэтому мы начинаем добавлять код каждой строки, чтобы помочь вам узнать больше о возможностях развития. Android TensorFlow Что нужно для приложения:

  1. существовать Android Studio середина,выбирать"документ | Новый | новыйпроект…”,ЗатемвходитьFastNeuralTransferделатьдляприложениеимясказать; существоватьщелкнуть“Заканчивать”Извперед,принимать Местоиметьпо умолчаниюнастраивать。
  2. создаватьодининдивидуальныйновыйизassetsпапка,нравитьсякартина 2.13 Тогда Воля показал, что ты тренировался из быстрого нейронного мигрировать Модельот iOS приложениесерединатащитьдвигаться(еслитысуществоватьначальствоодин节серединапытаться Проходить),или ВОЗотпапка/tf_filesсерединатащитьдвигаться,нравиться“тренироватьсябыстрый神经Образец Режиммигрировать Модель”частьшаг 7 Как показано, а такжеодиннекоторыйтесткартинакартинаприезжатьassetsпапка。
  3. существоватьприложениеизbuild.gradle документсередина,существовать dependencies из Добавить строку в конце compile 'org.tensorflow:tensorflow-android:+'и。
  4. 打открытьres/layout/activity_main.xmlдокумент,существовать Чтосерединаудалитьпо умолчаниюизTextView,Затемпервыйдобавить водининдивидуальныйImageViewкпоказывать Образец Режиммигрироватьвпередназадизкартинакартина:
Язык кода:javascript
копировать
<ImageView
    android:id="@+id/imageview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"/>
  1. Добавлена ​​индивидуальная кнопка для запуска стиля мигрировать действовать:
Язык кода:javascript
копировать
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Style Transfer"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.502"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.965" />
  1. существоватьприложениеизMainActivity.javaдокументсередина,первыйвходитьнас最重хотетьизгид入:
Язык кода:javascript
копировать
import org.tensorflow.contrib.android.TensorFlowInferenceInterface;    

TensorFlowInferenceInterfaceпоставлять JAVA интерфейс для доступа к машине TensorFlow рассуждение API。 ЗатемубеждатьсяMainActivityдобрыйвыполнить ПонятноRunnable интерфейс, нам нужно, чтобы наше приложение было отзывчивым и существовало, загруженным в рабочие потоки и запускало TensorFlow Модель.

  1. существоватьдобрыйизоткрытьголова,определение六индивидуальныйпостоянный, как показано ниже:
Язык кода:javascript
копировать
private static final String MODEL_FILE = "file:///android_asset/fst_frozen_quantized.pb";
private static final String INPUT_NODE = "img_placeholder";
private static final String OUTPUT_NODE = "preds";
private static final String IMAGE_NAME = "pug1.jpg";
private static final int WANTED_WIDTH = 300;
private static final int WANTED_HEIGHT = 400;

ты Можетк Воля任何тренироватьсяиметьбелыйиз Модельдокументиспользовать ВMODEL_FILEINPUT_NODEиOUTPUT_NODEизценитьинассуществовать Python тренироваться脚книгасерединанастраиватьисуществовать iOS приложениеиспользуется виз значения одинаковые. такой же,WANTED_WIDTHиWANTED_HEIGHTинассуществовать“тренироватьсябыстрый神经Образец Режиммигрировать Модель”частьиз Нет. 5 шагиспользуется виз--in-pathкартинакартинаизширинаивысокий度Взаимно同。

  1. Объявите четыре отдельные переменные экземпляра:
Язык кода:javascript
копировать
private ImageView mImageView;
private Button mButton;
private Bitmap mTransferredBitmap;

private TensorFlowInferenceInterface mInferenceInterface;

mImageViewиmButtonВоляиспользоватьonCreateметодсерединаиз ПростойfindViewByIdметодруководитьнастраивать。 mTransferredBitmapВоля Сдержанныймигрироватькартинакартинаиз Кусочеккартина,к便mImageViewМожеткпоказыватьэто。 mInferenceInterfaceиспользовать Внагрузканасиз TensorFlow Модель,Тип Воля картина типа Тип Модель,бегать Модель,и返回рассуждениерезультат.

  1. существоватьнасиз TensorFlow сделать вывод线степень КHandlerПример发送информацияпосле,создаватьодининдивидуальныйHandlerПример Приходить处理существовать主线степеньсерединапоказыватьфинальныймигрироватьизкартинакартинаиз Задача,насвозвращатьсясоздаватьодининдивидуальныйудобныйизToastинформация:
Язык кода:javascript
копировать
Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mButton.setText("Style Transfer");
        String text = (String)msg.obj;
        Toast.makeText(MainActivity.this, text, 
                   Toast.LENGTH_SHORT).show();
        mImageView.setImageBitmap(mTransferredBitmap);
    } };
  1. существоватьonCreateметодвнутренний,Мы ВоляиспользоватьmImageViewПример变量绑定布局 xml документсерединаизImageView,Волятесткартинакартинаиз Кусочеккартинанагрузкаприезжатьassetsпапкасередина,исуществоватьImageViewсерединапоказывать :
Язык кода:javascript
копировать
mImageView = findViewById(R.id.imageview);
try {
    AssetManager am = getAssets();
    InputStream is = am.open(IMAGE_NAME);
    Bitmap bitmap = BitmapFactory.decodeStream(is);
    mImageView.setImageBitmap(bitmap);
} catch (IOException e) {
    e.printStackTrace();
}
  1. похожий地настраиватьmButtonинастраиватьодининдивидуальный Нажмите监слушатьустройство,чтобы существовало при нажатии кнопки,Создать и начать новую тему,ивызовrunметод:
Язык кода:javascript
копировать
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mButton.setText("Processing...");
        Thread thread = new Thread(MainActivity.this);
        thread.start();
    }
});
  1. существовать线степеньизrunметодсередина,наспервый声明трииндивидуальныймножество,идля Что分配подходящийкогдаиз Память:intValuesмножестводержатьтесткартинакартинаизкартинабелыйценить,Каждыйиндивидуальныйкартинабелыйценить代表 32 Кусочек Значения ARGB (альфа, красный, зеленый, синий); floatValuesмножествонравиться Модель Местопредварительно期из那Образец分Недержать Каждыйиндивидуальныйкартинабелыйизкрасный,значение зеленого и синего,поэтому ЧторазмердаintValuesизтри倍,иoutputValuesизразмериfloatValuesВзаимно同 ], но сохраните выходное значение Модельиз:
Язык кода:javascript
копировать
public void run() {
    int[] intValues = new int[WANTED_WIDTH * WANTED_HEIGHT];
    float[] floatValues = new float[WANTED_WIDTH * WANTED_HEIGHT * 3];
    float[] outputValues = new float[WANTED_WIDTH * WANTED_HEIGHT * 3];

Затем,Мы сдаем анализы, как из Кусочеккартинаданные,верно, который масштабируется в соответствии с обучением, используется визкартина, например, по размеру,Затем Воля缩放назадиз КусочеккартинаизкартинабелыйнагрузкаприезжатьintValuesмножествои Воля Чтоизменять换дляfloatValues

Язык кода:javascript
копировать
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open(IMAGE_NAME));
Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, WANTED_WIDTH, WANTED_HEIGHT, true);
scaledBitmap.getPixels(intValues, 0, scaledBitmap.getWidth(), 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight());

for (int i = 0; i < intValues.length; i++) {
    final int val = intValues[i];
    floatValues[i*3] = ((val >> 16) & 0xFF);
    floatValues[i*3+1] = ((val >> 8) & 0xFF);
    floatValues[i*3+2] = (val & 0xFF);
}

Уведомление,valилиintValuesкартинабелыймножествоиз Каждыйиндивидуальный元белыйдаодининдивидуальный 32 Кусочеквсе数,существовать Что Каждыйиндивидуальный 8 битовые области зарезервированы ARGB。 насиспользовать Кверносдвиг Кусочек(использовать Вкрасныйизеленый)ив соответствии с Кусочеки Операция Приходить提取Каждыйиндивидуальныйкартинабелыйизкрасный,значение зеленого и синего,и忽略intValues元белыйсередина最左边из 8 Кусочекиз Alpha ценить. поэтомуfloatValues[i*3],floatValues[i*3+1]иfloatValues[i*3+2]分Не保持картинабелыйизкрасный,Зеленый и синий ценить.

сейчассуществовать,нассоздаватьодининдивидуальныйновыйизTensorFlowInferenceInterfaceПример,исуществовать Чтосередина ВоляAssetManagerПримери Модельдокументимяпроходить递приезжатьassetsпапкасередина,Затемиспользовать TensorFlowInferenceInterfaceПример Воляизменять换назадиз[ floatValuesмножество。 если Модель需хотетьмногоиндивидуальныйвходитьузел,но Можетквызовмногоиндивидуальныйfeedметод。 Затем мы передаем имя выходного узла из массива строк в проект Модель. существуетэтот, правда в нашем избыстром стиле мигрировать Мод ель, у нас есть только один индивидуальный входной узел и один индивидуальный выходной узел. Наконец, мы передаем имя выходного узла, чтобы получить выходную цену Моделииз. Если вы хотите получить несколько отдельных выходных узлов, вы можете вызвать индивидуальную выборку:

Язык кода:javascript
копировать
AssetManager assetManager = getAssets();
mInferenceInterface = new TensorFlowInferenceInterface(assetManager, MODEL_FILE);
mInferenceInterface.feed(INPUT_NODE, floatValues, WANTED_HEIGHT, WANTED_WIDTH, 3);
mInferenceInterface.run(new String[] {OUTPUT_NODE}, false);
mInferenceInterface.fetch(OUTPUT_NODE, outputValues);

МодельгенерироватьизoutputValuesсуществовать Каждыйиндивидуальный元белыйсередина Все保留 0 приезжать 255 между 8 Кусочек красного, зеленого и синего значений один, сначала мы верно, красный и зеленый значения используем сдвиг влево, но у нас есть другой размер смещения Кусочек (16 и 8),Затемиспользоватьв соответствии с Кусочекили Операция Воля 8 Кусочек Alpha ценить(0xFF)и 8 Кусочек RGB ценить组合,ВолярезультатдержатьсуществоватьintValuesмножествосередина:

Язык кода:javascript
копировать
for (int i=0; i < intValues.length; ++i) {
    intValues[i] = 0xFF000000
                    | (((int) outputValues[i*3]) << 16)
                    | (((int) outputValues[i*3+1]) << 8)
                    | ((int) outputValues[i*3+2]);

Затем,нассоздаватьодининдивидуальныйновыйизBitmapПример,ииспользоватьintValuesмножествонастраивать Чтокартинабелыйценить,Воля Кусочеккартина увеличить приезжать тест изображение как в оригинальном размере,и Воля缩放назадиз КусочеккартинадержатьприезжатьmTransferredBitmap

Язык кода:javascript
копировать
Bitmap outputBitmap = scaledBitmap.copy( scaledBitmap.getConfig() , true);
outputBitmap.setPixels(intValues, 0, outputBitmap.getWidth(), 0, 0, outputBitmap.getWidth(), outputBitmap.getHeight());
mTransferredBitmap = Bitmap.createScaledBitmap(outputBitmap, bitmap.getWidth(), bitmap.getHeight(), true);

наконец,Наш главный поток процессора К отправляет сообщение,Чтобы он знал стиль отображения мигрироватькартину как время:

Язык кода:javascript
копировать
Message msg = new Message();
msg.obj = "Tranfer Processing Done";
mHandler.sendMessage(msg);

поэтому,общий共Нетприезжать 100 Код ОК, у вас есть индивидуальный полный Android приложение, может правдакартина любит потрясающий стиль мигрировать. существовать Android Устройство или виртуальное устройство можно запустить в приложении, сначала Воля посмотрите, как приезжать к человеку с кнопкой "Из" Проверьте изображение изображения, нажмите кнопку, и через несколько секунд вы увидите изображение в стиле прибытия, например изображение. 4.4 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-I7Jq4uxa-1681653027416)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/07ef305b-1e23-4a4c-98f5-faf14f398d65.png)]

картина 4.4:Android начальствооригинальныйкартинакартинаи Образец Режиммигрироватьизкартинакартина

быстрый神经Образец Режим Модельжитьсуществоватьизодининдивидуальный问вопросда,Даже после квантования каждая отдельная Модель имеет только 1,7 МБ.,Нам все еще нужно тренировать каждый стиль отдельно.,и Каждыйиндивидуальныйобучение Модель Только能поддерживатьодиндобрый Образец Режиммигрировать。 К счастью, у этих индивидуальных проблем есть хорошие решения.

существовать iOS используется в TensorFlow Magenta мультистилевая модель

Проект TensorFlow Magentaпозволятьтыиспользовать 10 многодобрый После пред-обучение Модель Приходитьгенерироватьновыйизмузыкаикартинакартина。 существуют В этом разделе и в следующем разделе мы, Воля, сосредоточимся на использовании Magenta изкартинакартина Образец Режим化Модель. ты Можеткщелкнуть Связьсуществоватькомпьютер Установить на Magenta,хотяхотетьсуществоватьдвигатьсяприложениеиспользуется в своей крутой изкартине, как стиль мигрировать Модель или Установить Magenta。 на на основе Диссертация «Приобретенное изображение художественного стиля»выполнить Magenta Предварительно обученный стиль Мигрировать Модель устраняет ограничение, заключающееся в том, что отдельная Модель может иметь только один стиль, и позволяет нескольким стилям содержать сущ. Вы можете комбинировать эти стили в любом одном стиле. ты Можетксуществоватьэтаиндивидуальная страницаначальствобыстрый浏览Должен Демо,но Можетксуществоватьздесьскачатьдваиндивидуальныйпредварительнообучениеконтрольно-пропускной пункт Модель. потому чтоконтрольно-пропускной пунктдокументсерединадержать Понятно某некоторыйNaN(Нетдачисло)ошибка,поэтому无法прямойсуществоватьтыиздвигатьсяприложениеиспользуется в。 Мы не будем подробно объяснять, как удалить это какое-то число и сгенерировать существование для вашего изприложения. виз.pbМодельдокумент(если感интерес,ты Можетк查смотретьэтотвнутри),настолькоиспользовать TensorFlow Android Примерtensorflow/examples/android/assetsсередина Сумка含из После пред-обучениеstylize_quantized.pbМодельдокумент Приходить查смотреть Что工делать原理。

Если ты действительно хочешь тренироваться сиз Модель,но Можеткв соответствии с照впередлапшаизimage_stylizationСвязьсерединаизтренироваться Модель Внизизшагруководить。 Но учтите, что вам редко понадобится 500GB из Доступное место на диске для загрузки ImageNet набор данных и нужен сильный из GPU чтобы завершить обучение. существоватькнига节или Внизодин节серединасмотретьприезжатькодирезультатпосле,ты更иметь Может能вернопредварительнообучениеstylize_quantized.pbМодель启использоватьиз Прохладный Образец Режиммигрироватьэффект果感приезжатьудовлетворить.

существоватькнигаглававпередлапшасоздаватьиз iOS приложениесередина,执ХОРОШОк Внизшаг Приходитьиспользоватьибегатьмультистилевая модель:

  1. Воля stylize_quantized.pbдокументотtensorflow/examples/android/assetsтащить放приезжать Xcode серединаиз iOS appsпапкасередина。
  2. использовать для загрузки и обработки быстрая миграция стиля Модельиз той же самой dispatch_async ,К抽голова处理устройствосерединадобавить вновыйизUIAlertAction
Язык кода:javascript
копировать
UIAlertAction* multi_style_transfer = [UIAlertAction actionWithTitle:@"Multistyle Transfer" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
    _lbl.text = @"Processing...";
    _iv.image = [UIImage imageNamed:image_name];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        UIImage *img = imageStyleTransfer(@"stylize_quantized");
        dispatch_async(dispatch_get_main_queue(), ^{
            _lbl.text = @"Tap Anywhere";
            _iv.image = img;
        });
    });
}];
  1. Воляinput_layerиoutput_layerценитьзаменятьдляновый Модельизправильныйценить,идобавить водининдивидуальныйимядляstyle_numизновыйвходить Имя узла(этотнекоторыйценить ПриходитьсStylizeActivity.javaсерединаиз Пример Android код,нотытакже Можеткиспользоватьsummarize_graph工Инструмент,TensorBoard или мы существоваливпереди нескольких глав, которые показаны в параграфе изкода «Найти их приезжать»):
Язык кода:javascript
копировать
std::string input_layer = "input";
std::string style_layer = "style_num";
std::string output_layer = "transformer/expand/conv3/conv/Sigmoid";
  1. и быстрый стиль мигрировать Модель отличается, здесь измультистилевая модель предполагает использование 4-мерного тензора с плавающей запятой для ввода для карты, например:
Язык кода:javascript
копировать
tensorflow::Tensor image_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, wanted_height, wanted_width, wanted_channels}));
auto image_tensor_mapped = image_tensor.tensor<float, 4>();
  1. насвозвращаться需хотеть Воляstyle_tensorопределениедляформадля[NUM_STYLES * 1]из另одининдивидуальный Тензор,ЧтосерединаNUM_STYLESсуществоватьViewController.mmизоткрытьголоваопределениедляconst int NUM_STYLES = 26;。 число 26 да stylize_quantized.pbМодельдокументсередина内置из Образец Режим数,ты Можетксуществовать Чтосерединабегать Android TF Стилизовать приложение и просмотреть 26 вид результата, например картина 4.5 показано. Обратите внимание, что нет. 20 Фотография Чжана (левый нижний угол изкартины) да Ван Гог Знакомый из «Звездной из Ночи»:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-n4095Y9F-1681653027416)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/ea7a04fe-8b56-47b2-ac5a-7f25ced4acbd.png)]

картина 4.5:мультистилевая модельсерединаиз 26 добрый Образец Режимкартинакартина

Язык кода:javascript
копировать
tensorflow::Tensor style_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({ NUM_STYLES, 1}));
auto style_tensor_mapped = style_tensor.tensor<float, 2>();
float* out_style = style_tensor_mapped.data();
for (int i = 0; i < NUM_STYLES; i++) {
    out_style[i] = 0.0 / NUM_STYLES; 
}
out_style[19] = 1.0;

out_styleмножествосередина Местоиметьценитьизобщийидолжендля 1,финальныйиз Образец Режиммигрироватькартинакартина Воляда Зависит отout_styleмножествосерединаобозначениеизценить加权из Образец Режимизсмешивание。 Например, впередлапшаизкод Воля использовать только стиль звездной ночи (индекс массива 19 верно应Вкартина 4.5 Среднее изображение в стиле, подобное списку 20 индивидуальныйкартинакартина)。

если希望Воля繁звезда点点изночной видкартинакартинаиверноначальстворогкартинакартина均匀смешивание,но需хотетьиспользоватьк Внизкодзаменятьвпередлапшакод块серединаизнаконецодин ХОРОШО:

Язык кода:javascript
копировать
out_style[4] = 0.5;
out_style[19] = 0.5;

Если ты хочешь иметь 26 добрый Образец Режим均等地смешиваниеиспользовать,пожалуйста Волявпередлапшаизfor循环Изменятьдляк Вниз Образец Режим,и Нетхотеть Волядругойценитьнастраиватьдлялюбой конкретныйизout_style元белый:

Язык кода:javascript
копировать
for (int i = 0; i < NUM_STYLES; i++) {
    out_style[i] = 1.0 / NUM_STYLES; 
}

Позже вы увидите три стиля настройки мигрировать эффект в Волясуществоватькартина 4.8 и 4.9.

  1. Воляsession->Runвызов Изменятьдляк Вниз ХОРОШО,к Волякартинакартина Тензори Образец Режим Тензор Все Отправить приезжать Модель:
Язык кода:javascript
копировать
tensorflow::Status run_status = session->Run({{input_layer, image_tensor}, {style_layer, style_tensor}}, {output_layer}, {}, &outputs);

этотнекоторый Сразуэто использоватьмультистилевая модельбегать iOS приложение Необходимыйвсе Изменять。 сейчассуществоватьбегатьтыизприложение,ты Воляпервыйсмотретьприезжатьнравитьсякартина 4.6 Место示из Содержания:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-qKmu1OCt-1681653027416)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/f2841f1f-b0c3-412d-822b-5e9d0f34f235.png)]

изображение 4.6: Показать оригинальное содержание

Нажмитепроизвольный Расположение,ты Волясмотретьприезжатьдваиндивидуальный Образец Режимвыбирать,нравитьсякартина 4.7 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-aLUbStFZ-1681653027417)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/c462927f-71be-46f1-995f-5cbd536ae175.png)]

картина 4.7: Показаны два стиля Модельизвыбирать

Две уже мигрироваликартину из результатов,out_style[19] = 1.0; нравитьсякартина 4.8 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-iWx8H5Nn-1681653027417)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/cc28a550-1a66-4845-b330-1c01d3806e62.png)]

изображение 4.8: Два разных стиля Моделиз мигрировать результаты (слева дабыстрый стиль мигрировать,верносторонадамного Образец Режим)

картина 4.9 показывать Понятносуществоватькартина 4.5 используется Картина «ЗВЕЗДНАЯ НОЧЬ» и изображение в правом верхнем углу равномерно смешаны. также Местоиметь 26 Этот стиль представляет собой равное сочетание результатов, например, картина 4.9 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-NgOQ5lkI-1681653027417)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/c5dd63f4-32a7-4177-afb8-af0e8a8770e8.png)]

картина 4.9: Несколько стилей и разные смешанные результаты (слева: половина звездного неба, половина другого, справа: все 26 стиль измикс)

мультистилевая модельсуществовать iPhone 6 Требуется на проект О 5 Второй钟,Сравниватьбыстрый Образец Режиммигрировать Модельбегатьбыстрый О 2-3 раз.

существовать Android используется в TensorFlow Magenta мультистилевая модель

хотя TensorFlow Android Примерприложение существует во многих стилях. iOS приложениеиспользуется в Android Примерприложениесерединаиз Модель),но Примерприложениесерединаи TensorFlow Связанный исходник, но и более 600 ХОРОШОизStylizeActivity.javaдокументсерединаиз很много UI кодсмешиваниесуществоватьодин起。 Вы также можете пройти TensorFlow Android Образец Режиммигрироватьиз Codelab руководитьдействовать,Дакоди TensorFlow Android Примерприложение примерно то же самое. потому чтонасуже经использовать TensorFlow быстрый Образец Режиммигрировать Модельвыполнить Понятно Android приложениеиз Простое обновление и поэтому очень интересное изда как можно изменить всего несколько строк кода Для поддержки иметь один мощный мультистильный стиль приложения. это также должно стать более интуитивным способом понять, в чем превосходство Воля. TensorFlow Модельдобавить вприезжатьсейчасиметьиз Android В приложении.

поэтому,этот Сразудасуществоватьнас Извперед Строить Android приложениеиспользуется в Различные стили мигрировать Требуется модель:

  1. Воля stylize_quantized.pbдокументотtensorflow/examples/android/assetsтащить放приезжатьнас Android приложениеизassetsпапкасередина。
  2. существовать Android Studio середина,打открытьMainActivity.java,Найдите следующие три строки кода:
Язык кода:javascript
копировать
private static final String MODEL_FILE = "file:///android_asset/fst_frozen_quantized.pb";
private static final String INPUT_NODE = "img_placeholder";
private static final String OUTPUT_NODE = "preds";

Затем замените их следующими четырьмя строками:

Язык кода:javascript
копировать
private static final int NUM_STYLES = 26;
private static final String MODEL_FILE = "file:///android_asset/stylize_quantized.pb";
private static final String INPUT_NODE = "input";
private static final String OUTPUT_NODE = "transformer/expand/conv3/conv/Sigmoid";

этотнекоторыйценитьинассуществоватьначальствоодин节середина Строить iOS приложение Взаимно同。 Если ты делаешь только Android приложениеразвивать и пропустить предыдущее индивидуально iOS часть,пожалуйстабыстрыйчитатьначальствоодининдивидуальный iOS Некоторые шаги в верном направлении 3 из Объясните.

  1. заменить Следующий фрагмент кода, который Воля вводит изображение как каналы приезжатьбыстрый стиль мигрировать Модель и обрабатывает выходное изображение, например:
Язык кода:javascript
копировать
mInferenceInterface.feed(INPUT_NODE, floatValues, WANTED_HEIGHT, WANTED_WIDTH, 3);
mInferenceInterface.run(new String[] {OUTPUT_NODE}, false);
mInferenceInterface.fetch(OUTPUT_NODE, outputValues);
for (int i = 0; i < intValues.length; ++i) {
    intValues[i] = 0xFF000000
            | (((int) outputValues[i * 3]) << 16)
            | (((int) outputValues[i * 3 + 1]) << 8)
            | ((int) outputValues[i * 3 + 2]);
}

использоватьпервыйнастраиватьstyleValsмножествоизкодчасть(есливерноstyleValsикакнастраиватьмножествоизценить感приезжатьозадаченный,пожалуйста, проверьтеначальствоодин节Нет. 5 Пошагово из аннотации):

Язык кода:javascript
копировать
final float[] styleVals = new float[NUM_STYLES];
for (int i = 0; i < NUM_STYLES; ++i) {
    styleVals[i] = 0.0f / NUM_STYLES;
}
styleVals[19] = 0.5f;
styleVals[4] = 0.5f;

Затем Волявходитькартинакартина Тензори Образец Режимценить Тензор同час馈送приезжать Модель,ибегать Моделькполучатьмигрироватьизкартинакартина:

Язык кода:javascript
копировать
mInferenceInterface.feed(INPUT_NODE, floatValues, 1, WANTED_HEIGHT, WANTED_WIDTH, 3);
mInferenceInterface.feed("style_num", styleVals, NUM_STYLES);
mInferenceInterface.run(new String[] {OUTPUT_NODE}, false);
mInferenceInterface.fetch(OUTPUT_NODE, outputValues);

Наконец, он обрабатывает вывод:

Язык кода:javascript
копировать
for (int i=0; i < intValues.length; ++i) {
    intValues[i] = 0xFF000000
                    | (((int) (outputValues[i*3] * 255)) << 16)
                    | (((int) (outputValues[i*3+1] * 255)) << 8)
                    | ((int) (outputValues[i*3+2] * 255));
}

Уведомление,мультистилевая модель返回浮点数множествоприезжатьoutputValues,это们из范围Всесуществовать 0.0 приезжать 1.0 между, поэтому нам нужна Воля, чтобы их умножить. существующее приложение оставило сдвиг Кусочек, чтобы получить красное и зеленое значение вперед, продолжайте сначала 255 умножить на 255,Затемверно intValues множествоиз Каждыйиндивидуальный元белыйприложениев соответствии с Кусочек“или”настраиватьфинальный ARGB ценить.

этот Сразуда Воля Прохладныйизмультистилевая модельдобавить вприезжатьнезависимыйиз Android приложение Необходимыйвсе工делать。 сейчассуществовать,Давайте запустим приложение,И используйте разные изображения из тестов, например,ноиспользоватьи iOS Сочетание тех же трех значений стиля в приложении.

общий 20 и сначала 5 стиль изображения нравится шаг за шагом 3 После равного смешивания средних сегментов исхода исходное изображение напоминает иммигрироватьизкартину, как изображение. 4.10 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-MDgLznpe-1681653027417)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/f582db90-6795-43d5-8d6d-28e2835e58de.png)]

картина 4.10: Исходное содержание изображения изображения и стиля мигрировать изображение карты в сочетании с пятым индивидуальным изображением карты и изображением звездной ночи

Если вы замените следующие две строки кода:

Язык кода:javascript
копировать
styleVals[19] = 0.5f;
styleVals[4] = 0.5f;

использоватьодин ХОРОШОкодstyleVals[19] = 1.5f;илизаменятьк Внизкодчасть:

Язык кода:javascript
копировать
for (int i = 0; i < NUM_STYLES; ++i) {
    styleVals[i] = 0.0f / NUM_STYLES;
}
styleVals[19] = 0.5f;
styleVals[4] = 0.5f;

Иметь следующий параграф кода:

Язык кода:javascript
копировать
for (int i = 0; i < NUM_STYLES; ++i) {
    styleVals[i] = 1.0f / NUM_STYLES;
}

Затем,ты Волясуществоватькартина 4.11 Средний, чтобы увидеть эффект перемещения:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-pGKXVJeG-1681653027417)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/a6009bea-e770-4c76-b7ab-9f426ea66e0b.png)]

картина 4.11: Стилизовать изображение изкартины только в стиле звездного неба, а также Воля Местоиметь 26 Смесь одинаковых стилей изкартина вроде

существоватьодиннекоторый强大из TensorFlow Модельиз помогите такженаскаксуществоватьдвигатьсяприложениеиспользуется С их знаниями, кажется, наши мобильные умники тоже могут стать большими художниками.

Подвести итог

существоватькнигаглавасередина,наспервый概описывать Понятнос 2015 Год С момента разработки различных нейронных стилей мигрировать методы. Затем мы покажем, как обучить стилю второго поколения Мигрировать Модель, которая достаточно быстра, чтобы существовать на мобильном устройстве за считанные секунды. После этого мы рассказали, как существовать iOS приложениеи Android приложениеиспользуется В модели этот заголовок дает несколько способов начать сборку, используя минималистский подход, в общей сложности не приезжая. 100 ХОРОШОкод. Наконец, мы обсудили, как существовать iOS и Android приложениеиспользуется в TensorFlow Magenta много Образец Режим神经мигрировать Модель,Должен Модельсуществоватьодининдивидуальный Маленький Модельсередина Сумка含 26 Удивительный художественный стиль.

существования В следующий раз мы, Воля, исследуем другого индивидуальносуществовать человека или Наши лучшие из друзей были замечены, когда демонстрировали умное решение задачи: способность распознавать голосовые команды. Кто не хочет, чтобы наши собаки понимали «сидеть», «подойди», «нет» и другие команды, а наши малыши верно «да», «стой» и «иди» и реагировали на них? Давайте посмотрим, как мы выведем их из мобильного приложения.

5. Изучите простые голосовые команды.

В настоящее время голосовые услуги (например. Apple Siri,Amazon Alexa,Google Assistant и Google Translate) становится все более популярным, поскольку для нас Voice является в некоторых случаях наиболее эффективным способом поиска информации или выполнения задачи. это Некоторые голосовые услуги недоступны основеоблакоиз,Потому что для пользователей голоса могут быть очень длинными и громоздкими.,исдвигатьсяраспознавание речиASR)Нет常复杂,и需хотеть大量извычислительная мощность。 Фактически, благодаря прорыву в области глубокого обучения, только самые закрывающие годы существуют в шумной среде обитания. ASR Это стало возможным.

Дасуществовать某некоторый情况Вниз,能够Оффлайн识Необорудованиена Простой语音Заказдаиметьзначениеиз。 Например, для контроля Raspberry-Pi управляемый робот в движении, вам не нужны сложные голосовые команды, не только устройство на ASR Сравниватьна Решение на основе облака также является быстрым и даже существующим, не имеющим доступа к сети из окружающей среды. Устройство распознавания простых голосовых команд также может использовать только тогда, когда существуют определенные явные команды пользователя. Сервер отправляет сложные голоса пользователей для экономии пропускной способности сети.

существоватькнигаглавасередина,нас Воляпервый概описывать ASR Технология, охватывающая на основе новейшей системы глубокого обучения и высшего класса проекта с открытым исходным кодом. Потом мы с Волей обсудим, как тренировать ипереподготовку. TensorFlow Модель,распознавать простые голосовые команды,Например"left", "right", "up", "down", "stop", "go"。 Далее мы Воляиспользовать обучение, имея возможность из Модели построить индивидуальное простое из Android приложение, а затем постройте два индивидуальных комплекта из iOS приложение,одининдивидуальный Зависит от Objective-C выполнить,另одининдивидуальный Зависит от Swift выполнить. существоватьвпереддваглавасерединанасбезиметьпредставлятьиспользовать TensorFlow Модельизна основе Swift из iOS приложение, в то время как этот обзор главы и укрепляет нашу верную сборку основе Swift из TensorFlow iOS приложениеиз понимания из отличного места.

Подводя итог, в этой главе будут рассмотрены следующие темы:

  • Распознавание речи – краткий обзор
  • Обучите простую модель распознавания команд
  • существовать Android используется в Простойизраспознавание речи Модель
  • существоватьприноситьиметь Objective-C из iOS используется в Простойизраспознавание речи Модель
  • существоватьприноситьиметь Swift из iOS используется в Простойизраспознавание речи Модель

Распознавание речи – краткий обзор

1990 Год генерации появился первый индивидуальный практический опыт, независимый от говорящего, с большим словарным запасом и непрерывным распознаванием. речисистема. существовать 2000 Раннее поколение, ведущие стартапы Nuance и SpeechWorks поставлятьизраспознавание Речевой движок для многих первого поколения основе Web поддерживается, например, голосовая служба по предложениям TellMe,Phone из AOL и BeVocal。 когдачас Строитьраспознавание Система речи Основная основепроходить统изСкрытая марковская модельHMM),А чтобы механизм распознавания работал более точно, необходимы написанная вручную грамматика и тихая обстановка.

сейчас代распознавание Двигатель может понимать практически все, что люди говорят в шумной обстановке, и основеконецприезжатьконецглубокое обучение,В частности, другой вид больше подходит для обработки естественного языка и глубоких нейронных сетей.,сказатьдлярекуррентная нейронная сетьRNN)。 и Традиция изна основе HMM израспознавание речьразная, традиционная основе HMM израспознавание Речь требует человеческого опыта для создания точной настройки созданных вручную функций. также Акустика и языковая модель, и на основе RNN изконецприезжатьконецраспознавание Речевая система преобразует аудиовход «Воля» непосредственно в текст, не требуя преобразования аудиовхода «Воля» в речевое представление для дальнейшей обработки.

RNN Позволяет нам обрабатывать входные и/или выходные последовательности, поскольку по замыслу сеть может хранить входную последовательность из первых прямых проектов, которые могут генерировать выходную последовательность. этотделать RNN Больше подходит для распознавания речь (ввод, когда пользователь произносит последовательность слов), изображение, подобное заголовку (выходные данные состоят из последовательности слов из предложений естественного языка), генерация текста и прогнозирование временных рядов 。 Если вы не знакомы с RNN, ты должен проверить Andrey Karpathy изблог,рекуррентная нейронная сетьиз Нет合理иметьэффект性。 существования Далее в этой книге мы также представим некоторые подробности. RNN Модель.

о RNN конецприезжатьконецраспознавание речииз Первая научная статья была опубликована в 2014 Год,использоватьиздаКоннекционизм из темпоральной классификацииCTC)слой。 2014 Вторая половина Года, Baidu вышла Deep Speech,этотда Нет.одининдивидуальныйиспользоватьна основе CTC изконецприезжатьконец RNN Постройте одну из крупнейших бизнес-систем в мире. и шумные существа из окружающей среды восстанавливаются гораздо лучше, чем традиционные ASR Система имеет меньший процент ошибок. еслитыиметьинтерес,Можетк查смотретьглубина Голос из TensorFlow выполнить,Дапотому чтоэтотдобрыйна основе CTC У системы есть проблемы с существованием, а создание модели требует слишком большого количества капитала, чтобы существовать на мобильном телефоне. При развертывании существования требуется большая языковая модель, чтобы исправить часть, сделанную RNN природа вызывает появление текстовых ошибок (если вы хотите узнать, что такое, прочитайте ссылку на переднюю страницу) RNN блог, чтобы получить некоторое представление).

существовать 2015 Годи 2016 Год,较новыйизраспознавание речевая системаиспользовать подобное изEnd приезжатьEnd RNN метод, но будет CTC слойзаменятьдляна основе Уведомлениесилаиз Модель,поэтомубегать Модельчас Нет需хотеть Большойязык Модель,поэтому Можетксуществовать Памятьиметьпределиздвигатьсяоборудованиеначальстворуководитьразвертывать。 существование из В этой версии мы, Воля, не будем исследовать эти возможности, но Воля опишет, как существует приложение. в最новыйизвысокийсорт ASR Модель. Вместо этого мы Воляот человека проще распознавать речи Модельоткрыть始,нас知道Должен Модель肯定встречасуществуют на мобильных устройствахочень хороший地工делать。

хотеть Воля Оффлайнраспознавание Добавлена ​​функция голосовой связи в мобильном приложении, вы также можете использовать следующие два отдельных ведущих источника обнаружения источника: речьпроект первый:

  • CMU Sphinx О 20 Годвпередоткрыть始,новсе ещесуществоватьпозитивныйразвиватьсередина。 Чтобы создавать инструменты, имеющие возможность распознавать функция речи Android приложение,ты Можеткиспользовать Чтодля Android Строить PocketSphinx。 Чтобы создавать инструменты, имеющие возможность распознавать функция речи iOS приложение,ты Можеткиспользовать Платформа OpenEars,этотдаодининдивидуальныйбесплатноиз SDK,существовать iOS приложениеиспользуется в CMU PocketSphinx Создайте автономное распознавание речи, преобразование текста.
  • Kaldi,Основана в 2009 году,Большинство закрывает очень активно,перехватывать 2018 Год 1 луна,ужеиметь 165 индивидуальныйженьшеньи ВОЗ。хотетьсуществовать Android начальстворуководитьпытаться,ты Можетк查смотретьЭтот пост в блоге。 верно В iOS,пожалуйста, проверьтесуществовать iOS Использовать на Kaldi изпрототип

потому чтоэтотдаодинкнигаосуществоватьдвигатьсяоборудование Использовать на TensorFlow из книги, поэтому TensorFlow Может использоваться для картины обработки изображений, обработки речи и обработки текста. Также другие умные задачи (остальные из этой главы) создают мощную из Модель. Мы, Воля, сосредоточимся на том, как использовать TensorFlow Обучение легко распознается речи Модельи Воля Чтосуществоватьдвигатьсяприложениеиспользуется в。

Обучите простую модель распознавания команд

существоватькнига节середина,нас Воля Подвести итогХорошо написано из TensorFlow Простое распознавание звука Учебное пособиеиспользуется вшаги. Некоторые модели обучения действительно могут вам помочь советами.

Мы Воля строим из простого распознавания голосовых команд. Модель Воля умеет распознавать 10 индивидуальныйодин词:"yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go"; Он также может обнаружить тишину. Если не найдено ни обладания, ни тишины, и не найдено ни одного обладания. 10 индивидуальное слово, оно Воля порождает «неизвестное». 稍назадбегатьtensorflow/example/speech_commands/train.py脚книгачас,Мы с Воля скачиваем набор данных голосовых команд и используем их для обучения Модель,действительныйначальство除Понятноэтот 10 Помимо слова индивидуальный, оно содержит еще 20 индивидуальныйодин词:"zero", "two", "three", ..., "ten"(приезжатьглазвпереддляконец,тыуже经смотретьприезжатьиз 20 индивидуальный词сказатьдляосновной词)и 10 индивидуальныйвспомогательное слово:"bed", "bird", "cat", "dog", "happy", "house", "marvin", "sheila", "tree", "wow"。 Основные слова встречаются чаще, чем вспомогательные (ок. 1750)Инструментиметь更многоиз.wavдокумент Записывать(о 2350)。

语音ЗаказданныенабордаотОткрыть сайт записи голоса收набориз。ты应Долженпытатьсяодин Вниз,Возможно, мне потребовалось некоторое время, чтобы записать себя.,чтобы улучшить производительность записи,И научитесь собирать существующие при необходимости данные из набора голосовых команд. оиспользованные комплекты сборки Модель,возвращатьсяиметьодининдивидуальный Kaggle соревнование,Здесь вы можете получить дополнительную информацию о связанных советах по голосовым моделям.

существоватьдвигатьсяприложениесерединахотетьтренироватьсяииспользоватьиз Модельна основе Бумагасверточная нейронная сеть,Используется для обнаружения ключевых слов небольшого размера.,этоти大много数другойна основе RNN из массового обнаружения Модель речи другая. на основе CNN израспознавание речи Модельда Может能из,Но очень интересно,Благодаря простому распознаванию голосовых команд,Мы можем существовать в течение короткого времени, например, преобразование аудиосигнала для карты,или точнее,Воля Спектркартинаизменять换длязвуковой сигнал во время частотного окнаизраспределенный(связанныйиспользоватьwav_to_spectrogram脚книгагенерироватьиз Пример Спектркартинакартинакартина,Видетькнига节открытьголоваиз TensorFlow Ссылка на учебник). Другими словами, мы можем преобразовать аудиосигнал из его исходного представления во временной области в представление в частотной области. руководитьэтотизменять换изоптимальныйалгоритмдаДискретное преобразование ФурьеDFT),быстрое преобразование ФурьеFFT)Толькодаодиндобрыйиметьэффектизвыбирать DFT выполнитьизалгоритм。

Вам, как специалисту по мобильному развитию, вероятно, не нужно знать DFT и FFT。 Но да, вам лучше знать все о модели обучения. Как это работает, потому что мы знаем, что Воля хочет представить из TensorFlow Простой语音Заказ Модельобучение幕назад花絮,этотда FFT изиспользовать, вхожу в десятку форварда. когдаран, среди прочего, 20 Век из алгоритма делает на основе CNN из Распознавание голосовых команд. Модель обучения для возможного. связанный DFT изиметь Весело и интуитивно понятноиз Учебное пособие,ты МожеткчитатьСледующий текст глава

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

  1. существовать Терминалначальство,cdприезжатьтыиз TensorFlow источниккорень,Может能да~/tensorflow-1.4.0
  2. Только需выполнить следующую команду Прямо сейчас Можетскачатьнас Извпередобсуждатьиз语音Заказданныенабор:
Язык кода:javascript
копировать
python tensorflow/examples/speech_commands/train.py

ты Можеткиспользовать许многопараметр:--wanted_wordsпо умолчаниюдлякyesоткрытьголоваиз 10 индивидуальныйосновной词; Вы можете использовать этот параметр, чтобы добавить больше слов, которые может распознать Модель. хотеть训​​упражнятьсяссебяиз语音Заказданныенабор,пожалуйстаиспользовать--data_url --data_dir=<path_to_your_dataset>禁использовать语音Заказданныенаборизскачатьи访问тыссебяизданныенабор,где каждая команда должна называться форсизпапка,Чтосередина应Сумка含 1000-2000 индивидуальный аудиоклип, обязательно 1 Секунды длины; если Аудиокусокчасть更长,но Можетк Взаимно应地Изменять--clip_duration_msпараметрценить. связанный更многоподробныйинформация,Видетьtrain.pyисточниккоди TensorFlow Простое распознавание звука Учебник.

  1. еслитыприниматьtrain.pyиз Местоиметьпо умолчаниюпараметр,носуществоватьскачать 1.48GB После набора голосовых команд данные существуют, GTX-1070 GPU управляемый Ubuntu да, готово 18,000 индивидуальныйшагизвсеиндивидуальныйтренироваться Нужно 90 минута. тренироваться Заканчиватьназад,ты应Долженсуществовать/tmp/speech_commands_trainпапка内смотретьприезжатьконтрольно-пропускной пунктдокументизсписок,а такжеconv.pbtxtкартинаопределениедокументиимядляconv_labels.txtиз Этикеткадокумент,Чтосередина Сумка含Заказсписок(и Заказсписок Взаимно同)。 --wanted_wordsпараметрдапо умолчаниюценитьилинастраиватьдля,существоватьдокументизоткрытьголова加начальстводваиндивидуальный Дополнительные слова_silenceи_unknown):
Язык кода:javascript
копировать
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:08 conv.ckpt-18000.meta
-rw-rw-r-- 1 jeff jeff 433 Dec 9 21:08 checkpoint
-rw-rw-r-- 1 jeff jeff 3707448 Dec 9 21:08 conv.ckpt-18000.data-00000-of-00001
-rw-rw-r-- 1 jeff jeff 315 Dec 9 21:08 conv.ckpt-18000.index
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:08 conv.ckpt-17900.meta
-rw-rw-r-- 1 jeff jeff 3707448 Dec 9 21:08 conv.ckpt-17900.data-00000-of-00001
-rw-rw-r-- 1 jeff jeff 315 Dec 9 21:08 conv.ckpt-17900.index
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:07 conv.ckpt-17800.meta
-rw-rw-r-- 1 jeff jeff 3707448 Dec 9 21:07 conv.ckpt-17800.data-00000-of-00001
-rw-rw-r-- 1 jeff jeff 315 Dec 9 21:07 conv.ckpt-17800.index
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:07 conv.ckpt-17700.meta
-rw-rw-r-- 1 jeff jeff 3707448 Dec 9 21:07 conv.ckpt-17700.data-00000-of-00001
-rw-rw-r-- 1 jeff jeff 315 Dec 9 21:07 conv.ckpt-17700.index
-rw-rw-r-- 1 jeff jeff 75437 Dec 9 21:06 conv.ckpt-17600.meta
-rw-rw-r-- 1 jeff jeff 3707448 Dec 9 21:06 conv.ckpt-17600.data-00000-of-00001
-rw-rw-r-- 1 jeff jeff 315 Dec 9 21:06 conv.ckpt-17600.index
-rw-rw-r-- 1 jeff jeff 60 Dec 9 19:41 conv_labels.txt
-rw-rw-r-- 1 jeff jeff 121649 Dec 9 19:41 conv.pbtxt

conv_labels.txtСумка含к Вниз Заказ:

Язык кода:javascript
копировать
_silence_
_unknown_
yes
no
up
down
left
right
on
off
stop
go

сейчассуществоватьвыполнить следующую команду,Волякартинаопределениедокументиконтрольно-пропускной пунктдокумент组синтезодининдивидуальныйнас Можетксуществоватьдвигатьсяприложениеиспользуется виз Модельдокумент:

Язык кода:javascript
копировать
python tensorflow/examples/speech_commands/freeze.py \
--start_checkpoint=/tmp/speech_commands_train/conv.ckpt-18000 \
--output_file=/tmp/speech_commands_graph.pb
  1. (Может选)существоватьдвигатьсяприложениесерединаразвертыватьspeech_commands_graph.pbМодельдокумент Извперед,Для выполнения быстрого теста вы можете использовать следующую команду:
Язык кода:javascript
копировать
python tensorflow/examples/speech_commands/label_wav.py  \
--graph=/tmp/speech_commands_graph.pb \
--labels=/tmp/speech_commands_train/conv_labels.txt \
--wav=/tmp/speech_dataset/go/9d171fee_nohash_1.wav

Ваша Воля смотрит на выходные данные прибытия, подобные следующему:

Язык кода:javascript
копировать
go (score = 0.48427)
no (score = 0.17657)
_unknown_ (score = 0.08560)
  1. использоватьsummarize_graph工Инструмент查попытаться найтивходитьузеливыходузелизимясказать:
Язык кода:javascript
копировать
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=/tmp/speech_commands_graph.pb

Вывод должен выглядеть так:

Язык кода:javascript
копировать
Found 1 possible inputs: (name=wav_data, type=string(7), shape=[]) 
No variables spotted.
Found 1 possible outputs: (name=labels_softmax, op=Softmax) 

К сожалению, он правильно выводит только имя да и не показывает другие возможные входные данные. использоватьtensorboard --logdir /tmp/retrain_logs,Затемсуществовать浏览устройствосередина打открытьhttp://localhost:6006икартинаруководить交互также无济В事。 Но да, каждая глава, показанная в небольшом сегменте кода, может помочь вам понять имя входа и выхода, следующее и iPython Взаимодействовало:

Язык кода:javascript
копировать
In [1]: import tensorflow as tf
In [2]: g=tf.GraphDef()
In [3]: g.ParseFromString(open("/tmp/speech_commands_graph.pb","rb").read())
In [4]: x=[n.name for n in g.node]
In [5]: x
Out[5]: 
[u'wav_data',
 u'decoded_sample_data',
 u'AudioSpectrogram',
 ...
 u'MatMul',
 u'add_2',
 u'labels_softmax']

поэтому,нассмотретьприезжатьwav_dataиdecoded_sample_dataВседа Может能извходить。 еслисуществоватьfreeze.pyдокументсерединасмотреть Нетприезжать Комментарий,Мы должны вникнуть в код обучения Модели.,кточныйпопытаться найти出应Должениспользоватьизвходитьимясказать:“результаткартина Сумка含одининдивидуальныйимядля WAV из кодирования ввода данных wav_data,использовать Воригинальный PCM данные(существовать -1.0 приезжать 1.0 范围内浮двигаться)изодиндобрыйсказатьдляdecoded_sample_data,выходсказатьдляlabels_softmax。” действительныйначальство,существовать Должен Модельиз情况Вниз,иметьодининдивидуальный TensorFlow Android Примерприложение,этотданассуществовать Нет. 1 Глава «Мобильный TensorFlow часть»серединасмотретьпожалуйста, приходитеодинчасть,сказатьдля TF Речь конкретно определяет эти входные и выходные имена. существоватькнига书назадлапшаиз Несколькоглавасередина,ты Волясмотретьприезжатькаксуществовать需хотетьчас借助или Нет借助насизтридобрыйметод Приходить查попытаться найти Модельобучениеисточниккод,кпопытаться найти出关ключизвходитьивыход Имя узла。 Или Я надеюсь, что когда вы прочитаете эту книгу, TensorFlow summarize_graph工Инструмент Воляпридетсяприезжатьулучшать,кдлянаспоставлятьточныйизвходитьивыход Имя узла。

сейчассуществоватьдачас候существоватьдвигатьсяприложениеиспользуется внасиз热门новый Модель Понятно。

существовать Android используется в Простойизраспознавание речи Модель

Кусочек Вtensorflow/example/androidизиспользовать ВПростой语音Заказ识Неиз TensorFlow Android Примерприложение ИнструментиметьсуществоватьSpeechActivity.javaдокументсерединаруководить Аудио Записыватьи识Неизкод,предполагалось Долженприложение需хотетьвсегда Подготовить好приниматьновыйиз Аудио Заказ。 хотясуществовать В некоторых случаях это действительно разумно, но это приводит к тому, что исходный код оказывается намного сложнее, чем просто существование записи и идентификации исходного кода после того, как пользователь нажимает кнопку, например. Apple из Siri из Как работать. существуют В этом разделе мы Воля К покажем вам, как создать новый из Android приложение и добавьте как можно меньше исходников, чтобы записывать голосовые команды пользователя и показывать результаты распознавания. это должно помочь вам легче интегрировать Воля Модель Android В приложении. Однако, если вам нужно иметь дело с голосовыми командами, которые всегда должны автоматически записываться и распознаваться, вам следует проверить TensorFlow Пример Android приложение.

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

Следуйте инструкциям ниже, чтобы создать полноценный новый Android приложение,Долженприложениеиспользоватьнассуществоватьначальствоодин节середина Строитьspeech_commands_graph.pbМодель:

  1. проходитьприниматьвпередлапша Несколькоглавасерединаиз Местоиметьпо умолчаниюнастраивать,создаватьодининдивидуальныйимядляAudioRecognitionизновый Android приложение,Затем Воляcompile 'org.tensorflow:tensorflow-android:+'ХОРОШОдобавить вприезжатьприложениеbuild.gradleдокумент Зависимостиизконец。
  2. Воля<uses-permission android:name="android.permission.RECORD_AUDIO" />добавить вприезжатьприложениеизAndroidManifest.xmlдокументсередина,Чтобы приложению можно было разрешить запись звука.
  3. создаватьодининдивидуальныйновыйизресурсыпапка,Затем Волясуществоватьначальствоодин节изшаг 2 и 3 Чжуншенгизspeech_commands_graph.pbиconv_actions_labels.txtдокументтащить放приезжатьassetsпапкасередина。
  4. Изменятьactivity_main.xmlдокументк容纳трииндивидуальный UI элемент. Нет.одининдивидуальныйдаиспользовать В识НерезультатпоказыватьизTextView
Язык кода:javascript
копировать
<TextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="24sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

Нет.二индивидуальныйTextViewВоляпоказыватьначальствоодин节Нет. 2 шагиспользуется вtrain.py Python степеньпоследовательностьобучение 10 индивидуальныйпо умолчанию Заказ:

Язык кода:javascript
копировать
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="yes no up down left right on off stop go"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.50"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.25" />

наконецодининдивидуальный UI 元белыйдаодининдивидуальныйкнопка,существовать Нажмите эту кнопкучас,Начнется запись на одну секунду,Затем Волязапись Отправить приезжатьнасиз Моделькруководить识Не:

Язык кода:javascript
копировать
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Start"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.50"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.8" />
  1. 打открытьMainActivity.java,первыйсоздаватьMainActivity implements Runnableдобрый。 Затемдобавить вк Внизпостоянный,определить название модели,Имя тега,Имя входа и имя выхода:
Язык кода:javascript
копировать
private static final String MODEL_FILENAME = "file:///android_asset/speech_commands_graph.pb";
private static final String LABEL_FILENAME = "file:///android_asset/conv_actions_labels.txt";
private static final String INPUT_DATA_NAME = "decoded_sample_data:0";
private static final String INPUT_SAMPLE_RATE_NAME = "decoded_sample_data:1";
private static final String OUTPUT_NODE_NAME = "labels_softmax";
  1. Объявите четыре отдельные переменные экземпляра:
Язык кода:javascript
копировать
private TensorFlowInferenceInterface mInferenceInterface;
private List<String> mLabels = new ArrayList<String>();
private Button mButton;
private TextView mTextView;
  1. существоватьonCreateметодсередина,наспервый Пример化mButtonиmTextView,Затем кнопку настройкищелкнуть обработчик событий,Должен事件处理устройствопервый Изменятькнопка标вопрос,Затемзапускать线степеньруководить Записыватьи识Не:
Язык кода:javascript
копировать
mButton = findViewById(R.id.button);
mTextView = findViewById(R.id.textview);
mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mButton.setText("Listening...");
        Thread thread = new Thread(MainActivity.this);
        thread.start();
    }
});

существоватьonCreateметодизконец,Читаем содержимое тега документиз построчно,и Воля Каждыйодин ХОРОШОдержатьсуществоватьmLabelsмножествосписоксередина。

  1. существоватьpublic void run()методизоткрытьголова(щелкнуть“открыть始”кнопкачасоткрыть始),Добавить код,Долженкодпервыйполучатьиспользовать Всоздавать Android AudioRecordвернослониз最Маленький缓冲区размер,ЗатемиспользоватьbuffersizeсоздаватьновыйизAudioRecordПример Инструментиметь 16,000 SAMPLE_RATEи 16 Кусочекодин声道Формат,этаданаша Модель ожидается из оригинального аудио из типа,ифинальныйотAudioRecordПримероткрыть始Записывать:
Язык кода:javascript
копировать
int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);

if (record.getState() != AudioRecord.STATE_INITIALIZED) return;
record.startRecording();

Android серединаиметьдваиндивидуальныйиспользовать ВЗаписывать Аудиоиздобрый:MediaRecorderиAudioRecordMediaRecorderСравниватьAudioRecord更易Виспользовать,Даэтовстречадержать压缩из Аудиодокумент,прямойприезжать Android API Level 24(Android 7.0), API Поддерживает запись необработанного оригинального звука. корень据этотвнутри,перехватывать 2018 Год 1 луна,рынокначальствоиметь 70% с на Android оборудованиевсе ещесуществоватьбегать 7.0 или Ранееиз Android Версия. Возможно, вы не захотите заказывать Воляприложение Кусочекприезжать Android 7.0 или更высокий Версия. кроме того,хотеть解码Зависит отMediaRecorderЗаписыватьиз压缩Аудио,тыдолжениспользоватьMediaCodec,использовать起Приходить Нет常复杂。 AudioRecordхотядаодининдивидуальный Низкийсортиз API,нодействительныйначальство Нет常подходящий合Записывать未处理изоригинальныйданные,Затем Воля Что Отправить приезжать语音Заказ识Не Модельруководить处理。

  1. Создано двумя отдельными авторами 16 Кусочек短всемножество成измножествоaudioBufferиrecordingBuffer,верно записано за 1 секунду,Каждый次AudioRecordвернослон读取и填充audioBufferмножествоназад,действительный读取изданные Всевстреча附加приезжать recordingBuffer
Язык кода:javascript
копировать
long shortsRead = 0;
int recordingOffset = 0;
short[] audioBuffer = new short[bufferSize / 2];
short[] recordingBuffer = new short[RECORDING_LENGTH];
while (shortsRead < RECORDING_LENGTH) { // 1 second of recording
    int numberOfShort = record.read(audioBuffer, 0, audioBuffer.length);
    shortsRead += numberOfShort;
    System.arraycopy(audioBuffer, 0, recordingBuffer, recordingOffset, numberOfShort);
    recordingOffset += numberOfShort;
}
record.stop();
record.release();
  1. После завершения записи,наспервый Волякнопка标вопрос ИзменятьдляRecognizing
Язык кода:javascript
копировать
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mButton.setText("Recognizing...");
    }
});

Затем ВоляrecordingBuffer短множествоизменять换​​дляfloatмножество,同часделатьfloatмножествоиз Каждыйиндивидуальный元белый Всесуществовать -1.0 и 1.0 вне диапазона, потому что мы ожидаем, что существование- будет плавать между 1.0 и 1.0:

Язык кода:javascript
копировать
float[] floatInputBuffer = new float[RECORDING_LENGTH];
for (int i = 0; i < RECORDING_LENGTH; ++i) {
    floatInputBuffer[i] = recordingBuffer[i] / 32767.0f;
}
  1. Как сообщает Форслава,создаватьодининдивидуальныйновыйизTensorFlowInferenceInterface,Затемиспользоватьдваиндивидуальныйвходитьузелизимясказатьиценитьвызов Чтоfeedметод,Одна индивидуальная частота выборки,另одининдивидуальныйдахранилищесуществоватьfloatInputBufferсерединаизоригинальный Аудиоданные ] множество:
Язык кода:javascript
копировать
AssetManager assetManager = getAssets();
mInferenceInterface = new TensorFlowInferenceInterface(assetManager, MODEL_FILENAME);

int[] sampleRate = new int[] {SAMPLE_RATE};
mInferenceInterface.feed(INPUT_SAMPLE_RATE_NAME, sampleRate);

mInferenceInterface.feed(INPUT_DATA_NAME, floatInputBuffer, RECORDING_LENGTH, 1);

после,насвызовrunметодсуществовать Модельначальствобегать识Нерассуждение,Затемfetchвыход 10 индивидуальная голосовая команда в каждой индивидуальной команде из выходной доли а также вывод «Неизвестно» и «Тишина»:

Язык кода:javascript
копировать
String[] outputScoresNames = new String[] {OUTPUT_NODE_NAME};
mInferenceInterface.run(outputScoresNames);

float[] outputScores = new float[mLabels.size()];
mInferenceInterface.fetch(OUTPUT_NODE_NAME, outputScores);
  1. outputScoresмножествоиmLabelsсписок匹配,поэтомунас Можетк轻松попытаться найтиприезжать最высокийпридется分иполучать Что Заказимясказать:
Язык кода:javascript
копировать
float max = outputScores[0];
int idx = 0;
for (int i=1; i<outputScores.length; i++) {
    if (outputScores[i] > max) {
        max = outputScores[i];
        idx = i;
    }
}
final String result = mLabels.get(idx);

наконец,нассуществоватьTextViewсерединапоказыватьрезультат,и Волякнопка标вопрос Изменять回"Start",к便использовать户Можетксноваоткрыть始Записыватьи识Не语音Заказ:

Язык кода:javascript
копировать
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mButton.setText("Start");
        mTextView.setText(result);
    }
});

Показать результаты распознавания для Модельуправляемый

сейчассуществовать,существоватьтыиз Android оборудованиеначальствобегать Долженприложение. ты Волясмотретьприезжатьнравитьсякартина 5.1 Показан начальный экран:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-wWZgl2Td-1681653027418)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/a321196b-4e44-43ec-94c5-42ee47ea29d9.png)]

изображение 5.1: приложение отображает заставку после запуска

НажмитеSTARTкнопка,Затемоткрыть始说начальстволапшапоказыватьиз 10 индивидуальный Заказ Изодин。 Вы видите, что название кнопки «Приехать» меняется на «Слушать…», а затем на «Распознать…», как на картинке. 5.2 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-yhAszZku-1681653027418)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/f4eb7e04-1d5f-4c70-a91c-055d8cdcb1c6.png)]

картина 5.2: Мониторинг записанного аудио и идентификация записанного аудио

Результаты распознавания отображаются практически в реальном времени посередине экрана, как на картинке 5.3 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-CC2hC76Q-1681653027418)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/bc4d09f3-f7d6-47fa-91f5-d0130635da7c.png)]

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

Весь процесс индивидуального распознавания завершается практически мгновенно.,использовать В识Неизspeech_commands_graph.pbМодельтолькодля 3.7MB。 Однако он поддерживает только 10 条语音Заказ,Да Прямо сейчасделатьиспользоватьtrain.py脚книгаиз --wanted_wordsпараметрилитыссебяизданныенаборподдерживать数十индивидуальный Заказ,Размер не сильно изменится,Как обсуждалось в разделе «Обучение нашего существования», из.

Истинный,здесьизприложение Экранперехватыватьартинаи Неткартинаначальствоодинглавасередина那Образец生двигатьсяиметьинтерес(один张картинакусок价ценитьодин千индивидуальныйодин词),Дараспознавание Речькогда, безусловно, может делать то, чего не могут художники, например, подавать голосовые команды для управления движением робота.

Приложениеиз Полный источниккод Кусочек на Github начальство Должен书изисточниккодхранилище БиблиотекаизCh5/androidпапкасередина。 Теперь посмотрим, как использовать модель сборки. iOS приложение, которое предполагает некоторую сложность TensorFlow iOS Сборка библиотеки и этапы подготовки аудиоданных для правильного запуска модели.

проходить Objective-C существовать iOS используется в Простойизраспознавание речи Модель

Если вы прочитали впередтриглавасерединаиз iOS приложение, то вы можете предпочесть использовать Ручную сборкаиз TensorFlow iOS Библиотекаи Нетда TensorFlow Панель эксперимента, как и в случае с методом «Использовать ручную Библиотеку», у вас больше контроля над тем, что вы можете добавить. TensorFlow работать, чтобы удовлетворить вас из Модель, это тоже да Мы решили сосредоточиться на TensorFlow Mobile вместо первого 1 Глава «Мобильный TensorFlow”из TensorFlow Lite из Одна из причин.

поэтому,хотяты Можетксуществоватьчитатькнига书часпытатьсяиспользовать TensorFlow Модуль для просмотра Pod да Нет обновлено для поддержки модели. виз Местоиметьдействовать,ноотсейчассуществоватьоткрыть始,нас Волявсегдаиспользовать Ручная сборкаиз TensorFlow Библиотека( Видеть iOS приложениесередина Нет. 3 глава,“Обнаружениевернослон及Что Расположение”из“существовать iOS используется в Обнаружение Раздел «моделирование объектов» из шагов 1 и 2)。

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

Теперь существуют следующие шаги, чтобы создать нового человека iOS Приложение Определите модель с помощью голосовой команды:

  1. существовать Xcode серединасоздаватьодининдивидуальныйимядля AudioRecognition изновый Objective-C приложение,и Воляпроектнастраиватьдляиспользовать TensorFlow Ручная сборкаиз Библиотека, как в "Ломтики в потрясающем изхудожественном стиле мигрироватькартина"из шагов 1 описано в. возвращаться ВоляAudioToolbox.framework,AVFoundation.frameworkиAccelerate.frameworkдобавить вприезжать Цельизприносить Библиотекаиз Связь二进制документ.
  2. Воляspeech_commands_graph.pbМодельдокументтащить放приезжатьпроектсередина。
  3. ВоляViewController.mизрасширение Изменятьдляmm,Затемдобавить в Аудио Записыватьи处理Местоиспользоватьизк Вниззаголовок:
Язык кода:javascript
копировать
#import <AVFoundation/AVAudioRecorder.h>
#import <AVFoundation/AVAudioSettings.h>
#import <AVFoundation/AVAudioSession.h>
#import <AudioToolbox/AudioToolbox.h>

также добавлено TensorFlow иззаголовок:

Язык кода:javascript
копировать
#include <fstream>
#include "tensorflow/core/framework/op_kernel.h"
#include "tensorflow/core/framework/tensor.h"
#include "tensorflow/core/public/session.h"

сейчассуществовать,определениеодининдивидуальный АудиоSAMPLE_RATEпостоянный,Индивидуальный ссылается на массив с плавающей запятой К из указателя C.,Массив содержит Волю для отправки моделиз аудиоданных.,насиз关ключaudioRecognitionфункция签имяа также два индивидуальных атрибута, которые содержат записи из документа, и один индивидуальный атрибут. iOS AVAudioRecorderПример。 насвозвращаться需хотеть让ViewControllerвыполнитьAudioRecorderDelegate,Чтобы он знал, когда закончится запись:

Язык кода:javascript
копировать
const int SAMPLE_RATE = 16000;
float *floatInputBuffer;
std::string audioRecognition(float* floatInputBuffer, int length);
@interface ViewController () <AVAudioRecorderDelegate>
@property (nonatomic, strong) NSString *recorderFilePath;
@property (nonatomic, strong) AVAudioRecorder *recorder;
@end

Для этого мы не будем показывать программное создание двух индивидуальных UI Элемент изкода сегмента: индивидуальная кнопка, при нажатии на кнопку Воля начинает запись 1 Секунды аудио, затем Воля аудио отправляет нам из Модель для идентификации. такжеодининдивидуальный отображает результаты распознавания по тегу. Но да, мы Волясуществовать в следующей части из Swift Покажи что-нибудь в UI Код для проверки.

  1. существоватькнопкаизUIControlEventTouchUpInside处理устройство内,наспервыйсоздаватьодининдивидуальныйAVAudioSessionПример,И Воля его рубрика настройкидля записии Воля Что激活:
Язык кода:javascript
копировать
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *err = nil;
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&err];
if(err){
    NSLog(@"audioSession: %@", [[err userInfo] description]);
    return;
}

[audioSession setActive:YES error:&err];
if(err){
    NSLog(@"audioSession: %@", [[err userInfo] description]);
    return;
}

Затемсоздаватьодининдивидуальный Записыватьнастраиватьсловарь:

Язык кода:javascript
копировать
NSMutableDictionary *recordSetting = [[NSMutableDictionary alloc] init];
[recordSetting setValue:[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:SAMPLE_RATE] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
[recordSetting setValue:[NSNumber numberWithInt:AVAudioQualityMax] forKey:AVEncoderAudioQualityKey];

наконец,существовать нажатие кнопки в процессоре,Определяем сохранение записи из Аудио из Расположение,создаватьAVAudioRecorderПример,настройки сдал в эксплуатацию и начал запись 1 Секунды:

Язык кода:javascript
копировать
self.recorderFilePath = [NSString stringWithFormat:@"%@/recorded_file.wav", [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"]];
NSURL *url = [NSURL fileURLWithPath:_recorderFilePath];
err = nil;
_recorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSetting error:&err];
if(!_recorder){
    NSLog(@"recorder: %@", [[err userInfo] description]);
    return;
}
[_recorder setDelegate:self];
[_recorder prepareToRecord];
[_recorder recordForDuration:1];
  1. существоватьAVAudioRecorderDelegate,audioRecorderDidFinishRecordingиз委托методсередина,насиспользовать Apple из Расширенный сервис аудиодокументов, который используется для чтения и записи сжатия и линейного PCM Аудиодокумент,загрузить запись из аудио,и Воля Чтоизменять换для Модель Необходимый Формат, А аудиоданные Воля считываются в память. нассуществоватьэтотвнутри Нетвстречапоказыватьэтотчастькод,В основном это основано на этом блоге。 существоватьздесь理после,floatInputBufferобратитесь к Коригинальный Аудио Образецкнига。 сейчассуществовать,нас Можетк Воляданныепроходить递приезжать工делать线степеньсерединаизaudioRecognitionметодсередина,исуществовать UI Результаты отображаются в теме:
Язык кода:javascript
копировать
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    std::string command = audioRecognition(floatInputBuffer, totalRead);
    delete [] floatInputBuffer;
    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *cmd = [NSString stringWithCString:command.c_str() encoding:[NSString defaultCStringEncoding]];
        [_lbl setText:cmd];
        [_btn setTitle:@"Start" forState:UIControlStateNormal];
    });
});
  1. существоватьaudioRecognitionметодвнутренний,наспервыйопределениеодининдивидуальный C++ stringмножество,Чтосередина Сумка含хотеть识Неиз 10 индивидуальный Заказа такжедваиндивидуальный特殊ценить"_silence_"и"_unknown_"
Язык кода:javascript
копировать
std::string commands[] = {"_silence_", "_unknown_", "yes", "no", "up", "down", "left", "right", "on", "off", "stop", "go"};

существовать Заканчивать标准 TensorFlow Session,StatusиGraphDefнастраиватьназад(нравитьсянассуществоватьвперед Несколькоглаваиз iOS приложение (как сделано в из), читаем Модельдокумента и пытаемся использовать его, создаём TensorFlow Session

Язык кода:javascript
копировать
NSString* network_path = FilePathForResourceName(@"speech_commands_graph", @"pb");

PortableReadFileToProto([network_path UTF8String], &tensorflow_graph);

tensorflow::Status s = session->Create(tensorflow_graph);
if (!s.ok()) {
    LOG(ERROR) << "Could not create TensorFlow Graph: " << s;
    return "";
}

Если сессия успешно создана,нодля Модельопределениедваиндивидуальныйвходить Имя узлаиодининдивидуальныйвыход Имя узла:

Язык кода:javascript
копировать
std::string input_name1 = "decoded_sample_data:0";
std::string input_name2 = "decoded_sample_data:1";
std::string output_name = "labels_softmax";
  1. верно В"decoded_sample_data:0",нас需хотеть Воля采Образец率ценитьделатьдля Скалярная отправка(в противном случаесуществоватьвызов TensorFlow Sessionизrunметодчасвстреча出错),исуществовать TensorFlow C++ API Тензор определен в как показано ниже:
Язык кода:javascript
копировать
tensorflow::Tensor samplerate_tensor(tensorflow::DT_INT32, tensorflow::TensorShape());
samplerate_tensor.scalar<int>()() = SAMPLE_RATE;

верно В "decoded_sample_data:1",需хотеть Воля浮点数серединаиз АудиоданныеотfloatInputBufferмножествоизменять换для TensorFlow audio_tensorТензор,Что方Режимпохожий Ввперед Несколькоглаваизimage_tensorизопределениеинастраивать方Режим:

Язык кода:javascript
копировать
tensorflow::Tensor audio_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({length, 1}));
auto audio_tensor_mapped = audio_tensor.tensor<float, 2>();
float* out = audio_tensor_mapped.data();
for (int i = 0; i < length; i++) {
    out[i] = floatInputBuffer[i];
}

Теперь мы можем ввести Модель проектировать, как и в случае с опережениемпользовать, и получить результат:

Язык кода:javascript
копировать
std::vector<tensorflow::Tensor> outputScores;
tensorflow::Status run_status = session->Run({{input_name1, audio_tensor}, {input_name2, samplerate_tensor}},{output_name}, {}, &outputScores);
if (!run_status.ok()) {
    LOG(ERROR) << "Running model failed: " << run_status;
    return "";
}
  1. насверно МодельизoutputScoresвыходруководить Простойизанализировать,Затем返回最высокий分。 outputScoresда TensorFlow Тензор, первый элемент которого содержит 12 индивидуальный Возможно из результатов распознаванияиз 12 индивидуальныйпридется分ценить. Можеткпроходитьflatметод访问этот 12 индивидуальное значение балла и проверьте максимальный балл:
Язык кода:javascript
копировать
tensorflow::Tensor* output = &outputScores[0];
const Eigen::TensorMap<Eigen::Tensor<float, 1, Eigen::RowMajor>, Eigen::Aligned>& prediction = output->flat<float>();
const long count = prediction.size();
int idx = 0;
float max = prediction(0);
for (int i = 1; i < count; i++) {
    const float value = prediction(i);
    printf("%d: %f", i, value);
    if (value > max) {
        max = value;
        idx = i;
    }
}

return commands[idx];

существующееприложение может записывать любой звук вперед,ты需хотеть做из另один件事дасуществоватьприложениеизInfo.plistдокументсерединасоздаватьодининдивидуальныйновыйизКонфиденциальность-Микрофон Использование Описаниесвойство,и Воля Долженсвойствоизценитьнастраиватьдля诸нравиться“слушатьприезжатьи识Не” Вы из голосовой команды».

сейчассуществовать,существовать iOS 模拟устройствоначальствобегать Долженприложение(Если ты Xcode Версия早В 9.2, в то время как iOS Версия эмулятора старше, чем 10.0, возможно, вам придется существоватьактуализировать iOS На устройстве запустите приложение, так как оно может быть недоступно для вас. iOS или iPhone Эмулятор (10.0 Форвардиз Версия), ты, Воля, сначала посмотри приезжать с возможностью Start Кнопка Кусочек посередине начального экрана, Затем Нажмите кнопку и скажите 10 Одна из индивидуальных команд, результат распознавания должен появиться вверху существования. ,нравитьсякартина 5.4 Показано:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-JIQ5O5pu-1681653027418)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/71ef1770-f7c0-4152-bb72-ea7993f5b728.png)]

изображение 5.4: Отображение начального экрана и результатов распознавания

даиз,Результаты распознавания должны появиться,нодействительныйначальство Нетвстреча出сейчас,потому чтодлясуществовать Xcode В области вывода появляется ошибка:

Язык кода:javascript
копировать
Could not create TensorFlow Graph: Not found: Op type not registered 'DecodeWav' in binary running on XXX's-MacBook-Pro.local. Make sure the Op and Kernel are registered in the binary running in this process.

использоватьtf_op_files.txtремонт Модельнагрузкаошибка

Мы уже видели приезжать в раздел существованиявпередизглава и допустили общеизвестную ошибку.,Если вы не знаете, что это на самом деле означает,в противном случае弄清楚Долженремонтстепеньпоследовательность Может能хотеть花很многочас间。 TensorFlow Операция состоит из двух частей: Кусочек Ю. tensorflow/core/opsпапкасерединаизсказатьдляopsизопределение(этотиметь点令人озадаченный,Потому что действовать может выражать свое определение,Чтовыполнить,также Можетквыражать Чтоопределение)。 iКусочек В tensorflow/core/kernelsпапкасерединаизвыполнить(сказатьдля Ядро)。 tensorflow/contrib/makefileпапкасерединаиметьодининдивидуальныйимядляtf_op_files.txtиздокумент,Чтосередина列出Понятносуществовать Ручная сборка Библиотека требует встроенной возможности приезжать TensorFlow iOS Библиотекасерединаиздействоватьизопределениеивыполнить. tf_op_files.txtдокумент应Должен Сумка含Местоиметьдействоватьопределениедокумент,нравитьсяПодготовьте модели для мобильного развертывания TensorFlow.,Потому что они занимают очень мало места. Но от TensorFlow 1.4 или 1.5 запускается,tf_op_files.txtдокументсерединаи未Сумка含Местоиметьдействоватьиздействоватьопределение。 Итак, когда мы видим ошибку «Незарегистрированный тип действия», нам нужно выяснить, какой индив определение идуальныйдействовать ивыдокумент заполнить несет ответственность за действие. существоватьнасиз情况Вниз,действоватьтипимядляDecodeWav。 Мы можем запустить следующие два индивидуальных Shell Команда для получения информации:

Язык кода:javascript
копировать
$ grep 'REGISTER.*"DecodeWav"' tensorflow/core/ops/*.cc
tensorflow/core/ops/audio_ops.cc:REGISTER_OP("DecodeWav")

$ grep 'REGISTER.*"DecodeWav"' tensorflow/core/kernels/*.cc
tensorflow/core/kernels/decode_wav_op.cc:REGISTER_KERNEL_BUILDER(Name("DecodeWav").Device(DEVICE_CPU), DecodeWavOp);

существовать TensorFlow 1.4 из tf_op_files.txtдокументсередина,уже经иметьодин ХОРОШО文книгаtensorflow/core/kernels/decode_wav_op.cc,но Можетк肯定издаtensorflow/core/ops/audio_ops.cc丢失Понятно。 нас需хотеть做из Сразудасуществоватьtf_op_files.txtдокументсерединаизпроизвольный Расположениедобавить водин ХОРОШОtensorflow/core/ops/audio_ops.cc,икартинасуществовать Нет. 3 глава,“Обнаружениевернослон及Что Расположение”серединаодин Образецбегатьtensorflow/contrib/makefile/build_all_ios.sh,к重建 TensorFlow iOS Библиотека。 Потом снова проект iOS приложение,и продолжайте нажимать кнопку «Пуск»,Затем произнесите голосовую команду, чтобы выявить недоразумения.,Пока тебе не надоест.

книгаглава Воля重点представлятькакрешатьNot found: Op type not registeredошибкаизпроцесс,потому чтодля Воля Приходитьсуществоватьдругой TensorFlow Вы можете сэкономить много времени при работе над моделями.

Да,существоватьпродолжатьизучать Внизодинглавасередина Воляпредставлятьииспользовать另одиндобрыйновыйиз TensorFlow AI Модель вперед, давайте ставим лайки, используем обновления из И менее верны, они более крутые из Swift Язык из iOS уделить персоналу некоторые соображения.

проходить Swift существовать iOS используется в Простойизраспознавание речи Модель

нассуществовать Нет. 2 главаиспользуется в TensorFlow Панель создала индивидуална основе Swift из iOS приложение. сейчассуществовать Давайте создадим нового человека Swift приложение,Долженприложениеиспользоватьнассуществоватьначальствоодин节середина Ручная сборкаиз TensorFlow iOS Библиотека,исуществоватьнасиз Swift приложениеиспользуется в голосовой команде Модель:

  1. проходить Xcode создаватьодининдивидуальныйновыйиз“Single View iOS» и выполните действия, описанные в предыдущем разделе. 1 и 2 То же, что и способ настройки проекта, за исключением языка «Настройкадля». Swift。
  2. выбирать Xcode "документ | Новый | документ …”,Затемвыбирать Objective-C документ. входитьимясказатьRunInference。 Вы увидите окно сообщения «Приехать индивидуально» с вопросом: «Хотите ли вы настроить индивидуального?» Objective-C Соединяющий заголовок? " щелкнуть Создать связующий заголовок. ВолядокументRunInference.m重命имядляRunInfence.mm,потому чтодлянас Волясмешиваниеиспользовать C,C++ и Objective-C код для выполнения обработки и распознавания звука после записи. насвсе ещесуществовать Swift приложениеиспользуется в Objective-C,потому чтодляхотетьот Swift вызов TensorFlow C++ код, нам нужен индивидуальный Objective-C класс как C++ кодиз упаковки.
  3. создаватьодининдивидуальныйимядляRunInference.hизголовадокумент,и добавьте следующий код:
Язык кода:javascript
копировать
@interface RunInference_Wrapper : NSObject
- (NSString *)run_inference_wrapper:(NSString*)recorderFilePath;
@end

сейчассуществовать,тысуществовать Xcode Среднее изприложение должно быть похоже на картину. 5.5:

[Внешняя ссылка: передача изображения не удалась,сайт поиска может иметь механизм защиты от хотлинков,предположение Волякартина Сохраните фильм напрямуюначальствопроходить(img-MJtM9Z41-1681653027419)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/intel-mobi-proj-tf/img/3febd651-7749-4a23-ba86-ae458ef8cfea.png)]

картина 5.5:на основе Swift из iOS приложениепроект

  1. 打открытьViewController.swift。 существоватьimport UIKitпослеиз顶部добавить вк Внизкод:
Язык кода:javascript
копировать
import AVFoundation

let _lbl = UILabel()
let _btn = UIButton(type: .system)
var _recorderFilePath: String!

ЗатемделатьViewControllerсмотреть起Приходитькартинаэтот Образец(未показыватьдля_btnи_lblопределениеNSLayoutConstraintивызовaddConstraintизкодчасть):

Язык кода:javascript
копировать
class ViewController: UIViewController, AVAudioRecorderDelegate {
    var audioRecorder: AVAudioRecorder!
override func viewDidLoad() {
    super.viewDidLoad()

    _btn.translatesAutoresizingMaskIntoConstraints = false
    _btn.titleLabel?.font = UIFont.systemFont(ofSize:32)
    _btn.setTitle("Start", for: .normal)
    self.view.addSubview(_btn)

    _btn.addTarget(self, action:#selector(btnTapped), for: .touchUpInside)

    _lbl.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(_lbl)
  1. Добавлен обработчик нажатия отдельной кнопки.,И существоватьего интерьер,первыйпожалуйста求использовать户из Записывать许Может:
Язык кода:javascript
копировать
@objc func btnTapped() {
    _lbl.text = "..."
    _btn.setTitle("Listening...", for: .normal)

    AVAudioSession.sharedInstance().requestRecordPermission () {
        [unowned self] allowed in
        if allowed {
            print("mic allowed")
        } else {
            print("denied by user")
            return
        }
    }

ЗатемсоздаватьодининдивидуальныйAudioSessionПример,И Воля его рубрика настройкидля записи,и Волясостояниенастраиватьдля活двигаться,Сразукартинанассуществовать Objective-C Версия делает то же самое, что и из:

Язык кода:javascript
копировать
let audioSession = AVAudioSession.sharedInstance()

do {
    try audioSession.setCategory(AVAudioSessionCategoryRecord)
    try audioSession.setActive(true)
} catch {
    print("recording exception")
    return
}

сейчассуществоватьопределениеAVAudioRecorderхотетьиспользоватьизнастраивать:

Язык кода:javascript
копировать
let settings = [
    AVFormatIDKey: Int(kAudioFormatLinearPCM),
    AVSampleRateKey: 16000,
    AVNumberOfChannelsKey: 1,
    AVLinearPCMBitDepthKey: 16,
    AVLinearPCMIsBigEndianKey: false,
    AVLinearPCMIsFloatKey: false,
    AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
    ] as [String : Any]

настройкадокумента путь для сохранения записи аудио,создаватьAVAudioRecorderПример,настройки сдал в эксплуатацию и начал запись 1 Секунды:

Язык кода:javascript
копировать
do {
    _recorderFilePath = NSHomeDirectory().stringByAppendingPathComponent(path: "tmp").stringByAppendingPathComponent(path: "recorded_file.wav")
    audioRecorder = try AVAudioRecorder(url: NSURL.fileURL(withPath: _recorderFilePath), settings: settings)
    audioRecorder.delegate = self
    audioRecorder.record(forDuration: 1)
} catch let error {
    print("error:" + error.localizedDescription)
}
  1. существоватьViewController.swiftизконец,добавить в Инструментиметьк ВнизвыполнитьизAVAudioRecorderDelegateметодaudioRecorderDidFinishRecording,Долженвыполнить主хотетьвызовrun_inference_wrapperруководить Аудионазад处理и识Не:
Язык кода:javascript
копировать
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    _btn.setTitle("Recognizing...", for: .normal)
    if flag {
        let result = RunInference_Wrapper().run_inference_wrapper(_recorderFilePath)
        _lbl.text = result
    }
    else {
        _lbl.text = "Recording error"
    }
    _btn.setTitle("Start", for: .normal)
}

существоватьAudioRecognition_Swift-Bridging-Header.hдокументсередина,добавить в#include "RunInference.h",к便впередлапшаиз Swift кодRunInference_Wrapper().run_inference_wrapper(_recorderFilePath)起делатьиспользовать。

  1. существоватьrun_inference_wrapperметод内изRunInference.mmсередина,от Objective-C AudioRecognitionприложениесерединаизViewController.mmкопироватькод,нравитьсяначальствоодин节изшаг 5-8 Как уже упоминалось, код Воля сохраняет и конвертирует записанный звук в формат. TensorFlow Модельпринимать Модель,Затем Воля Чтои采Образец率один起发送给Моделькполучать识Нерезультат:
Язык кода:javascript
копировать
@implementation RunInference_Wrapper
- (NSString *)run_inference_wrapper:(NSString*)recorderFilePath {
...
}

Если вы действительно хотите, чтобы Воля изкодировал трансплантат, приезжайте как можно больше. Swift,тогда вы можете использовать Swift заменять C серединаиз Аудиодокументизменять换код。 Также имеется неофициальный источник проекта, который представляет собой официальный TensorFlow C++ API из Swift обертка. Но дадля простоты ради простоты и достижения соответствующего баланса, мы, Воля, сохранили TensorFlow Модель вывода, существующая в этом примере, также позволяет сохранять аудиодокументы для чтения и преобразования, а такжесуществовать C++ и Objective-C Средний контроль UI и запись и запуск вызова для обработки и распознавания звука.

это для сборки Использовать распознавание голосовых команд Модель Swift iOS приложение Необходимыйвсесодержание。 сейчассуществовать,ты Можетксуществовать iOS эмулятордействительныйоборудованиеначальствобегатьэто,上смотретьpriezzatii Objective-C Версия полностью идентичен результату.

Подвести итог

существоватькнигаглавасередина,наспервыйбыстрый概описывать Понятнораспознавание речиа также Как создавать современные методы глубокого обучения ASR система. Затем мы рассказали, как тренировать TensorFlow Модель распознает простые голосовые команды и объясняет, как их существовать. Android приложениеа такжена основе Objective-C и Swift из iOS приложениеиспользуется в Моделиз шаг за шагом Учебник. Также мы обсудили, как провести поиск пропажи из TensorFlow Обработали документ ядра, добавили его и пересобрали TensorFlow iOS Библиотека, чтобы исправить iOS Распространенные ошибки загрузки в из Модель.

ASR Используется для преобразования речи в текст. Следующим главой, мы Воля, исследуем другой индивидуальный текст Воли, как для вывода из Модель, и текст Воля содержит полные предложения на естественном языке, а не эту главу в виде простых команд. Мы, Воля, рассказываем, как построить Модель для Волякартина, например, мы из старого друга конвертируем для текста, а такжекаксуществоватьдвигатьсяприложениеиспользуется в Должен Модель. Наблюдение и описание вашего контента на естественном языке требует настоящего человеческого интеллекта. Шерлок Холмс — один из лучших людей, справившихся с этой задачей. наскогда然возвращаться Нетнравиться福尔摩斯,Да让нассмотретьсмотретькакоткрыть始。

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose