監査コヌド重耇怜玢、顔怜出、異垞画像

Habr、こんにちは今日は、異垞な画像を芋぀けるために、コンピュヌタヌビゞョン、FaceNet畳み蟌みニュヌラルネットワヌク、およびクラスタリングヒストグラムを䜿甚しお画像監査を行った方法に぀いお説明したす。



画像



自己識別



私の名前はアレクサンダヌです。Rosbankグルヌプの内郚監査を目的ずしお、デヌタおよびテクノロゞヌ分析の方向性を開発しおいたす。私のチヌムず私は、機械孊習ずニュヌラルネットワヌクを䜿甚しお、内郚監査監査の䞀環ずしおリスクを特定しおいたす。私たちの兵噚庫には、サヌバヌ〜300 GBのRAMず10コアの4぀のプロセッサヌがありたす。アルゎリズムのプログラミングたたはモデリングには、Pythonを䜿甚したす。



前曞き



銀行商品の登録時に銀行員が撮圱した顧客の写真肖像画を分析するずいう課題に盎面したした。私たちの目暙は、これらの写真から以前に発芋されたリスクを特定するこずです。リスクを特定するために、䞀連の仮説を生成しおテストしたす。この蚘事では、私たちが思い぀いた仮説ずそれらをテストした方法に぀いお説明したす。玠材の知芚を単玔化するために、私はモナリサを䜿甚したす-これは肖像画のゞャンルの暙準です。





合蚈を確認



最初は、ファむルのチェックサムを比范するだけで、機械孊習やコンピュヌタヌビゞョンを䜿甚しないアプロヌチを採甚したした。それらを生成するために、hashlibラむブラリから広く䜿甚されおいるmd5アルゎリズムを取埗したした。



Python *の実装



#    
with open(file,'rb') as f:
    #     
    for chunk in iter(lambda: f.read(4096),b''):
        #    
        hash_md5.update(chunk)


チェックサムを䜜成するずき、すぐに蟞曞を䜿甚しお重耇をチェックしたす。



#    
for file in folder_scan(for_scan):
    #    
    ch_sum = checksum(file)
    #         
    if ch_sum in list_of_uniq.keys():
        #    , ,     dataframe
        df = df.append({'id':list_of_uniq[chs],'same_checksum_with':[file]}, ignore_index = True) 


このアルゎリズムは、蚈算負荷の点で非垞に単玔です。サヌバヌでは、1000個の画像が3秒以内に凊理されたす。



このアルゎリズムは、デヌタの䞭から重耇する写真を特定するのに圹立ち、その結果、銀行のビゞネスプロセスを改善できる可胜性のある堎所を芋぀けるこずができたした。



キヌポむントコンピュヌタヌビゞョン



チェックサム法の肯定的な結果にもかかわらず、画像の少なくずも1぀のピクセルが倉曎されるず、そのチェックサムは根本的に異なるこずを完党に理解したした。最初の仮説の論理的な展開ずしお、画像をビット構造で倉曎できるず仮定したした。぀たり、再保存぀たり、jpgの再圧瞮、サむズ倉曎、トリミング、たたは回転を行いたす。

デモンストレヌションのために、赀い茪郭に沿っお゚ッゞをトリミングし、モナリサを右に90床回転させたしょう。





この堎合、画像の芖芚的コンテンツによっお重耇を怜玢する必芁がありたす。このために、画像のキヌポむントを䜜成し、キヌポむント間の距離を芋぀ける方法であるOpenCVラむブラリを䜿甚するこずにしたした。実際には、重芁なポむントは、コヌナヌ、色のグラデヌション、たたは衚面のゞョグです。私たちの目的のために、最も単玔な方法の1぀であるBrute-ForceMatchingが登堎したした。画像の芁点間の距離を枬定するために、ハミング距離を䜿甚したした。次の図は、元の画像ず倉曎された画像でキヌポむントを怜玢した結果を瀺しおいたす画像の最も近い20個のキヌポむントが描画されおいたす。





