Python神经网络1之TensorFlow
- 深度学习介绍
* - 深度学习与机器学习的区别
- - 深度学习框架介绍
- - TensorFlow框架介绍
* - TensorFlow结构分析
- - 图与TensorBoard
-
深度学习介绍
深度学习与机器学习的区别
特征提取方面
- 机器学习的特征工程步骤是要靠手动完成的,需要大量领域的专业知识
- 深度学习通常用多个层组成,它们通常将更简单的模型组合在一起,将数据从一层传递到另一层来构建更复杂的模型,通过训练大量数据自动得出模型,不需要人工特征提取环节
; 数据量和计算性能方面要求
- 深度学习需要大量的训练数据集
- 训练深度神经网络需要大量的算力
算法代表
- 机器学习 -朴素贝叶斯、决策树
- 深度学习 -神经网络
深度学习框架介绍
框架名主语言从语言灵活性上手难易开发者TensorflowC++cuda/python好难GooglePyTorchpythonC/C++好中等FaceBookCaffeeC++cuda/python/Matlab一般中等贾杨清MXNetc++cyda/R/julia好中等李沐和陈天奇等Torchluac/cuda好中等FaceBookTheanopythonC++/cuda好易蒙特利尔理工学院
总结:
- 最常用的框架当数TensorFlow和Pytorch,而Caffee和Caffee2次之
- PyTorch和Torch更适用于学术研究,TensorFlow,Caffee,Caffee2更适用于工业界的生产环境部署
- Caffee适用于处理静态图像,Torch和PyTorch更适用于动态图像,TensorFlow在两种情况下都很实用
- TensorFlow和Caffee2可在移动端实用
TensorFlow的安装
- CPU与GPU的对比
CPU:核芯的数量更少,但是每一个核芯的速度更快,性能更强,更适用于处理连续性的任务
GPU:核芯的数量更多,但是每一个核芯的处理速度较慢,更适用于并行任务 - CPU版本
macOS安装
pip install tensorflow==1.8 -i https://mirrors.aliyun.com/pypi/simple
TensorFlow框架介绍
TensorFlow结构分析
TensorFlow程序通常被组织成一个构建图阶段和一个执行图阶段
在构建阶段,数据与操作的执行步骤被描述成一个图
在执行阶段,使用会话知心构建好的图中的操作
- 构建图----类似流程图,定义数据和操作
- 执行图----调用各方资源,将定义好的数据和操作运行起来
图和会话:
- 图:这是TensorFlow将计算表示为指令之间的依赖关系的一种表示法
- 会话:TensorFlow跨一个或多个本地或远程设备运行数据流图的机制
- 张量:TensorFlow中的基本数据对象
- 节点:提供图当中执行的操作
TensorFlow是一个采用数据流图,用于数值计算的开源框架
节点在图中表示数学操作,线则表示在节点间相互联系的多维数据数组,即张量
案例加法展示
pycharm上主流是2.x版本的,添加
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
这两行代码将2.x版本变成1.x版本来学习
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
def tensorflow_demo01():
a=tf.constant(2);
b=tf.constant(3);
c=a+b;
print(c)
with tf.Session() as sess:
c_t=sess.run(c)
print("c_value:",c_t)
return None;
if __name__=='__main__':
tensorflow_demo01();
图与TensorBoard
简单来说,图结构 就是 图数据+操作
图相关操作
默认图
通常TensorFlow会默认帮我们创建一张图
查看默认图的两种方法:
- 调用tf.get_default_graph()访问,
- op,sess,都含有graph属性,默认都在一张图中
def graph_tensorflow_demo02():
a=tf.constant(2)
b=tf.constant(3)
c=a+b
print("c:",c)
g_graph=tf.get_default_graph()
print("g的图属性:",g_graph)
with tf.Session() as sess:
c_t=sess.run(c)
print("c_t:",c_t)
print("session的图属性:",sess.graph)
print("a_g:",a.graph)
print("b_g:",b.graph)
return None;
创建图
- 通过tf.Graph()自定义创建图
- 如果要在这张图中创建OP,典型用法就是使用tf.Graph.as_default()上下文管理器
不能在自定义图中运行数据和操作
def diy_graph_tensorflow_demo03():
new_Graph=tf.Graph()
a=tf.constant(20)
b=tf.constant(30)
c=a+b
with new_Graph.as_default():
a_new=tf.constant(20)
b_new=tf.constant(30)
c_new=a_new+b_new;
print("c_new:\n",c_new)
print("a_graph:\n",a_new.graph)
print("b_graph:\n",b_new.graph)
with tf.Session() as sess:
c_value=sess.run(c)
print("c_value:\n",c_value)
with tf.Session(graph=new_Graph) as new_sess:
c_new_value=new_sess.run(c_new)
print("c_new_value:\n",c_new_value)
return None;
TensorBoard:可视化学习
实现程序可视化过程:
- 数据序列化-events文件
tf.summary.FileWriter(path,graph=sess.graph) - 启动TensorBoard
tensorboard --logdir=path
def demo03():
a=tf.constant(10)
b=tf.constant(20)
print("a\n", a)
print("b\n", b)
c=a+b
with tf.Session() as sess:
c_value=sess.run(c)
print("c_value:\n",c_value)
tf.summary.FileWriter("./tmp/summary",graph=sess.graph)
OP
数据:Tensor对象
操作:Oeration对象 -OP
- 常见OP
操作函数操作对象tf.constant(Tensor对象)输入Tensor对象 —Constant -输出 Tensor对象tf.add(Tensor对象1,Tensor对象2)输入Tensor对象1,Tensor对象2 —Add对象 -输出 Tensor对象3
- 指令名称
一张图对应一个命名空间
tf.Graph对象为其包含的tf.Operation对象定义的一个命名空间。用户可以指定描述性名称,使程序阅读起来更轻松
def demo04():
a=tf.constant(1,name="a")
b=tf.constant(2,name="b")
print("a\n",a)
print("b\n",b)
c=tf.add(a,b,name="c")
print("c:\n",c)
with tf.Session() as sess:
c_value=sess.run(c)
tf.summary.FileWriter("./tmp/summary",graph=sess.graph)
print("c_value:\n",c_value)
Original: https://blog.csdn.net/qq_34306228/article/details/124075894
Author: VillanelleS
Title: Python神经网络1之TensorFlow
相关阅读1
Title: 轮播总结
轮播总结
一.二帧式布局实现
运用二块画布实现轮播动画
1)jq实现的滑动原理
a.初始化
第一帧显示第一张图;
第二帧显示第二张图;
b.向左滑动时
先向左左动画;
动画结束后,将第一帧删除;
在第二帧后添加新的帧,并将新帧的图片换成,图片数组中要显示的下一个图片
var _that = this;
this.data.picNo++;
if(this.data.picNo==3){
this.data.picNo=0;
}else if(this.data.picNo==4){
this.data.picNo=1;
}
$(this.data.frameParent).find("li:first-child").animate({
marginLeft:"-300px"
},1000,function(){
var temp=$(this).clone();
$(this).remove();
temp.css({marginLeft:"0"}).children().attr("src",_that.data.srcArr[_that.data.picNo]);
//temp.css({marginLeft:"0"}).children().attr("data-src",_that.data.srcArr[_that.data.picNo]);
$(_that.data.frameParent).append(temp);
});
c.向右滑动时
先删除当前位置的第二帧;
在第一帧前添加一帧,并将新帧的图片换成,图片数组中要显示的下一个图片;
最后向右做动画
var _that = this;
this.data.picNo--;
if(this.data.picNo
2)regular实现原理(固定二帧)
根据方向,维持二个数组:当前显示数组,即将显示数组;
点击事件先获取第二帧数据;对第一帧做动画;
第一帧动画完了,显示第二帧,然后做第二帧动画;
第二帧动画结束后,将当前的数据变更为第二帧的数据。
二.动画/h3>
1.jq滑动动画(animate)
$(this.data.frameParent).find("li:first-child").animate({
marginLeft:"0"
},1000);
2.regular内置了animate动画
3.regular动画
Original: https://www.cnblogs.com/jingwhale/p/6808337.html
Author: jingwhale
Title: 轮播总结
相关阅读2
Title: 如何5分钟上手使用OCR
随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架。
net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48;
netstandard2.0;netcoreapp3.1;
net5.0;net6.0;
创建完窗口后,切换到【程序包管理控制台】,输入下面命令并回车:
Install-Package PaddleOCRSharp -Version 1.3.1
完成PaddleOCRSharp的依赖包安装。
在窗口界面拖放一个按钮,并双击,在按钮的点击事件中,输入以下代码:
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
if (ofd.ShowDialog() != DialogResult.OK) return;
var imagebyte = File.ReadAllBytes(ofd.FileName);
Bitmap bitmap = new Bitmap(new MemoryStream(imagebyte));
OCRModelConfig config = null;
OCRParameter oCRParameter = new OCRParameter ();
OCRResult ocrResult = new OCRResult();
//建议程序全局初始化一次即可,不必每次识别都初始化,容易报错。
PaddleOCREngine engine = new PaddleOCREngine(config, oCRParameter);
{
ocrResult = engine.DetectText(bitmap );
}
if (ocrResult != null)
{
MessageBox.Show(ocrResult.Text,"识别结果");
}
然后按F5运行,点击按钮,选择一个本地图片,进行OCR文字识别。
弹出识别结果,说明你已经上手学会了如何使用OCR,就这么简单。
微信公众号:
QQ技术交流群
PaddleOCRSharp项目,是基于百度飞桨OCR代码修改并封装的.NET的工具类库。包含文本识别、文本检测、基于文本检测结果的统计分析的表格识别功能,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别。同时支持多种文本检测。项目封装极其简化,实际调用仅几行代码,极大的方便了中下游开发者的使用和降低了PaddleOCR的使用入门级别,同时提供不同的.NET框架使用,方便各个行业应用开发与部署。Nuget包即装即用,可以离线部署,不需要网络就可以识别的高精度中英文OCR。
关键:离线、免费、高精度、开源
项目开源地址:https://gitee.com/raoyutian/paddle-ocrsharp
github地址:https://github.com/raoyutian/PaddleOCRSharp
项目目前支持以下.NET框架,可以说,覆盖范围很广。
net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48;
netstandard2.0;netcoreapp3.1;
net5.0;net6.0;
5分钟的时间,你Get到了吗?
欢迎加入QQ交流群:318860399进行技术交流
Original: https://www.cnblogs.com/raoyutian/p/16182170.html
Author: 明月心技术学堂
Title: 如何5分钟上手使用OCR
相关阅读3
Title: 基于halcon与c#联合的视觉处理软件
1、视觉软件
当我们拿到一个视觉项目,如果有一个拖拽式视觉软件去帮我们完成这样一个项目,既省时又省力,学什么halcon、opencv、visionpro,甚至头疼的C++、C#,统统不需要,也能快速成为一名视觉工程师,哈哈哈,这样一想门槛也太低了吧。下图海康的视觉软件vision master想必各位视觉大佬都不陌生吧,每个公司都有自己研发的视觉软件,市场上五花八门的软件,不过框架都差不多,学一个其他的也差不多了吧。这些视觉软件究竟为什么框选出一个区域,就能找到一个圆、一条线、识别出数字、或者其他特征呢,这个问题也困扰了我很久,奈何自己读书少,一直困惑于此,前几天闲来无事,工地搬完砖下班回到宿舍,打开才上手不久的halcon,和在工地上自学的C#,用底层代码去编写这样一个小视觉软件。
vision master
2、图像处理
利用halcon软件进行图像处理,这里用一个下班在路上捡的一个药品盖做一个模板匹配。图像处理上的细节不过多阐述,主要就是创造模板(create_shape_model)、寻找模板(create_shape_model)、点和角度刚性仿射变换,XLD轮廓任意仿射2D变换,相信各位大神对这些都不陌生,我就不在关公面前耍大刀,代码仅供跟我一样的小白参考,哈哈哈。
3、halcon导出c#
用halcon菜单栏文件,将算子代码转为c#代码,因为我们待会做界面要用winform来做,到时候直接用导出的代码,大神也可以用MFC编界面。
导出来之后,我们只需要关注action这个方法里面的代码,前面的都是定义变量,halcon的变量一般只有三个变量类型, HTuple数据变量(宽度,大小,数量),Hobject图像变量,HWindow 窗口句柄。
private void action()
{
// Local iconic variables
HObject ho_Qq20211015161226, ho_GrayImage;
HObject ho_Rectangle, ho_ImageReduced, ho_ModelContours;
HObject ho_ContoursAffineTrans, ho_RegionAffineTrans=null;
HObject ho_ContoursAffineTrans1=null, ho_Rectangle1=null;
// Local control variables
HTuple hv_WindowHandle = null, hv_Row1 = null;
HTuple hv_Column1 = null, hv_ModelID = null, hv_Area = null;
HTuple hv_Row = null, hv_Column = null, hv_HomMat2D = null;
HTuple hv_Angle = null, hv_Score = null, hv_i = null, hv_HomMat2DIdentity = new HTuple();
HTuple hv_HomMat2DTranslate = new HTuple(), hv_HomMat2DRotate = new HTuple();
HTuple hv_HomMat2D1 = new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Qq20211015161226);
HOperatorSet.GenEmptyObj(out ho_GrayImage);
HOperatorSet.GenEmptyObj(out ho_Rectangle);
HOperatorSet.GenEmptyObj(out ho_ImageReduced);
HOperatorSet.GenEmptyObj(out ho_ModelContours);
HOperatorSet.GenEmptyObj(out ho_ContoursAffineTrans);
HOperatorSet.GenEmptyObj(out ho_RegionAffineTrans);
HOperatorSet.GenEmptyObj(out ho_ContoursAffineTrans1);
HOperatorSet.GenEmptyObj(out ho_Rectangle1);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.CloseWindow(HDevWindowStack.Pop());
}
HOperatorSet.SetWindowAttr("background_color","black");
HOperatorSet.OpenWindow(0,0,512,512,0,"visible","",out hv_WindowHandle);
HDevWindowStack.Push(hv_WindowHandle);
ho_Qq20211015161226.Dispose();
HOperatorSet.ReadImage(out ho_Qq20211015161226, "G:/实验/药瓶盖检测1.bmp");
ho_GrayImage.Dispose();
HOperatorSet.Rgb1ToGray(ho_Qq20211015161226, out ho_GrayImage);
//draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
ho_Rectangle.Dispose();
HOperatorSet.GenRectangle1(out ho_Rectangle, 328, 456, 676, 797);
ho_ImageReduced.Dispose();
HOperatorSet.ReduceDomain(ho_GrayImage, ho_Rectangle, out ho_ImageReduced);
HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", (new HTuple(-180)).TupleRad()
, (new HTuple(180)).TupleRad(), "auto", "auto", "use_polarity", "auto", "auto",
out hv_ModelID);
ho_ModelContours.Dispose();
HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID, 1);
HOperatorSet.AreaCenter(ho_Rectangle, out hv_Area, out hv_Row, out hv_Column);
HOperatorSet.VectorAngleToRigid(0, 0, 0, hv_Row, hv_Column, 0, out hv_HomMat2D);
ho_ContoursAffineTrans.Dispose();
HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ContoursAffineTrans,
hv_HomMat2D);
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Qq20211015161226, HDevWindowStack.GetActive());
}
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_ContoursAffineTrans, HDevWindowStack.GetActive());
}
if (HDevWindowStack.IsOpen())
{
HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");
}
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispObj(ho_Rectangle, HDevWindowStack.GetActive());
}
//关闭
ho_ContoursAffineTrans.Dispose();
if (HDevWindowStack.IsOpen())
{
HOperatorSet.ClearWindow(HDevWindowStack.GetActive());
}
ho_Qq20211015161226.Dispose();
HOperatorSet.ReadImage(out ho_Qq20211015161226, "G:/实验/药瓶盖检测2.bmp");
HOperatorSet.FindShapeModel(ho_Qq20211015161226, hv_ModelID, (new HTuple(-180)).TupleRad()
, (new HTuple(180)).TupleRad(), 0.6, 0, 0.5, "least_squares", 0, 0.9, out hv_Row1,
out hv_Column1, out hv_Angle, out hv_Score);
for (hv_i=0; (int)hv_i<=(int)((new htuple(hv_score.tuplelength()))-1); hv_i="(int)hv_i" + 1) { hoperatorset.hommat2didentity(out hv_hommat2didentity); hoperatorset.hommat2dtranslate(hv_hommat2didentity, hv_row1.tupleselect(hv_i), hv_column1.tupleselect(hv_i), out hv_hommat2dtranslate); hoperatorset.hommat2drotate(hv_hommat2dtranslate, hv_angle.tupleselect(hv_i), hv_hommat2drotate); hoperatorset.vectorangletorigid(hv_row1, hv_column1, hv_angle, hv_row1, hv_hommat2d1); ho_regionaffinetrans.dispose(); hoperatorset.affinetransregion(ho_rectangle, ho_regionaffinetrans, hv_hommat2d1, "nearest_neighbor"); ho_contoursaffinetrans1.dispose(); hoperatorset.affinetranscontourxld(ho_modelcontours, ho_contoursaffinetrans1, ho_rectangle1.dispose(); hoperatorset.genrectangle2(out ho_rectangle1, hv_column1.tupleselect( hv_i), 170, 170); if (hdevwindowstack.isopen()) hoperatorset.dispobj(ho_qq20211015161226, hdevwindowstack.getactive()); } hoperatorset.dispobj(ho_contoursaffinetrans1, hdevwindowstack.getactive() ); hoperatorset.setdraw(hdevwindowstack.getactive(), "margin"); hoperatorset.dispobj(ho_rectangle1, ho_qq20211015161226.dispose(); ho_grayimage.dispose(); ho_rectangle.dispose(); ho_imagereduced.dispose(); ho_modelcontours.dispose(); ho_contoursaffinetrans.dispose(); }< code></=(int)((new>
4、界面编写
下面就是激动人心的代码时刻了,本界面使用c#下winform编写的。首先配置halcon与vs环境,一共就只有两步,不像MFC配置那么复杂,到现在我也忘了,反正自认为很难搞,会的可以教教我,第一步添加应用,第二步添加命名空间using HalconDotNet。如果配置成功但总是报错,可以改以下生成平台
第一步
第二步
环境配置好后,进行界面的设计,大家在界面上添加hWindowControl1窗口,这里也是需要在工具箱添加halcon窗体控件的,工具箱里面控件,右键点击选择项,找到halcon安装路径,添加halcondotnet.dll文件,因为图像处理都基于halcon窗口来做的,picturebox是没法做。这里我们只需要注意模板匹配里面的控件,采集图片和清除功能。我们的理清楚我们模板匹配的思路,一、读入图像,二、画出ROI,找到所需要的模板区域,三、创建模板,将你所框选区域的模板物体进行显示、四、再读取一张图片,在这张图中进行模板搜索,识别出该图中的目标予以框出,显示目标坐标,五,清除界面。
4.1、读入图像
双击采集图片按钮,我们以选取文件夹里面的图片为例,按钮中添加以下代码。
4.2、画出ROI
双击画矩形按钮,设置框选的颜色,样式(一般margin),线宽,画出区域,将区域图片进行裁剪显示。
4.3、创建模板
4.4、读取图片,寻找模板
将匹配分数设置为0.5,这里需要注意的是,halcon处理得到的中心坐标是HTuple类型,textBox显示出来得用string类型,进行类型转换,我用了如下方法,其他也没找到比较好的方法。
4.5,清除界面
5、结果展示
该模板匹配,检测,适用于常规目标识别,只需要模板图片和测试图片。
6、还做了一些以相机实时采集的形式、查找圆、查找线、拟合、测量的一些小控件。框选出目标区域,自动找圆、找线,如下图,下次再分享,明天还得上工地,第一次写,写的不好,望各位大神提出意见,相互学习,晚安!
Original: https://blog.csdn.net/qq_55834632/article/details/124673278
Author: ️169
Title: 基于halcon与c#联合的视觉处理软件