📑項目-顔認識



顔認識計画!


私の人生の最初のプロジェクトかもしれません.
4人でやったGit bashが最後までエラーでハブにアップできなかった
その時の記憶とコードをできるだけ思い出して書きます

📔当時記録された報告(最終改訂日2020.04.13)


1.概要


選手たちは種目のテーマを決めた.4人とも顔認識に興味を持っているため、テーマを丹念に確定し、プロジェクトの進行過程を確定した.テーマは顔以外の画面をチーク処理した後、感情によって背景を変える人工知能カメラ(?)進行するはずです.手順は,顔フレームワーク→感情認識→感情に基づいて背景を変え,プログラム使用が最も一般的で,最も使いやすいライブラリ(モジュール,パッケージ)の파이썬である.

2.ライブラリの選択

파이썬プログラムでこのプロジェクトに最適なライブラリを検索しました.画像処理についてはnumpy,ImazeJ,PIL(Python Image Library)など多くの画像処理ライブラリを調べることができ,その代表的なものが画像処理分野に用いられるライブラリである.Opencvです.Opencvは他のライブラリとともに使用され,画像処理分野で広く用いられており,写真は容易にスライス処理できるため便利で,我々が作成したプロジェクトに適した人工知能感情認識カメラであるため,まずOpencvについて検討する.

3.OpenCV練習


まず、PythonにOpencvをインストールする手順を練習しました.これまで行われていたゲームアイテムと葛藤しないように、ドローンをインストールし、ドローンのヒントで!これはpip install opencv-contrib-pythonをインストールする簡単なプロセスです.
Opencvの練習のために、基本的なレッスン写真を印刷しました.
import cv2 
img_file = 'img/figures.jpg' # 이미지 불러오기
img = cv2.imread(img_file) # 이미지 변수 할당
cv2.imshow('IMG', img) # 화면 표시 창이름 : 'IMG' 
cv2.waitKey()
cv2.destroyAllWindows()
以上のコードはOpencv写真出力の最も基本的なコードです.img fileは、自分が読み込む画像を変数に格納し、imgはその画像ファイルを読み出す.徐cv 2もあります.imshowコマンドを使用して写真を表示したらdestroyAllwindowsを使用してウィンドウを閉じるだけです.

💻プロジェクトの開始


顔をそる


プロジェクトの第一段階である顔を外すことが始まった.OpenCvライブラリでは,物事の区別を助けるアルゴリズムが多く,最初はContourであった.
import cv2
img_color = cv2.imread('C:/Users/GhostDog/Desktop/test.png')
img_gray = cv2.cvtColor(img_color, cv2.COLOR_BGR2GRAY)
ret, img_binary = cv2.threshold(img_gray,127,255,0)contours, 
hierarchy = cv2.findContours(img_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(contours)
cv2.drawContours(img_color, contours, 0,(0,0,255),3)
cv2.drawContours(img_color, contours, 1,(0,255,0),3)cv2.imshow("result",img_color)
cv2.waitKey(0)

実行結果


Coutourアルゴリズムは、明暗度を判断するアルゴリズムである.上はDraw等高線で2枚の図に(00255)赤枠と(0255,0)緑枠で周囲の明るさの異なる星と三角形を区別した.Contourを使用して、この段階の目標は、顔フレームを外す(顔と前景を分離する)ことである.

ご覧のように、わざと背景を明るくしたり、服や顔を暗い色にしたりしても、Contourは区別できません.さらに資料調査によると、Contourは極端な色の変化を発見し、周囲の背景物が目立ちすぎると区別がつかなくなり、私たちがしなければならない項目に適用するのは難しいと思います.
顔とパノラマの分離に焦点を当て,さらに파이썬ライブラリを調べた.
.
上図は、顔とパノラマを分離するための代表的なツールです.当時、画像処理ライブラリに関する文章があり、その特徴と長所と短所をまとめた.
Magic Wandユーザーが特定の位置または領域を指定した場合、関連するピクセル間の差が特定の値より小さいピクセルを選択します.BackgroundとForegroundの画素値分布は互いに重なり合う.
スマートスキャンプログラムMortensenとBarretが推奨する方法でマウスを移動し、アウトライン内のポイントをseedとして指定して領域を選択します.現在のカーソル位置と前のシード位置の間の最小コストパスをリアルタイムで計算し、リアルタイムで表示します.現在表示されているパスが好きな場合は、パスをロックし、現在の位置を次のseedに指定します.領域を選択するには、この操作を繰り返します.このバーでは、テクスチャが複雑な領域であるか、テクスチャがない領域である場合、最小コストパスは唯一の問題ではありません.
Bayes Mattingユーザー定義のTrimapに従って色分布をモデリングし、透明度を取得します.ユーザは,ユーザの内側と外側の領域を入力する必要がある.
これはKnockout 2 Trimapを用いたBayes mattingと同様である.
Graph Cut Bays MattingとTrimapおよび確率カラーモデル.後で単独で説明します.
エネルギー最小化法によりLevel sets偏微分方程式を用いて解いた.エネルギーを定義する方法や初期化方法によっては、結果が異なる場合があります.
これらのツールではGrabcut파이썬に有用なライブラリと考えられ,Grabcutを調べた.GrabCutアルゴリズムは、背景に関係のない前景画像を画像から抽出する方法である.
ユーザとのインタラクションにより,画像から徐々に前景を抽出する.
このインタラクションは大きく2つの段階に分けられます.
1つ目は、画像に前景が含まれている領域を矩形に大まかに指定することです.ただし、指定した矩形領域には、すべての前景が含まれている必要があります.
2つ目は、第1に得られたパノラマ画像の内容において、含まれる背景部分がどこであり、欠落したパノラマ部分がどこであるかをマークし、これらのマークを用いてパノラマ画像を再抽出することである.
さっき等高線でパノラマ分割した画像をGrabcutで再分割した.
import numpy as np
import cv2 from matplotlib 
import pyplot as plt
img = cv2.imread('C:/Users/GhostDog/Desktop/myface.jpg')
mask = np.zeros(img.shape[:2] ,np.uint8)
bgdModel = np.zeros((1 ,65) ,np.float64)
fgdModel = np.zeros((1 ,65) ,np.float64)
rect = (50 ,50 ,1200 ,700)
cv2.grabCut(img ,mask ,rect ,bgdModel ,fgdModel ,5 ,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2) |(mask==0) ,0 ,1).astype('uint8')
img = img *mask2[: ,: ,np.newaxis]plt.imshow(img) ,plt.colorbar() ,plt.show()

