簡(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圖表。
以下是使用Resnet-34進(jìn)行400次車(chē)型識(shí)別訓(xùn)練 Top-1的錯(cuò)誤率璧榄。
以下是使用Resnet-34進(jìn)行400次車(chē)型識(shí)別訓(xùn)練 Top-5的錯(cuò)誤率特漩。
掃一掃識(shí)別功能
以下是移植到android平臺(tái)后進(jìn)行識(shí)別的結(jié)果展示圖。
使用的技術(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ù)集。
需要的同學(xué)可以私聊找我要網(wǎng)盤(pán)鏈接紊选。
各模塊介紹
模型訓(xùn)練
Github 地址:pytorch_train 歡迎 star/issue
訓(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è)置吏夯。
任何一個(gè)深度學(xué)習(xí)的模型訓(xùn)練都是離不開(kāi)數(shù)據(jù)集的,根據(jù)多種多樣的數(shù)據(jù)集即横,我們應(yīng)該使用一個(gè)方式將數(shù)據(jù)集用一種通用的結(jié)構(gòu)返回噪生,方便網(wǎng)絡(luò)模型的加載處理。
這里使用了殘差網(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)圖瞧甩。
除了最開(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)雅地配置。
以下為最終的項(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)器
數(shù)據(jù)抓取
Github 地址:crawer/dongchedi 歡迎 star/issue
最終獲取的數(shù)據(jù)如下圖:
模型移植
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
實(shí)現(xiàn)了以下功能:
- 調(diào)用攝像頭權(quán)限自動(dòng)申請(qǐng)
- 攝像頭預(yù)覽
- 讀取pytorch訓(xùn)練模型
- 調(diào)用第三方接口禀忆,精準(zhǔn)預(yù)測(cè)
最終界面展示:
安卓項(xiàng)目結(jié)構(gòu)如圖:
使用方式
啟動(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