2020机器学习结构化学习(1)

naruto_vs_sasuke.png

结构化学习

简介

什么样问题是结构化学习,输入和输出都是结构化数据,所谓结构化数据可以是以下这些数据结构

  • 序列
  • 列表
  • 树结构
  • 定界框(bounding Box)
    在我们之前学习机器学习中输入与输出往往不是同的结构,例如在CNN中我们输入一张图,输出分类的概率。而在结构化学习输入和输出往往是同样数据结构。

结构化学习应用

  • 语音辨识(Speech Recognition)
  • 机器翻译(Translation)
  • 目标检测(object Detection)
  • 语法分析(Syntactic Paring)
  • 文本总结(Summarization)
  • 文本检索(Retrieval)

模型结构


表示输入 X Y 这里用大写表示一个结构化对象,例如矩阵

输入 x 后会遍历所有Y 中的 y 来最大值

目标检测

在目标检测中,我们输入一张图片,输出BoundingBox 边框矩形的(左上角点,和右下角点)

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import glob
%matplotlib inline
img = cv.imread("images/naruto_bouding_box.jpg")
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
print(img.shape)
cv.rectangle(img,(100,80),(350,300),(0,255,0),10)
plt.imshow(img)
(393, 699, 3)






output_3_2.png

在这个火影识别任务中,输入是图片 img 和 bouding box((100,80),(350,300))

img = cv.imread("images/naruto_bouding_box.jpg")
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
print(img.shape)
cv.rectangle(img,(530,150),(580,220),(0,0,255),10)
plt.imshow(img)
(393, 699, 3)






output_5_2.png
img = cv.imread("images/naruto_bouding_box.jpg")
img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
print(img.shape)
roi_img = img[80:300,100:350,:]
print(roi_img.shape)
plt.imshow(roi_img)
(393, 699, 3)
(220, 250, 3)






output_6_2.png
roi_img_hist = roi_img.reshape((220* 250 *3,1))
print(roi_img_hist.shape)
roi_img_n, bins, patches = plt.hist(roi_img_hist, 10, facecolor='blue', alpha=0.5)
print(roi_img_n)
plt.show()
(165000, 1)
[13130.  7950.  8218. 10143. 11940. 18027. 25068. 37002. 10166. 23356.]
output_7_1.png

这个分数就会很低,因为bouding box (蓝色矩形)位置不正确

bounding_boxes = np.array([
    [100,80,350,300],
    [530,150,580,220]
])

for rect in bounding_boxes:
    print(type(rect))


img_001 = cv.imread("images/naruto_001.jpeg")
img_001 = cv.cvtColor(img_001,cv.COLOR_BGR2RGB)
print(img.shape)
# roi_img = img[80:300,100:350,:]
# print(roi_img.shape)
plt.imshow(img_001)
(436, 474, 3)






output_10_2.png
y_001 = np.array([
    [50,250,160,300],
    [100,150,100,150],
    [300,400,120,200]
])
roi_img_001_dict = {}
for idx in range(len(y_001)):
    print(idx)
    print(y_001[idx])
    plt.subplot(1,len(y_001),(idx+1))
    roi_img_ = img_001[y_001[idx][0]:y_001[idx][1],y_001[idx][2]:y_001[idx][3],:]
    roi_img_001_dict[idx] = roi_img_.reshape(((y_001[idx][1] - y_001[idx][0])
                                              *(y_001[idx][3] - y_001[idx][2])*3))
#     roi_img.reshape((220* 250 *3,1))
#     print(roi_img_)
    plt.imshow(roi_img_)
# print(roi_img.shape)
# plt.imshow(roi_img_001)
0
[ 50 250 160 300]
1
[100 150 100 150]
2
[300 400 120 200]
output_11_1.png
# print(roi_img_001_list)
print(type(roi_img_001_dict))
plt.figure(figsize=(16,5))
for key in roi_img_001_list.keys():
    plt.subplot(1,3,(key+1))
    roi_img_001_n, bins, patches = plt.hist(roi_img_001_dict[key], 10, facecolor='blue', alpha=0.5)

output_12_1.png
def generate_img_data(path):
    print(glob.glob(path + "/*.jpg"))
generate_img_data("./source")
['./source/naruto_bouding_box.jpg']

最后希望大家关注我们微信公众号


wechat.jpeg

你可能感兴趣的:(2020机器学习结构化学习(1))