본문 바로가기

소이뉴스

인공지능의 활용 - 누군지 안 알랴줌~

본 글은 소이넷에서 발행하는 뉴스레터 메일인 소이뉴스에 게재했던 내용을 담고 있습니다.

메일 구독을 원하시는 분은 구독링크를 통해 신청해 주세요.

 

 

안녕하세요, 구독자님.

 

11월의 마지막 한주를 잘 보내고 계신지요?

 

얼마 전 인공지능 학습 데이터 라벨링을 부업으로 하고 있는 지인과 얘기를 나눌 기회가 있었습니다. 데이터 가공 플랫폼 기업에서 제공하는 온라인 교육과 테스트, 심지어는 자격을 취득하고 라벨링 일감이 나오면 육아 중간중간에 짬짬히 시간을 내어 하는 것이었죠. 최근에 하고 있는 작업은 도로 상의 자동차와 표지판 라벨링 작업이라고 하길래 아... 자율주행 기술 개발을 위해서 기업이나 정부에서 수집하는 것이겠구나 생각했습니다.

 

구독자님 중에는 이렇게 도로 위를 달리는 차량에서 찍은 영상에 개인을 식별할 수 있는 얼굴 사진이나 자동차 번호판, 전화번호 등등이 포함되어 있을까봐 걱정하시는 분들도 있을 것 같습니다. 알아본 바에 의하면 최근에는 AI 학습용 데이터 구축 과제를 통해 수집/라벨링 되는 데이터들은 이런 부분을 다 고려해서 비식별화가 의무적으로 적용된다고 합니다.

 

얘기가 나왔으니 이번 글에서는 이미지나 영상 데이터 가운데 개인 비식별화를 위해 사용되는 안면 비식별화에 대해 간략하게 알아보도록 하겠습니다.


비식별화(de-identification)


비식별화(de-identification)란?

 

한국정보화진흥원(NIA)가 발행한 자료에서는, 비식별화란 '정보의 일부 또는 전부를 삭제, 대체하거나 다른 정보와 쉽게 결합하지 못하도록 하여 특정 개인을 알아볼 수 없도록 하는 일련의 조치'라고 되어 있습니다. 깔끔하게 잘 다듬어진 정의 같아서 그대로 옮겨 봤는데 좀 더 간단히 요약해 보면  '데이터가 누구 것인지 알아볼 수 없도록 하는 것'이라고 할 수 있겠습니다.

 

비식별화는 익명화(Anonymization)과 가명화(Pseudonymization) 두가지로 구분할 수 있는데, 익명화는 완전히 식별이 불가능하도록 하는 것이고 가명화는 추가 정보의 결합 없이는 식별을 할 수 없도록 데이터의 일부를 삭제하거나 일부/전부를 대체하는 것을 의미합니다. 가명화 방식에는 다양한 기술적인 접근방법이 존재합니다.

 

비식별화가 필요한 데이터에는 어떤 것이 있나요?

 

개개인의 정보를 포함하는 데이터에는 신분 증명이 가능한 신상정보 (예: 거주지, 주민번호, 나이, 출신지, 출신학교, 나이, 등등)나 신체상태 정보 (예: 체온, 심박동 등등), 사용 차량이나 모바일 기기 정보, 행동/행위 정보 (예: 이동/방문 경로, 구매이력, 기기의 사용 이력, 등등)과 같은 다양한 영역의 것들이 있습니다. 즉, 직/간접적으로 개인을 식별할 수 있는 모든 데이터가 원칙적으로는 비식별화의 대상이 된다고 할 수 있습니다. 다만, 앞서 언급한대로 비식별화의 수준이 익명화냐 가명화냐, 데이터의 적용처가 어디냐 등등 다양한 사유에 의해 비식별화를 해야 하는 데이터의 범주는 달라질 수 있습니다.

 

예전에는 개인 정보를 함부로 사용할 수 있었나요?

 

그렇지 않습니다. 과거(2020년 데이터3법 이전)에는 원칙적으로 각 개인의 동의 없이는 개인정보를 수집 활용하는 것이 불법이었습니다. 그러던 것이, 통계작성 및 과학적 연구, 공익적 기록보존 등을 위해 사용될 수 있는 데이터가 너무 제한될 수 있기 때문에, 2020년에 개된 데이터3법(개인정보보호법, 정보통신망 이용촉진 및 정보보호 등에 관한 법률, 신용정보의 이용 및 보호에 관한 법률)이 개정되어 개인정보 가운데 민감정보 (예:이름, 전화번호, 메일, 등등)가 빠진 '가명정보'를 활용할 수 있게 되었습니다. 그래서, 현재는 비식별화된 데이터는 개인의 동의 없이도 상업적으로 활용할 수 있게 되었죠. 다만, 비식별화된 정보들을 상호 결합해서 개인 식별을 할 위험이 있기 때문에 데이터를 다루는 기관에서 결합 시에는 개인정보보호위원회나 전문기관에 의뢰해야 한다는 규정을 추가로 두고 있습니다. (참고글)

 

