百度飞桨领航团零基础图像分类速成营 课程总结1(课前预习)

百度飞桨领航团零基础图像分类速成营 课程总结1(课前预习)

课程链接 https://aistudio.baidu.com/aistudio/course/introduce/11939
飞桨官网 https://www.paddlepaddle.org.cn/
推荐学习网站 https://www.runoob.com/python3/python3-tutorial.html


目录

课节1:课前资料

python 的__call__()方法

class A:
     def __init__(self):
         print("__init__ ")
         print(self)
         super(A, self).__init__()

     def __new__(cls):
         print("__new__ ")
         self = super(A, cls).__new__(cls)
         print(self)
         return self

    def __call__(self):  # 可以定义任意参数
        print('__call__ ')

A()

输出:

__new__ 
<__main__.A object at 0x1007a95f8>
__init__ 
<__main__.A object at 0x1007a95f8>
# a是实例对象,同时还是可调用对象
a = A()
print(callable(a))  # True
  • new 方法的返回类的实例对象,传递给 init 方法中定义的 self 参数
  • init()的作用是初始化某个类的一个实例,返回 None 值
  • call()的作用是使实例能够像函数一样被调用

外加总结:

调用父类(超类)的方法:

  1. 明确指定:
class  C(P):
     def __init__(self):
             P.__init__(self)
             print 'calling Cs construtor'
  1. 使用super()方法 :
class  C(P):
    def __init__(self):
            super(C,self).__init__()
            print 'calling Cs construtor'
  • 单继承结果一样,多继承super更好。

  • 对于定义的类,在Python中会创建一个MRO(Method Resolution Order)列表,它代表了类继承的顺序。MRO的查找顺序是按广度优先

  • super().method()是调用父类中的方法,这个搜索顺序当然是按照MRO从前向后开始进行的。

    super([type][, object-or-type])

    根据官方文档,super函数返回一个委托类type的父类或者兄弟类方法调用的代理对象。super函数用来调用已经再子类中重写过的父类方法。

    常见的是直接调用super(),这其实是super(type, obj)的简写方式,将当前的类传入type参数,同时将实例对象传入type-or-object参数,这两个实参必须确保isinstance(obj, type)为True。

    使用该方法调用的super函数返回的代理类是obj所属类的MRO中,排在type之后的下一个父类。

示例1:

继承结构:
 Base
  /  \
 /    \
A      B
 \    /
  \  /
   C
  • 不使用super:
class Base(object):
    def __init__(self):
        print ("enter Base")
        print ("leave Base")

class A(Base):
    def __init__(self):
        print ("enter A")
        Base().__init__()
        print ("leave A")

class B(Base):
    def __init__(self):
        print ("enter B")
        Base().__init__()
        print ("leave B")

class C(A, B):
    def __init__(self):
        print ("enter C")
        A().__init__()
        B().__init__()
        print ("leave C")
        
print (C.mro())
C()

输出:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
enter C
enter A
enter Base
leave Base
enter Base
leave Base
leave A
enter A
enter Base
leave Base
enter Base
leave Base
leave A
enter B
enter Base
leave Base
enter Base
leave Base
leave B
enter B
enter Base
leave Base
enter Base
leave Base
leave B
leave C
<__main__.C at 0x7f734302db10>
  • 使用super:
class Base(object):
    def __init__(self):
        print ("enter Base")
        print ("leave Base")

class A(Base):
    def __init__(self):
        print ("enter A")
        super(A, self).__init__()
        print ("leave A")

class B(Base):
    def __init__(self):
        print ("enter B")
        super(B, self).__init__()
        print ("leave B")

class C(A, B):
    def __init__(self):
        print ("enter C")
        super(C, self).__init__()
        print ("leave C")
        
print (C.mro())
C()

输出:

