STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

人工智能68

STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow )

由于实现的是简单的逻辑运算( A ∩ B ) ∪ ( C ∩ D ) (A\cap B)\cup (C\cap D)(A ∩B )∪(C ∩D ),因此使用最简单的一个带有两层全连接层的网络,结构图如下:
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

X1,X2,X3,X4分别代表A,B,C,D,隐藏层1和隐藏层2均采用Sigmoid激活函数。实现代码如下:

import csv
import numpy as np
import tensorflow as tf
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "2"

x_d = np.zeros((80, 4), dtype='float32')
y_d = np.zeros((80, 1), dtype='float32')

f = csv.reader(open('dataset/train_data.csv', 'r'))

for i in f:
    x_d[int(i[0])][0] = float(i[1])
    x_d[int(i[0])][1] = float(i[2])
    x_d[int(i[0])][2] = float(i[3])
    x_d[int(i[0])][3] = float(i[4])
    y_d[int(i[0])] = float(i[6])

x = tf.compat.v1.placeholder(tf.float32, shape=[None, 4], name='x')
y = tf.compat.v1.placeholder(tf.float32, shape=[None, 1], name='y')

w1 = tf.Variable(tf.truncated_normal([4, 2]), name='w1')
b1 = tf.Variable(tf.truncated_normal([2], 0.1), name='b1')
l1 = tf.sigmoid(tf.matmul(x, w1) + b1, name='l1')

w = tf.Variable(tf.truncated_normal([2, 1]), name='w')
b = tf.Variable(tf.truncated_normal([1], 0.1), name='b')

o = tf.sigmoid(tf.matmul(l1, w) + b, name='o')
loss = tf.reduce_mean(tf.square(o - y))
train = tf.train.GradientDescentOptimizer(0.9).minimize(loss)

init = tf.global_variables_initializer()
saver = tf.train.Saver(max_to_keep=4)

with tf.Session() as sess:
    writer = tf.summary.FileWriter("logs/", sess.graph)
    sess.run(init)
    max_step = 9000
    for i in range(max_step + 1):
        sess.run(train, feed_dict={x: x_d, y: y_d})
        cost = sess.run(loss, feed_dict={x: x_d, y: y_d})
        if i % 1000 == 0:
            print("------------------------------------------------------")

            saver.save(sess, "model/ckpt/model", global_step=i)
            print("------------------------------------------------------")
        print('step: ' + str(i) + '  loss:' + "{:.3f}".format(cost))

print('训练结束')

运行之后将会得到一个ckpt格式文件,之后运行代码将该ckpt模型固化为pb格式,代码如下:

import tensorflow as tf
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "4"

input_ckpt_path = 'model/ckpt/model-9000'

out_pb_path = "model/pb/pb_model.pb"

output_node_names = "o"
saver = tf.train.import_meta_graph(input_ckpt_path+'.meta', clear_devices=True)

with tf.Session() as sess:
    saver.restore(sess, input_ckpt_path)
    output_graph_def = tf.compat.v1.graph_util.convert_variables_to_constants(
          sess=sess,
          input_graph_def=sess.graph_def,
          output_node_names=output_node_names.split(","))
    with tf.io.gfile.GFile(out_pb_path, "wb") as f:
        f.write(output_graph_def.SerializeToString())
print('转换结束')

将固化的pb模型转换为单片机要用的tflite文件,由于模型简单不需要进行轻量化,直接进行转换即可代码如下:

import tensorflow as tf
import os

os.environ["CUDA_VISIBLE_DEVICES"] = "1"

input_pb_path = "model/pb/pb_model.pb"

out_tflie_path = "model/tflite/tflite_model.tflite"

input_tensor_name = ["x"]
input_tensor_shape = {input_tensor_name[0]:[1,4]}

out_tensor_name = ['o']

converter = tf.lite.TFLiteConverter.from_frozen_graph(
    input_pb_path,
    input_tensor_name,
    out_tensor_name,
    input_tensor_shape)