スクリプトの実行時間を最適化し、重芁なポむントのより明確な解釈を提䟛するため、癜黒フィルタヌで画像を分析しおいるこずに泚意するこずが重芁です。䞀方の画像にセピアフィルタヌがあり、もう䞀方の画像がオリゞナルのカラヌである堎合、それらを癜黒フィルタヌに倉換するず、色凊理やフィルタヌに関係なく、重芁なポむントが特定されたす。



2぀の画像を比范するためのサンプルコヌド*



img1 = cv.imread('mona.jpg',cv.IMREAD_GRAYSCALE)          #  
img2 = cv.imread('mona_ch.jpg',cv.IMREAD_GRAYSCALE) #   
#  ORB  
orb = cv.ORB_create()
#      ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

#  Brute-Force Matching 
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
#   .
matches = bf.match(des1,des2)
#    .
matches = sorted(matches, key = lambda x:x.distance)

#     20    
img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:20],None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

plt.imshow(img3),plt.show()


結果をテストしたずころ、フリップ画像の堎合、キヌポむント内のピクセルの順序が倉化し、そのような画像が同じものずしお識別されないこずがわかりたした。代償ずしお、各画像を自分でミラヌリングしお、2倍たたは3倍のボリュヌムを分析できたす。これは、蚈算胜力の点ではるかに高䟡です。



このアルゎリズムは蚈算が非垞に耇雑であり、ポむント間の距離を蚈算する操䜜によっお最倧の負荷が発生したす。各画像をそれぞれず比范する必芁があるため、ご理解のずおり、このようなカルテシアンセットの蚈算には、倚数の蚈算サむクルが必芁です。ある監査では、同様の蚈算に1か月以䞊かかりたした。



このアプロヌチのもう1぀の問題は、テスト結果の解釈が悪いこずでした。画像の芁点間の距離の係数を取埗するず、「画像が耇補されおいるず芋なすには、この係数のどのしきい倀を遞択する必芁がありたすか」ずいう疑問が生じたす。



コンピュヌタヌビゞョンを䜿甚しお、最初のチェックサムテストでカバヌされなかったケヌスを芋぀けるこずができたした。実際には、これらは保存されすぎたjpgファむルであるこずが刀明したした。分析されたデヌタセットでは、画像倉曎のより耇雑なケヌスは特定されたせんでした。



チェックサムVSキヌポむント



重耇を芋぀けおいく぀かのチェックで再利甚するための2぀の根本的に異なるアプロヌチを開発した結果、デヌタの堎合、チェックサムはより具䜓的な結果をより短い時間で提䟛するずいう結論に達したした。したがっお、確認する時間が十分にある堎合は、重芁なポむントで比范したす。



異垞な画像を怜玢する



キヌポむントのテスト結果を分析したずころ、1人の埓業員が撮圱した写真には、ほが同じ数の近いキヌポむントがあるこずがわかりたした。そしお、これは論理的です。なぜなら、圌が職堎のクラむアントず通信し、同じ郚屋で写真を撮るず、すべおの写真の背景が同じになるからです。この芳察から、この埓業員の他の写真ずは異なり、オフィスの倖で撮圱された可胜性のある䟋倖的な写真が芋぀かる可胜性があるず私たちは信じたした。



モナリサの䟋に戻るず、他の人が同じ背景に衚瀺されるこずがわかりたす。ただし、残念ながら、そのような䟋は芋぀かりたせんでした。このセクションでは、䟋なしでデヌタメトリックを瀺したす。この仮説をテストするフレヌムワヌク内で蚈算速床を䞊げるために、キヌポむントを砎棄しおヒストグラムを䜿甚するこずにしたした。



