Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.
В этой лабораторной работе вы узнаете, как создать приложение, которое обрабатывает основной вариант использования Computer Vision, определяя основное содержимое изображения. Обычно это называется классификацией изображений или маркировкой изображений .
Эта лаборатория кода является частью пути " Начало работы с классификацией изображений ". Он был написан для опытных разработчиков, плохо знакомых с машинным обучением.
Компьютерное зрение — это область более широкой дисциплины машинного обучения, которая работает над поиском новых способов обработки и извлечения машинами информации из содержимого изображения. Если раньше компьютер сохранял только фактические данные изображений, такие как значения пикселей, составляющих изображение, Computer Vision позволяет компьютеру анализировать содержимое изображения и получать информацию о том, что в нем содержится.
Например, в области компьютерного зрения изображение кошки может быть помечено как содержащее кошку в дополнение к пикселям, из которых состоит это изображение. Существуют и другие области компьютерного зрения, которые более подробно рассматриваются, например, обнаружение объектов, когда компьютер может находить несколько элементов на изображении и создавать для них ограничивающие рамки.
В этой лаборатории кода вы узнаете, как создать приложение, которое обрабатывает основной вариант использования, определяя основное содержимое изображения. Обычно это называется классификацией изображений или маркировкой изображений .
Чтобы сделать приложение как можно более простым, оно будет использовать изображения, связанные с ним, в качестве ресурсов и показывать вам их классификацию. Будущие расширения могут заключаться в использовании средства выбора изображений или извлечении изображений непосредственно из камеры.
Вы начнете с процесса создания приложения на Android с помощью Android Studio. (Перейдите к шагу 7, чтобы сделать то же самое на iOS.)
ML Kit (https://developers.google.com/ml-kit) предлагает ряд решений для разработчиков, отвечающих распространенным сценариям машинного обучения и упрощающих их реализацию и кросс-платформенную работу. ML Kit предоставляет готовую библиотеку, которую вы можете использовать в этом приложении под названием Image Labelling. Эта библиотека включает модель, предварительно обученную распознавать более 600 классов изображений. Таким образом, он идеально подходит для начала.
Обратите внимание, что ML Kit также позволяет вам использовать пользовательские модели с использованием того же API, поэтому, когда вы будете готовы, вы можете перейти от «начала работы» и приступить к созданию своего персонализированного приложения для маркировки изображений, которое использует модель, обученную для вашего сценария.
В этом сценарии вы создадите распознаватель цветов. Когда вы создадите свое первое приложение и покажете ему изображение цветка, оно распознает его как цветок. (Позже, когда вы создадите свою собственную модель детектора цветов, вы сможете поместить ее в свое приложение с минимальными изменениями благодаря ML Kit, и новая модель скажет вам, какой это тип цветка, например, тюльпан или тюльпан. Роза.)
implementation 'com.google.mlkit:image-labeling:17.0.3'
(Убедитесь, что это внутри зависимостей <>)
Вы импортировали ML Kit и готовы приступить к маркировке изображений.
Далее вы создадите простой пользовательский интерфейс для рендеринга изображения и предоставите вам кнопку, при нажатии которой ваш пользователь запускает модель маркировки изображений для анализа содержимого изображения.
В Android Studio вы редактируете пользовательский интерфейс для каждого экрана (или действия) с помощью файла макета на основе xml. Базовое приложение, которое вы создали, имеет одно действие (код которого находится в MainActivity , и вы скоро это увидите), а объявление пользовательского интерфейса — в activity_main.xml .
Вы можете найти это в папке res > layout в проводнике проектов Android, например:
Откроется полноценный редактор, который позволит вам создать пользовательский интерфейс Activity. Там много всего, и цель этой лаборатории не в том, чтобы научить вас, как это использовать. Чтобы узнать больше о редакторе макетов, посетите: https://developer.android.com/studio/write/layout-editor.
Для целей этого практического занятия выберите инструмент «Код» в правом верхнем углу редактора.
Теперь вы увидите только XML-код в основной части окна. Измените код на этот:
Это даст вам очень простой макет, содержащий ImageView (для рендеринга изображения), Button (для нажатия пользователем) и TextView , где будут отображаться метки.
Теперь у вас есть определенный пользовательский интерфейс. Прежде чем приступить к кодированию, добавьте несколько изображений в качестве активов, и приложение сделает вывод на основе этих изображений.
Один из способов связать дополнительные файлы с приложением Android — добавить их в качестве ресурсов, которые компилируются в приложение. Чтобы сделать это приложение простым, мы сделаем это, чтобы добавить изображение некоторых цветов. Позже вы можете расширить это приложение, чтобы использовать CameraX или другие библиотеки, чтобы делать фотографии и использовать их. Но для простоты мы пока просто объединим изображение.
Как только вы это сделаете, в проводнике проекта появится новая папка ресурсов :
Сделав это, вернитесь в Android Studio, и вы должны увидеть свой файл в папке с ресурсами.
Теперь вы готовы пометить это изображение!
(А теперь то, чего мы все так долго ждали, — компьютерное зрение на Android!)
Если вы решили использовать Kotlin, вам может быть интересно, почему родительская папка называется Java . Это исторический артефакт, когда Android Studio была только Java. В будущих версиях это может быть исправлено, но не волнуйтесь, если вы хотите использовать Kotlin, все в порядке. Это просто имя папки для исходного кода.
class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) >>
Под закрывающей фигурной скобкой вы можете добавить код расширения, который не является частью класса, но может использоваться классом. Вам понадобится расширение для чтения файла из ресурсов в виде растрового изображения. Это будет использоваться для загрузки изображения, которое вы скопировали в папку активов ранее.
// extension function to get bitmap from assets fun Context.assetsToBitmap(fileName: String): Bitmap? < return try < with(assets.open(fileName))< BitmapFactory.decodeStream(this) >> catch (e: IOException) < null >>
В этот момент Android Studio, вероятно, будет жаловаться и выделять часть кода красным цветом, например Context , Bitmap и IOException :
Не волнуйся! Это потому, что вы еще не импортировали содержащие их библиотеки. Android Studio предлагает удобный ярлык.
val img: ImageView = findViewById(R.id.imageToLabel) // assets folder image file name with extension val fileName = "flower1.jpg" // get bitmap from assets folder val bitmap: Bitmap? = assetsToBitmap(fileName) bitmap?.apply
val txtOutput : TextView = findViewById(R.id.txtOutput)
Как и ранее, он находит информацию о файле макета для текстового представления по его имени (проверьте XML, где оно называется txtOutput ) и использует его для создания экземпляра объекта TextView с именем txtOutput.
Точно так же вы создадите объект кнопки для представления кнопки и создадите его экземпляр с содержимым файла макета.
В файле макета мы назвали кнопку btnTest , поэтому мы можем создать ее экземпляр следующим образом:
val btn: Button = findViewById(R.id.btnTest)
Теперь у вас есть весь ваш код и элементы управления инициализированы, следующим (и последним) шагом будет их использование для получения вывода об изображении.
Прежде чем продолжить, убедитесь, что ваш код onCreate выглядит так:
override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val img: ImageView = findViewById(R.id.imageToLabel) // assets folder image file name with extension val fileName = "flower1.jpg" // get bitmap from assets folder val bitmap: Bitmap? = assetsToBitmap(fileName) bitmap?.apply < img.setImageBitmap(this) >val txtOutput : TextView = findViewById(R.id.txtOutput) val btn: Button = findViewById(R.id.btnTest) >
Ни одно из ключевых слов не должно быть красного цвета, что указывает на то, что они еще не были импортированы. Если это так, вернитесь назад и выполните трюк ALT + Enter , чтобы сгенерировать импорт.
При использовании этикетировщика изображений ML Kit первым шагом обычно является создание объекта Options для настройки поведения. Вы преобразуете свое изображение в формат InputImage , который может распознать ML Kit. Затем вы создаете объект Labeler для выполнения логического вывода. Это даст вам асинхронный обратный вызов с результатами, которые вы затем сможете проанализировать.
Для только что созданной кнопки сделайте все это в событии onClickListener . Вот полный код:
btn.setOnClickListener < val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) val image = InputImage.fromBitmap(bitmap. 0) var outputText = "" labeler.process(image) .addOnSuccessListener < labels ->// Task completed successfully for (label in labels) < val text = label.text val confidence = label.confidence outputText += "$text : $confidence\n" >txtOutput.text = outputText > .addOnFailureListener < e ->// Task failed with an exception > >
Вот и все! Теперь вы можете запустить приложение либо на устройстве Android, либо в эмуляторе. Если вы никогда не делали этого раньше, вы можете узнать, как здесь: https://developer.android.com/studio/run/emulator
Вот приложение, работающее в эмуляторе. Сначала вы увидите изображение и кнопку, а метка будет пустой.
Нажмите на кнопку, и вы получите набор меток для изображения.
Здесь вы можете видеть, что составитель определил высокую вероятность того, что изображение содержит лепесток, цветок, растение и небо. Все они верны, и все они демонстрируют, что модель работает над синтаксическим анализом изображения.
Но пока не может определить, что это изображение маргаритки. Для этого вам понадобится пользовательская модель, обученная на определенных цветах, и вы увидите, как это сделать, в следующем лабораторном занятии.
На следующих шагах вы узнаете, как создать такое же приложение на iOS.
Вы можете создать подобное приложение на iOS с помощью Xcode.
Поскольку ML Kit также работает на iOS, вы можете использовать его очень похожим образом для создания классификатора изображений. Для его интеграции вы будете использовать CocoaPods. Если у вас это еще не установлено, вы можете сделать это с помощью инструкций на https://cocoapods.org/
Здесь вы можете увидеть файл .xcodeproj, указывающий, что я нахожусь в правильном месте.
platform :ios, '10.0' target 'ImageClassifierStep1' do pod 'GoogleMLKit/ImageLabeling' end
Обратите внимание, что в конце вас попросят закрыть сеансы Xcode и с этого момента использовать файл рабочей области. Откройте этот файл, и Xcode запустится с исходным проектом и внешними зависимостями.
Теперь вы готовы перейти к следующему шагу и созданию пользовательского интерфейса.
Теперь вы готовы сделать следующий шаг — связать пользовательский интерфейс с кодом, используя выходы и действия.
При разработке iOS с использованием раскадровок вы обращаетесь к информации о макете для своих элементов управления с помощью выходов и определяете код, который будет выполняться, когда пользователь выполняет действие над элементом управления с помощью действий.
На следующем шаге вам нужно будет создать выходы для ImageView и Label. ImageView будет использоваться в коде для загрузки в него изображения. Метка будет упоминаться в коде, чтобы установить ее текст на основе вывода, полученного из комплекта ML.
При перетаскивании вы увидите стрелку, а когда отпустите, появится всплывающее окно, подобное этому:
Когда вы закончите, ваш код должен выглядеть следующим образом: (Обратите внимание, что метка и представление изображения объявлены как IBOutlet (Выход построителя интерфейса), а кнопка — как IBAction (Действие построителя интерфейса).)
import UIKit class ViewController: UIViewController < @IBAction func doClassification(_ sender: Any) < >@IBOutlet weak var imageView: UIImageView! @IBOutlet weak var lblOutput: UILabel! override func viewDidLoad() < super.viewDidLoad() // Do any additional setup after loading the view. >>
Файл будет связан с вашим приложением, и теперь вы сможете легко его классифицировать. Теперь вы готовы написать пользовательский интерфейс для классификации изображений!
Теперь, когда все настроено, написать код для выполнения классификации изображений очень просто.
import MLKitVision import MLKitImageLabeling
override func viewDidLoad() < super.viewDidLoad() // Do any additional setup after loading the view. imageView.image = UIImage(named:"flower1.jpg") >
func getLabels(with image: UIImage)
let visionImage = VisionImage(image: image) visionImage.orientation = image.imageOrientation
let options = ImageLabelerOptions() options.confidenceThreshold = 0.4
let labeler = ImageLabeler.imageLabeler(options: options)
labeler.process(visionImage)
Не беспокойтесь, если Xcode жалуется на отсутствие члена processResult . Вы просто еще не реализовали это, и вы сделаете это дальше.
Для удобства, вот полная функция getLabels:
// This is called when the user presses the button func getLabels(with image: UIImage) < // Get the image from the UI Image element and set its orientation let visionImage = VisionImage(image: image) visionImage.orientation = image.imageOrientation // Create Image Labeler options, and set the threshold to 0.4 // so we will ignore all classes with a probability of 0.4 or less let options = ImageLabelerOptions() options.confidenceThreshold = 0.4 // Initialize the labeler with these options let labeler = ImageLabeler.imageLabeler(options: options) // And then process the image, with the callback going to self.processresult labeler.process(visionImage) < labels, error in self.processResult(from: labels, error: error) >>
Итак, теперь вам нужно реализовать функцию processResult . Теперь это очень просто, учитывая, что у нас есть метки и возвращаемый нам объект ошибки. Метки должны быть преобразованы в тип ImageLabel из ML Kit.
Как только это будет сделано, вы можете просто перебрать набор меток, получить описание и значение достоверности и добавить их в labeltexts var Как только вы перебираете их все, вы просто устанавливаете lblOutput.text в это значение.
Вот полная функция:
// This gets called by the labeler's callback func processResult(from labels: [ImageLabel]?, error: Error?) < // String to hold the labels var labeltexts = "" // Check that we have valid labels first guard let labels = labels else< return >// . and if we do we can iterate through the set to get the description and confidence for label in labels < let labelText = label.text + " : " + label.confidence.description + "\n" labeltexts += labelText >// And when we're done we can update the UI with the list of labels lblOutput.text = labeltexts >
Остается только вызывать getLabels когда пользователь нажимает кнопку.
Когда вы создали действие, все было подключено за вас, поэтому вам просто нужно обновить IBAction с именем doClassificaiton , который вы создали ранее, для вызова getLabels .
Вот код, чтобы просто вызвать его с содержимым imageView:
@IBAction func doClassification(_ sender: Any)
Теперь запустите свое приложение и попробуйте. Вы можете увидеть это в действии здесь:
Обратите внимание, что ваш макет может выглядеть по-разному в зависимости от вашего устройства.
Лаборатория кода не исследует различные типы макетов для каждого устройства, что само по себе является довольно сложной концепцией. Если вы не видите пользовательский интерфейс должным образом, вернитесь в редактор раскадровки, и внизу вы увидите раздел « Просмотр как: », где вы можете выбрать конкретное устройство. Выберите тот, который соответствует изображению или устройству, на котором вы тестируете, и отредактируйте пользовательский интерфейс в соответствии с ним.
По мере того, как вы углубляетесь в разработку для iOS, вы узнаете, как использовать ограничения, чтобы обеспечить согласованность вашего пользовательского интерфейса на всех телефонах, но это выходит за рамки данного лабораторного занятия.
Теперь вы реализовали приложение для Android и iOS, которое дает вам базовое компьютерное зрение с универсальной моделью. Вы уже сделали большую часть тяжелой работы.
В следующей лаборатории кода вы создадите пользовательскую модель, которая распознает различные типы цветов, и всего несколькими строками кода вы сможете реализовать пользовательскую модель в этом приложении, чтобы сделать его более полезным!
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons "С указанием авторства 4.0", а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.