Как да изградите система за разпознаване на изображения, използвайки Keras и Tensorflow за 1000 ежедневни категории обекти (ImageNet ILSVRC)

Разпознаване на изображението с топ 5 прогнозирани етикети и техните вероятности (червеният ред обозначава правилния отговор) http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf
Отидете направо към кода на Github.

В тази поредица от публикации ще ви покажа как да изградите ваше собствено разпознаване или откриване / ограничаване на уеб услуга за прогнозиране само в няколко реда код, използвайки Keras, TensorFlow и библиотеката с искания на python. Поредицата за публикации е следната:

  1. Изградете система за разпознаване на изображения за 1000 ежедневни категории обекти (ImageNet ILSVRC) с помощта на Keras и TensorFlow (тази публикация)
  2. Изградете система за разпознаване на изображения за всякакви персонализирани категории обекти, като използвате трансферно обучение и фина настройка в Keras и TensorFlow
  3. Изградете система за откриване на обекти в реално време за стотици ежедневни категории обекти (PASCAL VOC, COCO)
  4. Създайте уеб услуга за всяка система за разпознаване на изображения или за откриване на обекти

Какво искаш да разпознаеш?

Има 3 популярни академични състезания в областта на компютърното зрение, които бяха изключително впечатляващи: ImageNet ILSVRC, PASCAL VOC и COCO. Тези състезания са задвижвали изобретения в изследванията на компютърното зрение и много от тях са достъпни за безплатна и неограничена употреба. За тази публикация ще се съсредоточа върху разпознаването на изображения с помощта на ImageNet ILSCVRC.

Разгледайте списъка с обекти на ILSVRC. Ако конкретните обекти, които се интересувате да разпознаете, са един от 1001 обекта в този списък, имате късмет! Ето откъс от списъка на категориите обекти:

Ами ако обектът на интерес не е в този списък или е значително различна настройка като анализ на медицински изображения? Ще обхвана изключително ценен подход, наречен трансферно обучение и фина настройка във втория пост.

Разпознаване на изображения

Какво е разпознаване на изображение (или обект)? Той отговаря на въпроса: „какви обекти са изобразени на това изображение?“ Това може да бъде полезно, ако искате да маркирате изображения въз основа на съдържание, да идентифицирате каква храна е в чинията ви, да класифицирате изображения, съдържащи рак или не-рак, и много повече приложения.

Keras и TensorFlow

Keras е библиотека от невронни мрежи на високо ниво, която служи като лесен за използване абстракционен слой на върха на числовата изчислителна библиотека TensorFlow. Той дори осигурява достъп чрез своя модул keras.applications до модели с конволюционни мрежи, спечелени от конкуренцията на ILSVRC като ResNet50 (разработен от Microsoft Research) и InceptionV3 (разработен от Google Research) за безплатно и неограничено използване. За да инсталирате, следвайте инструкциите на:

  • Инсталация на Keras: https://keras.io/#installation
  • Инсталация на TensorFlow: https://www.tensorflow.org/install/

изпълнение

За да преминете направо към пълната програма, разгледайте github.

Нашата крайна цел е да напишем малка програма на python с опции за аргументи или 1. път към локален файл или 2. URL адрес към изображение. Ето примера на използването на снимка на африкански слон.

1. python classify.py - изображение African_Bush_Elephant.jpg
2. python classify.py --image_url http://i.imgur.com/wpxMwsR.jpg
https://upload.wikimedia.org/wikipedia/commons/3/37/African_Bush_Elephant.jpg

Изходът ще изглежда така:

Топ 3 прогнозирани категории и техните вероятности

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

За да започнем, нека да заредим модулите keras.preprocessing и keras.applications.resnet50 (хартия resnet50: дълбоко остатъчно обучение за разпознаване на изображения) и да заредим ResNet50 модела с помощта на тежести, които са тренирани на състезанието ImageNet ILSVRC:

импортиране numpy като np
от изображението на keras.preprocessing import
от keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
model = ResNet50 (тегла = 'imagenet')

Тогава можем да определим функция за прогнозиране:

дефиниране на прогноза (модел, img, target_size, top_n = 3):
  "" "Изпълнете прогнозиране на модел върху изображението
  аргументи:
    модел: керас модел
    img: изображение в формат PIL
    target_size: (ширина, височина) кортеж
    top_n: # от най-добрите прогнози за връщане
  Се завръща:
    списък на прогнозираните етикети и техните вероятности
  "" "
  ако img.size! = target_size:
    img = img.resize (target_size)
  x = image.img_to_array (img)
  x = np.expand_dims (x, ос = 0)
  x = preprocess_input (x)
  preds = model.predict (x)
  върнете decode_predictions (преди, top = top_n) [0]

