结构化学习
简介
什么样问题是结构化学习,输入和输出都是结构化数据,所谓结构化数据可以是以下这些数据结构
- 序列
- 列表
- 树结构
- 定界框(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)
在这个火影识别任务中,输入是图片 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)
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)
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.]
这个分数就会很低,因为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)
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]
# 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)
def generate_img_data(path):
print(glob.glob(path + "/*.jpg"))
generate_img_data("./source")
['./source/naruto_bouding_box.jpg']
最后希望大家关注我们微信公众号