개인정보가 인공지능 쪽에서 중요한 이유는 뭔가요?

 

4차산업혁명의 핵심은 '데이터와 이를 활용한 인공지능'이라고들 합니다. 실제로 대부분의 인공지능은 학습할 충분한 데이터가 없으면 실생활에 적용할 수 없는 무용지물이 됩니다. 그만큼 데이터의 중요성은 크죠. 이런 데이터 중에는 개개인의 정보를 포함하고 있는 경우가 많은데, 그 이유는 인공지능을 통해 풀고자 하는 핵심적인 문제 중에 '**사람들의 행동이나 상태를 분석하고 이를 기반으로 비즈니스 차원에서의 의사결정을 신속하고 정확하게 하는 것'**이 들어 있기 때문입니다.

 

이렇게 비식별화를 해 버리면 인공지능이 활용하는데 문제가 없나요?

 

인공지능 모델로 어떤 것을 하려는지에 따라 달라질 수 있습니다. 예를 들어 마스크 착용판정나 안면인식 등에 사용되는 인공지능 모델에서는 안면 비식별화 데이터는 많은 제약이 있을 수도 있지만, 자세예측에 사용되는 모델에서는 학습에 전혀 문제가 없을 수도 있는 것이죠.


안면 비식별화(Face De-identification)


안면 비식별화(face de-identification)란?

 

비식별화 기술 중에는 '영상데이터 익명화' 또는 '영상데이터 비식별화'라고 하는 것이 있는데 이는 영상 내에서 개인을 식별하는데 사용될 수 있는 영역을 찾아내고 이를 식별하지 못하도록 변형하는 기술을 말합니다. **'안면 비식별화'**는 '**영상 속에 나오는 사람의 얼굴 영역에 대한 비식별화'**하는 기술을 말합니다.

 

안면 비식별화는 좀 더 이해하기 쉽게 예로 보여주세요.

 

예로 구글의 '스트리트 뷰' 서비스를 들어 보겠습니다. '구글 스트리트뷰'는 전세계 수많은 지역의 거리에서 촬영된 거리의 실제 이미지 영상을 웹 상에서 제공하는 서비스입니다. 촬영을 위해 전문적으로 제작된 차량이나 휴대용 장비를 이용하여 수집한 영상을 이용하는 것인데, 당연히 이 속에는 수많은 사람들과 차량 등이 포함되어 있습니다. 구글은 놀랍게도 '스트리트 뷰' 상에서 제공되는 모든 영상에서 사람들의 얼굴 부분이나 자동차 번호판 부분을 식별할 수 없도록 이미지 처리를 한 상태로 제공합니다. 역시 빅테크계의 맏형답습니다. (아래 사진 참조)

 

사진) 구글 스트리트뷰로 본 뉴욕 타임스퀘어 근처 영상 중 일부 ( 출처 )

 

 

안면 비식별화 기술은 어떤 것이 있나요?

 

안면 비식별화에는 감지된 얼굴 영역에 대해 다음과 같이 다양한 기술이 적용될 수 있습니다.

  • Bluring (영상을 흐릿하게 변환) - 비전 기술
  • Mosaic (모자이크 처리, Pixel화) - 비전 기술
  • Random noise (얼굴 영역 이미지에 랜덤한 노이즈 적용 처리)
  • Blackout (얼굴 영역 전체를 블랙처리)
  • Censor bar/ mask (특정 영역을 마스킹 처리)
  • Synthesis (가상으로 생성된 다른 얼굴로 대체) - 인공지능 + 비전 기술
  • 기타 등등

 

사진)  다양한 방식의 비식별화 처리 예시 (출처)

 

 

이외에도 사람의 눈으로는 개인을 식별할 수 없도록 하면서도 AI가 학습을 위해 필요한 데이터는 포함할 수 있도록 하는 특별한 익명화 기술을 적용한 케이스(예: 딥핑소스 비식별화 솔루션 사례)도 있습니다.

 

인공지능을 이용한 안면 비식별화 처리는 어떤 과정으로 진행되나요?

 