[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C
<__main__.C at 0x7f734304e090>
  • isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

    • isinstance() 与 type() 区别:

      type() 不会认为子类是一种父类类型,不考虑继承关系。

      isinstance() 会认为子类是一种父类类型,考虑继承关系。

    • isinstance(object, classinfo)
      object – 实例对象。
      classinfo – 可以是直接或间接类名、基本类型或者由它们组成的元组。其中基本类型:int,float,bool,complex,str(字符串),list,dict(字典),set,tuple。

      class A:
          pass
      
      class B(A):
          pass
      
      isinstance(A(), A)    # returns True
      type(A()) == A        # returns True
      isinstance(B(), A)    # returns True
      type(B()) == A        # returns False
      
      print('A\t:',A)
      print('A()\t:',A())
      print('type(A())\t:',type(A()))
      print('type(A())== A\t:', type(A()) == A  )
      print('判断A()实例对象,A类名 的类型是否相同:',isinstance(A(), A))
      

      输出:

      A	: <class '__main__.A'>
      A()	: <__main__.A object at 0x7f7342ff3350>
      type(A())	: <class '__main__.A'>
      type(A())== A	: True
      判断A()实例对象,A类名 的类型是否相同: True
      

图像基础知识

  • 在计算机中, 图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用 RGB 或 RGBA 表示。如果有A通道就表明这个图像可以有透明效果。
    R,G,B 每个分量一般是用一个字节(8位)来表示,所以RGB图中每个像素大小就是3 * 8=24位图, 而RGBA图中每个像素大小是4 * 8=32位。
  • 图像是二维数据,数据在内存中只能一维存储,二维转一维有不同的对应方式。比较常见的只有两种方式: 按像素“行排列” 从上往下 或者 从下往上。
  • 一般只会有RGB,BGR, RGBA, RGBA, BGRA这几种排列据。 绝大多数图形库或环境是BGR/BGRA排列,cocoa中的NSImage或UIImage是RGBA排列。

像素32位对齐
在x86体系下,cpu一次处理32整数倍的数据会更快,图像处理中经常会按行为单位来处理像素。24位图,宽度不是4的倍数时,其行字节数将不是32整数倍。这时可以采取在行尾添加冗余数据的方式,使其行字节数为32的倍数。 比如,如果图像宽为5像素,不做32位对齐的话,其行位数为24*5=120,120不是32的倍数。是32整数倍并且刚好比120大的数是128,也就只需要在其行尾添加1字节(8位)的冗余数据即可。(一个以空间换时间的例子) 有个公式可以轻松计算出32位对齐后每行应该占的字节数

    1. 调用函数计算:byteNum = ceil(bm.bmWidth / 32) * 4。图片实际存储宽度 除以32 再向上取整,32位相当于4字节,所以 乘以4 得出行字节数。
    1. 使用位运算:byteNum = ((bm.bmWidth + 31) & ~31) >> 3。图片实际存储宽度 加了31 与 取反后的31 按位与之后,后面5个位都置为0,这相当于向下取32的最大倍数;>>3右位移3位,即除以8,得出行字节数。
#图像宽为5像素,不做32位对齐的话,其行位数为24*5=120,120不是32的倍数。是32整数倍并且刚好比120大的数是128
print('二进制31\t',bin(31))
print('二进制~31\t',bin(~31))
print('二进制32\t',bin(32))

print('\n')
print('二进制120+31=151\t',bin(151))
print('二进制~31\t',bin(~31))
print('十进制(151 & ~31):\t{a}\n二进制(151 & ~31):\t{b} '.format(a=(151 & ~31),b=bin(151 & ~31)))
二进制31	 0b11111
二进制~31	 -0b100000
二进制32	 0b100000


二进制120+31=151	 0b10010111
二进制~31	 -0b100000
十进制(151 & ~31):	128
二进制(151 & ~31):	0b10000000 

图片格式

  • BMP格式

    bmp格式没有压缩像素格式,存储在文件中时先有文件头、再图像头、后面就都是像素数据了,上下颠倒存储。 用windows自带的mspaint工具保存bmp格式时,可以发现有四种bmp可供选择:

    • 单色: 一个像素只占一位,要么是0,要么是1,所以只能存储黑白信息
    • 16色位图: 一个像素4位,有16种颜色可选
    • 256色位图: 一个像素8位,有256种颜色可选
    • 24位位图: 就是图(1)所示的位图,颜色可有2^24种可选,对于人眼来说完全足够了。
  • BJPEG格式

    • jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了。
    • jpeg没有透明信息。
    • jpeg比较适合用来存储相机拍出来的照片,这类图像用jpeg压缩后的体积比较小。其使用的具体算法核心是离散余弦变换、Huffman编码、算术编码等技术
  • PNG格式

    • png是一种无损压缩格式, 压缩大概是用行程编码算法。
    • png可以有透明效果。
    • png比较适合适量图,几何图。
  • GIF格式

上面提到的bmp,jpeg,png图片都只有一帧,而gif可以保存多帧图像。

  • WebP编码

Webp是一种高效的图像编码方式,由谷歌推出,开源免费。其图像压缩效率相比jpg可以提升一倍性能。一般保存需要设置压缩因子。

常用库

  • Numpy
    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
    导入:import numpy as np
    创建数组:
    • numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    • arange([start,] stop[, step,], dtype=None),返回类型:ndarray,N 维数组对象 ndarray。
      • range()中的步长不能为小数,但是np.arange()中的步长可以为小数
      import numpy as np
      print(np.arange(3))
      print(type(np.arange(3)))
      
      print('\n')
      print(np.array([1,2,3])  )
      print(type(np.array([1,2,3]) ))
      
      输出:
      [0 1 2]
      <class 'numpy.ndarray'>
      
      
      [1 2 3]
      <class 'numpy.ndarray'>
      

数组信息:
python array=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) print(array) #数组维度 print(array.ndim) #数组形状 print(array.shape) #数组元素个数 print(array.size) #数组元素类型 print(array.dtype)
输出:
python [[ 1 2 3] [ 4 5 6] [ 7 8 9] [10 11 12]] 2 (4, 3) 12 int64
形状变换:numpy.reshape(arr, newshape, order=‘C’)
arr:要修改形状的数组 。
newshape:整数或者整数数组,新的形状应当兼容原有形状 。
order:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。