converter.allow_custom_ops=True
converter.post_training_quantize = True
tflite_model = converter.convert()
open(out_tflie_path, "wb").write(tflite_model)
print('转换结束')

我们可以用Netron可视化一下之前的pb和最终的tflite,如下图
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

以上的代码包括训练集均在Gitee上:

https://gitee.com/shibwoen/stm32_tensorflow/tree/master/train_model

Original: https://blog.csdn.net/ShiBoWen2021/article/details/121448569
Author: ShiBoWen2021
Title: STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)



相关阅读1

Title: opencv -- 颜色和轮廓 的 提取&筛选

注:本文使用的编程语言是python。
如果读者使用的是C++,有些代码可能需要自行变更!

前言

初学opencv的阶段,难免是从枯燥地啃文档和记函数开始。逐一而草率地"过"一遍函数用法,对于初学者而言,其实很难起到学习的进步。只有在具体的实例中,才能更好地理解函数用法和搭配 的 妙用。
笔者在视觉库cvzone和halcon的启发下,总结了些opencv实现的颜色和轮廓的提取&筛选方法,能够方便地应用在不同的项目之上。
如果读友是小白,在这里也推荐个B站上的油管搬运教程:opencv超实用实战项目,因为是手把手敲代码的,对初学者非常友好。还有,视频原作者是 巴基斯坦 的 CV工程师 Murtaza。这边附上他油管的主页 Murtaza's Workshop,感兴趣的朋友可以看看。
言归正传,我们开始吧!

Part1. 颜色提取&筛选

颜色提取&筛选 是最直观的图像处理方式,简单粗暴但不失为有效。
其主要步骤如下:

  • 1.将原图像由 RGB模型转为 HSV模型
    (因为HSV模型有专门的 H色调 通道,更方便颜色的提取s)
  • 2.确定 目标提取颜色 HSV范围 (可以不止一个)
  • 3.使用inRange()函数,获取图像掩膜
  • 4.使用图像位操作,将掩膜进行合并
  • 5.用掩膜覆盖原图像,使其仅保留预期的部分

针对步骤2,这里给出常用的HSV范围:

颜色HSV 范围起始范围结束范围全部(0, 0, 0) (180, 255, 255)黑色(0, 0, 0) (180, 255, 46)灰色(0, 0, 46) (180, 43, 220)白色(0, 0, 211) (180, 30, 255)红色(0, 43, 46) (10, 255, 255) (156, 43, 46) (180, 255, 255)橙色(11, 43, 46) (25, 255, 255)黄色(26, 43, 46) (34, 255, 255)绿色(35, 43, 46) (77, 255, 255)青色(78, 43, 46) (99, 255, 255)蓝色(100, 43, 46) (124, 255, 255)紫色(125, 43, 46) (155, 255, 255) 从表中不难看出,区分各颜色的主要参数,就在于H通道的取值。表内颜色的取值边界比较宽泛模糊,如果有更精准的提取需求,建议还是手动调参。

接下来,就是代码部分。为了使模块更通用,笔者是把功能写成python类进行封装。调用类实例化的对象,以实现颜色提取的功能。主要是在魔术方法__call__()内实现。

import cv2
import numpy as np

def setMask(src: np.ndarray, mask: np.ndarray) -> np.ndarray:
    channels = cv2.split(src)

    result = []
    for i in range(len(channels)):
        result.append(cv2.bitwise_and(channels[i], mask))

    dest = cv2.merge(result)

    return dest

class ColorFilter(object):
    def __init__(self):
        self.colorRange = []

    def __call__(self, src: np.ndarray) -> np.ndarray:

        finalMask = np.zeros_like(src)[:, :, 0]

        hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)

        for each in self.colorRange:

            lower, upper = each

            mask = cv2.inRange(hsv, lower, upper)

            finalMask = cv2.bitwise_or(finalMask, mask)

        dest = setMask(src, finalMask)

        return dest

