HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2021/12/25

Visual Studio 2017の C# .NETで OpenCVの顔検出を行ない機械学習用の顔画像を大量に用意する方法 Visual Studio 2017の C# .NETで OpenCVの顔検出を行ない機械学習用の顔画像を大量に用意する方法

(C#で OpenCVを使って大量の画像から顔検出をして画像に保存する方法、機械学習用に顔画像を大量にゲット)

Tags: [Windows], [無人インストール]




●機械学習用に画像検索の結果一覧のサムネイル画像を JavaScriptで全自動で一括で取得する方法


2020/09/29
機械学習用に画像検索の結果一覧のサムネイル画像を JavaScriptで全自動で一括で取得する方法
機械学習用に画像検索の結果一覧のサムネイル画像を JavaScriptで全自動で一括で取得する方法

  画像検索結果一括ダウンローダ、JavaScript言語を使って、ブラウザの開発者モードのコンソールで動かします、ググれ勝つ


● Visual Studio 2017の C# .NETで OpenCVの顔検出を行ない機械学習用の顔画像を大量に用意する

 C#で OpenCVを使って大量の画像から顔検出をして画像に保存する方法、機械学習用に顔画像を大量にゲットします。

 Pythonで動く物を拾ってきて Jetson Nano上で動かして使用するのでも良いのですが、Jetsonで動かすのが面倒くさいので Windows上で動くプログラムが欲しかったのです。

● OpenCvSharp C#で使える OpenCVのライブラリ

 ここでは OpenCVのライブラリとして C#からそのまま使える OpenCvSharpライブラリを使用します。


● OpenCvSharpライブラリのインストール方法

shimat / opencvsharp
OpenCvSharp4.Windows 4.2.0.20200108

 Windowsアプリ用なので OpenCvSharp4.Windowsをインストールします。
 (OpenCvSharp4.Windowsは UWP(Universal Windows Platform)には非対応)

 最新版は 4.5.3.20211226ですが、.NET 4.0環境で使いたかったので古い 4.2.0.20200108を使います。(4.2.0.20200108までが .NET 4.0にも対応)

 ※ 一旦は .NET 4.6環境で 4.5.3.20211226を試しましたが DllNotFoundException: DLL 'OpenCvSharpExtern'の実行時エラーで動かなかったので最新版はトラウマになり諦めました。

 パッケージマネージャのコンソールで下記を実行します
PM> Install-Package OpenCvSharp4.Windows -Version 4.2.0.20200108

パッケージ 'OpenCvSharp4.Windows.4.2.0.20200108' を 'packages.config' に追加しました

・OpenCvSharpライブラリのインストール方法
OpenCvSharpライブラリのインストール方法


OpenCvSharpライブラリのインストール方法




●新規プロジェクト - Visual C# - Windows デスクトップ - コンソール アプリ

 新規プロジェクト - Visual C# - Windows デスクトップ - コンソール アプリで空のプロジェクトを作成して、プログラムを入力します。

・新規プロジェクト - Visual C# - Windows デスクトップ - コンソール アプリ
新規プロジェクト - Visual C# - Windows デスクトップ - コンソール アプリ



 アニメ画像からの顔検出を行ないたかったので下記の lbpcascade_animeface.xmlをカスケード識別器として使用します。
nagadomi / lbpcascade_animeface

 実写の人物の場合は OpenCVの配布する haarcascade_frontalface_default.xmlを使います。
opencv/data/haarcascades/

 アニメ用と実写用とで検出結果の矩形領域に差があるので拡大/縮小したい場合の補正をできる様にしています。

Program.cs
// lbpcascade_animefaceの Python Exampleを単純に C#に置き換えたもの
using OpenCvSharp;

namespace TestOpenCV_Face
{
    class Program
    {
        // 識別したい画像ファイル
        private const string INPUT_IMAGE = @"hogehoge.jpg";

        // アニメ顔用のカスケード識別器
        private const string CASCADE_FILE = @"lbpcascade_animeface.xml";

        // 実写の人物用のカスケード識別器
        // private const string CASCADE_FILE = @"haarcascade_frontalface_default.xml";

        // 検出結果の矩形領域を拡大/縮小したい場合の補正値
        private const float CORRECTION_RATIO = 0.0f;

        // 検出結果の矩形領域の位置の補正値
        private const float OFFSET_Y_RATIO = 0.0f;

        static void Main(string[] args)
        {
            using (var cascade = new CascadeClassifier(CASCADE_FILE))

            using (var image = new Mat(INPUT_IMAGE, ImreadModes.Color))
            using (var gray = image.CvtColor(ColorConversionCodes.BGR2GRAY))
            using (var grayHist = gray.EqualizeHist())
            {
                var faces = cascade.DetectMultiScale(
                    image: grayHist,
                    scaleFactor: 1.1,
                    minNeighbors: 5,
                    minSize: new Size(24, 24));

                foreach (var face in faces)
                {
                    // 検出結果の矩形領域を拡大/縮小したい場合の補正
                    var scaleRect = face;
                    scaleRect.Y += (int)((face.Width) * OFFSET_Y_RATIO);
                    var inflateSize = (int)((face.Width) * CORRECTION_RATIO);
                    scaleRect.Inflate(inflateSize, inflateSize);

                    // 検出した部分に枠線を描画
                    Cv2.Rectangle(
                        img: image,
                        rect: scaleRect,
                        color: new Scalar(0, 0, 255),
                        thickness: 2);
                }

                Cv2.ImShow("FaceDetect", image);
            }
            Cv2.WaitKey();
        }
    }
}

 上記のサンプルでは使用していませんが最近のバージョンでは HaarDetectionTypeが HaarDetectionTypesに成っています。

 HaarDetectionTypeの使用例
    var faces = cascade.DetectMultiScale(
        image: grayHist,
        scaleFactor: 1.1,
        minNeighbors: 5,
        flags: HaarDetectionType.ScaleImage,
        minSize: new Size(24, 24));


●顔検出の実行例

・実写の場合の顔検出 haarcascade_frontalface_default.xmlを使用
実写の場合の顔検出 haarcascade_frontalface_default.xmlを使用
食い逃げだー!の写真素材

・アニメ画像の顔検出 lbpcascade_animeface.xmlを使用
アニメ画像の顔検出 lbpcascade_animeface.xmlを使用
 大人の事情で検出画像全体に加工をしています。


●検出部分を切り出して画像保存する場合

 「枠線を描画」の処理の手前で行ないます。
 (座標チェックをしていないので領域がハミ出した時はエラーで落ちます)

                var baseFileName = Path.GetFileNameWithoutExtension(INPUT_IMAGE);
                var index = 0;
                foreach (var face in faces)
                {
                    // 検出結果の矩形領域を拡大/縮小したい場合の補正
                    var scaleRect = face;
                    scaleRect.Y += (int)((face.Width) * OFFSET_Y_RATIO);
                    var inflateSize = (int)((face.Width) * CORRECTION_RATIO);
                    scaleRect.Inflate(inflateSize, inflateSize);

                    // 検出した顔部分の画像を保存したい場合
                    var faceImage = image[scaleRect];
                    var saveFileName = baseFileName + "_" + index++ + ".png";
                    Cv2.ImWrite(saveFileName, faceImage);
                }


●引数入力に対応してみた

 ・ワイルドカード指定で一括変換可能
 ・出力先を指定可能

 これで顔画像をゲットしまくり千代子だぜ!

        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                Environment.Exit(1);
            }

            string inputImageFile = args[0];
            string outputImagePath = args[1];

            string path = Path.GetDirectoryName(inputImageFile);
            if (path.Length == 0)
            {
                path = Directory.GetCurrentDirectory();
            }
            string searchPattern = Path.GetFileName(inputImageFile);

            string[] files = Directory.GetFiles(path, searchPattern);
            foreach (var file in files)
            {
                DetectFace(file, outputImagePath);
            }
        }

        static void DetectFace(string inputImageFile, string outputImagePath)
        {
            string appPath = Path.GetDirectoryName(AppDomain.CurrentDomain.SetupInformation.ApplicationBase);

            using (var cascade = new CascadeClassifier(Path.Combine(appPath, CASCADE_FILE)))

            using (var image = new Mat(inputImageFile, ImreadModes.Color))
                ...
                ...
                var baseFileName = Path.GetFileNameWithoutExtension(inputImageFile);
                ...
                    Cv2.ImWrite(Path.Combine(outputImagePath, saveFileName), faceImage);


●座標チェックの例(超手抜きのお手軽実装)

 これで、領域がハミ出ししなくなるのでアプリが落ちなくなります。

                foreach (var face in faces)
                {
                    var scaleRect = face;
                    scaleRect.Y += (int)((face.Width) * OFFSET_Y_RATIO);
                    if (scaleRect.Y < 0)
                    {
                        scaleRect.Y = 0;
                    }
                    var inflateSize = (int)((face.Width) * CORRECTION_RATIO);
                    if (scaleRect.X < inflateSize)
                    {
                        inflateSize = scaleRect.X;
                    }
                    if (scaleRect.Y < inflateSize)
                    {
                        inflateSize = scaleRect.Y;
                    }
                    if (scaleRect.Right + inflateSize >= image.Width)
                    {
                        inflateSize = image.Width - scaleRect.Right - 1;
                    }
                    if (scaleRect.Bottom + inflateSize >= image.Height)
                    {
                        inflateSize = image.Height - scaleRect.Bottom - 1;
                    }
                    scaleRect.Inflate(inflateSize, inflateSize);

                    var faceImage = image[scaleRect];


●検出画像を指定したサイズで一律にリサイズ

 Resizeメソッドは倍率での指定もできます。
        private static int RESIZE_SIZE = 128;

                    var faceImage = image[scaleRect];
                    // 画像をリサイズ
                    var faceSize = new Size(RESIZE_SIZE, RESIZE_SIZE);
                    faceImage = faceImage.Resize(faceSize, 0, 0, InterpolationFlags.Lanczos4);
                    var saveFileName = "face_" + baseFileName + "_" + index++ + ".png";

 アニメ顔の機械学習が捗りトリンドル



Tags: [Windows], [無人インストール]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

OpenSSLコマンドを使って RSA暗号処理する方法
OpenSSLコマンドを使って RSA暗号処理する方法

  OpenSSLコマンドで公開鍵暗号方式の RSA暗号処理する方法を解説

Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応
Java言語で RSA暗号処理する方法、OpenSSLとの連携方法、Androidにも対応

  Java言語で公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

Visual Studio 2013の .NET C#で RSA暗号処理する方法、OpenSSLとの連携方法
Visual Studio 2013の .NET C#で RSA暗号処理する方法、OpenSSLとの連携方法

  C# .NETで公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

PHP言語で RSA暗号処理する方法、OpenSSLとの連携方法
PHP言語で RSA暗号処理する方法、OpenSSLとの連携方法

  PHP言語で 公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

GO言語で RSA暗号処理する方法、OpenSSLとの連携方法
GO言語で RSA暗号処理する方法、OpenSSLとの連携方法

  GO言語で 公開鍵暗号方式の RSA暗号処理と OpenSSLと連携する方法を解説

Visual Studio 2013の C# .NETで Hash計算処理をする方法のサンプルプログラム
Visual Studio 2013の C# .NETで Hash計算処理をする方法のサンプルプログラム

  HashAlgorithm.TransformBlockを使用すると巨大ファイル等でハッシュ計算の進行状況の進捗を取得できます

Visual Studio 2013の .NET C#で UTF-8対応 QRコード生成・読取アプリを作成する方法、ZXing.Net QR Codeライブラリを使用
Visual Studio 2013の .NET C#で UTF-8対応 QRコード生成・読取アプリを作成する方法、ZXing.Net QR Codeライブラリを使用

  .NETで UTF-8対応 QRコード作成・解読アプリを作成、ILMergeで dllを exeに合体する方法

C# .NETで ZIPファイル解凍ツール UnZipをソースリスト 1行で自作する方法、Windows .NET専用
C# .NETで ZIPファイル解凍ツール UnZipをソースリスト 1行で自作する方法、Windows .NET専用

  Visual Studio 2013の C# .NET 4.5で ZipFile.ExtractToDirectoryを使い、UnZip解凍ツールを作成

Visual Studio 2013に Windows 10 SDK + UwpDesktopで UWPの機能を素の Windowsアプリから使用
Visual Studio 2013に Windows 10 SDK + UwpDesktopで UWPの機能を素の Windowsアプリから使用

  VS2013に Win 10 SDKをインストールして Uwp Desktopで UWPの機能を従来の Windowsアプリで動かす

Visual Studio 2013の C# .NETで 日本語対応の OCR文字認識アプリを自作する方法
Visual Studio 2013の C# .NETで 日本語対応の OCR文字認識アプリを自作する方法

  オフライン環境で動作可能な 世界各国語対応の OCR文字認識アプリを C# .NETで作成、MS製 OCRライブラリを使用

Visual Studio 2013の C#で日本語対応の手書き文字認識アプリを自作する方法
Visual Studio 2013の C#で日本語対応の手書き文字認識アプリを自作する方法

  オフライン環境で動作する世界各国語対応の手書き文字認識アプリを作成、MS製 手書き認識ライブラリを使用

Open XML SDKを使用して Officeのファイルを C#で自在に操る方法
Open XML SDKを使用して Officeのファイルを C#で自在に操る方法

  Microsoft Officeのファイルをプログラムで生成したり直接中身の読み取りができます

Visual Studioの各バージョンと開発できる .NET Frameworkの各バージョンのまとめ
Visual Studioの各バージョンと開発できる .NET Frameworkの各バージョンのまとめ

  .Microsoft.NET Framework Developer Packの各バージョンのダウンロードまとめ。言語パック等

Windows 10対応 Microsoft Speech使用の音声認識アプリ
Windows 10対応 Microsoft Speech使用の音声認識アプリ

  SpeechRecognizeApp 音声認識エンジンを使用してマイク入力の音声を認識します

Windows 10の音声合成エンジンを使用して入力した文字列を喋る & Waveファイル書き出し
Windows 10の音声合成エンジンを使用して入力した文字列を喋る & Waveファイル書き出し

  SpeechApp Windows 10用 Speech 音声合成 Text-to-Speech TTSのアプリ

Visual Studioの C#や MFC C++用のサンプルアプリのリンク集
Visual Studioの C#や MFC C++用のサンプルアプリのリンク集

  Visual Studioの C#や MFC C++でアプリを作る時の参考資料として

Windowsの Input Method Manager IMEや TSF Text Services Frameworkの公式情報源のまとめ
Windowsの Input Method Manager IMEや TSF Text Services Frameworkの公式情報源のまとめ

  Windowsで IME Input Method Manager関連のアプリを作成する時の情報 ImeTrayもこの辺を必死に読んだ

Visual Studioの C#で開発した .Netアプリの難読化をする方法
Visual Studioの C#で開発した .Netアプリの難読化をする方法

  C#で開発した .Netアプリの難読化は必須事項です、素の状態では簡単に内部を解析されます

Visual Studioの C#で開発した .Netアプリを逆コンパイルして、中身の実装を覗き見る方法
Visual Studioの C#で開発した .Netアプリを逆コンパイルして、中身の実装を覗き見る方法

  C#で開発した .Netアプリは比較的簡単に元のソースコードに戻せます

Visual Studio 2019 Professional v16.4を無人インストールする方法、完全自動でインストール
Visual Studio 2019 Professional v16.4を無人インストールする方法、完全自動でインストール

  VS2019 v16.4を完全オフラインインストール&コンポーネント選択の事前設定で自動インストールする

Visual Studio 2013 Professionalを無人インストールする方法、完全自動でインストール
Visual Studio 2013 Professionalを無人インストールする方法、完全自動でインストール

  VS2013を Update 5適用済みとコンポーネント選択の事前設定でインストール時の手間を省く




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2021 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/software/visual_c_sharp_opencv_face_detect/