Обърнете внимание, че за да използвате архитектурата на ResNet50, target_size трябва да е равен (224, 224). Много архитектури на CNN имат фиксиран размер на входа и ResNet50 е една такава архитектура, където изобретателите са използвали фиксиран размер на вход (224, 224).

image.img_to_array: преобразува изображение в формат PIL в масивен масив

np.expand_dims: преобразува нашето (3, 224, 224) изображение в размер (1, 3, 224, 2 24). Причината за това е, че функцията model.predict изисква входен 4-мерен масив, където 4-тият размер съответства на размера на партидата. Това означава, че ако искахме, бихме могли да класифицираме няколко изображения наведнъж.

preprocess_input: нула центрира нашите данни за изображения, използвайки средните стойности на канала от обучителния набор от данни. Това е изключително важна стъпка, която, ако бъде прескочена, ще доведе до неточност на всички прогнозирани вероятности. Това средно центриране е това, което се нарича нормализиране на данни, основна концепция в машинното обучение.

model.predict: изпълнява извода на нашата група данни и връща прогнози

decode_predictions: взема кодираните етикети, свързани с model.predict и връща етикети, разпознаваеми от човека от ILNRRC на ImageNet.

Модулът keras.applications предлага 4 архитектури извън рафта: ResNet50, InceptionV3, VGG16, VGG19, XCeption. Ние избрахме произволно ResNet50, но вие сте свободни да го разменяте с някоя от другите архитектури, които не са на разположение. Поръчка https://keras.io/applications/ за допълнителна информация и справки.

Построяване

Можем да използваме matplotlib за отпечатване на изхода в хоризонтална лента така:

def plot_preds (изображение, преди):
  "" "Показва изображение и прогнозираните вероятности от най-високо ниво n
     в графика
  аргументи:
    изображение: PIL изображение
    preds: списък на прогнозираните етикети и техните вероятности
  "" "
  #изображение
  plt.imshow (изображение)
  plt.axis ( "изключено")
  
  #bar графика
  plt.figure ()
  order = списък (обърнат (диапазон (len (preds))))
  bar_preds = [pr [2] за pr в преди]
  labels = (pr [1] за pr в преди)
  plt.barh (ред, bar_preds, алфа = 0,5)
  plt.yticks (поръчка, етикети)
  plt.xlabel ( "Вероятност)
  plt.xlim (0, 1.01)
  plt.tight_layout ()
  plt.show ()

основен

За да използвате този команден ред:

1. python classify.py - изображение African_Bush_Elephant.jpg
2. python classify.py --image_url http://i.imgur.com/wpxMwsR.jpg

Ще дефинираме основна функция, както следва:

ако __name __ == "__ main__":
  a = argparse.ArgumentParser ()
  a.add_argument ("- изображение", help = "път към изображението")
  a.add_argument ("- image_url", help = "url to image")
  args = a.parse_args ()
ако args.image е None, а args.image_url е None:
    a.print_help ()
    sys.exit (1)
ако args.image не е None:
    img = Image.open (args.image)
    plot_preds (предвиди (модел, img, target_size))
ако args.image_url не е None:
    response = questions.get (args.image_url)
    img = Image.open (BytesIO (response.content))
    plot_preds (предвиди (модел, img, target_size))

Опцията image_url използва библиотеката за искания на python, за да изтегли лесно изображение от всеки URL адрес!

Готови сме!

След като сложите всички по-горе код заедно, имате началото на система за разпознаване на изображения! Вижте цялата програма и примерни изображения тук на Github.

Следващата публикация в нашата поредица ще обхване ситуацията, в която обектът ви на интерес не е от категориите ImageNet ILSVRC:

  1. Изградете система за разпознаване на изображения за 1000 ежедневни категории обекти (ImageNet ILSVRC) с помощта на Keras и TensorFlow (тази публикация)
  2. Изградете система за разпознаване на изображения за всякакви персонализирани категории обекти, като използвате трансферно обучение и фина настройка в Keras и TensorFlow
  3. Изградете система за откриване на обекти в реално време за стотици ежедневни категории обекти (PASCAL VOC, COCO)
  4. Създайте уеб услуга за всяка система за разпознаване на изображения или за откриване на обекти

Допълнителни примери

Нека опитаме още няколко примера!

  1. python classify.py --image_url http://i.imgur.com/cg37Ojo.jpg
Изображение и топ 3 прогнозирани етикети, заедно с техните вероятности

2. python classify.py --image_url http://i.imgur.com/4FIOwAN.jpg

Изображение и топ 3 прогнозирани етикети, заедно с техните вероятности

3. python classify.py --image_url http://goo.gl/t3Gh5P

Изображение и топ 3 прогнозирани етикети, заедно с техните вероятности

Ако сте харесали статията, щракнете върху ❤ и се регистрирайте:

Ако имате някакви въпроси, свържете се с мен на greg.ht.chu@gmail.comи ме изпратете на LinkedIn!