- Оригинальный адрес:How to easily Detect Objects with Deep Learning on Raspberry Pi
- Оригинальный автор:Sarthak Jain
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Starrier
- Корректор:luochen1992,jasonxia23
Реальные проблемы — это ограниченность данных и небольшое оборудование, такое как мобильные телефоны и Raspberry Pi, которые не могут запускать сложные модели глубокого обучения. Этот пост демонстрирует, как использовать Raspberry Pi для обнаружения объектов, таких как автомобили на дороге, апельсины в холодильнике, подписи на документах, Tesla в космосе.
Отказ от ответственности: я строю с меньшим объемом данных и без оборудованияnanonets.comчтобы помочь построить машинное обучение.
Если у вас не хватает терпения продолжать чтение, вы можете прокрутить страницу вниз, чтобы просмотреть репозиторий Github.
Обнаружение транспортных средств на дорогах Мумбаи.
Зачем обнаруживать объекты? Зачем использовать Raspberry Pi?
Raspberry Pi — отличное аппаратное обеспечение, покорившее сердца своих современников, которые продали 15 миллионов устройств, и даже хакеры создали его с его помощью.более крутые проекты. Учитывая глубокое обучение иКамера Raspberry PiПопулярность Raspberry Pi, мы думаем, что было бы очень важно иметь возможность обнаруживать любой объект с помощью глубокого обучения на Raspberry Pi.
Теперь вы сможете заметить на своем селфи потобомблера, кого-то, кто входит в клетку Харамбе, где кто-то впускает Шрирачу или курьера Amazon в ваш дом.
Что такое обнаружение объекта?
20 миллионов лет эволюции привели к значительной эволюции человеческого зрения. Человеческий мозг имеет30%нейронов обрабатывают зрение (по сравнению с 8% для осязания и 3% для слуха). У людей есть два основных преимущества перед машинами. Один из них — стереозрение, а другой — почти бесконечные тренировочные данные (5-летний ребенок делает около 2,7 млрд изображений со скоростью 30 кадров в секунду).
Чтобы имитировать уровни производительности на уровне человека, ученые разбили задачу визуального восприятия на четыре отдельные категории.
- Классификация, присвоение метки всему изображению
- Localization, чтобы указать границу для конкретной метки
- обнаружение объекта, который рисует несколько ограничивающих рамок на изображении
- Сегментация изображения, который создает точную часть изображения, где находится объект
Обнаружение объектов достаточно хорошо для различных приложений (хотя результаты сегментации изображения более точны, оно страдает от сложности создания обучающих данных. Для комментатора-человека сегментация изображения занимает больше времени, чем рисование границ в 12 раз больше блоков; это больше анекдотично, но без источника). А после обнаружения объекта его можно сегментировать только по ограничивающей рамке.
Используйте обнаружение объектов:
Обнаружение объектов имеет важное практическое значение и нашло широкое применение в различных отраслях промышленности. Вот соответствующий пример:
Как я могу использовать обнаружение объектов для решения своей проблемы?
Обнаружение объектов может использоваться для ответа на множество вопросов. Вот грубая разбивка:
- существует ли объект на моем изображении? Например, есть ли злоумышленник в моем доме?
- где находится объект, на изображении? Например, когда автомобиль пытается объехать весь мир, важно знать, где находятся объекты.
- сколько объектов, они все на картинке? Обнаружение объектов — один из самых эффективных способов подсчета объектов. Например, сколько коробок на полке на складе.
- какие бывают типы объектовна изображении? Например, какое животное находится в какой части зоопарка?
- каков размер объекта? Особенно легко вычислить размер объекта при использовании фотокамеры. Например, каков размер манго?
- **Как взаимодействуют разные объекты? **Как расстановка на футбольном поле влияет на результат?
- Где находятся объекты, связанные со временем (объекты отслеживания), например.Отслеживайте движущийся объект, например поезд, и вычисляйте его скорость и т. д.
Обнаружение объекта в 20 строках кода
Визуализация алгоритма YOLO.
Существуют различные модели/архитектуры для обнаружения объектов. Компромисс между скоростью, размером и точностью. Мы выбрали один из самых популярных:YOLO(Вы смотрели его только один раз). И покажите, как это работает (если вы проигнорируете комментарии с привидениями), менее чем в 20 строках кода.
Примечание. Это псевдокод и не будет полезным примером. Он имеет частичный черный ящик, близкий к стандарту CNN, следующим образом..
Полный текст можно прочитать здесь:Семья P Eddie.com/Media/files…
Архитектура сверточной нейронной сети в YOLO.
#this is an Image of size 140x140. We will assume it to be black and white (ie only one channel, it would have been 140x140x3 for rgb)
image = readImage()
#We will break the Image into 7 coloumns and 7 rows and process each of the 49 different parts independently
NoOfCells = 7
#we will try and predict if an image is a dog, cat, cow or wolf. Therfore the number of classes is 4
NoOfClasses = 4
threshold = 0.7
#step will be the size of step to take when moving across the image. Since the image has 7 cells step will be 140/7 = 20
step = height(image)/NoOfCells
#stores the class for each of the 49 cells, each cell will have 4 values which correspond to the probability of a cell being 1 of the 4 classes
#prediction_class_array[i,j] is a vector of size 4 which would look like [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow]
prediction_class_array = new_array(size(NoOfCells,NoOfCells,NoOfClasses))
#stores 2 bounding box suggestions for each of the 49 cells, each cell will have 2 bounding boxes, with each bounding box having x, y, w ,h and c predictions. (x,y) are the coordinates of the center of the box, (w,h) are it's height and width and c is it's confidence
predictions_bounding_box_array = new_array(size(NoOfCells,NoOfCells,NoOfCells,NoOfCells))
#it's a blank array in which we will add the final list of predictions
final_predictions = []
#minimum confidence level we require to make a prediction
threshold = 0.7
for (i<0; i<NoOfCells; i=i+1):
for (j<0; j<NoOfCells;j=j+1):
#we will get each "cell" of size 20x20, 140(image height)/7(no of rows)=20 (step) (size of each cell)"
#each cell will be of size (step, step)
cell = image(i:i+step,j:j+step)
#we will first make a prediction on each cell as to what is the probability of it being one of cat, dog, cow, wolf
#prediction_class_array[i,j] is a vector of size 4 which would look like [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow]
#sum(prediction_class_array[i,j]) = 1
#this gives us our preidction as to what each of the different 49 cells are
#class predictor is a neural network that has 9 convolutional layers that make a final prediction
prediction_class_array[i,j] = class_predictor(cell)
#predictions_bounding_box_array is an array of 2 bounding boxes made for each cell
#size(predictions_bounding_box_array[i,j]) is [2,5]
#predictions_bounding_box_array[i,j,1] is bounding box1, predictions_bounding_box_array[i,j,2] is bounding box 2
#predictions_bounding_box_array[i,j,1] has 5 values for the bounding box [x,y,w,h,c]
#the values are x, y (coordinates of the center of the bounding box) which are whithin the bounding box (values ranging between 0-20 in your case)
#the values are h, w (height and width of the bounding box) they extend outside the cell and are in the range of [0-140]
#the value is c a confidence of overlap with an acutal bounding box that should be predicted
predictions_bounding_box_array[i,j] = bounding_box_predictor(cell)
#predictions_bounding_box_array[i,j,0, 4] is the confidence value for the first bounding box prediction
best_bounding_box = [0 if predictions_bounding_box_array[i,j,0, 4] > predictions_bounding_box_array[i,j,1, 4] else 1]
# we will get the class which has the highest probability, for [0.5 #cat, 0.3 #dog, 0.1 #wolf, 0.2 #cow], 0.5 is the highest probability corresponding to cat which is at position 0. So index_of_max_value will return 0
predicted_class = index_of_max_value(prediction_class_array[i,j])
#we will check if the prediction is above a certain threshold (could be something like 0.7)
if predictions_bounding_box_array[i,j,best_bounding_box, 4] * max_value(prediction_class_array[i,j]) > threshold:
#the prediction is an array which has the x,y coordinate of the box, the height and the width
prediction = [predictions_bounding_box_array[i,j,best_bounding_box, 0:4], predicted_class]
final_predictions.append(prediction)
print final_predictions
Объяснение YOLO в
Как мы создаем модели глубокого обучения для обнаружения объектов?
6 основных этапов рабочего процесса глубокого обучения будут разделены на 3 этапа.
- Собирайте тренировочные данные
- Обучите модель
- Прогнозировать новые изображения
Этап 1 —— Сбор данных для обучения
Шаг 1 Соберите изображения (минимум 100 изображений на объект):
В этой задаче требуется несколько сотен изображений для каждого объекта. Попытайтесь собрать данные о данных, на основе которых вы в конечном итоге делаете прогнозы.
Шаг 2. Аннотация (нарисуйте эти изображения вручную):
Нарисуйте ограничивающую рамку на изображении. Вы можете использовать что-то вродеlabelImgтакой инструмент. Вам нужны люди, чтобы аннотировать ваши изображения. Это достаточно интенсивная и трудоемкая задача.
Этап 2 — Обучить модель на машине с графическим процессором
Шаг 3 Найдите предварительно обученные модели для трансферного обучения
ты сможешьmedium.com/nanonets/that…Подробнее об этом читайте в . Вам нужна предварительно обученная модель, чтобы вы могли уменьшить объем данных, необходимых для обучения. Без него вам могут понадобиться сотни тысяч изображений для обучения модели.
Вы можете найти некоторые предварительно обученные модели здесь
Шаг 4, тренируйтесь на GPU (облачные сервисы, такие как AWS/GCP или ваша собственная машина с GPU):
Докер-образ
Процесс обучения модели необязателен, но процесс создания образа докера для облегчения обучения упростить сложно.
Вы можете начать обучение модели, запустив:
sudo nvidia-docker run -p 8000:8000 -v `pwd`:data docker.nanonets.com/pi_training -m train -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -p '{"batch_size":8,"learning_rate":0.003}'
См. эту ссылку для получения подробной информации о том, как использовать
В образе докера есть скрипт run.sh, который можно вызвать со следующими параметрами
run.sh [-m mode] [-a architecture] [-h help] [-e experiment_id] [-c checkpoint] [-p hyperparameters]
-h display this help and exit
-m mode: should be either `train` or `export`
-p key value pairs of hyperparameters as json string
-e experiment id. Used as path inside data folder to run current experiment
-c applicable when mode is export, used to specify checkpoint to use for export
Вы можете найти более подробную информацию ниже:
Чтобы обучить модель, нужно выбрать правильные гиперпараметры.
найти правильные параметры
Искусство «глубокого обучения» немного иронично, но оно пытается выяснить, какие параметры являются лучшими для получения максимальной точности для вашей модели. С этим связана некоторая степень черной магии и немного теории.Это хороший ресурс для поиска правильных параметров.
Проквантуйте модель (уменьшите ее, чтобы она поместилась на маленьком устройстве, таком как Raspberry Pi или телефон)
Небольшие устройства, такие как сотовые телефоны и Raspberry Pi, имеют очень мало памяти и вычислительной мощности.
Обучение нейронной сети выполняется путем применения множества крошечных увеличений весов, и эти крошечные приращения часто требуют для работы точности с плавающей запятой (хотя здесь также предпринимаются исследовательские усилия по использованию квантованных представлений).
Использование предварительно обученной модели и выполнение логического вывода — это очень разные вещи. Одно из удивительных свойств глубоких нейронных сетей заключается в том, что они, как правило, очень хорошо справляются с высоким уровнем шума в своих входных данных.
Зачем измерять?
Например, модели нейронных сетей могут занимать много места на диске, а AlexNet поначалу имел формат с плавающей запятой более 200 МБ. Поскольку в одной модели часто присутствуют миллионы нейронных связей, почти все размеры определяются весами нейронных связей.
Узлы и веса нейронной сети изначально хранятся в виде 32-битных чисел с плавающей запятой, простейшая мотивация квантования — уменьшить размер файла, сохраняя минимальное и максимальное значения каждого слоя, а затем сжимая каждое значение с плавающей запятой. в 8-битное целое, размер файла уменьшается на 75%.
Код квантования:
curl -L "https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz" |
tar -C tensorflow/examples/label_image/data -xz
bazel build tensorflow/tools/graph_transforms:transform_graph
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=tensorflow/examples/label_image/data/inception_v3_2016_08_28_frozen.pb \
--out_graph=/tmp/quantized_graph.pb \
--inputs=input \
--outputs=InceptionV3/Predictions/Reshape_1 \
--transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,299,299,3")
remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true)
fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes
strip_unused_nodes sort_by_execution_order
Этап 3: Прогнозирование новых изображений с помощью Raspberry Pi
Шаг 5, сделайте новый снимок с помощью камеры
Вам нужен Raspberry Pi, чтобы жить и работать. затем сделайте новый снимок
Инструкции по установке смотрите здесьСсылка на сайт
import picamera, os
from PIL import Image, ImageDraw
camera = picamera.PiCamera()
camera.capture('image1.jpg')
os.system("xdg-open image1.jpg")
Код для захвата новых изображений.
Шаг 6, предскажите новые изображения
Скачать модель
Закончив обучение модели, вы можете загрузить ее на свой Raspberry Pi. Чтобы экспортировать модель, выполните:
sudo nvidia-docker run -v `pwd`:data docker.nanonets.com/pi_training -m export -a ssd_mobilenet_v1_coco -e ssd_mobilenet_v1_coco_0 -c /data/0/model.ckpt-8998
Затем загрузите модель на Raspberry Pi.
Загрузите Tensorflow на Raspberry Pi
В зависимости от устройства может потребоваться немного изменить установку
sudo apt-get install libblas-dev liblapack-dev python-dev libatlas-base-dev gfortran python-setuptools libjpeg-dev
sudo pip install Pillow
sudo pip install http://ci.tensorflow.org/view/Nightly/job/nightly-pi-zero/lastSuccessfulBuild/artifact/output-artifacts/tensorflow-1.4.0-cp27-none-any.whl
git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git)
sudo apt-get install -y protobuf-compiler
cd models/research/protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:/home/pi/models/research:/home/pi/models/research/slim
Запустите модель, чтобы предсказать новые изображения
python ObjectDetectionPredict.py --model data/0/quantized_graph.pb --labels data/label_map.pbtxt --images /data/image1.jpg /data/image2.jpg
Тесты производительности Raspberry Pi
Raspberry Pi ограничен как в памяти, так и в вычислениях (версия Tensorflow, совместимая с графическим процессором Raspberry Pi, по-прежнему недоступна). Поэтому для бенчмаркинга важно, сколько времени требуется каждой модели для прогнозирования новых изображений.
Запуск тестов для обнаружения различных объектов в Raspberry Pi.
Наша цель в NanoNets — упростить работу по глубокому обучению. Обнаружение объектов является основной областью нашего внимания, и мы разработали рабочий процесс для решения многих проблем, связанных с внедрением моделей глубокого обучения.
Как NanoNets упрощают процесс:
1. Аннотации не требуются
Мы убрали необходимость аннотировать изображения, у нас есть профессиональные аннотаторы дляАннотируйте свои изображения.
2. Модель автоматической оптимизации и выбор гиперпараметров
мы для васАвтоматически обучайте лучшие модели. Для этого мы запускаем набор моделей с разными параметрами, чтобы выбрать лучшую модель для ваших данных.
3. Нет необходимости в дорогом оборудовании и графическом процессоре
NanoNets Работает полностью в облакеИ без всякого оборудования. Это упрощает использование.
4. Подходит для мобильных устройств, таких как Raspberry Pi.
Поскольку такие устройства, как малина и телефоны, не предназначены для выполнения сложных вычислительных задач, вы можете передать рабочую нагрузку нашему облаку, которое сделает все вычисления за вас.
Вот простой фрагмент для прогнозирования изображения с помощью API NanoNets.
import picamera, json, requests, os, random
from time import sleep
from PIL import Image, ImageDraw
#capture an image
camera = picamera.PiCamera()
camera.capture('image1.jpg')
print('caputred image')
#make a prediction on the image
url = 'https://app.nanonets.com/api/v2/ObjectDetection/LabelFile/'
data = {'file': open('image1.jpg', 'rb'), \
'modelId': ('', 'YOUR_MODEL_ID')}
response = requests.post(url, auth=requests.auth.HTTPBasicAuth('YOUR_API_KEY', ''), files=data)
print(response.text)
#draw boxes on the image
response = json.loads(response.text)
im = Image.open("image1.jpg")
draw = ImageDraw.Draw(im, mode="RGBA")
prediction = response["result"][0]["prediction"]
for i in prediction:
draw.rectangle((i["xmin"],i["ymin"], i["xmax"],i["ymax"]), fill=(random.randint(1, 255),random.randint(1, 255),random.randint(1, 255),127))
im.save("image2.jpg")
os.system("xdg-open image2.jpg")
Код для прогнозирования новых изображений с использованием NanoNets
Создайте свой собственный NanoNet
Можно попробовать построить собственную модель из следующих пунктов:
1. С помощью графического интерфейса (изображения также могут быть автоматически аннотированы):Специальности nano nets.com/object…
2. Используя наш API:GitHub.com/nanonets/OB…
Шаг 1: Клонируйте репозиторий
git clone [https://github.com/NanoNets/object-detection-sample-python.git](https://github.com/NanoNets/object-detection-sample-python.git)
cd object-detection-sample-python
sudo pip install requests
Шаг 2: Получите ключ для вашего бесплатного API
отapp.nano nets.com/user/API_can…Получите бесплатный ключ API в
Шаг 3. Установите ключ API в качестве переменной среды.
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
Шаг 4: Создайте новую модель
python ./code/create-model.py
Примечание. При этом будет сгенерирован идентификатор модели, необходимый для следующего шага.
Шаг 5. Добавьте идентификатор модели в качестве переменной среды.
export NANONETS_MODEL_ID=YOUR_MODEL_ID
Шаг 6. Загрузите данные тренировки
Соберите изображения объектов, которые вы хотите обнаружить. Вы можете аннотировать его с помощью нашего веб-интерфейса (https://app.nanonets.com/ObjectAnnotation/?appId=YOUR_MODEL_ID) или использовать что-то вродеlabelImgТакой инструмент с открытым исходным кодом. Как только набор данных будет готов в папке,images
(файл изображения) иannotations
(аннотация к файлу изображения), вы можете начать загрузку набора данных.
python ./code/upload-training.py
Шаг 7: Обучите модель
После загрузки изображений начните обучение модели.
python ./code/train-model.py
Шаг 8: Получите состояние модели
Обучение модели занимает 2 часа. Вы получите электронное письмо, как только модель будет обучена. Также проверьте состояние модели
watch -n 100 python ./code/model-state.py
Шаг 9: Прогноз
Как только модель обучена, вы можете использовать ее для прогнозирования
python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg
Код (репозиторий GitHub)
Репозиторий Github для обучения модели:
Репозиторий GitHub для создания прогнозов для Raspberry Pi (т.е. обнаружения новых объектов):
Аннотированный набор данных:
- Транспортные средства, видимые на индийских дорогах, набор данных о транспортных средствах, извлеченных из изображений индийских дорог.
- Набор данных Коко
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.