碰到的一些背景知识的记录:
tf.Variable()
简而言之,tf.Variable()函数会生成一个对象,这个对象包含key和value两个内容。
tf.pow
这个链接里的代码要仔细看,感觉弯弯绕绕很多
tf.reduce_sum
又一个弯弯绕
tf.train中的Optimizer相关的函数与功能介绍
大概了解
sess.run(tf.global_variables_initializer()) 做了什么?
[tf.nn.softmax_cross_entropy_with_logits]
tf.reshape(x,shape)
x为输入,shape为转后的形式。
比如 tf.reshape(x, [-1,28,28,1]),意思就是将1D向量转为2D的图片格式,即从1 * 784转化为原始的28*28的结构。同时由于只有一个颜色通道,故最终尺寸为[-1, 28, 28, 1],前面的-1代表样本数量不固定,最后一个1代表颜色通道数量。
训练自己的数据
训练自己的数据,一方面是希望通过这个能理解项目中整个的开发流程是如何的,大概是干些什么事情,另一方面也从实际操作来巩固先前所学的一些知识和概念。
- 环境的配置,这一步其实还蛮关键的,报了很多错。
- 我是windows环境,python安装最新的就行了,我用的3.7.3,就一个python-3.7.3-amd64.exe安装包,一路点击下一步,就遇到环境变量的时候可以让它自动加就行了。
- Tensorflow ,因为pip是安装python的时候自动安装的所以可以直接用,包括环境变量也加上了。直接在cmd里执行 pip install tensorflow ,也不用管版本安装最新的就行了(我用的是cpu版本的)。
- Tensorflow的模型,它的作用是实现了很多功能,包括物体检测,它有现成的很优秀的模型,但是需要去github下载,它的名字叫models,直接下载就可以了,最关键的是,把它下载下来之后放到什么地方很多人没有提甚至都说错了。我这里下载后会看到models-master这样一个压缩包400多M,解压,然后把解压后的文件夹models-master名称改成models,接下来将其拷贝到python安装目录下,TensorFlow库下的路径里,即我的就是 E:\Python3\Lib\site-packages\tensorflow\models,因为上面第二步安装TensorFlow的时候使用pip安装,因此TensorFlow会出现在python的库路径下 Lib\site-packages,而models需要放在TensorFlow下面,因为它里面的代码很多都会用到TensorFlow。
- Protobuf,之所以要安装它是因为后面会需要对上一步的models进行一些操作,这个后面会说。下载地址是这里。下载下来是一个压缩包:protoc-3.8.0-win64.zip,直接解压随便哪个目录都可以,因为它只是在这个过程中充当一个工具的角色,没有与其他任何模块产生联系。
- 安装一些库,包括pillow,matplotlib。其实后面在编译的时候如果没有安装一些需要的库会报错,一样也可以在那时安装,安装方法都是pip install xxx 。这里说的编译,是指后面会对models的object_detection编译。
- 我们的目的是训练自己的数据,具体一点说就是要让自己的模型能够识别图片中人的脸。最终的效果是希望能够给模型喂这样一张图片:
然后模型能识别出来这个图片中的脸是娜扎的还是刘诗诗的,这里本来可以做很多个人,但简单来做,就两个分类,一个是娜扎一个是刘诗诗。不光能识别图片中的脸属于谁,同时还可以把脸框出来:
- 第一步首先是准备这些明星脸的图片数据,按道理来说,图片越多肯定越好,但图片越多也就意味着对这张图片打标签就会越多,打标签这个活不是个讨喜的活,因为目前来看只能手打,具体后面会说。这里首先要准备图片,我参考的是一篇博客,但不建议完全参照看这篇,因为这篇博客里面好多东西都没有说,讲解步骤跨度太大。准备图片需要用到网络爬虫,也就是爬数据,我在pycharm新建的test工程根目录执行的,代码名称随意,代码如下:
import requests
import re
import os
from pypinyin import pinyin, lazy_pinyin
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("")
def getPageUrls(text, name):
re_pageUrl = r'href="(.+)">\s*<img src="(.+)" alt="' + name
return re.findall(re_pageUrl, text)
def downPictures(text, root, name):
pageUrls = getPageUrls(text, name)
titles = re.findall(r'alt="' + name + r'(.+)" ', text)
for i in range(len(pageUrls)):
pageUrl = pageUrls[i][0]
path = root + titles[i] + "//"
if not os.path.exists(path):
os.mkdir(path)
if not os.listdir(path):
pageText = getHTMLText(pageUrl)
totalPics = int(re.findall(r'<em>(.+)</em>)', pageText)[0])
downUrl = re.findall(r'href="(.+?)" class="">下载图片', pageText)[0]
cnt = 1;
while (cnt <= totalPics):
picPath = path + str(cnt) + ".jpg"
r = requests.get(downUrl)
with open(picPath, 'wb') as f:
f.write(r.content)
f.close()
print('{} - 第{}张下载已完成\n'.format(titles[i], cnt))
cnt += 1
nextPageUrl = re.findall(r'href="(.+?)">下一张', pageText)[0]
pageText = getHTMLText(nextPageUrl)
downUrl = re.findall(r'href="(.+?)" class="">下载图片', pageText)[0]
return
def main():
name = input("请输入你喜欢的明星的名字:")
nameUrl = "http://www.win4000.com/mt/" + ''.join(lazy_pinyin(name)) + ".html"
try:
text = getHTMLText(nameUrl)
if not re.findall(r'暂无(.+)!', text):
root = "D://pics//" + name + "//"
if not os.path.exists(root):
os.mkdir(root)
downPictures(text, root, name)
try:
nextPage = re.findall(r'next" href="(.+)"', text)[0]
while (nextPage):
nextText = getHTMLText(nextPage)
downPictures(nextText, root, name)
nextPage = re.findall(r'next" href="(.+)"'