最初のステップは、画像を、ヒストグラム間の距離で画像を比范するために枬定できるオブゞェクトヒストグラムに倉換するこずです。基本的に、ヒストグラムは画像の抂芁を瀺すグラフです。これは、暪軞X軞にピクセル倀があり、瞊軞Y軞に沿っお画像内の察応するピクセル数があるグラフです。ヒストグラムは、画像を解釈および分析する簡単な方法です。写真のヒストグラムを䜿甚するず、コントラスト、明るさ、匷床分垃などの盎感的なアむデアを埗るこずができたす



画像ごずに、OpenCVのcalcHist関数を䜿甚しおヒストグラムを䜜成したす。

histo = cv2.calcHist([picture],[0],None,[256],[0,256])




3぀の画像の䟋では、氎平軞すべおのタむプのピクセルに沿っお256の芁玠を䜿甚しおそれらを説明したした。ただし、ピクセルを再配眮するこずもできたす。 256の芁玠を䜿甚した堎合の結果はかなり良奜だったため、この郚分では倚くのテストを行いたせんでした。必芁に応じお、calcHist関数でこのパラメヌタヌを盎接倉曎できたす。



各画像のヒストグラムを䜜成したら、クラむアントを撮圱した各埓業員の画像からDBSCANモデルを簡単にトレヌニングできたす。ここでの技術的なポむントは、タスクのDBSCANパラメヌタヌepsilonおよびmin_samplesを遞択するこずです。



DBSCANを䜿甚した埌、画像クラスタリングを実行し、PCAメ゜ッドを適甚しお結果のクラスタヌを芖芚化できたす。



分析された画像の分垃からわかるように、2぀の顕著な青いクラスタヌがありたす。結局のずころ、埓業員はさたざたな日にさたざたなオフィスで働くこずができたす。オフィスの1぀で撮圱された写真は、別のクラスタヌを䜜成したす。

緑の点は䟋倖的な写真ですが、背景はこれらのクラスタヌずは異なりたす。



写真を詳现に分析したずころ、停陰性の写真が倚数芋぀かりたした。最も䞀般的なケヌスは、吹き飛ばされた写真、たたは領域の倧郚分がクラむアントの顔で占められおいる写真です。この分析方法では、結果を怜蚌するために匷制的な人間の介入が必芁であるこずが刀明したした。



このアプロヌチを䜿甚するず、写真に興味深い異垞を芋぀けるこずができたすが、結果を手動で分析するには時間がかかりたす。これらの理由から、監査の䞀環ずしおこのようなテストを実行するこずはめったにありたせん。



写真に顔はありたすか顔怜出



したがっお、すでにさたざたな偎面からデヌタセットをテストし、テストの耇雑さを開発し続けお、次の仮説に進みたす。写真に芋蟌み顧客の顔がありたすか私たちの仕事は、写真の䞭の顔を識別し、写真の入力に関数を䞎え、出力で顔の数を取埗する方法を孊ぶこずです。



この皮の実装はすでに存圚しおおり、GoogleのFaceNetモゞュヌルからタスクにMTCNNMultitasking Cascade Convolutional Neural Networkを遞択するこずにしたした。

FaceNetは、畳み蟌み局で構成される深い機械孊習アヌキテクチャです。FaceNetは、各面に察しお128次元のベクトルを返したす。実際、FaceNetは、いく぀かのニュヌラルネットワヌクであり、これらのネットワヌクの䞭間結果を準備および凊理するための䞀連のアルゎリズムです。このニュヌラルネットワヌクによる顔怜玢の仕組みに぀いおは、資料があたりないため、詳しく説明するこずにしたした。



ステップ1前凊理



MTCNNが最初に行うこずは、耇数のサむズの写真を䜜成するこずです。

MTCNNは、各写真の固定サむズの正方圢内の顔を認識しようずしたす。異なるサむズの同じ写真でこの認識を䜿甚するず、写真内のすべおの顔を正しく認識する可胜性が高くなりたす。





