不知道大家在日常生活中有沒有朋友或是妹子看見一輛車艾帐,突然問道:這是什么車定躏?
或者我們逛論壇時經常會看見有人傳一張照片然后問:這是什么車患雇?
就像下圖這樣
其他人還好临梗,如果是妹子問,你答不出來荧止,咱面子上掛不住啊~
但是除了老司機屹电,我們不可能每輛車都能說出名稱來,尤其是僅僅憑借汽車內飾或者一些局部特寫跃巡。
那么我們能不能制作一個汽車識別程序危号,讓程序自動識別車型呢。
今天我決定通過卷積神經網絡素邪,從頭實現(xiàn)一個汽車識別分類器外莲。
大體流程如下
- 爬取數(shù)據(jù)、清洗數(shù)據(jù)
- 搭建模型兔朦、訓練模型
- 模型識別汽車圖像
先表明一下操作環(huán)境:
操作系統(tǒng):ubuntu18.04
python版本:3.7
pytorch版本:1.2
GPU:1060
CUDA:10.1
另外:ubuntu自帶的輸入法真難用偷线,如果有錯別字請自行聯(lián)想:)
爬取數(shù)據(jù)篇
這里爬取的目標是汽車之家圖片板塊下關注度排行的各類型(如微型車磨确、小型車、SUV等)下的汽車各9種淋昭。合集應該是81種(但是我爬取了90種俐填,可能是HTML里多了一類汽車的鏈接)
點擊其中一個汽車(比如奔馳AMG GT),是此汽車的分類目錄翔忽,如下圖
將此分類下的圖像全部爬取下來英融。以便網絡可以識別汽車的不同角度以及各種局部信息。
爬取的結果如以下圖展示:
可以看到圖片數(shù)據(jù)全部放在了all_cars這個文件夾下歇式,并且按車類放在了各自的文件夾里驶悟。一共16萬多張圖片,占用3.5G材失。
另外值得一提的是痕鳍,為了節(jié)省抓取時間和訓練時間以及儲存空間~×蓿~
我抓取的是展示用的縮略圖(圖像尺寸為200 * 180)笼呆,并非為1024 * 768的原圖。
下面貼出爬蟲代碼(car.py)
import requests
from lxml import etree
from os.path import join
import os
import time
base_url = 'https://car.autohome.com.cn'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
}
# 獲取html文檔旨别,方便下面的函數(shù)調用
def get_html(url):
r = requests.get(url, headers=headers)
r.encoding = r.apparent_encoding
html = etree.HTML(r.text)
return html
# 獲取汽車的名稱和圖冊鏈接
def get_car(url):
html = get_html(url)
links = html.xpath('//div[@id="levelContent"]/div/ul/li/a/@href')
for link in links:
link = base_url + link
get_calsses(link)
# 獲取汽車的各分類的圖冊鏈接
def get_calsses(url):
html = get_html(url)
links = html.xpath('//ul[@class="search-pic-sortul"]/li/a/@href')
for link in links:
link = base_url+link
get_img_url(link)
# 獲取圖片地址
def get_img_url(url):
html = get_html(url)
links = html.xpath('//div[@class="uibox-con carpic-list03 border-b-solid"]/ul/li/a/img/@src')
name = html.xpath('//h2[@class="fn-left cartab-title-name"]/a/text()')[0]
for link in links:
link = 'https:' + link
# print(link)
save_img(name, link)
try:
next_page = html.xpath('//div[@class="page"]/a[last()]/@href')[0]
next_page = base_url + next_page
if 'html' in next_page:
get_img_url(next_page)
time.sleep(0.5)
except:
pass
# 保存圖片
def save_img(name, url):
img_name = url.split('_')[-1]
img = requests.get(url, headers=headers)
root = join('cars', name)
filename = join(root, img_name)
if not os.path.exists(root):
os.makedirs(root)
with open(filename, 'wb') as f:
f.write(img.content)
print('正在下載:', filename)
if __name__ == '__main__':
url = 'https://car.autohome.com.cn/pic/index.html'
get_car(url)
print('下在完成诗赌!')
最后說一下,爬蟲爬取下來的可能會有錯誤的秸弛,會給訓練帶來麻煩铭若,這里再貼出清理錯誤的圖片的代碼。
import imghdr
import os
from torchvision.datasets import ImageFolder
data_set = ImageFolder('./all_cars')
print(data_set.imgs)
for img, _ in data_set.imgs:
img_type = imghdr.what(img)
if img_type == None:
os.remove(img)
print('已刪除無效文件:', img)
OK, 數(shù)據(jù)爬取和清洗已經介紹完了递览,改天我換個搜狗輸入法叼屠,繼續(xù)~