保时捷分类器-以95%的准确率识别保时捷车型

2020-10-29 10:30:56

使用Fastai-v3、pytorch和Gradient进行培训。使用resnet50,在NVIDIA Quadro P5000上进行培训。构建在坞站上,并托管在Microsoft Azure Web服务上。在包含30000款不同质量的保时捷车型的公开来源图像数据集上进行培训。保时捷汽车,特别是最新一代的Panamera/Taycan,Macan/Cayenne&Amp911/718对于一个不太关注的外行来说可能很难区分,这就是为什么我想测试这种深度学习模型会获得什么样的功能。

在本教程中,我们将了解如何通过Google Images轻松创建图像数据集。注意:对于任何你想用谷歌搜索的新类别,你都必须重复这些步骤(例如,一次针对狗,一次针对猫)。

转到谷歌图片,搜索你感兴趣的图片。你在谷歌搜索中越具体,搜索结果就越好,你需要做的手动修剪就越少。

向下滚动,直到您看到要下载的所有图像,或者直到您看到一个按钮,上面写着“显示更多结果”。您滚动过的所有图像现在都可以下载。要获取更多信息,请单击该按钮,然后继续滚动。Google Images最多显示700张图片。

将您想要排除的内容放入搜索查询中是一个好主意,例如,如果您正在搜索欧亚狼“canis lupus lupus”,那么排除其他变体可能是个好主意:

您还可以通过单击工具并从类型下拉列表中选择照片,将结果限制为仅显示照片。

现在,您必须在浏览器中运行一些Javascript代码,该代码将为您的数据集保存您想要的所有图像的URL。

在Google Chrome中,在Windows/Linux上按CtrlShiftj,在MacOS上按CmdOptj,会出现一个名为javascript“控制台”的小窗口。在Firefox中,按CtrlShiftk(Windows/Linux)或CmdOptk(MacOS)。这就是您将粘贴JavaScript命令的位置。

您需要获取每个图像的URL。在运行以下命令之前,您可能需要禁用广告拦截扩展(uBlock、AdBlockPlus等)。在Chrome中。否则,window.open()命令不起作用。然后,您可以运行以下命令:

为带标签的图像选择适当的名称。您可以多次运行这些步骤来创建不同的标签。

In[0]:Folder=';718';file=';718.csv';in[0]:Folder=';911';file=';911.csv';in[0]:Folder=';cayenne';file=';cayenne.csv';Folder=';Macan';file=';macan.csv';In[0]:Folder=';taycan';file=';taycan.csv';in[0]:Folder=';Panamera';file=';panamera.csv';

In[0]:path=path(';data/Porsche';)DEST=path/Folder dest.mkdir(Parents=True,Exist_ok=True)in[0]:path.ls()out[0]:[PosiPath(';data/Porsche/Cayenne';),PosiPath(';data/Porsche/panamera.csv';),PosiPath(';data/Porsche/cayenne.csv';),PosixPath(';data/Porsche/Panamera.csv';),PosixPath(';data/Porsche/Panamenne.csv';),PosiPath(';data/Porsche/Panamerne.csv';)。)、PosiPath(';data/Porsche/taycan';)、PosiPath(';data/Porsche/911.csv';)、PosiPath(';data/Porsche/taycan.csv';)、PosiPath(';data/Porsche/911';)、PosiPath(';data/Porsche/macan.csv';)、PoSixPath(';data/Porsche/718';)、PoSixPath(';data/Porsche/718';)、PoSixPath(';data/Porsche/718';)、PoSixPath(';data/Porsche/718';)、PoSixPath(';data/Porsche/718';)。Data/Porsche/718.csv';),PosiPath(';Data/Porsche/Macan';)]。

最后,上传您的URL文件。您只需在工作目录中按“上载”并选择您的文件,然后为每个显示的文件单击“上载”即可。

Ast.ai有一个函数可以让您这样做。您只需指定URL文件名和目标文件夹,此功能将下载并保存所有可以打开的图像。如果在打开它们时出现问题,将不会保存它们。

让我们下载我们的图片吧!请注意,您可以选择要下载的最大图像数量。在这种情况下,我们不会下载所有URL。

在[0]:CLASS=[';taycan';,';Panamera';,';Macan&39;,';Cayenne&39;,';718';,';911';]in[0]:download_images(path/file,est,max_picts=500)in[0]:#如果下载有问题,请尝试使用`max_worker=0`查看异常:download_images(path/file,est,max_picks=20,max_worker=0)``然后我们可以移除所有可以'的镜像;T被打开:`python in[0]:对于类中的c:print(C)VERIFY_IMAGES(path/c,delete=True,max_size=500)taycan Panamera Macan cayenne 718 911`#查看数据``python in[0]:np随机.Seed(42)data=ImageDataBunch.from_Folder(path,train=";.";;,valid_pct=0.2,ds_tfms=get_transforms(),size=224,num_worker=4).Normalize(ImageNet_Stats)in[0]:#如果您已经清理了数据,请运行此单元格,而不是np.随机.Seed(42)data=ImageDataBunch.from_csv(path,Folder=";.";,Valid_pct=0.2,CSV_Labels=';Cleaned.csv';,DS_tfms=get_transforms(),size=224,num_worker=4).ize(ImageNet_Stats)``好!那么让我们看看我们的一些照片吧。``pythonIn[0]:data.classesOut[0]:[';718';,';911';,';cayenne&39;,';Macan';,';Panamera';,';taycan';]in[0]:data.show_Batch(row=6,figsize=(7,8))in[0]:data.class,data.c,len(data.ran_ds),len(data.valid_ds)out[0]:([';718';,';911';,';cayenne';,';Macan';,';Panamera';,';taycan';],6,1920,480)