if __name__ == '__main__':
    src = cv2.imread(r'xxx.png')

    colorFilter = ColorFilter()
    colorFilter.colorRange = [
        ((xxx,xxx,xxx),(xxx,xxx,xxx)),
        ((xxx,xxx,xxx),(xxx,xxx,xxx))
    ]
    dest = colorFilter(src)
    cv2.imshow('dest', dest)
    cv2.waitKey(0)

笔者在这里以opencv的logo为例,对红、蓝色的区域进行提取。如下是效果图:
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)
对于其他复杂的情形,可以修改上述代码中,对掩膜的图像位操作,以实现复杂的区域的合并、剪切、取反等效果。

Part2. 轮廓提取&筛选

相比较颜色提取,轮廓提取对于实际应用的普适性更好,也相应得更复杂。
其主要步骤如下:

  • 1.彩色图转灰度图,二值化处理。
    (如果图像噪声多,可适当使用滤波器)
  • 2.使用findContours()函数,提取轮廓
  • 3.使用arcLength(),contourArea()函数获取 轮廓周长和面积
    (也可以引入其他特征量)
  • 4.筛选轮廓,过滤掉无效轮廓
  • 5.进行 绘制轮廓/制作掩膜 等操作

针对步骤3,这里给出halcon里常用的区域特征量:

特征名称解释取值范围计算公式面积(Area)轮廓的面积(0,+∞)A周长(contlength)轮廓线总长(0,+∞)P紧密度(Compactness)相同周长的圆和当前轮廓的面积比[1,+∞)4PiA/P^2圆度(Circularity)当前轮廓和最小外接圆的面积比(0,1]A/(Pi*R外接^2)凸度(Convexity)当前轮廓和凸包的面积比(0,1]A/A凸矩形度(Rectangularity)当前轮廓和最小外接矩形的比值(0,1]A/A矩 以上是常用且在opencv中容易实现的特征量。相关的opencv函数见下:

  • 轮廓周长:arcLength()
  • 轮廓面积:contourArea()
  • 凸包检测:convexHull()
  • 最小外接圆:minEnclosingCircle()
  • 最小外接矩形:minAreaRect()

接下来,就是代码部分。同上,是封装在python类中实现。因为轮廓的筛选方式很多,这里实现的是简单的依据 轮廓面积和周长范围进行筛选。

import cv2
import numpy as np

class ContourFilter(object):
    def __init__(self):
        super(ContourFilter, self).__init__()

        self.threshold = lambda image: cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                                                             cv2.THRESH_BINARY_INV, 15, 21)

        self.areaRanges = []

        self.perimeterRanges = []

        self.contourColor = (255, 127, 127)

        self.contourThickness = 3

        self.inPlace = False

        self.paint = True

    def __call__(self, src: np.ndarray) -> np.ndarray:

        if not self.areaRanges:
            self.areaRanges = [(0, float('inf'))]
        if not self.perimeterRanges:
            self.perimeterRanges = [(0, float('inf'))]

        if self.inPlace:
            dest = src.copy()
        else:
            dest = np.zeros_like(src)

        if len(src.shape) == 3 and src.shape[2] == 3:
            gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
        elif len(src.shape) == 2:
            gray = src

        binary = self.threshold(gray)

        contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        resultContours = []

        for contour in contours:

            perimeter = cv2.arcLength(contour, True)

            area = cv2.contourArea(contour)

            for perimeterRange, areaRange in zip(self.perimeterRanges, self.areaRanges):
                if perimeterRange[0] < perimeter  perimeterRange[1] and areaRange[0] < area  areaRange[1]:
                    resultContours.append(contour)

        if self.paint:
            cv2.drawContours(dest, resultContours, -1, self.contourColor, self.contourThickness)

        return dest

