Камера С Функцией Отслеживания Объектов

Я хочу сделать автономный дрон, который мог бы самостоятельно находить путь к цели и обратно, избегая при этом всех препятствий и никого не задев.

Я решил начать с нейросети и веб-камеры.

Так появился этот проект

Камера с функцией отслеживания объектов

Суть проекта — нейросеть, точнее фреймворк imageai, написанный на Python под Keras, находит человека на картинке и выдает координаты его ящика.

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

Далее находим второй центр, но на этот раз по вертикали, добавляем к нему несколько десятков пикселей, чтобы, когда человек стоит, камера фиксировала его лицо.

Еще хотел добавить распознавание лиц, но веб-камера дешевая и поэтому не имеет функции автофокуса.



Для проекта было необходимо

STM32f4discovery — плата разработки Пара машинистов МТ415 2 шаговых двигателя Блок питания 24 В 2,5 А ИзображениеAI

Кратко опишу код на Python

Инициализация imageai. Выберите тип нейронной сети — yolo и размер изображения — flash. При прошивке изображение уменьшается до небольшого размера (не помню какого размера) и за счет этого ускоряется сеть.

  
  
  
  
   

detector = ObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("yolo.h5") detector.loadModel(detection_speed="flash")

Функции отправки символа микроконтроллеру для выполнения одного шага по горизонтальной и вертикальной оси

def step(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'v') u=0 ff=ser.read(1) print(1111) if ff==b'B': i=0 def step_y(): i = 1 u = 0 while i: while u!=1: u = ser.write( b'V') u=0 ff=ser.read(1) #print(1111) if ff==b'B': i=0

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

Опять же в МК отправляются управляющие символы.



def rotate_x(left, right): center = (right - left)/2 + left u = 0 if center < 320: i=1 while i: while u!=1: u = ser.write( b'r') u=0 ff=ser.read(1) #print(1111) if ff==b'B': i=0 # print("right") if center > 320: i=1 while i: while u!=1: u = ser.write( b'l') u=0 ff=ser.read(1) print(1111) if ff==b'B': i=0 #print("left") global step_right global step_left if center > 360: step_right = step_right + 1 step_left = step_left - 1 if step_left < 0: step_left = 0 if step_right < 30: step() else: step_right = 30 if (center < 250 and center != 0): step_right = step_right - 1 step_left = step_left + 1 if step_right < 0: step_right = 0 if step_left < 30: step() else: step_left = 30

По вертикали функция управления практически такая же.

Отличия описаны выше.

В основном мы уже получаем от нейросети два объекта.

Первый — это картинка с положением нарисованного объекта, второй — массив обнаруженных объектов с их координатами.



detected_copy, detections = detector.detectObjectsFromImage(input_image=frame, input_type ="array", output_type = "array") for eachObject in detections: if eachObject["name"] == "person": str1 = eachObject["box_points"] str2= str(str1) n = 1 for i in range(5): if str2[i] in [","]: detect1 = int(str2[1:i]) #print(detect1) print (eachObject["box_points"])



Теперь код для МК

Функция получения данных через виртуальный ком-порт.

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 6 */ //USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);

Теги: #Машинное обучение #Программирование микроконтроллеров #stm32 #github #Сделай сам или сделай сам #сделай сам #с открытым исходным кодом #OpenCV #нейронная сеть
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.