在[0]中:在[0]中学习.save(';Stage-1&39;)在[0]中:在[0]:学习.lr_find()25.00%[1/4 00:12<;00:37]```pech|TRAIN_LOSS|VALID_LOSS|ERROR_RATE|TIME-|-0|0.196860|#na#|00:1283.33%[25/30 00:10<;00:02 0.6416]LR查找器完成后,键入{LELENER_NAME}.recorder.lot()查看图形。`in[0]:#如果绘图没有显示,请尝试给出开始和结束学习速率#learn.lr_find(start_LR=1e-5,end_lr=1e-1)Learning.recorder.lot()in[0]:Learning.fit_one_Cycle(2,max_LR=Slice(3e-5,3e-4))EPOCH TRAIN_LOSS VALID_LOSS ERROR_RATE TIME 0 0.280386 1.524914 0.372917 00:13 1 0.276844 1.312542 0.345833 00:13IN[0]:Learning.save(';Stage-2';)`#解释在[0]中:Learning.load(';Stage-2';);在[0]中:interp=ClassficationInterpretation.From_learner(LEARN)in[0]:interp.lot_conflomy_Matrix()#清理升级由于我们的模型表现不佳,我们的一些最大损失不在此列。我们的数据集中有一些不应该出现的图像。使用来自fast ai.widgets的ImageCleaner小部件,我们可以修剪掉最大的损失,删除不属于我们的照片。[0]中的``:从fast ai.widgets import\*`首先需要从top_loses获取文件路径。我们可以使用.from_toplosses执行此操作。然后,我们将顶级损失指数和相应的数据集提供给ImageCleaner。请注意,该小部件不会直接从磁盘删除图像,但它将创建一个新的CSV文件Cleaned.csv,您可以从该文件中创建具有更正标签的新ImageDataBunch,以继续训练您的模型。[0]中的``:db=(ImageList.from_older(Path).plit_one().label_from_older().Transform(get_transforms(),size=224).database unch())in[0]:#如果您已经使用`From_toplosses`中的索引清理了数据,#请运行此单元格而不是前面的单元格以继续删除重复项。#否则,上一步的所有结果将被#新运行的`ImageCleaner`覆盖。DB=(ImageList.from_csv(路径,已清理.csv;,文件夹=。';).Split_None().label_from_df().transform(get_transforms(),size=224).databunch())``然后我们创建一个新的学习者,以便对所有图像使用新的数据库。[0]中的``:Learning_cln=cnn_learner(db,model s.resnet50,metrics=error_rate)Learning_cln.load(';Stage-2&39;);in[0]:ds,idxs=DatasetForMatter().From_toplosses(Learning_Cln)in[0]:#Don';不要在Google CoLab或任何其他运行jupyter实验室的实例中运行此命令。#如果您确实在Jupyter Lab上运行此程序,则需要重新启动运行时,并且包括所有本地变量的#运行时状态将会丢失。ImageCleaner(ds,idxs,path)`Hbox(Child=(Vbox(Child=(Image(Value=b';\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x00 d\x00d\x00\x00\xff…。BUTTON(BUTTON_STYLE=';PRIMARY';,Description=';Next Batch';,Layout=Layout(width=';auto';),Style=ButtonStyle())通过单击';删除';标记要删除的照片。然后单击下一批以删除已标记的照片,并将其余照片保留在该行中。ImageCleaner将向您显示新的一行图像,直到没有更多图像可显示。在这种情况下,小部件将显示图像,直到top_losses.ImageCleaner(ds,idxs)中没有图像为止。您还可以在数据集中找到重复项并将其删除!要做到这一点,您需要运行.From_Similars来获取潜在的重复ID,然后在Duplicate=True的情况下运行ImageCleaner。API的工作方式与错误分类的映像类似:只需选择要删除的映像,然后单击下一批,直到没有其他映像。请确保重新创建数据库并从Cleaned.csv文件学习_CLN。否则,该文件将被从头开始覆盖,从而丢失从toploses中清除数据的所有结果。`在[100.00]中:ds,idxs=DatasetForMatter().From_Similars(LEARN_CLN)正在获取激活...100.00%[36/36 00:05<;00:00]计算相似性...在[0]中:图像清洗器(DS,IDX,PATH,DUPLICATES=TRUE)Hbox(子项=(子项=(映像(值=b';\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x00 d\x00 d\x00\x00\xff…。BUTTON(BUTTON_STYLE=';PRIMARY';,description=';Next Batch';,Layout=Layout(width=';auto';),style=ButtonStyle())`记住从清理的.csv重新创建ImageDataBunch,以包括您在数据中所做的更改!#首先要将模型投入生产,让';的导出Learner对象的内容用于生产:``In[0]:Lear.export()`这将创建一个名为';export.pkl';的文件。在我们工作的目录中,包含部署模型所需的所有内容(模型、权重,但也包含一些元数据,如使用的类或转换/规范化)。您可能希望使用CPU进行推理,除非是大规模的(而且您几乎肯定不需要&#