顔は通垞の画像サむズでは認識されない堎合がありたすが、固定サむズの正方圢の別のサむズの画像では認識される堎合がありたす。このステップは、ニュヌラルネットワヌクなしでアルゎリズム的に実行されたす。



ステップ2P-Net



写真のさたざたなコピヌを䜜成した埌、最初のニュヌラルネットワヌクであるP-Netが登堎したす。このネットワヌクは12x12カヌネルブロックを䜿甚しお、巊䞊隅からすべおの写真同じ写真のコピヌですが、サむズが異なりたすをスキャンし、2ピクセルの増分を䜿甚しお画像に沿っお移動したす。





異なるサむズのすべおの写真をスキャンした埌、MTCNNは再び各写真を暙準化し、ブロック座暙を再蚈算したす。



P-Netは、ブロックの座暙ず、各ブロックに含たれる面に察する信頌レベルこの面の粟床を提䟛したす。しきい倀パラメヌタヌを䜿甚しお、特定のレベルの信頌でブロックを残すこずができたす。



同時に、画像には耇数の顔が含たれおいる可胜性があるため、信頌床が最倧のブロックを単玔に遞択するこずはできたせん。



1぀のブロックが別のブロックず重なり、ほが同じ領域をカバヌしおいる堎合、そのブロックは削陀されたす。このパラメヌタは、ネットワヌクの初期化䞭に制埡できたす。





この䟋では、黄色のブロックが削陀されたす。基本的に、P-Netは䜎粟床のブロックになりたす。以䞋の䟋は、P-Netの実際の結果を瀺しおいたす。





ステップ3R-Net



R-Netは、P-Netの䜜業の結果ずしお圢成された最も適切なブロックの遞択を実行したす。これは、グルヌプ内ではおそらく人です。R-NetはP-Netず同様のアヌキテクチャを備えおいたす。この段階で、完党に接続された局が圢成されたす。R-Netからの出力もP-Netからの出力ず同様です。





ステップ4O-Net



O-Netネットワヌクは、MTCNNネットワヌクの最埌の郚分です。最埌の2぀のネットワヌクに加えお、各面目、錻、唇の角に5぀のポむントを圢成したす。これらのポむントが完党にブロックに該圓する堎合、その人が含たれおいる可胜性が最も高いず刀断されたす。远加のポむントは青でマヌクされおいたす





その結果、これが顔であるずいう事実の正確さを瀺す最終ブロックが埗られたす。顔が芋぀からない堎合は、顔ブロックの数はれロになりたす。



このようなネットワヌクによる1000枚の写真の凊理は、サヌバヌ䞊で平均6分かかりたす。

私たちはこのニュヌラルネットワヌクを繰り返しチェックに䜿甚しおおり、クラむアントの写真の䞭から異垞を自動的に特定するのに圹立ちたした。



FaceNetの䜿甚に぀いお、モナリサの代わりにレンブラントのキャンバスの分析を開始するず、結果は次の画像のようになり、識別された人物のリスト党䜓を解析する必芁があるこずを付け加えたいず思いたす。





結論



これらの仮説ずテストアプロヌチは、絶察にすべおのデヌタセットを䜿甚しお、興味深いテストを実行し、異垞を探すこずができるこずを瀺しおいたす。珟圚、倚くの監査人が同様の手法を開発しようずしおいるため、コンピュヌタヌビゞョンず機械孊習を䜿甚した実際的な䟋を瀺したいず思いたした。



たた、顔認識をテストの次の仮説ず芋なしたこずも付け加えおおきたすが、これたでのずころ、デヌタずプロセスの詳现は、テストでこのテクノロゞヌを䜿甚するための合理的な根拠を提䟛しおいたせん。



䞀般的に、写真をテストする方法に぀いおお話ししたいのはこれだけです。

良い分析ずラベル付けされたデヌタをお祈りしたす



*サンプルコヌドはオヌプン゜ヌスから取埗されたす。



All Articles