처리 과정은 의외로 단순합니다. 입력된 영상 이미지에서 사람의 얼굴 영역을 감지한 후, 해당 영역에 비식별화 기술을 적용하는 것이죠. 얼굴 영역을 감지할 때, 바운딩 박스 형태로 영역을 잡을 것인지 아니면 얼굴 윤곽을 따라 영역을 잡을 것인지에 따라서 적용되는 감지모델은 달라질 수 있습니다. 또한 얼굴 영역에는 위에서 언급한 다양한 비식별화 기술을 적용할 수 있습니다.

 

간단히 적용해 볼만한 비식별화 모델이 있을까요?

 

github 등에 공개되어 있는 안면 비식별화 모델 또는 구현체들이 다수 있는데 그 가운데 몇 가지를 적어보겠습니다.

 

이외에 이런 상용 서비스를 제공하는 곳들도 다수 있는데 일부를 옮겨봅니다.

 

비식별화 관련해서 좀 더 알고 싶어요.

 

제가 찾아본 비식별화 관련 자료입니다. 참고가 되었으면 좋겠네요.

 


안면 비식별화(Face De-identification) 모델 테스트


안면 비식별화 예시

 

안면 감지를 위한 모델은 공개 모델 중 yolov7-face라는 것을 사용해 보겠습니다. 이 모델을 이용해서 얼굴 영역을 감지한 후 해당 부분에 단순히 gaussian blur 처리를 하는 간단한 예제를 만들어 보겠습니다. 테스트에 사용한 원본 사진은 이곳에 있습니다.

 

절차

 

테스트를 위한 코드와 모델의 weight 파일은 해당 모델의 github repo를 clone하고 링크에 걸려 있는 weight를 다운받아 진행하면 됩니다. 그리고 나서 아래 예제 코드를 다운받은 폴더에 생성한 후 실행해 보시기 바랍니다. 이 코드는 해당 github repo에서 제공하는 detect.py에서 필요한 부분만 남긴 후 감지된 안면부를 blur 처리하는 부분만 추가한 간단한 예제입니다.

 

테스트 용 예시 코드

from pathlib import Path
import cv2
import torch
from models.experimental import attempt_load
from utils.datasets import LoadImages
from utils.general import non_max_suppression, scale_coords

device = 'cpu'
kpt_label = 5

def detect():
    # Load model
    model = attempt_load('yolov7-w6-face.pt', map_location='cpu') 
    stride = int(model.stride.max())
    names = model.module.names if hasattr(model, 'module') else model.names  # get class names
    dataset = LoadImages('./crowd.jpg', img_size=640, stride=stride)
    # Run inference
    for path, img, im0s, vid_cap in dataset:
        img = torch.from_numpy(img).to(device)
        img = img.float()  # uint8 to fp16/32
        img /= 255.0  # 0 - 255 to 0.0 - 1.0
        if img.ndimension() == 3: img = img.unsqueeze(0)

        # Inference
        pred = model(img, augment=False)[0]

        # Apply NMS
        pred = non_max_suppression(pred, 0.25, 0.45, classes=0, agnostic=False, kpt_label=kpt_label)

        # Process detections
        for i, det in enumerate(pred):  # detections per image
            p, s, im0, frame = path, '', im0s.copy(), getattr(dataset, 'frame', 0)
            gn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwh
            if len(det):
                # Rescale boxes from img_size to im0 size
                scale_coords(img.shape[2:], det[:, :4], im0.shape, kpt_label=False)
                scale_coords(img.shape[2:], det[:, 6:], im0.shape, kpt_label=kpt_label, step=3)

                # Write results
                for det_index, (*xyxy, conf, cls) in enumerate(reversed(det[:,:6])):
                    c = int(cls)  # integer class
                    label =  f'{names[c]} {conf:.2f}'
                    kpts = det[det_index, 6:]

                    # replace face region with blurred one
                    left_pos, top_pos, right_pos, bottom_pos = int(xyxy[0]), int(xyxy[1]), int(xyxy[2]), int(xyxy[3])
                    face_image = im0[top_pos:bottom_pos, left_pos:right_pos]
                    face_image = cv2.GaussianBlur(face_image, (99,99), 30)
                    im0[top_pos:bottom_pos, left_pos:right_pos] = face_image

            cv2.imshow(str(p), im0)
            if cv2.waitKey(10000) == ord('q'): break

if __name__ == '__main__':
    with torch.no_grad():
        detect()

 

테스트 코드 실행 결과

 

테스트에 사용한 모델은 생각보다 안면부 감지를 잘 해내고 있습니다. 유사한 크기의 얼굴이 있을 경우에 특히나 더 잘 해 내는 것 같습니다. (다른 이미지에서 원근감이 강하게 적용되는 경우에 누락되는 경우가 더러 있었습니다) 이렇게 감지만 잘 될면 그 뒤에 어떤 비식별화 기술을 적용할 것인지는 선택하면 되겠죠.