STM32运行深度学习指南基础篇(2)(STM32CubeMX.AI+Tensorflow )
由于实现的是简单的逻辑运算( A ∩ B ) ∪ ( C ∩ D ) (A\cap B)\cup (C\cap D)(A ∩B )∪(C ∩D ),因此使用最简单的一个带有两层全连接层的网络,结构图如下:
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,如下图
以上的代码包括训练集均在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为例,对红、蓝色的区域进行提取。如下是效果图:
对于其他复杂的情形,可以修改上述代码中,对掩膜的图像位操作,以实现复杂的区域的合并、剪切、取反等效果。
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为例,给出运行的效果图:
上述代码用例实现了轮廓的绘制,读者也可以自行更改代码,使其变体为生成掩膜、区域填充等功能。笔者在此就不加赘述。
结束语
笔者作为初涉计算机视觉领域的在校学生,技术水平有限。本文中倘若出现错误或者值得补充的地方,希望各位读者在评论中指出。衷心感谢每位看到本文的读者!
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使用指南指令备忘录
- 硬件外设
* - 外接显示器HiDpi
- homebrew
- 必备网站
- 软件推荐
* - Parallels Desktop
- Silicon
- Bob
- IINA
- iterm2远程
- mysql和redis启动
- OhMyZsh设置
- 磁盘读写查询
- tensorfow安装配置
* - python环境
- 在虚拟环境安装 TensorFlow
- 未完待补充
M1用到现在也小半年了,踩了些坑,也有一些使用心得,这里主要提供思路方法,具体方法可以自行搜索了解
硬件外设
首先是用的Macbook air丐版8+256
- 显示器,HKC的C299Q,看中它长屏方便剪辑和分屏,90%的DCI-P色域看电影还行,不打游戏所以VA的曲面屏还是挺合适
- 键盘,将就用之前ipad配的逻辑K380
- 鼠标,罗技M720
- 硬盘,在家组了个NAS,4T用来放电影和剪辑素材之类的大文件
- 拓展坞,飞利浦的五合一Type-c+Hdim1.4+3*USB3.0基本满足需求。
- Ipad air3随航当拓展屏很好用
外接显示器HiDpi
强制开启Hidpi
有条件上4k显示器的当然最好,接上显示器就会出现调节界面,主要针对非4K屏幕
hidpi是macos优化显示效果的一种技术,需要硬件达到视网膜屏幕标准,具体技术可以自行了解,主要问题是非4k比如我现在用的带鱼屏1080*2560会出现字体发虚的情况
参考国外一个大神软件虚拟显示器的方法
BetterDummy
主要方法是通过软件虚拟一个支持hidpi的显示器,再把这个显示器投到自己的上面。带鱼屏的话注意选21.5:9,21.3:9是没Hidpi的。
系统需要更新到Monetery
; 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)"
必备网站
- Is apple Silicon ready?对应软件官方是否已经适配m1平台
- MacWk一个免费的破解软件下载网站
- m1游戏适配情况介绍游戏在不同环境下运行情况,点进去有详细测评
; 软件推荐
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 盘查看读写次数
这个磁盘过度读写的问题最好是使用原生软件
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使用指南和指令备忘录