深度學(xué)習(xí)車(chē)型識(shí)別APP(畢業(yè)設(shè)計(jì))

簡(jiǎn)介

通過(guò)深度學(xué)習(xí)技術(shù)搭建殘差網(wǎng)絡(luò)捎迫,使用CompsCars數(shù)據(jù)集 進(jìn)行車(chē)型識(shí)別模型的訓(xùn)練,并將訓(xùn)練好的模型移植到了Android端头滔,實(shí)現(xiàn)了通過(guò)手機(jī)掃一掃的方式進(jìn)行汽車(chē)車(chē)型識(shí)別的功能蝠检。

項(xiàng)目涉及到的技術(shù)點(diǎn)較多沐鼠,需要開(kāi)發(fā)者有一定的技術(shù)功底。如:python語(yǔ)言的使用、深度學(xué)習(xí)框架pytorch的使用饲梭、爬蟲(chóng)腳本的理解乘盖、Java語(yǔ)言的使用、Android平臺(tái)架構(gòu)的理解等等排拷。

雖然屬于跨語(yǔ)言開(kāi)發(fā),但是要求并不高锅尘,只要達(dá)到入門(mén)級(jí)別即可看懂本項(xiàng)目监氢,并可以嘗試一些定制化的改造。畢竟框架已經(jīng)搭建好了藤违,只需要修改數(shù)據(jù)源浪腐、重新訓(xùn)練出模型,就可以實(shí)現(xiàn)一款新的應(yīng)用啦顿乒。


最終效果

以下視頻將展示所有功能完成后的APP的使用情況议街。

https://www.bilibili.com/video/BV1Pk4y1B7qK

模型訓(xùn)練精度

以下是使用Resnet-34進(jìn)行400次車(chē)型識(shí)別訓(xùn)練的 train-validation圖表。

loss.png

以下是使用Resnet-34進(jìn)行400次車(chē)型識(shí)別訓(xùn)練 Top-1的錯(cuò)誤率璧榄。

top1.png

以下是使用Resnet-34進(jìn)行400次車(chē)型識(shí)別訓(xùn)練 Top-5的錯(cuò)誤率特漩。

top5.png

掃一掃識(shí)別功能

以下是移植到android平臺(tái)后進(jìn)行識(shí)別的結(jié)果展示圖。


UtcItH.png

使用的技術(shù)&框架

  • 開(kāi)發(fā)語(yǔ)言:Python骨杂、Java
  • 技術(shù)框架:pytorch涂身、resnet-34、Android平臺(tái)
  • 可選借助平臺(tái):百度AI平臺(tái)
  • 項(xiàng)目構(gòu)成:模型訓(xùn)練項(xiàng)目搓蚪、爬蟲(chóng)項(xiàng)目蛤售、APP開(kāi)發(fā)項(xiàng)目

軟/硬件需求

機(jī)器要求

因?yàn)樯婕暗綑C(jī)器學(xué)習(xí)模型訓(xùn)練,所以你應(yīng)該擁有一臺(tái)用來(lái)訓(xùn)練模型的機(jī)器妒潭,且需要搭載支持CUDA的GPU(如:GeForce悴能、GTX、Tesla等)雳灾,顯存大小漠酿,自然是越大越好。

本人項(xiàng)目環(huán)境:

  • windows10 專(zhuān)業(yè)版谎亩;GeForce MAX150记靡;獨(dú)顯 2G;1T硬盤(pán)

也就是說(shuō)這是最低配了团驱,你至少要和我同一配置摸吠。

開(kāi)發(fā)工具

  • Pycharm:用來(lái)訓(xùn)練模型、pyhton爬蟲(chóng)嚎花、模型移植腳本
  • Android Studio:用來(lái)開(kāi)發(fā)安卓APP

數(shù)據(jù)集

數(shù)據(jù)集是項(xiàng)目最重要的一部分寸痢,有了數(shù)據(jù)集才能開(kāi)始訓(xùn)練

本項(xiàng)目使用的是 香港中文大學(xué)的CompCars細(xì)粒度汽車(chē)數(shù)據(jù)集

CompCars數(shù)據(jù)集

需要的同學(xué)可以私聊找我要網(wǎng)盤(pán)鏈接紊选。


各模塊介紹

模型訓(xùn)練

Github 地址:pytorch_train 歡迎 star/issue

UtyvKf.png

