Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

주간 닷넷에 소개된,

주간닷넷 2016년 8월 2일
; https://learn.microsoft.com/en-us/archive/blogs/eva/%EC%A3%BC%EA%B0%84%EB%8B%B7%EB%84%B7-2016%EB%85%84-8%EC%9B%94-2%EC%9D%BC

내용 중에 다음의 것을 한번 실습해 보았습니다. ^^

Detect and Blur Faces with .NET Core and Face API
; https://carlos.mendible.com/2016/07/30/detect-and-blur-faces-with-dotnetcore-and-face-api/

위의 내용에 소개된 Face API는 마이크로소프트가 Azure를 통해 서비스하는 "Cognitive Services" 중의 하나입니다. 따라서 이 API를 사용하려면 APIKey를 받아야 하고 그러려면 다음의 페이지에서 구독 신청을 해야 합니다.

Cognitive Services - Get started for free
; https://www.microsoft.com/cognitive-services/en-us/sign-up

그럼 다양한 서비스를 신청할 수 있는데,

Cognitive Services - Request new trials
; https://azure.microsoft.com/en-us/services/cognitive-services/

Face API의 경우 (분당 20건의 제한으로) 월 3만 건의 호출을 무료로 사용할 수 있습니다.

어쨌든, 신청을 하면 API Key를 받았을 테고 시작해 보겠습니다. ^^




사실 모든 순서는 "Detect and Blur Faces with .NET Core and Face API" 글에 잘 나와 있습니다. 하지만, .NET Core를 바탕으로 하고 있는데, 그냥 윈도우 응용 프로그램에도 쉽게 적용할 수 있습니다.

제 경우에는 윈도우 콘솔 프로그램으로 시작해 보겠습니다. 프로젝트 만든 후, NuGet을 통해 "Microsoft Cognitive Services Face API"와 함께 관련 라이브러리를 참조 추가합니다.

PM> Install-Package Microsoft.ProjectOxford.Face
PM> Install-Package ChyImageProcessorCore -Pre
PM> Install-Package System.Numerics.Vectors -Pre 
PM> Install-Package System.Runtime.CompilerServices.Unsafe 

그다음 App.config에 Face API Key를 입력해 설정해 두고,

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <appSettings>
        <add key="FaceAPIKey" value="...[your_face_api_key]..." />
    </appSettings>
</configuration>

"Detect and Blur Faces with .NET Core and Face API" 글의 소스 코드를 그대로 적용하시면 됩니다.

using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using ImageProcessorCore;
using Microsoft.ProjectOxford.Face;
using Microsoft.ProjectOxford.Face.Contract;
using System.Configuration;

public class Program
{
    const string sourceImage = "face_blur_1.png";

    public static void Main(string[] args)
    {
        const string destinationImage = "detectedfaces.jpg";

        var detects = DetectFaces(sourceImage, ConfigurationManager.AppSettings["FaceAPIKey"]);
        var faceRects = detects.Result;

        Console.WriteLine($"Detected {faceRects.Length} faces");

        BlurFaces(faceRects, sourceImage, destinationImage);

        Console.WriteLine($"Done!!!");
    }

    private static void BlurFaces(FaceRectangle[] faceRects, string sourceImage, string destinationImage)
    {
        if (File.Exists(destinationImage))
        {
            File.Delete(destinationImage);
        }

        if (faceRects.Length > 0)
        {
            using (FileStream stream = File.OpenRead(sourceImage))
            using (FileStream output = File.OpenWrite(destinationImage))
            {
                var image = new Image<Color, uint>(stream);

                foreach (var faceRect in faceRects)
                {
                    var rectangle = new Rectangle(
                        faceRect.Left,
                        faceRect.Top,
                        faceRect.Width,
                        faceRect.Height);

                    image = image.BoxBlur(20, rectangle);
                }

                image.SaveAsJpeg(output);
            }
        }
    }

    private static async Task<FaceRectangle[]> DetectFaces(string imageFilePath, string apiKey)
    {
        var faceServiceClient = new FaceServiceClient(apiKey);

        try
        {
            using (Stream imageFileStream = File.OpenRead(imageFilePath))
            {
                var faces = await faceServiceClient.DetectAsync(imageFileStream);
                var faceRects = faces.Select(face => face.FaceRectangle);
                return faceRects.ToArray();
            }
        }
        catch (Exception)
        {
            return new FaceRectangle[0];
        }
    }
}

직접 실습을 해봤는데, 좀 실망(?!)스럽군요. 아래는 원본 사진에서 위의 프로그램을 돌려 얼굴을 인식해 흐림 처리한 결과입니다. 그런데... 요즘 핫한 사람의 얼굴조차 인식하지 못하고 있습니다. ^^;

face_blur_0.jpg

(첨부 파일은 이 글의 예제 코드를 포함합니다.)









[최초 등록일: ]
[최종 수정일: 4/17/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2021-06-16 09시16분
How to get started with neural text to speech in Azure | Azure Tips and Tricks
; https://www.youtube.com/watch?v=dl0amatX5zs&ab_channel=MicrosoftAzure
정성태

1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13331정성태4/27/20233885오류 유형: 856. dockerfile - 구 버전의 .NET Core 이미지 사용 시 apt update 오류
13330정성태4/26/20233529Windows: 247. Win32 C/C++ - CS_GLOBALCLASS 설명
13329정성태4/24/20233732Windows: 246. Win32 C/C++ - 직접 띄운 대화창 템플릿을 위한 Modal 메시지 루프 생성파일 다운로드1
13328정성태4/19/20233402VS.NET IDE: 184. Visual Studio - Fine Code Coverage에서 동작하지 않는 Fake/Shim 테스트
13327정성태4/19/20233808VS.NET IDE: 183. C# - .NET Core/5+ 환경에서 Fakes를 이용한 단위 테스트 방법
13326정성태4/18/20235231.NET Framework: 2109. C# - 닷넷 응용 프로그램에서 SQLite 사용 (System.Data.SQLite) [1]파일 다운로드1
13325정성태4/18/20234525스크립트: 48. 파이썬 - PostgreSQL의 with 문을 사용한 경우 연결 개체 누수
13324정성태4/17/20234357.NET Framework: 2108. C# - Octave의 "save -binary ..."로 생성한 바이너리 파일 분석파일 다운로드1
13323정성태4/16/20234287개발 환경 구성: 677. Octave에서 Excel read/write를 위한 io 패키지 설치
13322정성태4/15/20235063VS.NET IDE: 182. Visual Studio - 32비트로만 빌드된 ActiveX와 작업해야 한다면?
13321정성태4/14/20233890개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동
13320정성태4/13/20233870개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동
13319정성태4/12/20234318개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치
13318정성태4/11/20234150개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우
13317정성태4/11/20234237오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...
13316정성태4/10/20233565오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생
13315정성태4/10/20233775Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의파일 다운로드1
13314정성태4/9/20233859개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치
13313정성태4/9/20233937개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]
13312정성태4/8/20233952Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)파일 다운로드1
13311정성태4/7/20234463C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)
13310정성태4/6/20234061C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library
13309정성태4/5/20234229.NET Framework: 2107. .NET 6+ FileStream의 구조 변화
13308정성태4/4/20234123스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법
13307정성태4/4/20233887.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법
13306정성태4/3/20233679Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...