if __name__ == '__main__':
    src = cv2.imread(r'xxx.png')
    contourFilter = ContourFilter()
    contourFilter.areaRanges.append((minArea, maxArea))
    contourFilter.perimeterRanges.append((minPerimeter, maxPerimeter))

    dest = colorFilter(src)
    cv2.imshow('dest', dest)
    cv2.waitKey(0)

笔者在这里同样以opencv的logo为例,给出运行的效果图:
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)
上述代码用例实现了轮廓的绘制,读者也可以自行更改代码,使其变体为生成掩膜、区域填充等功能。笔者在此就不加赘述。

结束语

笔者作为初涉计算机视觉领域的在校学生,技术水平有限。本文中倘若出现错误或者值得补充的地方,希望各位读者在评论中指出。衷心感谢每位看到本文的读者!

Original: https://blog.csdn.net/m0_50616665/article/details/124810344
Author: 墨鼠.Rat.
Title: opencv -- 颜色和轮廓 的 提取&筛选

相关阅读2

Title: TensorFlow Hub使用指南

TensorFlow Hub 是一个包含经过训练的机器学习模型的代码库,这些模型稍作调整便可部署到任何设备上。您只需几行代码即可重复使用经过训练的模型,例如 BERT 和 Faster R-CNN。

示例,利用词嵌入模型,

能将每一个句子或者单词输出为一个向量
(num_examples, embedding_dimension)。

!pip install --upgrade tensorflow_hub

import tensorflow_hub as hub

model = hub.KerasLayer("https://tfhub.dev/google/nnlm-en-dim128/2")
embeddings = model(["The rain in Spain.", "falls",
                    "mainly", "In the plain!"])

print(embeddings.shape)

TensorFlow Hub 是用于存储可重用机器学习资产的仓库和库。hub.tensorflow.google.cn
仓库中提供了许多预训练模型:文本嵌入、图像分类模型等。开发者可以从 tensorflow_hub 库下载资源,并以最少的代码量在 TensorFlow 程序中重用这些资源。

安装 tensorflow_hub

tensorflow_hub 库可与 TensorFlow 1 和 TensorFlow 2 一起安装。我们建议新用户立即从 TensorFlow 2 开始,并且当前用户升级到此版本。

与 TensorFlow 2 一起使用

往常一样使用 pip 来安装 TensorFlow 2。(有关 GPU 支持的更多说明,请参阅相关文档。)随后在它旁边安装当前版本的 tensorflow-hub(必须为 0.5.0 或更高版本)。

$ pip install "tensorflow>=2.0.0"
$ pip install --upgrade tensorflow-hub

TensorFlow Hub 的 TF1 样式 API 适用于 TensorFlow 2 的 v1 兼容模式。

与旧版 TensorFlow 1 一起使用

tensorflow_hub 库需要 TensorFlow version 1.7 或更高版本。

我们强烈建议您使用 TensorFlow 1.15 进行安装,此版本默认采用与 TF1 兼容的行为,但其底层包含了许多 TF2 功能,允许使用 TensorFlow Hub 的 TF2 样式 API。

$ pip install "tensorflow>=1.15,
$ pip install --upgrade tensorflow-hub

使用预发布版本

pip 软件包 tf-nightly 和 tf-hub-nightly 是从 GitHub 上的源代码自动构建的,没有版本测试。这样,开发者无需从源代码构建便可试用最新代码。

可选:设置下载的缓存位置。

TensorFlow Hub 是包含各种预训练模型的综合代码库,这些模型稍作调整便可部署到任何设备上。借助 tensorflow_hub 库,您可以下载训练过的最新模型,并且只需编写少量代码即可使用这些模型。

以下教程可帮助您根据个人需求开始使用和应用 TensorFlow Hub 中的模型。您可以通过互动式教程修改这些模型,并运行修改后的模型。点击互动式教程顶部的"在 Google Colab 中运行"按钮,即可修改并运行模型。

针对新手

