предисловие
Публичная бета-версия HiLens Studio также вышла некоторое время назад, и в ней есть много ярких моментов.Я также подал заявку на публичную бета-версию несколько дней назад.Пройдя тест, я быстро попробовал ее.Должен сказать, что это действительно хорошо, особенноОн поддерживает редактирование кода в облаке, отладку и даже запуск программы напрямую.Даже если вашего HiLens нет рядом, вы можете получить результат работы программы.Это не только так же просто, как облачная IDE, но также поддерживается облачным оборудованием Ресурсы., что значительно снижает нагрузку на разработчиков.Разработчикам нужен только компьютер, который можно подключить к интернету, который можно быстро проверить.После прохождения проверки их можно напрямую установить на собственный HiLens и применить, что действительно здорово .
Я попытался развить созданную ранее демонстрацию с помощью HiLens Stuido, она действительно хороша, ее очень легко выполнить.Стоит отметить, что HiLens Studio поддерживает преобразование моделей., больше не нужно преобразовывать модель с помощью функции преобразования и сжатия модели ModelArts, это можно сделать непосредственно в HiLens Studio и использовать непосредственно в проекте, что избавляет от проблем с передачей модели.Можно сказать, что эта HiLens Studio является шедевром, после получения прототипа модели (модель .pb TensorFlow или модель Caffe) последующее преобразование модели, написание кода, отладка и окончательная установка и развертывание могут быть выполнены через HiLens Studio, особенно поддерживается онлайн-отладка Его можно отлаживать без HiLens, что невообразимо для предыдущих разработок встраиваемых или периферийных вычислений, и все это благодаря мощному оборудованию и технической поддержке Huawei Cloud.
Не сплетничайте, на этот раз яЗавершено обнаружение пешеходов на основе YOLOv3_Resnet18 через HiLens Studio., здесь для простоты обнаруживаются только пешеходы. Если вы хотите обнаружить больше категорий целей, вы можете использовать больше категорий наборов данных для обучения. Соответственно, обратитесь к utils.py, представленному в этой статье, чтобы внести простые изменения в код. Код All будет дан, и необходимые комментарии будут добавлены, иПолный навык был выпущен на рынке ИИ ModelArts, каждый может его испытать., если у вас есть какие-либо вопросы, вы можете ответить ниже, кстати,Навык протестирован на последней версии прошивки.В консоли управления облаком отображается как версия 1.0.9.Под другими версиями не тестировался.Обратите внимание на версию. Ссылки на навыки на рынке ИИ:console.huawei cloud.com/model arts/?…
текст
Важное условие: вы подали заявку на общедоступную бета-версию HiLens Studio и прошли ее. При этом на счету HUAWEI CLOUD есть определенный баланс или ваучер, а обучение модели и OBS требуют определенной суммы денег, которая относительно невелика.
Общий процессдаСоздайте набор данных (общедоступный набор данных) ----> обучение модели ----> полное преобразование модели в HiLens Studio ----> редактирование кода ----> онлайн-отладка ----> установка и развертывание. Давайте представим один за другим
1. Создайте набор данных
Набор данных, используемый здесь, относительно большой, основанный на категории «Человек» в наборе данных VOC 2007, собранных из Интернета и организованных по различным общедоступным наборам данных, Загрузка из корзины OBS требует много денег, а делиться не очень удобно. . Впрочем, это не беда, вы можете использовать официально предоставленный набор данных,Нет необходимости загружать в ведро OBS, просто скопируйте его прямо из официального ведра, но недостаток в том, что в наборе данных есть два типа пешеходов и транспортных средств, и меньше пешеходов, в основном транспортных средств, что не подходит для, общее распределение данных выглядит следующим образом:
но тыВы можете рассмотреть возможность перехода на обнаружение транспортных средств или просто прямое обнаружение людей и транспортных средств (вам нужно просто изменить код самостоятельно), вы можете выбрать сами, о том, как получить набор данных, как создать набор данных и опубликовать набор данных, есть много связанных вводных, и я не буду повторять их здесь.Вы можете обратиться к методу в текстовой части этого блога, который знакомит с процессом.Не совсем. Huawei cloud.com/blogs/17518…
2. Модельное обучение
Для иллюстрации здесь используется YOLOv3_Resnet18, обученный на Ascend 910 в ModelArts. Ссылка:console.huawei cloud.com/model arts/?…, В то же время на рынке ИИ есть YOLOv3_Resnet18, основанный на обучении GPU, и YOLOv3_Resnet18 в предустановленном алгоритме ModelArts.Эти два также должны быть возможны.Пока модель .pb наконец получена и преобразование модели можно выполнить в HiLens Studio, это не должно быть проблемой Две ссылки на алгоритм:console.huawei cloud.com/model arts/?…иsupport.huaweicloud.com/engineers-no…
Обратите внимание, что на алгоритм в маркете ИИ нужно сначала подписаться (это бесплатно), а тренировку можно создать после синхронизации, аналогично тому, как вы купили алгоритм и синхронизировали алгоритм со своей учетной записью. введение можно посмотреть в третьей части основной части блога Обучение модели, но в блоге речь идет о YOLOv3_Darknet53, а не YOLOv3_Resnet18 здесь, но это не имеет никакого эффекта, просто название другое, операция аналогична, ссылка :Не совсем. Huawei cloud.com/blogs/17518…
Наконец,Напоминаем, что независимо от того, какой алгоритм вы используете, вы должны использовать HiLens Studio для преобразования модели, не используйте для этого преобразование и сжатие модели в ModelArts., поскольку я использую последнюю версию прошивки 1.0.9, и я в настоящее время пытаюсь использовать только модель преобразования HiLens Studio.
3. Преобразование модели
Кстати, открытие HiLens Studio займет некоторое время, наберитесь терпения.
здесь вы можетеОчень удобно импортировать результаты обучения модели в корзину OBS непосредственно в HiLens Studio, чтобы завершить преобразование модели., это действительно совершенная облачная операция, которая доводит облачные сервисы до крайности. Конечно, вы также можете загружать в HiLens Studio со своего локального компьютера. Давайте посмотрим, как импортировать. Это очень просто. Выберите «Импорт файлов из OBS», а затем найдите путь к вашему собственному хранилищу моделей, а затем к OBS. Обратите внимание, что за один раз можно импортировать только один файл, поэтому требуются две операции, одна — для импорта .pb Модель, однажды импортированная в преобразованный файл конфигурации, пока не может быть импортирована в папку.
Затем выберите файл и импортируйте его:
Еще раз, файл конфигурации selection.cfg:
Отлично, у вас уже получилось больше половины, мы видим импортированные файлы в левом каталоге, по умолчанию импорт в корневой каталог:
Преобразование модели выполняется ниже.При возникновении каких-либо проблем рекомендуется обратиться к документации.Если нет, то можно задать вопросы на форуме.
Ссылка на документацию:support.Huawei cloud.com/user manual-…
Ссылка на форум:Не совсем. Huawei cloud.com/forum/forum…
Основные операции по конвертации подробно описаны в документе.Видно, что персонал по-прежнему очень внимателен:
Просто откройте терминал в строке меню выше.Пользователь, использующий систему Linux или знакомый с NoteBook of ModelArts, должен быть с ней знаком. Затем конвертируйте модель с помощью командной строки.
Введите следующую команду в терминале в начале интерфейса:
/opt/ddk/bin/aarch64-linux-gcc7.3.0/omg --model=./yolo3_resnet18.pb --input_shape='images:1,352,640,3' --framework=3 --output=./yolo3_resnet18
--insert_op_conf=./insert_op_conf.cfg
Если вы хотите узнать больше о настройках преобразования модели, вы можете обратиться к:
console.huawei cloud.com/model arts/?…
Woohoo. Huawei cloud.com/ascend/doc/…
так какШаблон по умолчанию вызывает модель из папки модели левого каталога.(Это написано в части кода пути к модели, а face_detection_demo.om в папке — это модель, которая поставляется с шаблоном распознавания лиц. Что касается проблемы с шаблоном, я расскажу о ней позже, вы можете удалить ее самостоятельно) , поэтому нам нужно скопировать и вставить сгенерированную модель .om в эту папку, это очень просто, просто выберите модель .om напрямую и используйте сочетания клавиш на клавиатуре, как на вашем собственном компьютере.Ctrl + C(указывает на копирование выбранного файла), затем выберите папку модели и используйтеCtrl + V (Указывая на пасту) Вот и все, я должен сказать, что этот дизайн довольно удобен для пользователя, а стоимость обучения пользователя очень низкая.
В итоге получаем вот такой интерфейс, вот он:
Если вы не хотите тренироваться самостоятельно, просто протестируйте ее, вот преобразованная модель .om. После загрузки загрузите ее в папку с моделью HiLens Studio, чтобы использовать ее:
Ссылка: https://pan.baidu.com/s/1GT1BIvkQIDNCMP-YoVAssA
Код извлечения: c4d3
4. Отредактируйте код
Поскольку вы используете HiLens Studio, подтвердите, что вы подали заявку на общедоступную бета-версию и прошли ее. Соответствующая часть кода редактирования относительно проста. Как и в большинстве IDE, первое, что нужно сделать, это создать проект. Здесь представлено много шаблонов, но вы пока не можете создать пустой шаблон, поэтому просто выберите шаблон самостоятельно. Я выбрал шаблон распознавания лиц. После выбора , щелкните ОК. После простого имени проекта и так далее вы можете обратиться к рисунку ниже.
После создания вы можете войти в IDE-подобный интерфейс HiLens Studio, который немного похож на PyCharm, что очень удобно. Вы можете переключать темы и поддерживать стиль темной ночи. Этот переключатель остается вам найти, но это все в Английский интерфейс. Войдя сюда, вы можете в целом увидеть эти вещи, в основном представляя части, которые будут здесь использоваться:
Ну, здесь нам сначала нужно изменить основную программу main.py, Для внедрения и модульности кода части препроцессинга и разбора результата вывода написаны отдельно в виде файла utils.py, что удобно для понимания структуры работы программы. .Здесь нечего вводить.Да сразу к коду,если будут вопросы,можете задавать вопросы в комментариях ниже.
основной код main.py
# -*- coding: utf-8 -*-
# !/usr/bin/python3
# SkillFramework 1.0.0 YOLOv3_Resnet18_Person
import cv2
import numpy as np
import os
import hilens
# 这个postprocess没用哈
from postprocess import im_detect_nms
import utils
# 网络输入尺寸
input_height = 352
input_width = 640
def main(work_path):
hilens.init("YOLOv3Resnet18Person") # 参数要与创建技能时填写的检验值保持一致!
# 模型路径
model_path = os.path.join(work_path, 'model/yolo3_resnet18.om')
model = hilens.Model(model_path)
# hilens studio中VideoCapture如果不填写参数,则默认读取test/camera0.mp4文件,
# 在hilens kit中不填写参数则读取本地摄像头
camera = hilens.VideoCapture()
display_hdmi = hilens.Display(hilens.HDMI) # 图像通过hdmi输出到屏幕
while True:
try:
# 1. 读取摄像头输入(yuv nv21)
input_nv21 = camera.read()
# 2. 转为RGB格式
input_rgb = cv2.cvtColor(input_nv21, cv2.COLOR_YUV2RGB_NV21)
# src_image_height = input_bgr.shape[0]
# src_image_width = input_bgr.shape[1]
img_preprocess, img_w, img_h = utils.preprocess(input_rgb) # 缩放为模型输入尺寸
# 3. 模型推理
output = model.infer([img_preprocess.flatten()])
# 4. 结果输出
bboxes = utils.get_result(output, img_w, img_h) # 获取检测结果
output_rgb = utils.draw_boxes(input_rgb, bboxes) # 在图像上画框
# 5. 输出图像,必须是yuv nv21形式
output_nv21 = hilens.cvt_color(output_rgb, hilens.RGB2YUV_NV21)
display_hdmi.show(output_nv21)
except Exception:
break
if __name__ == "__main__":
main(os.getcwd())
Здесь нам также нужно создать упомянутый выше файл utils.py, что очень просто.
После создания код utils.py выглядит следующим образом:Если вы хотите обнаружить больше категорий, например, одновременное обнаружение любого автомобиля, вы можете обратиться к разделу комментариев, который я добавил в конце кода ниже.:
# -*- coding: utf-8 -*-
# !/usr/bin/python3
# utils for mask detection
import cv2
import math
import numpy as np
# 检测模型输入尺寸
net_h = 352
net_w = 640
# 检测模型的类别
class_names = ["person"]
class_num = len(class_names)
# 检测模型的anchors,用于解码出检测框
stride_list = [8, 16, 32]
anchors_1 = np.array([[10,13], [16,30], [33,23]]) / stride_list[0]
anchors_2 = np.array([[30,61], [62,45], [59,119]]) / stride_list[1]
anchors_3 = np.array([[116,90], [156,198], [163,326]]) / stride_list[2]
anchor_list = [anchors_1, anchors_2, anchors_3]
# 检测框的输出阈值、NMS筛选阈值和人形/人脸区域匹配阈值
conf_threshold = 0.3
iou_threshold = 0.4
cover_threshold = 0.8
# 图片预处理:缩放到模型输入尺寸
def preprocess(img_data):
h, w, c = img_data.shape
new_image = cv2.resize(img_data, (net_w, net_h))
return new_image, w, h
def overlap(x1, x2, x3, x4):
left = max(x1, x3)
right = min(x2, x4)
return right - left
# 计算两个矩形框的IOU
def cal_iou(box1, box2):
w = overlap(box1[0], box1[2], box2[0], box2[2])
h = overlap(box1[1], box1[3], box2[1], box2[3])
if w <= 0 or h <= 0:
return 0
inter_area = w * h
union_area = (box1[2] - box1[0]) * (box1[3] - box1[1]) + (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter_area
return inter_area * 1.0 / union_area
# 计算两个矩形框的IOU与box2区域的比值
def cover_ratio(box1, box2):
w = overlap(box1[0], box1[2], box2[0], box2[2])
h = overlap(box1[1], box1[3], box2[1], box2[3])
if w <= 0 or h <= 0:
return 0
inter_area = w * h
small_area = (box2[2] - box2[0]) * (box2[3] - box2[1])
return inter_area * 1.0 / small_area
# 使用NMS筛选检测框
def apply_nms(all_boxes, thres):
res = []
for cls in range(class_num):
cls_bboxes = all_boxes[cls]
sorted_boxes = sorted(cls_bboxes, key=lambda d: d[5])[::-1]
p = dict()
for i in range(len(sorted_boxes)):
if i in p:
continue
truth = sorted_boxes[i]
for j in range(i+1, len(sorted_boxes)):
if j in p:
continue
box = sorted_boxes[j]
iou = cal_iou(box, truth)
if iou >= thres:
p[j] = 1
for i in range(len(sorted_boxes)):
if i not in p:
res.append(sorted_boxes[i])
return res
# 从模型输出的特征矩阵中解码出检测框的位置、类别、置信度等信息
def decode_bbox(conv_output, anchors, img_w, img_h):
def _sigmoid(x):
s = 1 / (1 + np.exp(-x))
return s
_, h, w = conv_output.shape
pred = conv_output.transpose((1,2,0)).reshape((h * w, 3, 5+class_num))
pred[..., 4:] = _sigmoid(pred[..., 4:])
pred[..., 0] = (_sigmoid(pred[..., 0]) + np.tile(range(w), (3, h)).transpose((1,0))) / w
pred[..., 1] = (_sigmoid(pred[..., 1]) + np.tile(np.repeat(range(h), w), (3, 1)).transpose((1,0))) / h
pred[..., 2] = np.exp(pred[..., 2]) * anchors[:, 0:1].transpose((1,0)) / w
pred[..., 3] = np.exp(pred[..., 3]) * anchors[:, 1:2].transpose((1,0)) / h
bbox = np.zeros((h * w, 3, 4))
bbox[..., 0] = np.maximum((pred[..., 0] - pred[..., 2] / 2.0) * img_w, 0) # x_min
bbox[..., 1] = np.maximum((pred[..., 1] - pred[..., 3] / 2.0) * img_h, 0) # y_min
bbox[..., 2] = np.minimum((pred[..., 0] + pred[..., 2] / 2.0) * img_w, img_w) # x_max
bbox[..., 3] = np.minimum((pred[..., 1] + pred[..., 3] / 2.0) * img_h, img_h) # y_max
pred[..., :4] = bbox
pred = pred.reshape((-1, 5+class_num))
pred[:, 4] = pred[:, 4] * pred[:, 5:].max(1) # 类别
pred = pred[pred[:, 4] >= conf_threshold]
pred[:, 5] = np.argmax(pred[:, 5:], axis=-1) # 置信度
all_boxes = [[] for ix in range(class_num)]
for ix in range(pred.shape[0]):
box = [int(pred[ix, iy]) for iy in range(4)]
box.append(int(pred[ix, 5]))
box.append(pred[ix, 4])
all_boxes[box[4]-1].append(box)
return all_boxes
# 从模型输出中得到检测框
def get_result(model_outputs, img_w, img_h):
num_channel = 3 * (class_num + 5)
all_boxes = [[] for ix in range(class_num)]
for ix in range(3):
pred = model_outputs[2-ix].reshape((num_channel, net_h // stride_list[ix], net_w // stride_list[ix]))
anchors = anchor_list[ix]
boxes = decode_bbox(pred, anchors, img_w, img_h)
all_boxes = [all_boxes[iy] + boxes[iy] for iy in range(class_num)]
res = apply_nms(all_boxes, iou_threshold)
return res
# 在图中画出检测框,输出类别信息,注意这里对person类别绘制矩形框
def draw_boxes(img_data, bboxes):
thickness = 2
font_scale = 1
text_font = cv2.FONT_HERSHEY_DUPLEX
for bbox in bboxes:
label = int(bbox[4])
x_min = int(bbox[0])
y_min = int(bbox[1])
x_max = int(bbox[2])
y_max = int(bbox[3])
score = bbox[5]
# 1: person 蓝色
if label == 0:
# print(x_min, y_min, x_max, y_max)
cv2.rectangle(img_data, (x_min, y_min), (x_max, y_max), (0, 0, 255), thickness)
# cv2.putText(img_data, 'person', (x_min, y_min - 20), text_font, font_scale, (255, 255, 0), thickness)
# cv2.putText(img_data, score, (50, 50), text_font, font_scale, (255, 255, 0), thickness)
# 2:
'''
if label == 1:
# print(x_min, y_min, x_max, y_max)
cv2.rectangle(img_data, (x_min, y_min), (x_max, y_max), (255, 0, 0), thickness)
# cv2.putText(img_data, 'person', (x_min, y_min - 20), text_font, font_scale, (255, 255, 0), thickness)
# cv2.putText(img_data, score, (50, 50), text_font, font_scale, (255, 255, 0), thickness)
else:
# print("[INFO] Hi, find others.")
pass
'''
return img_data
хорошо,На этом базовая часть кода завершена..
Можно протестировать и протестировать следующее.Вот видеофрагмент с многоцелевого челленджа MOT для тестирования.Вы должны загрузить его в HiLens Studio самостоятельно.Это очень просто,и ничем не отличается от работы на локальном компьютере.Вы можно выбрать загрузку, что очень удобно для разработчиков:
Разрешение видео составляет 1920 * 1080, около 136M, но загрузка будет завершена в ближайшее время.Пропускная способность и скорость загрузки HUAWEI CLOUD по-прежнему очень хороши, но это также связано с вашей собственной сетевой средой.
Ссылка для скачивания видео есть:
Ссылка: https://pan.baidu.com/s/1RWUGpYvAQuP6icY0iDkgEw
Код извлечения: iwpo
Примечание. Вам необходимо переименовать видео в camera0.mp4 (выберите видео, всплывающее меню почты и выберите «Переименовать»), затем перейдите в тестовую папку в левом каталоге, удалите видео camera0.mp4 в папке, а затем переименовать его только сейчас Скопируйте видео camera0.mp4 (то есть видео, которое мы загрузили) в тестовую папку.
В итоге мы получили следующие важные файлы:
Далее вы можете выполнить тест программы:
После этого вы можете увидеть результат выполнения в окне видео в правом верхнем углу.Если вам неудобно, вы можете посмотреть его в полноэкранном режиме или даже в режиме «картинка в картинке». В остальном просмотр видео в маленьком окне похож на операцию разделения экрана на мобильном телефоне.
Отображение эффекта в полноэкранном режиме:
Отображение эффекта режима «картинка в картинке» (видео можно перетаскивать куда угодно):
Работа двух вышеуказанных режимов очень проста, аналогична работе на Tencent, iQiyi, Bilibili и других видео-сайтах:
Конечный эффект показан на видео ниже.Здесь очень извиняюсь.Так как записал на экран и не переключал в полноэкранный режим,то не очень понятно.Предлагаю попробовать самому.Будет очень наглядно в собственной HiLens Studio. В то же время прикрепите ссылку на видео станции B, если следующее видео недействительно и не может быть просмотрено:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо
Если вы хотите установить его на комплект HiLens, аналогичный оригинальной консоли, под интерфейсом воспроизведения видео выше есть выбор строки.
Пока все готово.В целом, HiLens Stuio, как упоминалось в начале, это шедевр, очень простой в использовании.Этот вид облачной IDE очень новый и инновационный, что значительно снижает требования к локальной конфигурации разработчиков , и даже несколько 10. Вы можете отлаживать программы без аппаратного оборудования, что является благословением для разработчиков периферийных вычислений.Это результат многолетних усилий многих людей из HiLens, в Huawei Cloud, а затем в Huawei. является частью полнофункционального решения искусственного интеллекта, и мы с нетерпением ждем возможности стать более мощным, давай.
Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~