首页 > 其他分享 >win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测

时间:2023-06-08 18:04:05浏览次数:51  
标签:layer self yolo Maix tiny ._ input sensor size


(1)制作目标检测数据集

使用labelimg软件进行图片的标注如图所示

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测_python


举一个例子:

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测_tensorflow_02


点击open,导入等待标注的图片,进行目标的标注后生成标注从config文件,数据分为train_img文件夹与train_ano文件,图片与标注的信息文件。一般每一个class至少要有40张以上图片数据。

(2)建立训练模型

模型的选择有很多种,本文中使用yolo v2tiny,事实上使用MobiNet的更多一些,本文也只是举一个个例子,将数据集读入进行模型的迭代。

network.py

# -*- coding: utf-8 -*-
from keras.models import Model
from keras.layers import Reshape, Conv2D, Input, Lambda
import numpy as np
import cv2
import os

from .utils.feature import create_feature_extractor


def create_yolo_network(architecture,
                        input_size,
                        nb_classes,
                        nb_box):
    feature_extractor = create_feature_extractor(architecture, input_size)
    yolo_net = YoloNetwork(feature_extractor,
                           input_size,
                           nb_classes,
                           nb_box)
    return yolo_net


class YoloNetwork(object):
    
    def __init__(self,
                 feature_extractor,
                 input_size,
                 nb_classes,
                 nb_box):
        
        # 1. create full network
        grid_size = feature_extractor.get_output_size()
        
        # make the object detection layer
        output_tensor = Conv2D(nb_box * (4 + 1 + nb_classes), (1,1), strides=(1,1),
                               padding='same', 
                               name='detection_layer_{}'.format(nb_box * (4 + 1 + nb_classes)), 
                               kernel_initializer='lecun_normal')(feature_extractor.feature_extractor.output)
        output_tensor = Reshape((grid_size, grid_size, nb_box, 4 + 1 + nb_classes))(output_tensor)
    
        model = Model(feature_extractor.feature_extractor.input, output_tensor)
        self._norm = feature_extractor.normalize
        self._model = model
        self._model.summary()
        self._init_layer()
        layer_names = [layer.name for layer in self._model.layers]
        print(layer_names)

    def _init_layer(self):
        layer = self._model.layers[-2]
        weights = layer.get_weights()
        
        input_depth = weights[0].shape[-2] # 2048
        new_kernel = np.random.normal(size=weights[0].shape)/ input_depth
        new_bias   = np.zeros_like(weights[1])

        layer.set_weights([new_kernel, new_bias])

    def load_weights(self, weight_path, by_name):
        self._model.load_weights(weight_path, by_name=by_name)
        
    def forward(self, image):
        def _get_input_size():
            input_shape = self._model.get_input_shape_at(0)
            _, h, w, _ = input_shape
            return h
            
        input_size = _get_input_size()
        image = cv2.resize(image, (input_size, input_size))
        image = self._norm(image)

        input_image = image[:,:,::-1]
        input_image = np.expand_dims(input_image, 0)

        # (13,13,5,6)
        netout = self._model.predict(input_image)[0]
        return netout

    def get_model(self, first_trainable_layer=None):
        layer_names = [layer.name for layer in self._model.layers]
        fixed_layers = []
        if first_trainable_layer in layer_names:
            for layer in self._model.layers:
                if layer.name == first_trainable_layer:
                    break
                layer.trainable = False
                fixed_layers.append(layer.name)

        if fixed_layers != []:
            print("The following layers do not update weights!!!")
            print("    ", fixed_layers)
        return self._model

    def get_grid_size(self):
        _, h, w, _, _ = self._model.get_output_shape_at(-1)
        assert h == w
        return h

    def get_normalize_func(self):
        return self._norm

(3)在进行模型训练之前先搭建模型训练环境:

conda create -n yolo python=3.6(创建python3.6版本的conda环境,名字为yolo)

进行环境激活:conda activate yolo

环境中安装深度学习框架,本文已经对环境进行整理进入requirement.txt

使用pip install -r requirements.txt,系统会进行自动的镜像安装。

(4)进行模型的训练

Python train.py -c configs.json

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测_深度学习_03


(5)生成的tflite文件进行格式的转化转换为k210可以使用的Kmodel模型

需要借助ncc工具箱转换,详细见本人GitHub社区

工具箱使用代码:

ncc_0.1_win\ncc test.tflite test.kmodel -i tflite -o k210model --dataset train_img

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测_人工智能_04


可能会报错,原因是你需要将训练好的“日期”模型。转化为test.tflite文件,并且将其移动到根目录下,进行转化

(6)使用读卡器烧录模型,将k210烧录固件,进行IDE的串口调用

maixpy ide

import sensor,image,lcd,time
import KPU as kpu

lcd.init(freq=15000000)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
#sensor.set_hmirror(1)
#sensor.set_vflip(1)
sensor.set_windowing((224, 224))
sensor.set_brightness(2)
#sensor.set_contrast(-1)
#sensor.set_auto_gain(1,2)

