Я хочу сделать автономный дрон, который мог бы самостоятельно находить путь к цели и обратно, избегая при этом всех препятствий и никого не задев.
Я решил начать с нейросети и веб-камеры.
Так появился этот проект
Суть проекта — нейросеть, точнее фреймворк 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 #нейронная сеть
-
Взгляните На Hp Pavilion-Dv6-3050Us
19 Oct, 24 -
Орр, Джон Бойд
19 Oct, 24