利用python爬取特定類別圖片---labelimg制作自己的目標檢測數據集


最近一直在學習神經網絡,一方面是課題需要,另一方面是因為機器學習已經逐漸成為社會的潮流,各行各業都可以見到神經網絡的應用,不學習一下都覺得自己落伍了。趁着這段時間沒辦法開學,好好學習了一些神經網絡的基礎內容,也試着把神經網絡運用到自己的課題中來,今天在試驗SSD目標檢測網絡的時候,發現要制作自己的訓練集首先需要有訓練的圖片,可是一張一張找實在麻煩,找到了,逐個保存,最好還要改成統一的名稱。百度找圖找了幾張,放棄了。。。幾百張下去可能眼睛瞎了。

如果可以有一個程序自動找到我要的圖片類型,還可以順便修改統一名稱保存到一個目錄就好了。。。

又開始了百度:如何爬取網頁里的圖片?  畢竟對網頁代碼不熟悉,只能求助於百度了(面向百度編程呀。。。)

 大概原理分析:

1、首先打開chorm瀏覽器,進入百度搜索  “自己要搜的圖片”,按下F12,進入開發者模式,就會看到如下所示,右邊就是網頁代碼(看不懂沒關系,我也不懂)

 

2、點擊右側的Network,鼠標滾輪在左邊圖片區域往下滑兩下(圖片是動態加載出來的,不滑兩下Network下看不到東西)

點擊XHR,在Name區域選擇一個acjson?.......雙擊,就會出現右下角的小框,選擇Headers,鼠標往下滑,找到Querry String Paramters。

 

 

Querry String Paramters表示什么呢,主要是發現這里有一個參數querryWord:工業指針式儀表 --------是的這就是我的查詢關鍵字

   其中的 word  指的是搜索關鍵字, pn 指的是第幾頁圖片,  rn 值得是每頁有30張圖片,那程序的目的就是對百度圖片網址+這一系列參數進行解析

百度圖片搜索的url為  https://image.baidu.com/search/acjson

將Querry String Paramters里面的搜索關鍵字設置為可改變的參數。如上圖所示,設置為keyword

得到網址解析后的數據后就可以對其中的圖片進行下載保存了參考https://www.jianshu.com/p/46287bd8559b  

 

  利用request.get()對網頁進行請求訪問,再調用json()方法進行解析,實現對圖片的爬取保存,總體代碼如下:

要記得在python中安裝requests module :pip install requests 即可

 

import requests
import os
def getManyPages(keyword, pages):
    params = []
    for i in range(30, 30 * pages + 30, 30):
        params.append({
            'tn': 'resultjson_com',
            'ipn': 'rj',
            'ct': 201326592,
            'is': '',
            'fp': 'result',
            'queryWord': keyword,
            'cl': 2,
            'lm': -1,
            'ie': 'utf-8',
            'oe': 'utf-8',
            'adpicid': '',
            'st': -1,
            'z': '',
            'ic': 0,
            'word': keyword,
            's': '',
            'se': '',
            'tab': '',
            'width': '',
            'height': '',
            'face': 0,
            'istype': 2,
            'qc': '',
            'nc': 1,
            'fr': '',
            'pn': i,
            'rn': 30,
            'gsm': '1e',
            '1488942260214': ''
        })
    url = 'https://image.baidu.com/search/acjson'
    urls = []
    for i in params:
        urls.append(requests.get(url, params=i).json().get('data'))
    return urls


def getImg(dataList, localPath):
    if not os.path.exists(localPath):  # 新建文件夾
        os.mkdir(localPath)
    x = 0

    for list in dataList:

        for i in list:

            if i.get('thumbURL') != None:

                print('正在下載中:%s' % i.get('thumbURL'))

                ir = requests.get(i.get('thumbURL'))

                open(localPath + '%d.jpg' % x, 'wb').write(ir.content)

                x += 1

            else:
                print('該圖片鏈接不存在')

if __name__ == '__main__':
    dataList = getManyPages('工業指針式儀表', 2)  # 參數1:關鍵字,參數2:要下載的頁數

    getImg(dataList, 'data/yibiao/')  # 參數2:指定保存的路徑

 

運行結果:

 

 

 保存到本地文件夾的圖片:

 

爬取到圖片后人工對圖片進行適當的篩選,刪掉部分不符和要求的圖片,就可以利用Labelimg進行圖片的標注了

首先確定安裝有labelimg  安裝方式也簡單: 打開python終端運行  pip install labelImg 即可

安裝后在python終端下輸入labelimg運行即可,因為我使用的是anaconda3的python開發環境,因此打開的是anaconda prompt

   運行后就會出現運行界面

 

 

 

 點擊open dir 選擇到自己下載的圖片的路徑

 

 

 

 選擇Changes Save Dir :新建一個Annotations文件夾專門用來存放標簽數據

 

 

 

點擊creat/nRectBox 或者直接快捷鍵w 可以標注圖片,框選目標最小區域,保存為對應的類別如cat,保存xmlz標注文件(在Annotations里面),點擊切換到下一張繼續標注。希望快一點的可以設置view下的自動保存,用快捷鍵 A和D實現上一張、下一張的切換。

 

 

 

 

 

 

 標注是沒有辦法偷懶的,只能一張一張進行標注,幾個小時標注是很正常的哈,如果一張圖片里有多個目標物,就多次創建標注框即可

保存的標注文件:

 

 打開一個看一看:

yibiao是類別名稱

有文件路徑,文件名,圖片的尺寸大小,目標框的邊框點坐標bndBox等信息

<annotation>
	<folder>yibiao</folder>
	<filename>1.jpg</filename>
	<path>E:\CV\qianyixuexi\ssd-keras-master\data\yibiao\1.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>286</width>
		<height>285</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>class1</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>5</xmin>
			<ymin>3</ymin>
			<xmax>283</xmax>
			<ymax>279</ymax>
		</bndbox>
	</object>
</annotation>

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM