首页 » PHP教程 » leancloudphp教程技巧_若何做一个完整的深度进修应用

leancloudphp教程技巧_若何做一个完整的深度进修应用

访客 2024-12-07 0

扫一扫用手机浏览

文章目录 [+]

做这个运用分为三步:先用一些图片完成模型的演习,然后把模型导出,做一个后真个 API 用来识别图片,再做一个前端用来上传图片和显示结果。

准备演习数据

Jupyter notebook 是个很盛行的用来做数据剖析和机器学习的交互式环境,它可以把 Markdown 文档和 Python 代码放在一个条记本里,也可以以图表、图片等友好的办法显示代码的运行结果。
这里也会用到 FastAI,它是一个基于 PyTorch,供应了很多网络和文件批量操作便捷接口的开源库。
这篇文章便是在 Jupyter notebook 里写的,以是你可以直接 clone 这个 repo、安装依赖、启动 Jupyter notebook。

leancloudphp教程技巧_若何做一个完整的深度进修应用

git clone https://github.com/hjiang/trump-sim-notebookpip install -r requirements.txtjupyter notebook

我们还会用到 Bing image search API [2] 来获取做演习的图片,你须要自己注册并申请一个免费的 API KEY。
当然,由于搜索到的图片是在很多第三方网站上的,以是你须要能无障碍地访问中国之外的网站。

leancloudphp教程技巧_若何做一个完整的深度进修应用
(图片来自网络侵删)

把你的 Bing image search API key 放在项目目录下的 .env 里,以免在代码里透露出去:

BING_SEARCH_API_KEY=XXXXXXXX....

然后在 Python 里读进来

import osfrom dotenv import load_dotenvload_dotenv()key = os.getenv('BING_SEARCH_API_KEY')

写一个函数用来搜索图片:

from azure.cognitiveservices.search.imagesearch import ImageSearchClientfrom msrest.authentication import CognitiveServicesCredentialsfrom fastcore.foundation import Ldef search_images_bing(key, term, min_sz=128): client = ImageSearchClient('https://api.cognitive.microsoft.com', CognitiveServicesCredentials(key)) return L(client.images.search(query=term, count=150, min_height=min_sz, min_width=min_sz).value)

实际验证一下, 搜一张 Artemis 的图片:

from torchvision.datasets.utils import download_urlfrom PIL import Imageimport fastai2.vision.widgetsresults = search_images_bing(key, 'Artemis')urls = results.attrgot('content_url')download_url(urls[0], 'images/', 'artemis.jpg')image = Image.open('images/artemis.jpg')image.to_thumb(128, 128)

确认图片下载没问题后,我们把关心的四类图片下载到 /objects 下面的四个目录里。

from fastai2.vision.utils import download_imagesfrom pathlib import Pathobject_types = 'woman','man','camera', 'TV'path = Path('objects')if not path.exists(): path.mkdir() for o in object_types: dest = (path/o) dest.mkdir(exist_ok=True) results = search_images_bing(key, o) download_images(dest, urls=results.attrgot('content_url'))

你可能会看到一些图片下载失落败的信息,只要不是太多都可以忽略。
网络上有的图片是破坏的,或者是 Python image library 不支持的格式,须要把它们删除。

from fastai2.vision.utils import get_image_filesfrom fastai2.vision.utils import verify_imagesfns = get_image_files(path)failed = verify_images(fns)failed.map(Path.unlink);预处理

在开始演习前,须要见告 FastAI 如何标注图片,并加载到它的数据构造中。
下面的代码完成以下几件事:

利用父目录名(parent_label)来标注每个图片。
保留 20% 的图片作为验证集(validation set),其它的作为演习集(training set)。
演习集便是用来演习神经网络的数据,验证集用于衡量演习好的模型在碰着新数据时的准确度。
这两个凑集不能有重叠。
把图片缩小以提高效率

末了一行代码会显示验证集的前三个图片。

from fastai2.data.block import DataBlock, CategoryBlockfrom fastai2.vision.data import ImageBlockfrom fastai2.data.transforms import RandomSplitter, parent_labelfrom fastai2.vision.augment import Resizeobjects = DataBlock( blocks=(ImageBlock, CategoryBlock), get_items=get_image_files, splitter=RandomSplitter(valid_pct=0.2, seed=42), get_y=parent_label, item_tfms=Resize(128))dls = objects.dataloaders(path)dls.valid.show_batch(max_n=3, nrows=1)

在做图像识别的时候每每还会对图片做一些随机的缩放、裁剪等变换,以便产生足够多的数据来提高演习效果。
可以从下面代码的结果看到对同一个图片做不同变换的结果。

from fastai2.vision.augment import aug_transforms, RandomResizedCropobjects = objects.new( item_tfms=RandomResizedCrop(224, min_scale=0.5), batch_tfms=aug_transforms())dls = objects.dataloaders(path)dls.train.show_batch(max_n=6, nrows=2, unique=True)

演习数据

接下来终于可以开始演习了。
对付图像识别这样的运用处景来说,每每不会从零开始演习一个新的模型,由于有大量的特色是险些所有运用都须要识别的,比如物体的边缘、阴影、不同颜色形成的模式等。
常日的做法因此一个预先演习好的模型为根本(比如这里的 resnet18),用自己的新数据对末了几层进行演习(术语为 fine tune)。
在一个多层的神经网络里,越靠前(靠近输入)的层卖力识别的特色越详细,而越靠后的层识别的特色越抽象、越靠近目的。
下面的末了一行代码指演习 4 轮(epoch)。

如果你有 Nvidia 的显卡,在 Linux 下,并且安装了得当的驱动程序的话,下面的代码只须要几秒到十几秒,否则的话就要等待几分钟了。

