Откриване на светофари за самоуправляваща се кола — ръководство стъпка по стъпка как да приложите API за откриване на обекти на Tensorflow

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

Един от най-ефективните инструменти е Tensorflow Object Detection API и използвайте техния предварително обучен модел, заменяйки последния слой за конкретния проблем, който се опитва да разреши и фино настрои модела.

Сега API е адаптиран към Tensorflow 2.x. Въпреки това, средата за изпълнение понякога не позволява да се използва най-новата версия и все още трябва да се използва Tensorflow 1.x. Тази публикация в блога демонстрира как да използвате API в такава ситуация. Ако можете да използвате Tensorflow 2.x за изводи, най-добре го използвайте — вижте друга публикация, обясняваща как.

Тук вземам откриването на светофари за самоуправляваща се кола, където червеният, жълтият или зеленият светофар трябва да бъдат открити с висока честота (~10 кадъра в секунда) дори на малък изчислителен ресурс на автомобила от по-стари библиотеки поради зависимости.

Моля, обърнете внимание, че тази публикация описва само откриването на обект чрез подход на машинно обучение. Действителната самоуправляваща се кола използва Lidar, Rader, GPS и карта и прилага различни филтри за локализиране, откриване на обекти, планиране на траекторията и така нататък, след което прилага задвижващи механизми за ускоряване, забавяне или обръщане на колата, което е извън тази публикация.

Що се отнася до данните за обучение, kitti (http://www.cvlibs.net/datasets/kitti/index.php) предоставя изчерпателен набор от данни за автономна кола.

По-долу използва Google Colab. Ако тренирате в локална среда, моля, вижте README в repo.

Част1: Подготовка на локален компютър

1. Клонирайте проекта repo или създайте нов

Ако сте създали ново репо, направете следните директории

Когато създавате ново репо, копирайте всички скриптове в директорията на скриптове.

2. Изберете кой предварително обучен модел да използвате

Отидете на Tensorflow 1 Detection Model Zoo в github и изтеглете този, който отговаря на целта. Моделите, обучени от coco dataset, работят добре в повечето случаи. Скоростта и точността (mAP) са компромис. Избрах SSD Mobilenet v2 за бърза скорост на извеждане, но човек може да избере по-големи модели с по-добра точност, като Faster RCNN Resnet101, който е около 100 пъти по-голям от размера на модела и 10 пъти по-бавен в моята машина, но идва с голяма точност.

След като моделът е решен, разархивирайте и копирайте pipeline.config. Като алтернатива можете да копирате примерна конфигурация на тръбопровода от repo модела tensorflow.

3. Подгответе данни за обучението

Както винаги се случва с контролираното обучение, трябва да отделите няколко часа, за да етикетирате ръчно входните данни. Запазете изображения за обучение в директория с изображения, където предоставих изображения за откриване на светофари в симулатор с етикети в Pascal VOC в моето репо. Има редица налични инструменти и labelImg е един от най-простите класически за тип кутия. Уверете се, че имате python 3 и просто го инсталирайте от PyPI или вижте ръководство за инсталиране.

Запазете xml файловете в същата директория. Добрата новина е, че няма нужда да подготвяте десетки хиляди етикети, тъй като това е обучение за трансфер и 100 етикета на категория ще дадат добри резултати за фина настройка.

4. Създаване на карта с етикети

Това е само списък с етикети. Имената трябва да съвпадат с анотираните етикети в предишната стъпка. Запазете файла като анотации/label_map.pbtxt

Следващата стъпка от подготовката на набора за обучение е да се разделят изображенията за набор за обучение и набор за тестване, след което да се генерира .TFRecord за всеки xml файл. Това може да се направи локално тук, но включих в стъпката на Colab, така че всяко допълнително етикетиране да не бъде пропуснато в TFRecord.

5. Редактирайте pipeline.config

Някои промени са задължителни, а други са незадължителни, но са по-подходящи за данните за обучение.

Изпратете репото към github — всичко е готово!

Част 2: Google Colab

След това отидете в Google Colab и създайте нов бележник. traffic-light-detection-tf1.ipynb е пример в моето репо.

1. Инсталирайте Tensorflow 1.14 и необходимите библиотеки

2. Настройте променливите

3. Clone Tensorflow model repo

Изтеглете tensorflow model repo в Colab env, компилирайте протоколни буфери, задайте PYTHONPATH и инсталирайте COCO API за оценка.

4. Изтеглете предварително обучени моделите

Изтеглете предварително обучения модел в средата на Colab.

5. Клонирайте проектрепо

Уверете се, че локалните промени са ангажирани в главния клон и предварително са изпратени в github.

6. Обработка на входни изображения (набор от данни за обучение)

  1. Първо, разделете изображенията и етикетите на комплект за обучение и набор за тестване
  2. След това конвертирайте xml файловете в csv
  3. След това преобразувайте csv в TFRecord

7. Настройте Tensorboard

Много е полезно да стартирате tensorboard, за да наблюдавате напредъка на обучението. За достъп до процеса tensorboard, използвайте ngrok tunnel тук.

8. Влак! най-накрая :)

Това отнема известно време, в зависимост от модела и параметрите обаче, от няколко минути до часове или повече. Вземете няколко чая или дори вечеря и душ, телевизия и сън...

В TF1 оценката се изпълнява на контролната точка по време на обучението, както е посочено в pipeline.config. Добре е да проверите напредъка на Tensorboard и да коригирате параметрите в pipeline.config, ако загубата не е намалена, точността/извикването не е подобрена или кривата на обучение не е както се очаква. Целева обща загуба под 2.

Осигурява добро сравнение между истината на земята и откриването и в изображенията, на всяка стъпка на оценка.

9. Експортирайте изхода

Не забравяйте да експортирате и изтеглите обучения модел, който ще се използва за извод.

След като го изтеглите, разархивирайте файла в exported_models/[име на модел] директория.

10. Прогнозирайте! (По избор)

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

Ето някои примерни резултати.

Част 3: Преобразуване на обучения модел в по-стара версия на tensoflow runtime (по избор)

Ако вашето време за изпълнение за изводи има ограничение на версията tensorflow, експортираният модел може да получи грешки като препратки към параметри, които не съществуват в по-старата версия. Това може да се избегне чрез конвертиране на експортирания модел в среда, която съответства на версията по време на изпълнение.

Тук времето ми за изпълнение е tensorflow v1.3. Най-старият наличен API за откриване на обекти е на v1.4, но за щастие изглежда съвместим с v1.3, така че използвайте тази версия.

1. Създайте env и инсталирайте библиотеки

Използвам conda, но вие можете да използвате който и да е инструмент за управление на виртуална среда.

2. Клонирайте tensorflow модел repo, копирайте съвместимата версия

3. Изтеглете protoc и компилирайте протоколни буфери

Съвместимата версия на протокола е v3.4.0, която може да бъде изтеглена от тук. След изтегляне компилирайте буферите на протокола.

4. Преобразуване на модела

Ако стартирате нова конзола, уверете се, че сте задали PYTHONPATH, който също може да бъде запазен, за да се изпълнява автоматично всеки път, когато превключите виртуалната среда - напр. за conda вижте Запазване на променливи на средата.

Тази публикация обяснява как да използвате Tensorflow Object Detection API за обучение и да извършвате изводи върху фино настроения модел от по-старата версия на Tensorflow 1.x. Ако нямате такова ограничение, моля, вижте друга публикация, която обяснява как да използвате най-новия API за откриване на обекти Tensorflow 2.x . Примерен код и изображения са налични в моето repo в github.