python小白0基礎利用飛槳平臺實現AI識別加口罩

大家好,這裏是小白三歲,三歲做夢都沒有想到,能夠踏上AI技術路,用上AI還完成了一個理想豐滿現實骨感的項目,項目漏洞極多,希望大佬們幫忙改進,謝謝大家~~

項目簡介

三歲通過AI技術對導入的照片進行AI識別,查看是否戴口罩,如果沒有就採用人臉關鍵點檢測,在對應的位置上加上“口罩”,裏面涉及了百度飛槳的兩款AI識別接口(點擊查看具體的內容)

  1. 口罩識別

  2. 關鍵點檢測

項目不足

因爲小編三歲,技術不行對圖片處理包括.jpg和.png格式的圖處理不好,導致了照片底黑,過大,還希望有大佬幫忙改進提供自己的版本!在這裏謝謝大家啦,如果有其他的想法可以自行修改添加自己的版本。
點擊查看項目

項目說明

項目思路

  1. 項目先對導入照片文件進行讀取,獲得照片的絕對路徑
  2. 建立連接根據照片路徑 對路徑下的圖片進行口罩識別
  3. 對於返回內容(未帶口罩的:‘NO MASK’)進行下一步
  4. 對未帶口罩的進行關鍵點識別
  5. 獲得相應的關鍵點
  6. 根據關鍵點添加“口罩”
  7. 繼續進行判定直到全部判定結束

代碼詳解

  • 有關庫的導入及使用(該處以飛槳AI studio平臺代碼使用方法爲準,如有問題歡迎私聊)
    下載有關模塊:
#運行模塊加載
#口罩識別
!hub install pyramidbox_lite_mobile_mask==1.1.0
#關鍵點檢測
!hub install face_landmark_localization==1.0.2
#摳圖
!hub isntall deeplabv3p_xception65_humanseg
#關鍵點識別
!hub install face_landmark_localization==1.0.2
# hub run face_landmark_localization --input_path "/PATH/TO/IMAGE"
#下載第三方包
!pip install matplotlib
  • 導入有關第三方庫:
import paddlehub as hub
import cv2
import os
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 
import paddlehub as hub
import numpy as np
import math
from PIL import Image
import importlib 
  • 創建照片地址讀取函數:
def photo_path_read(path, add):
    for root, dirs, files in os.walk(path):
        for file in files:
            a = os.path.splitext(file)
            add.append(f'{root}/{a[0]}{a[1]}')
            # print(add)
        return add
  • 創建口罩識別函數:
def Masks_to_identify(photo_path):
    module = hub.Module(name="pyramidbox_lite_mobile_mask")
    !hub run pyramidbox_lite_mobile_mask --input_path f"{pothot_path}"
    test_img_path = f"{photo_path}"

    # set input dict
    input_dict = {"data": [cv2.imread(test_img_path)]}
    results = module.face_detection(data=input_dict)
    print(results)
    return results

    '''
    可以採用以下代碼對圖片識別情況進行查看 
    !hub run pyramidbox_lite_mobile_mask --input_path 'photo/Baidu_001.jpg(圖片地址)'
    '''
    # test_img_path = f"{photo_path}"
    # img = mpimg.imread(test_img_path) 

    # # 展示待預測圖片
    # plt.figure(figsize=(10,10))
    # plt.imshow(img) 
    # plt.axis('off') 
    # plt.show()

    # # 預測結果展示
    # test_img_path = f"detection_result/{photo_path}"
    # img = mpimg.imread(test_img_path)

    # # 展示預測結果圖片
    # plt.figure(figsize=(10,10))
    # plt.imshow(img) 
    # plt.axis('off') 
    # plt.show()
  • 關鍵點識別及添加“口罩”函數:
def Masks_to_add(path):
    print('開始添加')
    src_img = cv2.imread(f'{path}')

    module = hub.Module(name="face_landmark_localization")
    result = module.keypoint_detection(images=[src_img])
    # print(result)
    # print(type(result))

    box_m = []
    box_0 = result[0]['data'][0][0]
    box_1 = result[0]['data'][0][11]#)(
    box_m.append(int(box_0[0]))
    box_m.append(int(box_0[1]))
    box_m.append(int(box_1[0]+30))
    box_m.append(int(box_1[1]+30))
    print(box_0,box_1,box_m)

    base_img = Image.open(f'{path}')
    

    #加載需要P上去的圖片
    tmp_img = Image.open('001.jpg')
    #以下添加標註均爲個人嘗試(無關緊要)
    # has_alpha = tmp_ing.mode == 'RGBA'
    # tmp_ing.putalptha()[-1]
    # tmp.img = tmp_img.convert('RGBA')
    #這裏可以選擇一塊區域或者整張圖片
    tmp_img = tmp_img.resize((100,100))
    
    #或者使用整張圖片
    region = tmp_img
    print('正在判定大小')
    
    
    region = region.resize((int(box_m[2] - box_m[0]), int(box_m[3] - box_m[1])))
    print(region)
    base_img.paste(region, box_m)
    print(base_img)
    base_img.show() # 查看合成的圖片
    print(base_img)
    # print(f'new_{path[6:]}')
    base_img.save(f'new_{path[6:]}') #保存圖片
    print('生成成功')

  • 主函數
if __name__ =='__main__':
    add = []
    photo_path = 'photo'
    path_listes = photo_path_read(photo_path, add)
    # print(add)
    for path_list in path_listes:
        # print(path_list)
        masks_data = Masks_to_identify(path_list)
        # print(masks_data[0]['data']['label'])
        try:
            if masks_data[0]['data']['label'] == 'NO MASK':
                print(path_list)
                Masks_to_add(path_list)

        except:
            continue

解析

其他的沒有什麼需要解析的就是一個關鍵點檢測:
在這裏插入圖片描述
以上是關鍵點檢測的結果,需要添加口罩只需要212位置上添加就可以了,至於圖片處理不是非常完善,這裏就不展示成果了,怕倒大家胃口。

成果思考及總結

這是一個創新賽,第一是有創新思想,第二要技術,小編技術有限,這一點在完成項目時真的深有體會,百度(度娘)都翻遍了,大佬都問了,情況不同幫不了你,還是必須要不斷提高自己,不管這次的成績如何結果如何無所謂了,關鍵的是這一次的過程,這一次過程中的學習,真的很多,包括百度飛槳小白逆襲大神課程也一樣,學到的非常多。

感謝大家支持,這一次的鍛鍊真的爲接下來的學習具有一定的指導作用,希望接下來再接再力,繼續努力。謝謝大家~~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章