其他运算 可见[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKY52sz9-1615019568778)(https://www.runoob.com/numpy/numpy-tutorial.html)]
* 矩阵乘法 (dot) ,对应分量相乘 (multiply或 *)

  • CV2
    读取BGR,通道HWC,范围[0,255] ,类型uint8; 图像类型numpy.ndarray;

  • PIL,Pillow, Pillow-SIMD
    读取RGB,通道HWC,范围[0,255],类型uint8;图像类型PngImageFile (np.array, Image.fromarray直接与numpy互相转换) 有.mode方法—rgb信息

  • Matplotlib
    读取RGB,通道HWC,范围[0,1] ,类型float;图像类型numpy.ndarray

  • Skimage
    读取RGB,通道HWC,范围[0,255],类型uint8;图像类型numpy.ndarray 有.mode方法—rgb信息

比较特殊,读取的时候image= io.imread(‘test.jpg’,as_grey=False);

彩图是uint8,[0,255];灰度图float,[0,1];

常见操作

读取

# cv2 默认
# 彩色图,默认值(1),灰度图(0),包含透明通道的彩色图(-1)
img = cv2.imread('examples.png')
img_gray = cv2.imread('examples.png', 0)
img_unchanged = cv2.imread('examples.png', -1)

PIL,Pillow, Pillow-SIMD
img = Image.open('examples.png')

Matplotlib
img = plt.imread('examples.png')

显示

# Matplotlib
img = plt.imread('examples.png')
plt.imshow(img)
plt.show()

# CV2
img = cv2.imread('examples.png')
plt.imshow(img[..., -1::-1]) # 因为opencv读取进来的是bgr顺序,而imshow需要的是rgb顺序,因此需要先反过来,也可以plt.imshow(img[:,:,::-1])
plt.show()

# PIL
#可直接打开
plt.imshow(Image.open('examples.png')) # 实际上plt.imshow可以直接显示PIL格式图像
plt.show()

# 转换为需要的numpy格式打开
img_gray = img.convert('L') #转换成灰度图像
img = np.array(img)
img_gray = np.array(img_gray)
plt.imshow(img) # or plt.imshow(img / 255.0)5
plt.show()
plt.imshow(img_gray, cmap=plt.gray()) # 显示灰度图要设置cmap参数
plt.show()
  • plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示。其后跟着plt.show()才能显示出来。
  • cmap将标量数据映射到色彩图

转换

主要是通过numpy的transpose操作,修正RGB,BGR;

例如:

a是rgb图像,那么

a[::-1],a[:,::-1],a[:,:,::-1]分别是X轴的镜像,Y轴的镜像,BGR转换为RGB;

# opencv相关图像操作;
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # BGR转灰度
img_bgr = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2BGR) # 灰度转BRG
img_rgb = cv2.cvtColor(img_gray,cv2.COLOR_GRAY2RGB) # 灰度转RGB

b,g,r = cv2.split(img) #bgr图像分离三个通道
img2 = cv2.merge([r,g,b]) #merge成rgb图像
# PIL相关图像操作:
img = Image.open('examples.png')
img_gray = image.convert(‘L’)
img_color = img_gray.convert(‘RGB’)
#PIL与numpy格式转换操作:
numpy.asarray()
Image.fromarray()

如果是pil转opencv,记得需要通过copy命令得到的才可以进行cv2操作,不然会有bug。

PIL类型,尺寸信息,通过.size方法,得到WH;

Numpy类型,通过shape方法,得到HWC

保存

# PIL
# 直接save方法

img = Image.open('examples.png')
img.save('examples2.png')
img_gray = img.convert('L')
img_gray.save('examples_gray.png') # 不管是灰度还是彩色,直接用save函数保存就可以,但注意,只有PIL格式的图片能够用save函数
#cv2.imwrite

import cv2
img = cv2.imread('examples.png') # 这是BGR图片
cv2.imwrite('examples2.png', img) # 这里也应该用BGR图片保存,这里要非常注意,因为用pylab或PIL读入的图片都是RGB的,如果要用opencv存图片就必须做一个转换
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imwrite('examples_gray.png', img_gray)

预习作业

飞桨安装文档:https://paddlepaddle.org.cn/install/quick

1.本地安装PaddlePaddle,截图并上传

 提示:使用 python 进入python解释器,输入import paddle ,再输入 paddle.utils.run_check()。

2.本地安装open-cv-python,截图上传

 终端下输入: pip show opencv-python

已标记关键词 清除标记
相关推荐
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了易用的一键式设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。在常规修复过程中,程序还会自动检测DirectX加速状态,在异常时给予用户相应提示。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同时兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V4.0版分为标准版、增强版以及在线修复版。所有版本都支持修复DirectX的功能,而增强版则额外支持修复c++的功能。在线修复版功能与标准版相同,但其所需的数据包需要在修复时自动下载。各个版本之间,主程序完全相同,只是其配套使用的数据包不同。因此,标准版和在线修复版可以通过补全扩展包的形式成为增强版。本程序自V3.5版起,自带扩展功能。只要在主界面的“工具”菜单下打开“选项”对话框,找到“扩展”标签,点击其中的“开始扩展”按钮即可。扩展过程需要Internet连接,扩展成功后新的数据包可自动生效。扩展用时根据网络速度不同而不同,最快仅需数秒,最慢需要数分钟,烦请耐心等待。如扩展失败,可点击“扩展”界面左上角小锁图标切换为加密连接,即可很大程度上避免因防火墙或其他原因导致的连接失败。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如。新程序更改了自我校验方式,因此使用新版本的程序时不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有更新系统c++功能。由于绝大多数软件运行时需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同时,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常时(非丢失时)会提示用户使用增强版进行修复。除常规修复外,新版程序还支持C++强力修复功能。当常规修复无效时,可以到本程序的选项界面内开启强力修复功能,可大幅提高修复成功率。请注意,请仅在常规修复无效时再使用此功能。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此时窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同时方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 新版程序支持命令行运行模式。在命令行中调用本程序,可以在路径后直接添加命令进行相应的设置。常见的命令有7类,分别是设置语言的命令、设置窗口模式的命令,设置安全级别的命令、开启强力修复的命令、设置c++修复模式的命令、控制Direct加速的命令、显示版权信息的命令。具体命令名称可以通过“/help”或“/?”进行查询。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同时,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式时无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题时,及时分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了7项高级功能。点击"常规”选项卡可以调整程序的基本运行情况,包括日志记录、安全级别控制、调试模式开启等。只有开启调试模式后才能在C
<span style="color:#E53333;"><span style="color:#000000;"> </span></span> <p style="font-size:16px;"> <span style="color:#3A4151;">课程演示环境:Ubuntu </span> </p> <p style="font-size:16px;"> </p><p> <span><span style="color:#0070C0;">需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》</span></span> </p> <p> <span><span style="color:#0070C0;">课程链接:https://edu.csdn.net/course/detail/29123</span></span>  </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;">当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是最新的强悍的目标检测技术。本课程使用</span><strong><span style="color:#C00000;">YOLOv4实现实时的人脸口罩佩戴检测</span></strong><span style="background-color:#FFFFFF;">。课程提供</span><strong><span style="color:#C00000;">超万张已标注人脸口罩数据集</span></strong><span style="background-color:#FFFFFF;">。训练后的YOLOv4可对真实场景下人脸口罩佩戴进行</span><span style="background-color:#FFFFFF;">高精度地</span><span style="background-color:#FFFFFF;">实时检测。</span> </p> <p style="font-size:16px;"> <span style="background-color:#FFFFFF;"><br /></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><span style="font-size:16px;">本课程会讲述本项目超万张人脸口罩数据集的制作方法,包括使用labelImg标注工具标注以及如何使用Python代码对第三方数据集进行修复和清洗。</span><br /></span></span> </p> <p style="font-size:16px;"> <span><span style="background-color:#FFFFFF;"><br /></span></span> </p> <p style="font-size:16px;"> 本课程的YOLOv4使用AlexyAB/darknet,在Ubuntu系统上做项目演示。具体项目过程包括:安装YOLOv4、训练集和测试集自动划分、修改配置文件、训练网络模型、测试训练出的网络模型、性能统计(mAP计算和画出PR曲线)和先验框聚类分析。  </p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <br /></p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200601524939.jpg" alt="" /></p> <p style="font-size:16px;"> <strong>YOLOv4人脸口罩佩戴检测效果</strong> </p> <p style="font-size:16px;"> <img src="https://img-bss.csdn.net/202005200603052758.jpg" alt="" /></p> <p style="font-size:16px;"> <br /></p> <span style="color:#000000;"></span>
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页