from fastai2.vision.learner import cnn_learnerfrom torchvision.models.resnet import resnet18from fastai2.metrics import error_rateimport fastai2.vision.all as fa_visionlearner = cnn_learner(dls, resnet18, metrics=error_rate)learner.fine_tune(4)

末了输出的表格里是每一轮里演习集的 loss,验证集的 loss,以及缺点率(error rate)。
缺点率是我们关心的指标,而 loss 是掌握演习过程的指标(演习的目标便是让 loss 越来越靠近于 0)。
须要这两个不同的指标是由于 loss 要知足一些缺点率不一定知足的条件,比如对所有参数可导,而缺点率不是一个连续函数。
loss 越低缺点率也越低,但他们之间没有线性关系。
这里缺点率有差不多 10%,也便是准确率是 90% 旁边。

接下来我们要看看验证集里到底有哪些图片识别错了,下面的代码会打印出 confusion matrix。
在这个矩阵里,对角线的数字是精确识别的图片数,其它地方的是识别缺点的图片数。

from fastai2.interpret import ClassificationInterpretationinterp = ClassificationInterpretation.from_learner(learner)interp.plot_confusion_matrix()

从输出的矩阵可以看到一共有 11 个缺点,个中男女性别缺点有 4 个,此外电视和其它几类的稠浊大概多。

下面我们把 loss 最高的图片显示出来看看详细有什么问题。

输出的结果反响出了从互联网上抓来的数据存在的范例问题:噪声太多。
比如电视的搜索结果里有电视遥控器、电视盒子、电视剧海报,还有一些是完备无关的结果。

FastAI 供应了一个 cleaner 可以帮助我们比拟较小的数据集做手动洗濯。
它可以把全体数据集中 loss 最高的图片列出来让用户可以手动修正标签或者删除。

from fastai2.vision.widgets import ImageClassifierCleanercleaner = ImageClassifierCleaner(learner)cleaner

把稳 cleaner 只是做标记,你须要用 Python 代码来做实际处理。
我常日就直接把有问题的图片标记为 delete 然后删除。

for idx in cleaner.delete(): cleaner.fns[idx].unlink()

清理完之后重复演习的过程。

objects = DataBlock( blocks=(ImageBlock, CategoryBlock), get_items=get_image_files, splitter=RandomSplitter(valid_pct=0.2, seed=42), get_y=parent_label, item_tfms=Resize(128))objects = objects.new( item_tfms=RandomResizedCrop(224, min_scale=0.5), batch_tfms=aug_transforms())dls = objects.dataloaders(path)learner = cnn_learner(dls, resnet18, metrics=error_rate)learner.fine_tune(3)

如果你把稳到 error_rate 在后面的 epoch 有上升的话,可以降落 fine_tune 的参数以达到最好的效果。
由于如果演习轮数过多,模型会对演习集 over fit,在碰着新数据时缺点率会变高。
从上面的输出可以看到准确率提高到了 96% 以上。

达到满意的准确率后就可以把模型导出用到线上了。
下面这行代码会把模型保存到 export.pkl。

learner.export()后端 API

后端 API 是这个项目最大略的一部分,只有一个 endpoint。
加载前面导出的模型,收到新图片时用模型来预测分类就可以。

trump = load_learner('model.pkl')@app.route('/api/1.0/classify-image', methods=['POST'])def classify(): image = request.files['image'] res = trump.predict(image.read()) response = jsonify({'result': res[0]}) response.status_code = 200 return response

完全的代码在 GitHub 上 [3]。
按照文档 [4] 支配到 LeanCloud 云引擎就行。

前端网站

前端也比较大略,只须要一个页面让用户上传照片,在浏览器里把照片缩小然后发送给后端 API 就可以。
完全的 React 项目在 GitHub [5],紧张的代码在 App.js [6]。
限于篇幅就不详细解释了,只附上一张运行的截图:

给读者的作业

你可能已经把稳到上面的后端 API 做事是无状态的,没有存储任何数据,以是实在识别的过程可以在前端完成。
如果你有兴趣的话,可以调研一下如何把 PyTorch 模型转化为 JavaScript 可用的模型,考试测验在浏览器里直接识别照片。
在真实的运用中,这样的办法由于不须要向做事端传输任何数据,可以完美地保护用户隐私,这也是 Apple 在推动的 on-device machine learning 的方向。

图片识别是机器学习可以办理的最大略的一类问题,由于有很多现成的结果可以重用,新的运用纵然只有少量演习数据也能达到比较好的效果。
还有很多其它类型的问题没有那么随意马虎得到让人满意的结果。
LeanCloud 目前正在开拓机器学习方面的新产品,以帮助开拓者更随意马虎地发掘数据的代价。
你如果对此感兴趣,可以关注我们的微博、微信"大众号、Twitter,或者注册成为 LeanCloud 用户。
不久后我们会公布更多信息,并约请一些用户试用新产品。

参考链接:

[1] https://url.leanapp.cn/n2u44Zn

[2] https://url.leanapp.cn/cWYXeuk

[3] https://url.leanapp.cn/acdrnbK

[4] https://url.leanapp.cn/g6EAin0

[5] https://url.leanapp.cn/C3NsK6Z

[6] https://url.leanapp.cn/3W94M5Y

标签:

相关文章

php教程240技巧_推耽美本钱

到随安树洞公主号回答关键字即可得到资源1《扞格难入》by巫哲类型:年上 救赎求文关键词:扞格难入txt大小:1.09MB文案:第一...

PHP教程 2024-12-09 阅读0 评论0