パノラマ分離はさっきよりずっとよく見えます.しかし、色が暗くなっているのが見え、その後はエッジをGrabcutに分離し、元の画像に基づいて合成すればいいだけです.
その時報告書をここに書いた.
import numpy as np
import cv2

lowerBound = np.array([13, 155, 53])
upperBound = np.array([56, 216, 119])
##HSV 색상 영역이다, 원하는 색상 영역으로 바꾸면 된다

def showcam():
    try:
        print ('open cam')
        cap = cv2.VideoCapture(0)
    except:
        print ('Not working')
    cap.set(3, 480)
    cap.set(4, 320)
 # try-except 문법을 이용해 캠이 안열였을때 에러를 출력한다
    while True:
        ret, frame = cap.read()
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        #RGB -> HSV 변환
        color_mask = cv2.inRange(hsv, lowerBound, upperBound)
        #특정 색상 범위 mask 설치
        ret1, thr = cv2.threshold(opening, 127, 255, 0)
        #contours 를 찾기위한 이진화
        _, contours, _ = cv2.findContours(thr, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        #contours찾기 _,는 사용하지 않는 인자라서 '_'로 받는다
        if len(contours) > 0:
            for i in range(len(contours)):
                area = cv2.contourArea(contours[i]) 
                #contours 영역 구하기
                if area > 100:  # 100이상 영역을 가진 물체가 있을 때만
                    rect = cv2.minAreaRect(contours[i])   #contours를 이용해 사각형을 만든다
                    box = cv2.boxPoints(rect) #사각형을 찾아 4점을 반환한다.
                    box = np.int0(box) 
                    cv2.drawContours(frame, [box], 0, (0, 0, 255), 2)   #사각형 모양을 그린다
        if not ret:
            print('error')
            break
        cv2.imshow('color_bitwise',color_mask)
        cv2.imshow('cam_load',frame)
        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break

    cap.release()
    cv2.destroyAllWindows()
showcam()
Countourをテストするために、このコードも当時作成されていました.

様々な実験モデルで画像処理を試みた.
だから天書花とケラスを使ってリストを作る時、顔と前景を分けて、感情によって背景を飾りますが、コードを失ったようです...

上の写真は、当時のimgフォルダのbackground happyが人の感情をhappyと認識していたら、Grabbcutで前景を分離していたものです.どうして結果だけがあって、コードがなくて、ほほほ;
いずれにしても、私の横突き種目はこのように終わりました.
また、画像処理には、ラプラス西安を調査した報告書も添付されている.

1.ラプラス西安とは何ですか。



上記のようにラプラス西安と呼ばれています

上記式を微分演算子と呼び,ベクトルから生成される2つの微分演算子を互いに内積し,内積の結果が同一位置の積の和であることがわかる.(=ラテンアメリカ)
この結果から,ラプラス西安は2回の偏微分の結果を得た.
あるスカラー関数をラプラス変換することは,順次傾斜と発散を求めることに等しい.(=傾斜発散)
※ラプラス西安を例に、電位と体積電荷密度の関係を例に、電位ラプラス西安を体積電荷密度とする.

2.画像処理に使用できる方法は何ですか?


ラバーラ西安辺が強化された.
最小値に変化のない二次導関数形式のフィルタ.一次関数に基づくグラデーションとは逆のフィルタ.
まずグラデーションから説明すると,傾きを勾配と呼ぶ勾配をビデオで求めればedge値が得られる.ビデオでは、データは一定の間隔で並べられているため、数学的な微分画像は行われないが、隣接画素間の差異の演算が行われる.

しかし、グレディアンのような一次微分演算の結果だけではエッジ候補が多すぎるため、グレディアン甲は局所的に最大の点がエッジであることのみを認め、二次微分演算者と呼ぶ.実際,分岐機構は一次微分が最大となり,二次微分が零点を通過する属性を利用している.などの方法では,二次微分演算子,すなわちラプラス演算子が導入された.
ラプラス西安の弱点は,二次微分によるエッジ判定時間を提供することである.
細かいエッジ検出はすべての方向のエッジを検出できるので便利です.
しかし、ノイズに敏感なため、ノイズ成分も画像で強調される.これを防止するために,Gauss型Laplaceアルゴリズムを用いて,Laplaceアルゴリズムを適用する前に前処理段階に平滑化した.

3.OPENCVが使いやすい

import cv2import numpy as np
def ImageSobel(): imageFile = "C:/Users/JongMin/Desktop/myface.jpg"    
img = cv2.imread(imageFile,cv2.IMREAD_GRAYSCALE)    
Laplacian = cv2.Laplacian(img,-1)    
cv2.imshow("ORIGIN",img)    
cv2.imshow("Laplacain",Laplacian)    
cv2.waitKey(0)    
cv2.destroyAllWindows()ImageSobel()