sensor.run(1)
clock = time.clock()
classes = ['class_1']
task = kpu.load('/sd/test.kmodel')
anchor = (1, 1.2, 2, 3, 4, 3, 6, 4, 5, 6.5)
a = kpu.init_yolo2(task, 0.17, 0.3, 5, anchor)
while(True):
    clock.tick()
    img = sensor.snapshot()
    code = kpu.run_yolo2(task, img)
    print(clock.fps())
    if code:
        for i in code:
            a=img.draw_rectangle(i.rect())
            a = lcd.display(img)
            print(i.classid(),i.value())
            for i in code:
                lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
                lcd.draw_string(i.x(), i.y()+12, '%f1.3'%i.value(), lcd.RED, lcd.WHITE)
    else:
        a = lcd.display(img)
a = kpu.deinit(task)

完整的代码开源在本人的GitHub社区
https://github.com/qianyuqianxun-DeepLearning/make-tiny-YOLO-v2-for-maix-dock 参考源代码来源:
https://github.com/TonyZ1Min/yolo-for-k210

欢迎关注微信公众号:

AI学习经历分享~

回复关键词,获取编程语言,计算机基础,考研保研,四六级,机器学习,嵌入式开发资料大礼包

win10系统下将yolo v2-tiny模型部署于Maix dock开发板进行目标检测_tensorflow_05


标签:layer,self,yolo,Maix,tiny,._,input,sensor,size
From: https://blog.51cto.com/u_13638291/6442045

相关文章

  • 【解决问题】libevent 编译时报错 Makefile:1708: test/.deps/test_regress-tinytest.
    1开发环境linux版本:统信UOS1030(可以认为是特殊的ubuntu)开发语言:C++2报错现象截图:报错语句:make:进入目录“/home/depend/libevent-2.1.11-stable”Makefile:1708:test/.deps/test_regress-tinytest.Po:没有那个文件或目录make:***没有规则可制作目标“te......
  • Yolov5训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法
    问题:train训练得出的P\R\map全部为0上网寻找寻找答案,大部分给出的原因解释如下:①文件夹格式(名称和架构)有问题,这属于基本内容,不应该出错的。②pytorch和cuda版本不对应。关于这部分可以参考链接:https://blog.csdn.net/jhsignal/article/details/111401628 和 https://www......
  • 关于Yolov3-Tiny算法
    1.Yolov3-Tiny模型YOLOv3-Tiny网络模型一共有24层,包括13个卷积层,6个最大池化层,2个route层,1个上采样层以及2个输出Yolo层。一共有13层卷积层,网络参数及计算量适中,适合在ZYNQ嵌入式平台上加速。1.1卷积层目的:提取输入特征图多个层次的特征。假设卷积层有N组卷积核(每组卷......
  • Tinyhttpd:源码分析【3】
    一、问题引入通过Tinyhttpd:运行测试【1】和抓包分析【2】,基本完成了对程序的功能测试和通信原理。此时可以进一步对源码进行分析,本文不考虑代码一行一行的分析,仅对关键部分代码解析。二、解决过程2-1main()函数主函数主要创建http的监听套接字,等待客户端的连接。一旦有新......
  • yolov5项目cuda错误解决
    CUDA报错解决#报错详情AssertionError:CUDAunavailable,invaliddevice0requested查看cuda版本先看一下电脑是否支持GPU,打开任务管理器就能查看(ctrl+shift+esc)#cmd命令nvcc--version#如果上面命令不是内部或外部命令,也不是可运行的程序,就输入下面的命令NVIDIA-......
  • win10,vs2015深度学习目标检测YOLOV5+deepsort C++多目标跟踪代码实现,源码注释,拿来即
    int8,FP16等选择,而且拿来即用,自己再win10安装上驱动可以立即使用,不用在自己配置,支持答疑。自己辛苦整理的,求大佬打赏一顿饭钱。苦苦苦、平时比较比忙,自己后期会继续发布真实场景项目;欢迎下载。优点:1、架构清晰,yolov5和sort是分开单独写的,可以随意拆解拼接,都是对外接口。2、支持答疑......
  • 如何将word图片粘贴到TinyMCE里面
    ​ 百度ueditor新增的将word内容导入到富文本编辑框的功能怎么没有啊,...ueditor实现word文档的导入和下载功能的方法:1、UEditor没有提供word的导入功能,只能说是粘贴复制。2、方案:用poi来提供word导入,思路是将word转换为html输出,再用UEditor提供的setContent()方法将html的内容......
  • YOLOV5实时检测屏幕
    YOLOV5实时检测屏幕目录YOLOV5实时检测屏幕思考部分先把原本的detect.py的代码贴在这里分析代码并删减不用的部分把屏幕的截图通过OpenCV进行显示写一个屏幕截图的文件用OpenCV绘制窗口并显示最终代码注:此为笔记目的:保留模型加载和推理部分,完成实时屏幕检测实现思路:1.写一......
  • yolotv5和resnet152模型预测
    我已经训练完成了yolov5检测和resnet152分类的模型,下面开始对一张图片进行检测分类。首先用yolo算法对猫和狗进行检测,然后将检测到的目标进行裁剪,然后用resnet152对裁剪的图片进行分类。首先我有以下这些训练好的模型 猫狗检测的,猫的分类,狗的分类 我的预测文件my_detect.p......
  • [重读经典论文]YOLOv7
    参考视频:YOLOv7论文,网络结构,官方源码,超详细解析参考博客:YOLOV7详细解读(一)网络架构解读总体来说框架也是没有大的变化,但是Block应该是精心设计过的,ELAN有点像Inception模块,加上RepVgg的结构重参数化,还有SPP魔改,总体感觉就是网络过于复杂,而且和v6同期,反而性能低于v6,有点尴尬。......