如果您不熟悉机器学习和 TensorFlow,可以先大致了解如何分类图像和文本、检测图像中的对象,或如何让自己的照片拥有著名画作的风格:

图像分类,使用bert进行文本分类,风格迁移,对象检测

面向有经验的开发者

您可以查看更高级教程,了解如何使用 TensorFlow Hub 中的 NLP、图像、音频和视频模型。

Original: https://blog.csdn.net/chenvvei/article/details/117159690
Author: cvvoid
Title: TensorFlow Hub使用指南

相关阅读3

Title: 程序员视角m1 Macbook air使用指南和指令备忘录

m1 Mac使用指南指令备忘录

M1用到现在也小半年了,踩了些坑,也有一些使用心得,这里主要提供思路方法,具体方法可以自行搜索了解

硬件外设

首先是用的Macbook air丐版8+256

  1. 显示器,HKC的C299Q,看中它长屏方便剪辑和分屏,90%的DCI-P色域看电影还行,不打游戏所以VA的曲面屏还是挺合适
  2. 键盘,将就用之前ipad配的逻辑K380
  3. 鼠标,罗技M720
  4. 硬盘,在家组了个NAS,4T用来放电影和剪辑素材之类的大文件
  5. 拓展坞,飞利浦的五合一Type-c+Hdim1.4+3*USB3.0基本满足需求。
  6. Ipad air3随航当拓展屏很好用

外接显示器HiDpi

强制开启Hidpi
有条件上4k显示器的当然最好,接上显示器就会出现调节界面,主要针对非4K屏幕
hidpi是macos优化显示效果的一种技术,需要硬件达到视网膜屏幕标准,具体技术可以自行了解,主要问题是非4k比如我现在用的带鱼屏1080*2560会出现字体发虚的情况
参考国外一个大神软件虚拟显示器的方法
BetterDummy
主要方法是通过软件虚拟一个支持hidpi的显示器,再把这个显示器投到自己的上面。带鱼屏的话注意选21.5:9,21.3:9是没Hidpi的。
系统需要更新到Monetery
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

; homebrew

homebrew是Mac上一个软件管理工具,可以理解为开源Appstore,直接brew install即可安装指定软件,最好安装前先用Brew search查询是否存在对应版本

export HOMEBREW_BREW_GIT_REMOTE="..."  # put your Git mirror of Homebrew/brew here
export HOMEBREW_CORE_GIT_REMOTE="..."  # put your Git mirror of Homebrew/homebrew-core here
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

必备网站

  1. Is apple Silicon ready?对应软件官方是否已经适配m1平台
    STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)
  2. MacWk一个免费的破解软件下载网站
  3. m1游戏适配情况介绍游戏在不同环境下运行情况,点进去有详细测评
    STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

; 软件推荐

Parallels Desktop

Silicon

Bob

IINA

iterm2远程

Iterm2比Mac自带terminal更好用,装机必备软件之一
cmd+O调出profile 保存帐号->cmd+option+F 调出password manage保存密码

mysql和redis启动

brew service start mysql

redis-server

OhMyZsh设置

可以在Mac和Debian本地分别设置
参考细节
推荐插件 extract、 zsh-syntax-highlighting、autojump、zsh-autosuggestions

磁盘读写查询

smartctl 盘查看读写次数

这个磁盘过度读写的问题最好是使用原生软件
STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow)

tensorfow安装配置

python环境

电脑自带python但是3.9有点高,可以自己选择对应版本
点击下载miniforge
安装命令

bash Miniforge3-MacOSX-arm64.sh

nano ~/.bash_profile
export PATH="/Users/Cyberbolt/miniforge3/bin:$PATH"

source $HOME/.bash_profile

在虚拟环境安装 TensorFlow

conda create -n py39 python=3.9
conda activate py39

conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

未完待补充

Original: https://blog.csdn.net/GawainTky/article/details/120914438
Author: GawainTky
Title: 程序员视角m1 Macbook air使用指南和指令备忘录