百度PaddlePaddle在疫情期间专门开设了一个7日CV特辑。 https://aistudio.baidu.com/aistudio/education/group/info/1149 应该说还是非常厚道的,aistudio.baidu.com的云模式不仅解决了GPU计算资源问题,还免除了环境部署的麻烦问题。正好借此机会入坑PaddlePaddle。
Day1 图像识别与人工智能
目录
- 图像识别定义和问题
- 传统图像识别方法
- 人工智能发展历程
图像识别定义和问题
从图像识别说起
面临挑战1
面临挑战2
传统图像识别方法
图像识别基本框架
测量空间->(特征表示:传统设计特征到深度学习特征)->特征空间->(特征匹配)->类别空间
图像识别基本框架(场景识别、目标识别、人脸识别…)
早期图像识别技术(1990-2003)
处理流程:
特征提取
索引技术
相关反馈
重排序
全局特征提取:用全局的视觉底层特性统计量表示图像
全局特征示例:颜色、文理、形状
全局特征提取:图片被表示成向量
重排序
早期图像识别技术的问题:全局特征丢掉了图像细节
中期图像识别技术(2003-2012)
文本搜索的经典模型:词袋模型(Bag-of-Words )
视觉词袋(Bag-of-Visual Words)
中期图像识别框架:特征提取、向量化、索引技术、后处理
局部特征(Local Feature):图像区块(patch)的向量
- 特征检测子Feature Detector
- 检测图像区块中心位置:Harris, DoG, SURF, Harris-Affineu
- 特征描述子Feature Descriptor
- 描述区块的视觉内容:SIFT, GLOH, Shape Context, ORB
局部特征示例:SIFT、SURF、BRIEF、COGE
向量化
视觉词典生成 - 特征空间
- 特征聚类:K-means, Affinity Propagation, etc
- 视觉关键词Visual Word
- SIFT
基于视觉关键词的图像表示
- 图像->(特征提取)->
- 局部特征->(特征量化)->
- 视觉词袋->
- 视觉关键词数量直方图
特征提取向量化索引技术后处理
直方图维度= 聚类中心的个数
维度值= 图像落在该聚类中心的特征数量
每一维可以类比为文本文档中的一个词
倒排索引
Contextual Visual Word
Nister, Scalable Recognition with a Vocabulary Tree, CVPR 06
排序
Contextual Visual Word
Nister, Scalable Recognition with a Vocabulary Tree, CVPR 06.
tf-IDF 加权(Term frequency-inverse document frequency)
后处理
- 局部几何验证
- 弱空间关系验证
- 乘积量化
- …
目的
- 提升一致性高的匹配结果得分
- 降低一致性低的匹配结果得分
人工智能发展历程
什么是人工智能
人工智能:使一部机器像人一样进行感知、认知、决策、执行的人工程序或系统
人工智能(Artificial Intelligence,AI)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新技术科学。
- 企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器
- 人工智能是对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能
- 根据对环境的感知,做出合理的行动,并获得最大收益
人工智能发展历程
- 推理期(20世纪50-70年代初)
- 认为只要给机器赋予逻辑推理能力,机器就能具有智能
- A. Newell 和H. Simon 的“逻辑理论家”、“通用问题求解”程序,获得了1975年图灵奖
- 知识期(20世纪70年代中期)
- 认为要使机器具有智能,就必须设法使机器拥有知识
- E.A. Feigenbaum 作为“知识工程”之父在1994 年获得了图灵奖
- 学科形成(20世纪80年代)
- 20 世纪80 年代是机器学习成为一个独立学科领域并开始快速发展、各种机器学习技术百花齐放
- 1980 年美国卡内基梅隆大学举行第一届机器学习研讨会
- 1990 年《机器学习:风范与方法》出版
- 繁荣期(20世纪80年代-至今)
- 20 世纪90 年代后,统计学习方法占主导,代表为SVM
- 2006 至今,大数据分析的需求,神经网络又被重视,成为深度学习理论的基础
人工智能发展历程
什么是机器学习
深度学习<机器学习<人工智能
机器学习
对于某类任务T(Task)和性能度量P(Performance Measure),一个计算机程序被认为可以从经验E(Experience)中学习是指,通过经验E改进后,计算机程序在任务T上由性能度量P衡量的性能有所提升
- 什么是机器学习任务?
- 什么是机器学习学习模型?
- 什么是机器学习经验/数据?
- 什么是机器学习性能指标?
经验=数据
任务->模型->输入->性能评价->输出
机器学习的一般过程
什么是深度学习
人是地球上具有最高智慧的动物,人类靠大脑进行思考、联想、记忆和推理判断。建立模仿人类大脑的模型
使用神经网络这种函数来解决机器学习问题,层数多所以深度
深度学习的优势
测量空间->特征空间->类别空间
传统方法:人工特征提取+分类器
深度学习:手工地选取特征是一件非常费力、启发式(需要专业知识)的方法,能不能选取好很大程度上靠经验和运气,而且它的调节需要大量的时间,而深度学习是学习特征。
基于深度学习的图像识别
深度学习大牛
ACM(国际计算机学会)宣布,有“深度学习三巨头”之称的Yoshua Bengio、Yann LeCun、Geoffrey Hinton共同获得了2018年的图灵奖。
Yann LeCun
Geoff Hinton
Yoshua Bengio
Andrew Ng
Richard Socher
Juergen Schmidhuber
深度学习大玩家
深度学习&学术
人工智能顶会投稿量猛增
深度学习&就业
深度学习应用
深度学习在图像领域的应用1
深度学习在图像领域的应用2
深度学习在自然语言处理领域的应用
深度学习在自然语言处理领域的应用
Day1 作业
作业说明:
作业1:飞桨本地安装
提交飞桨本地安装成功的截图,如下图所示,有安装问题可以随时在群里提问,可参考飞桨官网:https://www.paddlepaddle.org.cn/documentation/docs/zh/install/index_cn.html
作业2:新冠疫情可视化
请根据课上所学内容,爬取3月31日当天丁香园公开的统计数据,根据累计确诊数,使用pyecharts绘制疫情分布图,如下图所示,提交截图。
Pycharts api可参考:https://pyecharts.org/#/zh-cn/
重要:
一定要用正确的姿势在Notebook上传图片+生成版本作业提交示例: https://aistudio.baidu.com/aistudio/projectDetail/296022
可视化,是一种利用计算机图形学和图像处理技术,将数据转换成图像在屏幕上显示出来,再进行交互处理的理论、方法和技术。
本次实践基于丁香园公开的统计数据,实现新冠疫情可视化,包括疫情地图、疫情增长趋势图、疫情分布图等。
全国疫情地图如下:
疫情增长趋势图如下:
一、数据准备
上网的全过程:
普通用户
打开浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 渲染到页面上。
爬虫程序
模拟浏览器 --> 往目标站点发送请求 --> 接收响应数据 --> 提取有用的数据 --> 保存到本地/数据库。
爬虫的过程:
1.发送请求(requests模块)
2.获取响应数据(服务器返回)
3.解析并提取数据(re正则)
4.保存数据
request模块:
requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/
re模块:
re模块是python用于匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,
In[ ]
import json
import re
import requests
import datetime
today = datetime.date.today().strftime('%Y%m%d') #20200315
def crawl_dxy_data():
"""
爬取丁香园实时统计数据,保存到data目录下,以当前日期作为文件名,存JSON文件
"""
response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia') #request.get()用于请求目标网站
print(response.status_code) # 打印状态码
try:
url_text = response.content.decode() #更推荐使用response.content.deocde()的方式获取响应的html页面
#print(url_text)
url_content = re.search(r'window.getAreaStat = (.*?)}]}catch', #re.search():扫描字符串以查找正则表达式模式产生匹配项的第一个位置 ,然后返回相应的match对象。
url_text, re.S) #在字符串a中,包含换行符\n,在这种情况下:如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始;
#而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
texts = url_content.group() #获取匹配正则表达式的整体结果
content = texts.replace('window.getAreaStat = ', '').replace('}catch', '') #去除多余的字符
json_data = json.loads(content)
with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:
json.dump(json_data, f, ensure_ascii=False)
except:
print('<Response [%s]>' % response.status_code)
def crawl_statistics_data():
"""
获取各个省份历史统计数据,保存到data目录下,存JSON文件
"""
with open('data/'+ today + '.json', 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
statistics_data = {}
for province in json_array:
response = requests.get(province['statisticsData'])
try:
statistics_data[province['provinceShortName']] = json.loads(response.content.decode())['data']
except:
print('<Response [%s]> for url: [%s]' % (response.status_code, province['statisticsData']))
with open("data/statistics_data.json", "w", encoding='UTF-8') as f:
json.dump(statistics_data, f, ensure_ascii=False)
if __name__ == '__main__':
crawl_dxy_data()
crawl_statistics_data()
In[ ]
'''
安装第三方库pyecharts ,如果下载时出现断线和速度过慢的问题导致下载失败,可以尝试使用清华镜像
'''
#!pip install pyecharts
!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
二、疫情地图
Echarts 是一个由百度开源的数据可视化工具,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts 诞生了。pyecharts api可以参考:https://pyecharts.org/#/zh-cn/chart_api
使用 options 配置项,在 pyecharts 中,一切皆 Options。
主要分为全局配置组件和系列配置组件。
(1)系列配置项 set_series_opts(),可配置图元样式、文字样式、标签样式、点线样式等;
(2)全局配置项 set_global_opts(),可配置标题、动画、坐标轴、图例等;
先来认识下全局配置组件吧
2.1全国疫情地图
In[ ]
import json
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts
# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d') #20200315
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
# 分析全国实时确诊数据:'confirmedCount'字段
china_data = []
for province in json_array:
china_data.append((province['provinceShortName'], province['confirmedCount']))
china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序
print(china_data)
# 全国疫情地图
# 自定义的每一段的范围,以及每一段的特别的样式。
pieces = [
{'min': 10000, 'color': '#540d0d'},
{'max': 9999, 'min': 1000, 'color': '#9c1414'},
{'max': 999, 'min': 500, 'color': '#d92727'},
{'max': 499, 'min': 100, 'color': '#ed3232'},
{'max': 99, 'min': 10, 'color': '#f27777'},
{'max': 9, 'min': 1, 'color': '#f7adad'},
{'max': 0, 'color': '#f7e4e4'},
]
labels = [data[0] for data in china_data]
counts = [data[1] for data in china_data]
m = Map()
m.add("累计确诊", [list(z) for z in zip(labels, counts)], 'china')
#系列配置项,可配置图元样式、文字样式、标签样式、点线样式等
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12),
is_show=False)
#全局配置项,可配置标题、动画、坐标轴、图例等
m.set_global_opts(title_opts=opts.TitleOpts(title='全国实时确诊数据',
subtitle='数据来源:丁香园'),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(pieces=pieces,
is_piecewise=True, #是否为分段型
is_show=True)) #是否显示视觉映射配置
#render()会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件,也可以传入路径参数,如 m.render("mycharts.html")
m.render(path='/home/aistudio/data/全国实时确诊数据.html')
2.2湖北省疫情地图
In[ ]
import json
import datetime
from pyecharts.charts import Map
from pyecharts import options as opts
# 读原始数据文件
today = datetime.date.today().strftime('%Y%m%d') #20200315
datafile = 'data/'+ today + '.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_array = json.loads(file.read())
# 分析湖北省实时确诊数据
# 读入规范化的城市名称,用于规范化丁香园数据中的城市简称
with open('/home/aistudio/data/data24815/pycharts_city.txt', 'r', encoding='UTF-8') as f:
defined_cities = [line.strip() for line in f.readlines()]
def format_city_name(name, defined_cities):
for defined_city in defined_cities:
if len((set(defined_city) & set(name))) == len(name):
name = defined_city
if name.endswith('市') or name.endswith('区') or name.endswith('县') or name.endswith('自治州'):
return name
return name + '市'
return None
province_name = '湖北'
for province in json_array:
if province['provinceName'] == province_name or province['provinceShortName'] == province_name:
json_array_province = province['cities']
hubei_data = [(format_city_name(city['cityName'], defined_cities), city['confirmedCount']) for city in
json_array_province]
hubei_data = sorted(hubei_data, key=lambda x: x[1], reverse=True)
print(hubei_data)
labels = [data[0] for data in hubei_data]
counts = [data[1] for data in hubei_data]
pieces = [
{'min': 10000, 'color': '#540d0d'},
{'max': 9999, 'min': 1000, 'color': '#9c1414'},
{'max': 999, 'min': 500, 'color': '#d92727'},
{'max': 499, 'min': 100, 'color': '#ed3232'},
{'max': 99, 'min': 10, 'color': '#f27777'},
{'max': 9, 'min': 1, 'color': '#f7adad'},
{'max': 0, 'color': '#f7e4e4'},
]
m = Map()
m.add("累计确诊", [list(z) for z in zip(labels, counts)], '湖北')
m.set_series_opts(label_opts=opts.LabelOpts(font_size=12),
is_show=False)
m.set_global_opts(title_opts=opts.TitleOpts(title='湖北省实时确诊数据',
subtitle='数据来源:丁香园'),
legend_opts=opts.LegendOpts(is_show=False),
visualmap_opts=opts.VisualMapOpts(pieces=pieces,
is_piecewise=True,
is_show=True))
m.render(path='/home/aistudio/data/湖北省实时确诊数据.html')
[('武汉市', 50003), ('孝感市', 3518), ('黄冈市', 2907), ('荆州市', 1580), ('鄂州市', 1394), ('随州市', 1307), ('襄阳市', 1175), ('黄石市', 1015), ('宜昌市', 931), ('荆门市', 928), ('咸宁市', 836), ('十堰市', 672), ('仙桃市', 575), ('天门市', 496), ('恩施土家族苗族自治州', 252), ('潜江市', 198), ('神农架林区', 11)]
'/home/aistudio/data/湖北省实时确诊数据.html'
三、疫情增长趋势图
In[ ]
import numpy as np
import json
from pyecharts.charts import Line
from pyecharts import options as opts
# 读原始数据文件
datafile = 'data/statistics_data.json'
with open(datafile, 'r', encoding='UTF-8') as file:
json_dict = json.loads(file.read())
# 分析各省份2月1日至今的新增确诊数据:'confirmedIncr'
statistics__data = {}
for province in json_dict:
statistics__data[province] = []
for da in json_dict[province]:
if da['dateId'] >= 20200201:
statistics__data[province].append(da['confirmedIncr'])
# 获取日期列表
dateId = [str(da['dateId'])[4:6] + '-' + str(da['dateId'])[6:8] for da in json_dict['湖北'] if
da['dateId'] >= 20200201]
# 全国新增趋势
all_statis = np.array([0] * len(dateId))
for province in statistics__data:
all_statis = all_statis + np.array(statistics__data[province])
all_statis = all_statis.tolist()
# 湖北新增趋势
hubei_statis = statistics__data['湖北']
# 湖北以外的新增趋势
other_statis = [all_statis[i] - hubei_statis[i] for i in range(len(dateId))]
line = Line()
line.add_xaxis(dateId)
line.add_yaxis("全国新增确诊病例", #图例
all_statis, #数据
is_smooth=True, #是否平滑曲线
linestyle_opts=opts.LineStyleOpts(width=4, color='#B44038'),#线样式配置项
itemstyle_opts=opts.ItemStyleOpts(color='#B44038', #图元样式配置项
border_color="#B44038", #颜色
border_width=10)) #图元的大小
line.add_yaxis("湖北新增确诊病例", hubei_statis, is_smooth=True,
linestyle_opts=opts.LineStyleOpts(width=2, color='#4E87ED'),
label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部
itemstyle_opts=opts.ItemStyleOpts(color='#4E87ED',
border_color="#4E87ED",
border_width=3))
line.add_yaxis("其他省份新增病例", other_statis, is_smooth=True,
linestyle_opts=opts.LineStyleOpts(width=2, color='#F1A846'),
label_opts=opts.LabelOpts(position='bottom'), #标签在折线的底部
itemstyle_opts=opts.ItemStyleOpts(color='#F1A846',
border_color="#F1A846",
border_width=3))
line.set_global_opts(title_opts=opts.TitleOpts(title="新增确诊病例", subtitle='数据来源:丁香园'),
yaxis_opts=opts.AxisOpts(max_=16000, min_=1, type_="log", #坐标轴配置项
splitline_opts=opts.SplitLineOpts(is_show=True),#分割线配置项
axisline_opts=opts.AxisLineOpts(is_show=True)))#坐标轴刻度线配置项
line.render(path='/home/aistudio/data/新增确诊趋势图.html')