手把手教你:圖像識別的垃圾分類系統


系列文章

手把手教你:人臉識別考勤系統

手把手教你:基於粒子群優化算法(PSO)優化卷積神經網絡(CNN)的文本分類


@



項目簡介

本文主要介紹如何使用python搭建:一個基於深度殘差網絡(ResNet)的圖像識別垃圾分類系統。

博主也參考過網上其他博主介紹:ResNet或圖像分類的文章,但大多是理論大於方法。很多同學肯定對原理不需要過多了解,只需要搭建出一個分類或預測系統即可。

本文只會告訴你如何快速搭建一個基於ResNet的圖像分類系統並運行,原理的東西可以參考其他博主

也正是因為我發現網上大多的帖子只是針對原理進行介紹,功能實現的相對很少。

如果您有以上想法,那就找對地方了!


不多廢話,直接進入正題!

一、項目架構

整個項目的程序流程圖如下,分別為:
1.圖像數據預處理
2.模型訓練
3.模型測試
三個模塊

程序流程

二、圖像數據

本文用到的垃圾圖片數據主要為以下四類:

1.廚余垃圾
2.可回收垃圾
3.其他垃圾
4.有害垃圾
如下:

圖像數據

其中每個類別又涉及多個子類別如,有害垃圾文件夾中,中又涉及以下多個類別:

有害垃圾

每類圖片數量及圖片總數情況如下,共計6038張圖像數據:

圖片數量

三、環境介紹

1.環境要求

本項目開發IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安裝指南非常多,這里就不再贅述。

因為本項目基於TensorFlow因此需要以下環境:

  • tensorflow==2.0
  • pandas
  • scikit-learn
  • numpy
  • OpenCV2
  • matplotlib

如下:
引入包

2.環境安裝實例

環境都可以通過pip進行安裝。如果只是想要功能跑起來,這邊建議tensorflow安裝cpu版的。

如果沒使用過pycharm通過pip安裝包的同學可以參考如下:

環境安裝方法
點開“終端”,然后通過pip進行安裝tensorflow,其他環境包也可以通過上面的方法安裝。

四、重要代碼介紹

1.圖像數據讀取和預處理

## 讀取圖像,解決imread不能讀取中文路徑的問題
def cv_imread(filePath):
    # 核心就是下面這句,一般直接用這句就行,直接把圖片轉為mat數據
    cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
    # imdecode讀取的是rgb,如果后續需要opencv處理的話,需要轉換成bgr,轉換后圖片顏色會變化
    # cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
    return cv_img

# 定義圖像獲取函數
def read_img(img_url_list,num):
    # 設置隨機數種子
    random.seed(999)
    imgs = []
    err_img = []
    if num>len(img_url_list):
        print("抱歉,出錯了,您設置的采樣數量大於了圖片張數,請調小img_num!")
    else:
        # 對圖片數量進行采樣
        img_url_list = img_url_list[:num]
        for img_url in tqdm(img_url_list):
            # 獲取圖像
            img = cv_imread(img_url)
            if img is None:
                err_img.append(img_url) 
            else:
                # skimage.transform.resize(image, output_shape)改變圖片的尺寸
                img = cv2.resize(img, (w,h))
                if np.asarray(img).shape == (w,h,3):
                    imgs.append(img)
                else:
                    err_img.append(img_url)
    return imgs

2.圖像數據增強

因為我們用於訓練的圖像數量不算多,可以進行以下幾種方式進行數據增強:

  1. 隨機裁剪
  2. 旋轉
  3. 翻轉
# 圖像增強將圖像進行隨機翻轉,裁剪
def img_create_cut(imgs,label,cut_min,cut_max,cut_true):
    imgs_out = []
    label_out = []
    w = imgs[0].shape[0]
    h = imgs[0].shape[1]
    for i in tqdm(range(len(imgs))):
        # 添加原圖
        imgs_out.append(imgs[i])
        label_out.append(label[i])
        if cut_true:
            # 原圖隨機裁剪,執行1次
            for f in range(1):
                # 生成裁剪隨機數
                rd_num = np.random.uniform(cut_min, cut_max)
                # 生成隨機裁剪長寬
                rd_w = int(w * rd_num)
                rd_h = int(h * rd_num)
                # 進行裁剪
                crop_img = tf.image.random_crop(imgs[i],[rd_w,rd_h,c]).numpy()
                # 重新調整大小
                re_img = cv2.resize(crop_img, (w, h))
                # 添加裁剪圖像
                imgs_out.append(re_img)
                # 添加類標
                label_out.append(label[i])
        # 隨機翻轉
        for e in range(0,2):
            # 1:水平翻轉,0:垂直翻轉,-1:水平垂直翻轉
            f_img = cv2.flip(imgs[i], e)
            # 添加翻轉圖像
            imgs_out.append(f_img)
            # 添加類標
            label_out.append(label[i])
            
    imgs_out,label_out = np.asarray(imgs_out, np.float32), np.asarray(label_out, np.int32)
    # 打亂順序
    # 讀取data矩陣的第一維數(圖片的個數)
    num_example = imgs_out.shape[0]
    arr = np.arange(num_example)
    np.random.seed(99)
    np.random.shuffle(arr)
    imgs_out= imgs_out[arr]
    label_out= label_out[arr]
    return imgs_out,label_out

3.模型加載並訓練

3.1 模型加載

模型加載

3.2 模型訓練

模型訓練

3.3 訓練各項指標

可以看到,訓練准確率模型很快就達到了一個比較高的水平,測試集准確率在80分以上。
訓練指標

4.結果預測

讀取訓練好的模型:

w = test_data.shape[1]
h = test_data.shape[2]
c = test_data.shape[3]
# 獲取label數量
label_counts = len(classes)
# 加載模型結構
Resnetmodel = ResNetModel(input_shape=(w,h,c),classes=label_counts)
ResNet_model = Resnetmodel.ResNet50()
# 設置學習率
learning_rate=0.001
optimizer = keras.optimizers.Adam(learning_rate=learning_rate)
ResNet_model.compile(optimizer=optimizer,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
ResNet_model.summary()

4.1 測試集模型評價

使用sklearn輸出各類別評價指標:
其中類標:

0為:廚余垃圾
1為:可回收垃圾
2為:其他垃圾
3為:有害垃圾

模型評估

4.2 單張圖片測試

單張圖片測試

五、完整代碼地址

由於項目代碼量和數據集較大,感興趣的同學可以下載完整代碼,使用過程中如遇到任何問題可以在評論區評論或者私信我,我都會一一解答。

完整代碼下載:
手把手教你:圖像識別的垃圾分類系統


免責聲明!

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



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