訓(xùn)練模型主要分為五個(gè)模塊:?jiǎn)?dòng)器啼止、自定義數(shù)據(jù)加載器道逗、網(wǎng)絡(luò)模型、學(xué)習(xí)率/損失率調(diào)整以及訓(xùn)練可視化献烦。

啟動(dòng)器是項(xiàng)目的入口滓窍,通過(guò)對(duì)啟動(dòng)器參數(shù)的設(shè)置,可以進(jìn)行很多靈活的啟動(dòng)方式巩那,下圖為部分啟動(dòng)器參數(shù)設(shè)置吏夯。

UtciwD.png

任何一個(gè)深度學(xué)習(xí)的模型訓(xùn)練都是離不開(kāi)數(shù)據(jù)集的,根據(jù)多種多樣的數(shù)據(jù)集即横,我們應(yīng)該使用一個(gè)方式將數(shù)據(jù)集用一種通用的結(jié)構(gòu)返回噪生,方便網(wǎng)絡(luò)模型的加載處理。

Utc9OK.png

這里使用了殘差網(wǎng)絡(luò)Resnet-34东囚,代碼中還提供了Resnet-18跺嗽、Resnet-50、Resnet-101以及Resnet-152页藻。殘差結(jié)構(gòu)是通過(guò)一個(gè)快捷連接桨嫁,極大的減少了參數(shù)數(shù)量,降低了內(nèi)存使用份帐。

以下為殘差網(wǎng)絡(luò)的基本結(jié)構(gòu)和Resnet-34 部分網(wǎng)絡(luò)結(jié)構(gòu)圖瞧甩。

UtcPeO.png
Utcn6P.png

除了最開(kāi)始看到的train-val圖表、Top-弥鹦、Top-5的error記錄表以外肚逸,在訓(xùn)練過(guò)程中,使用進(jìn)度條打印當(dāng)前訓(xùn)練的進(jìn)度彬坏、訓(xùn)練精度等信息朦促。打印時(shí)機(jī)可以通過(guò)上邊提到的 啟動(dòng)器 優(yōu)雅地配置。

Utc3kQ.png

以下為最終的項(xiàng)目包架構(gòu)栓始。

pytorch_train
  |-- data                -- 存放讀取訓(xùn)練务冕、校驗(yàn)、測(cè)試數(shù)據(jù)路徑的txt
  |   |-- train.txt       
  |   |-- val.txt
  |   |-- test.txt
  |-- result              -- 存放最終生成訓(xùn)練結(jié)果的目錄
  |-- util                -- 模型移植工具
  |-- clr.py              -- 學(xué)習(xí)率
  |-- dataset.py          -- 自定義數(shù)據(jù)集
  |-- flops_benchmark.py  -- 統(tǒng)計(jì)每秒浮點(diǎn)運(yùn)算次數(shù)
  |-- logger.py           -- 日志可視化
  |-- mobile_net.py       -- 網(wǎng)絡(luò)模型之一 mobile_net2
  |-- resnet.py           -- 網(wǎng)絡(luò)模型之一 Resnet系列
  |-- run.py              -- 具體執(zhí)行訓(xùn)練幻赚、測(cè)試方法
  |-- start.py            -- 啟動(dòng)器
UtgkuV.png

數(shù)據(jù)抓取

Github 地址:crawer/dongchedi 歡迎 star/issue

UtyXxP.png

最終獲取的數(shù)據(jù)如下圖:

Utc8Yj.png

模型移植

Github 地址:pytorch_train/transfor

import os

import torch
import torchvision

model_pth = os.path.join("results", "2020-04-27_10-27-17", 'checkpoint.pth.tar')
# 將resnet34模型保存為Android可以調(diào)用的文件
mobile_pt = os.path.join("results", "2020-04-27_10-27-17", 'resnet34.pt')
num_class = 13
device = 'cpu'  # 'cuda:0'  # cpu

model = torchvision.models.resnet34(num_classes=num_class)
model = torch.nn.DataParallel(model, [0])
model.to(device=device)

checkpoint = torch.load(model_pth, map_location=device)
model.load_state_dict(checkpoint['state_dict'])

model.eval()  # 模型設(shè)為評(píng)估模式
# 1張3通道224*224的圖片
input_tensor = torch.rand(1, 3, 224, 224)  # 設(shè)定輸入數(shù)據(jù)格式
traced_script_module = torch.jit.trace(model.module, input_tensor)  # 模型轉(zhuǎn)化
traced_script_module.save(mobile_pt)  # 保存文件

安卓界面&數(shù)據(jù)走向

Github 地址:carIdentify 歡迎 star/issue

UtyO2t.png

實(shí)現(xiàn)了以下功能:

  • 調(diào)用攝像頭權(quán)限自動(dòng)申請(qǐng)
  • 攝像頭預(yù)覽
  • 讀取pytorch訓(xùn)練模型
  • 調(diào)用第三方接口禀忆,精準(zhǔn)預(yù)測(cè)

最終界面展示:

UtgABT.png

安卓項(xiàng)目結(jié)構(gòu)如圖:

UtgEHU.png

使用方式

啟動(dòng)模型訓(xùn)練

啟動(dòng)前需要確保你已經(jīng)有了本項(xiàng)目使用的數(shù)據(jù)集 CompCars

重新開(kāi)始新的訓(xùn)練

python start.py --data_root "./data" --gpus 0,1,2 -w 2 -b 120 --num_class 13
  • --data_root 數(shù)據(jù)集路徑位置
  • --gups 使用gpu訓(xùn)練的塊數(shù)
  • -w 為gpu加載自定義數(shù)據(jù)集的工作線(xiàn)程
  • -b 用來(lái)gpu訓(xùn)練的 batch size是多少
  • --num_class 分類(lèi)類(lèi)別數(shù)量

使用上次訓(xùn)練結(jié)果繼續(xù)訓(xùn)練

python start.py --data_root "./data" --gpus 0,1,2 -w 2 -b 120 --num_class 13 --resume "results/2020-04-14_12-36-16"
  • --data_root 數(shù)據(jù)集路徑位置
  • --gups 使用gpu訓(xùn)練的塊數(shù)
  • -w 為gpu加載自定義數(shù)據(jù)集的工作線(xiàn)程
  • -b 用來(lái)gpu訓(xùn)練的 batch size是多少
  • --num_class 分類(lèi)類(lèi)別數(shù)量
  • --resume 上次訓(xùn)練結(jié)果文件夾,可繼續(xù)上次的訓(xùn)練

模型移植

將訓(xùn)練好的模型轉(zhuǎn)換為Android可以執(zhí)行的模型

python transfor.py

項(xiàng)目定制化

  • 找尋自己的數(shù)據(jù)集
  • 需要修改啟動(dòng)腳本中 --num_class落恼,模型類(lèi)別

目前項(xiàng)目中具備很多備注記錄箩退,稍加review代碼就可以理解,如有不清楚佳谦,可以私信詢(xún)問(wèn)戴涝。

啟動(dòng)APP

APP下載鏈接:https://pan.baidu.com/s/1X7tobj4R302WmGu116-2mg 提取碼: 1606

  • 安裝完成后
  • 同意調(diào)用系統(tǒng)相機(jī)權(quán)限
  • 使用掃一掃對(duì)準(zhǔn)汽車(chē)
  • 稍后將會(huì)展示識(shí)別后的結(jié)果和識(shí)別的圖片

具體使用方式,可參見(jiàn):https://www.bilibili.com/video/BV1Pk4y1B7qK

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啥刻,隨后出現(xiàn)的幾起案子奸鸯,更是在濱河造成了極大的恐慌,老刑警劉巖可帽,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娄涩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡映跟,警方通過(guò)查閱死者的電腦和手機(jī)蓄拣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)申窘,“玉大人弯蚜,你說(shuō)我怎么就攤上這事孔轴√攴ǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵路鹰,是天一觀的道長(zhǎng)贷洲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)晋柱,這世上最難降的妖魔是什么优构? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮雁竞,結(jié)果婚禮上钦椭,老公的妹妹穿的比我還像新娘。我一直安慰自己碑诉,他們只是感情好彪腔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著进栽,像睡著了一般德挣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上快毛,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天格嗅,我揣著相機(jī)與錄音,去河邊找鬼唠帝。 笑死屯掖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的襟衰。 我是一名探鬼主播懂扼,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了阀湿?” 一聲冷哼從身側(cè)響起赶熟,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陷嘴,沒(méi)想到半個(gè)月后映砖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灾挨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年邑退,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劳澄。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡地技,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秒拔,到底是詐尸還是另有隱情莫矗,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布砂缩,位于F島的核電站作谚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庵芭。R本人自食惡果不足惜妹懒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望双吆。 院中可真熱鬧眨唬,春花似錦、人聲如沸好乐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曹宴。三九已至搂橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笛坦,已是汗流浹背区转。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留版扩,地道東北人废离。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像礁芦,于是被迫代替她去往敵國(guó)和親蜻韭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悼尾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355