<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>C2PA on kenji.blog</title><link>http://kenji.blog/en/tags/c2pa/</link><description>Recent content in C2PA on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/en/tags/c2pa/index.xml" rel="self" type="application/rss+xml"/><item><title>Deepfake and Information Literacy: How to Technically Detect Fake News</title><link>http://kenji.blog/en/p/deepfake-info-literacy/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/en/p/deepfake-info-literacy/</guid><description>&lt;img src="http://kenji.blog/p/deepfake-info-literacy/img/eyecatch.jpg" alt="Featured image of post Deepfake and Information Literacy: How to Technically Detect Fake News" />&lt;h1 id="introduction-the-era-where-the-boundary-between-reality-and-fiction-melts">Introduction: The Era Where the Boundary Between Reality and Fiction Melts
&lt;/h1>&lt;p>In the 2020s, the evolution of Generative AI has been progressing at an unprecedented speed. It is now possible to generate content—text, audio, images, and even videos—that is indistinguishable from what humans create, in just a few seconds. While this technological leap brings tremendous benefits to creative fields, it has also created a serious social threat: the flood of sophisticated forged content known as &amp;ldquo;Deepfakes.&amp;rdquo;&lt;/p>
&lt;p>Deepfakes threaten society in various forms, such as fake speeches by politicians, scams impersonating corporate CEOs (an evolution of BEC scams), and pornography that defames celebrities. Especially during election periods, the spread of fake news via deepfakes has escalated to a point where it shakes the very foundation of democracy.&lt;/p>
&lt;p>In such an era, what is required of us is an update to our &amp;ldquo;information literacy.&amp;rdquo; The common sense of &amp;ldquo;believing what you see with your own eyes&amp;rdquo; is no longer valid. In this article, starting from the technical background of how deepfakes are generated, we will explain at a very deep level—incorporating mathematical formulas and code—the cutting-edge digital forensic techniques to &amp;ldquo;technically&amp;rdquo; detect them, and the frameworks (such as C2PA) for society as a whole to counter fake information.&lt;/p>
&lt;hr>
&lt;h1 id="1-the-mechanisms-of-generative-ai-supporting-deepfakes">1. The Mechanisms of Generative AI Supporting Deepfakes
&lt;/h1>&lt;p>To understand deepfakes, you must first know the mechanisms of the generative AI that forms their foundation. Currently, the two representative architectures used for generating high-definition images and videos are &amp;ldquo;GAN (Generative Adversarial Networks)&amp;rdquo; and &amp;ldquo;Diffusion Models.&amp;rdquo;&lt;/p>
&lt;h2 id="11-generative-adversarial-networks-gan">1.1 Generative Adversarial Networks (GAN)
&lt;/h2>&lt;p>Proposed by Ian Goodfellow and others in 2014, GANs ignited the deepfake technology trend. In a GAN, two neural networks take on roles like a &amp;ldquo;forger&amp;rdquo; and a &amp;ldquo;police officer,&amp;rdquo; and by competing with each other (adversarial training), they generate extremely realistic data.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Generator ($G$)&lt;/strong>: Takes random noise (latent variable $z$) as input and generates data (such as images) that looks exactly like the real thing.&lt;/li>
&lt;li>&lt;strong>Discriminator ($D$)&lt;/strong>: Determines whether the inputted data is &amp;ldquo;Real&amp;rdquo; coming from an actual dataset or &amp;ldquo;Fake&amp;rdquo; created by the generator.&lt;/li>
&lt;/ul>
&lt;p>These two networks proceed with training to optimize a loss function formulated as the following Minimax game:&lt;/p>
$$
\min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_{z}(z)}[\log(1 - D(G(z)))]
$$&lt;p>Here, $x$ is real data, and $z$ is a latent variable (noise). The discriminator $D$ tries to maximize this formula (accurately distinguishing between real and fake), and the generator $G$ tries to minimize it (fooling the discriminator). When this training reaches an equilibrium state (Nash equilibrium), the generator becomes able to generate data indistinguishable from the real thing.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
Z[&amp;#34;Latent Variable (Latent Vector Z)&amp;#34;] --&amp;gt; G[&amp;#34;Generator&amp;#34;]
G --&amp;gt; F[&amp;#34;Generated Image (Fake Image)&amp;#34;]
R[&amp;#34;Actual Image (Real Image)&amp;#34;] --&amp;gt; D[&amp;#34;Discriminator&amp;#34;]
F --&amp;gt; D
D --&amp;gt; O[&amp;#34;Truth/False Judgment (Real/Fake)&amp;#34;]
O -.-&amp;gt;|&amp;#34;Loss Feedback&amp;#34;| G
O -.-&amp;gt;|&amp;#34;Loss Feedback&amp;#34;| D
&lt;/pre>
&lt;h2 id="12-diffusion-models">1.2 Diffusion Models
&lt;/h2>&lt;p>In recent years, &amp;ldquo;Diffusion Models&amp;rdquo; have emerged as the foundational technology for Midjourney and Stable Diffusion, boasting image quality and stability that surpass GANs. A diffusion model consists of a &amp;ldquo;forward diffusion process,&amp;rdquo; which gradually adds noise to data, and a &amp;ldquo;reverse diffusion process,&amp;rdquo; which restores the original data from noise.&lt;/p>
&lt;p>In the &lt;strong>Forward Process&lt;/strong>, Gaussian noise is added step by step over time $t$ to a clean image $x_0$. This process is expressed as a Markov chain with the following formula:&lt;/p>
$$
q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I})
$$&lt;p>Here, $\beta_t$ is a schedule parameter that controls the variance of the noise. After a sufficient number of steps $T$, $x_T$ becomes complete random noise.&lt;/p>
&lt;p>In the &lt;strong>Reverse Process&lt;/strong>, a neural network (usually a U-Net architecture) learns to predict the noise from the noisy image $x_t$ and restore the previous step $x_{t-1}$. By combining this process with conditioning (such as text prompts), it becomes possible to generate any image from zero (noise).&lt;/p>
&lt;hr>
&lt;h1 id="2-digital-forensics-techniques-to-search-for-traces-of-generated-artifacts">2. Digital Forensics: Techniques to Search for Traces of Generated Artifacts
&lt;/h1>&lt;p>No matter how advanced generative models become, &amp;ldquo;mathematical and statistical traces (artifacts)&amp;rdquo; invisible to humans always remain in AI-generated data. Detection technologies (deepfake detectors) capture these subtle traces through various approaches.&lt;/p>
&lt;h2 id="21-frequency-domain-analysis-and-dct-discrete-cosine-transform">2.1 Frequency Domain Analysis and DCT (Discrete Cosine Transform)
&lt;/h2>&lt;p>Human eyes are sensitive to spatial changes (spatial domain) in an image&amp;rsquo;s color and brightness, but insensitive to frequency changes (frequency domain). Images generated by GANs or diffusion models, even if they look perfect at first glance, produce peculiar frequency patterns (such as checkerboard artifacts) during the upsampling process (enlargement from low to high resolution).&lt;/p>
&lt;p>To detect this, the &lt;strong>Discrete Cosine Transform (DCT)&lt;/strong> is often used. DCT represents an image as a sum of cosine waves of different frequencies. The formula for the 2D DCT is as follows:&lt;/p>
$$
X_{k_1, k_2} = \sum_{n_1=0}^{N_1-1} \sum_{n_2=0}^{N_2-1} x_{n_1, n_2} \cos\left[\frac{\pi}{N_1}\left(n_1 + \frac{1}{2}\right)k_1\right] \cos\left[\frac{\pi}{N_2}\left(n_2 + \frac{1}{2}\right)k_2\right]
$$&lt;p>Generated images tend to have an abnormal energy distribution in the &lt;strong>high-frequency components (fine noise and abrupt edge changes)&lt;/strong> compared to natural images. The following Python code is a simple example of extracting the energy of high-frequency components from an image using DCT.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">cv2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">scipy.fftpack&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">extract_high_frequency_features&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">image_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Load image and convert to grayscale&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">img&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cv2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">imread&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">image_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cv2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">IMREAD_GRAYSCALE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="n">img&lt;/span> &lt;span class="ow">is&lt;/span> &lt;span class="kc">None&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">raise&lt;/span> &lt;span class="ne">ValueError&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Image not found&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Apply 2D Discrete Cosine Transform (DCT)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># First apply 1D DCT to rows, then 1D DCT to columns&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dct_result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">scipy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fftpack&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dct&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">scipy&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fftpack&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">dct&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">img&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">norm&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ortho&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">T&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">norm&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ortho&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Extract high-frequency components (mask the top-left low-frequency components to zero)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rows&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cols&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dct_result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mask&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ones&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="n">rows&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">cols&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Mask the low-frequency region (10% of the whole)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mask&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rows&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="p">:&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cols&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.1&lt;/span>&lt;span class="p">)]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">high_freq_features&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">dct_result&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">mask&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Calculate the amount of energy in the high-frequency region&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">energy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">abs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">high_freq_features&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">energy&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Comparing natural images with generated images often reveals a statistically significant difference in the energy value&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This unnaturalness in the frequency domain arises because while AI can learn &amp;ldquo;local consistency at the pixel level,&amp;rdquo; it struggles to perfectly mimic the &amp;ldquo;global frequency characteristics of the entire image.&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h1 id="3-detection-of-biological-signals-confirming-the-beat-of-life-via-rppg">3. Detection of Biological Signals: Confirming the &amp;ldquo;Beat of Life&amp;rdquo; via rPPG
&lt;/h1>&lt;p>In addition to detection technologies for images (still images), a groundbreaking approach to deepfake detection in videos is the &lt;strong>extraction of biological signals&lt;/strong>.&lt;/p>
&lt;p>As long as a human is alive, blood circulates through the body in sync with the heartbeat. Because hemoglobin in the blood absorbs specific wavelengths (especially green light, around 530nm) well, the color of the facial skin changes minutely (at a level invisible to the human eye) in time with the heartbeat. The technology that uses this principle to estimate the heart rate contactlessly from standard RGB camera video is called &lt;strong>rPPG (remote Photoplethysmography)&lt;/strong>.&lt;/p>
&lt;p>The basic rPPG model based on light absorption and reflection is expressed by the Beer-Lambert law as follows:&lt;/p>
$$
I(t) = I_0(t) e^{-\left( \mu_{dc} + \mu_{ac}(t) \right) d}
$$&lt;p>Here, $I(t)$ is the light intensity observed by the camera, $I_0(t)$ is the light source intensity, $\mu_{dc}$ is the static light absorption coefficient by tissue, $\mu_{ac}(t)$ is the dynamic light absorption coefficient due to blood flow fluctuation (heartbeat), and $d$ is the path length of the light.&lt;/p>
&lt;p>Deepfake videos (such as FaceSwap, which swaps faces, or Lip-sync, which matches lip movements to audio) pursue visual realism on a frame-by-frame basis, but &lt;strong>they cannot reproduce the minute blood flow changes (heartbeat signals) along the time axis.&lt;/strong> Therefore, when attempting to extract an rPPG signal from a deepfake video, one obtains a noisy, unnatural signal that differs from the regular rhythm of a natural human heart rate (typically in the range of 60-100 bpm).&lt;/p>
&lt;pre class="mermaid">
flowchart LR
V[&amp;#34;Input Video (Video Stream)&amp;#34;] --&amp;gt; F[&amp;#34;Face Detection &amp;amp; Tracking (Face Tracking)&amp;#34;]
F --&amp;gt; R[&amp;#34;Region of Interest Extraction (ROI Extraction)&amp;#34;]
R --&amp;gt; S[&amp;#34;Spatial Pooling&amp;#34;]
S --&amp;gt; B[&amp;#34;Bandpass Filter&amp;#34;]
B --&amp;gt; H[&amp;#34;Heartbeat Signal Extraction (Heartbeat Signal)&amp;#34;]
H --&amp;gt; A[&amp;#34;Truth/False Classification &amp;amp; Anomaly Detection (Fake/Real Classification)&amp;#34;]
&lt;/pre>
&lt;p>Below is a conceptual implementation example of a pipeline for extracting rPPG signals from video using Python.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">cv2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">scipy&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">signal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">extract_rppg_signal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">video_path&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cv2&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">VideoCapture&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">video_path&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">green_signals&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">while&lt;/span> &lt;span class="n">cap&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">isOpened&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ret&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">frame&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">cap&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="ow">not&lt;/span> &lt;span class="n">ret&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">break&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 1. Face detection and extraction of ROI (Region of Interest: e.g., forehead or cheeks)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># roi = detect_face_and_extract_roi(frame)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Here, for simplicity, the central part of the entire frame is used as the ROI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">h&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">w&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">frame&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">shape&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">roi&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">frame&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.3&lt;/span>&lt;span class="p">):&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">h&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.6&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.4&lt;/span>&lt;span class="p">):&lt;/span>&lt;span class="nb">int&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="mf">0.6&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 2. Extract Green channel from RGB space&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Because hemoglobin in the blood absorbs green light the most&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g_channel&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">roi&lt;/span>&lt;span class="p">[:,&lt;/span> &lt;span class="p">:,&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3. Spatial pooling (calculating the mean value)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mean_g&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">g_channel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">green_signals&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mean_g&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cap&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">release&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">green_signals&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="kc">None&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 4. Noise removal with a bandpass filter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Extract the human heart rate frequency band (e.g., 0.7Hz - 2.5Hz = 42 - 150 bpm)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fps&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">30.0&lt;/span> &lt;span class="c1"># Assumed frame rate&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nyquist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.5&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="n">fps&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">low&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">0.7&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">nyquist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">high&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mf">2.5&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">nyquist&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">butter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">low&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">high&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="n">btype&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;bandpass&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">filtered_signal&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">signal&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">filtfilt&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">b&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">a&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">green_signals&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">filtered_signal&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># By analyzing the frequency spectrum of the extracted filtered_signal,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># if no clear peak (heartbeat) exists, it is determined that the probability of it being a deepfake is high.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="4-the-never-ending-cat-and-mouse-game-adversarial-training-and-evasion-techniques">4. The Never-ending &amp;ldquo;Cat-and-Mouse Game&amp;rdquo;: Adversarial Training and Evasion Techniques
&lt;/h1>&lt;p>As introduced so far, advanced forensic techniques such as frequency analysis and biological signals (rPPG) do exist. However, in the world of AI, there is no &amp;ldquo;absolute barrier.&amp;rdquo; As soon as a detection technology is published in a paper, attackers (deepfake creators) immediately improve their generative models to evade that detector.&lt;/p>
&lt;p>For example, suppose a detector identifies deepfakes by detecting &amp;ldquo;anomalies in the frequency domain.&amp;rdquo; Attackers will &lt;strong>incorporate this detector itself as the &amp;ldquo;Discriminator&amp;rdquo; of a new GAN&lt;/strong> and retrain the Generator. Then, the Generator evolves to output &amp;ldquo;images that are indistinguishable from natural images even in the frequency domain.&amp;rdquo;&lt;/p>
&lt;p>Furthermore, there are already reports of research (Anti-Forensics) attempting to fool rPPG-based detection systems by intentionally adding artificial &amp;ldquo;minute color fluctuations (fake heartbeat signals)&amp;rdquo; to videos in post-processing.&lt;/p>
&lt;p>Detection and generation are truly engaged in a never-ending cat-and-mouse game of &amp;ldquo;shield and spear.&amp;rdquo; For this reason, it is pointed out that the approach of judging authenticity by retrospectively analyzing only the output data (images and videos) (passive detection) will eventually reach its limit.&lt;/p>
&lt;hr>
&lt;h1 id="5-fundamental-countermeasures-provenance-proof-and-the-c2pa-framework">5. Fundamental Countermeasures: Provenance Proof and the C2PA Framework
&lt;/h1>&lt;p>As retrospective detection approaches its limits, an active defense approach that cryptographically guarantees the &amp;ldquo;Provenance&amp;rdquo; of data is rapidly being promoted worldwide. Constructing the global standard framework for this is the &lt;strong>C2PA (Coalition for Content Provenance and Authenticity)&lt;/strong>.&lt;/p>
&lt;p>C2PA is a consortium established with the participation of major companies such as Adobe, Microsoft, Intel, BBC, and Sony. It defines technical specifications to embed the provenance of digital content (who shot it, when, with which camera, and what edits were made) directly into the content itself in a tamper-evident manner.&lt;/p>
&lt;h2 id="51-how-c2pa-works">5.1 How C2PA Works
&lt;/h2>&lt;p>The core technologies of C2PA are digital signatures using Public Key Infrastructure (PKI) and content hash binding.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Manifest Generation (Manifest)&lt;/strong>: The moment a photo is taken with a camera, or when it is edited with software, a metadata called a &amp;ldquo;Manifest&amp;rdquo; is generated, which includes the operation history, device information, and creator information.&lt;/li>
&lt;li>&lt;strong>Cryptographic Signature (Digital Signature)&lt;/strong>: A digital signature is applied to the Manifest and the hash value of the image itself (a summary of the pixel data) using a hardware or software private key.&lt;/li>
&lt;li>&lt;strong>Embedding in the Asset&lt;/strong>: The signed Manifest (C2PA credential) is embedded in the header information of file formats like JPEG or MP4.&lt;/li>
&lt;/ol>
&lt;p>If an attacker attempts to tamper with a part of the image or attach fake metadata to an AI-generated image, the hash value of the image itself will change, causing the digital signature verification to fail and instantly revealing the tampering.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
C[&amp;#34;Creator / Camera&amp;#34;] --&amp;gt; M[&amp;#34;Manifest Generation&amp;#34;]
M --&amp;gt; S[&amp;#34;Signature and Binding (Cryptographic Signature)&amp;#34;]
S --&amp;gt; A[&amp;#34;Asset with C2PA Manifest&amp;#34;]
A --&amp;gt; P[&amp;#34;Platform (Social Media Platform)&amp;#34;]
P --&amp;gt; V[&amp;#34;Validation Process&amp;#34;]
V --&amp;gt; U[&amp;#34;Display on User Screen (Content Credentials UI)&amp;#34;]
&lt;/pre>
&lt;h2 id="52-visualization-with-the-content-credentials-icon">5.2 Visualization with the &amp;ldquo;Content Credentials&amp;rdquo; Icon
&lt;/h2>&lt;p>In systems compliant with the C2PA standard, when users view images on social media or news sites, an icon reading &amp;ldquo;CR (Content Credentials)&amp;rdquo; is displayed in the corner of the image. By clicking this, anyone can transparently check the history of the image, such as whether it was &amp;ldquo;generated by AI,&amp;rdquo; &amp;ldquo;shot with an actual camera,&amp;rdquo; or &amp;ldquo;color-corrected in Photoshop.&amp;rdquo;&lt;/p>
&lt;p>Currently, major AI vendors like OpenAI (DALL-E 3) and Google have started attaching C2PA metadata to generated images, and camera manufacturers like Leica and Sony are proceeding to implement C2PA signature functions at the hardware level. The paradigm of society is shifting from &amp;ldquo;detecting fakes&amp;rdquo; to &amp;ldquo;proving authenticity (Zero-Trust approach).&amp;rdquo;&lt;/p>
&lt;hr>
&lt;h1 id="6-next-generation-information-literacy-what-we-can-do">6. Next-Generation Information Literacy: What We Can Do
&lt;/h1>&lt;p>Technical countermeasures (such as deepfake detectors or provenance proofs like C2PA) are merely infrastructure to protect society. Ultimately, it is our human brains that decide whether to consume and spread information.&lt;/p>
&lt;p>&amp;ldquo;Information literacy&amp;rdquo; in the AI era means adopting the following attitudes:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Avoid Reflexive Spreading (Stop and Think)&lt;/strong>
Especially when exposed to shocking footage or content that incites anger (information appealing to emotions), stop for a moment and halt your hands from reposting or sharing. The primary goal of deepfake creators is to hack human emotions and make the information spread.&lt;/li>
&lt;li>&lt;strong>Verify the Source of the Information (Verify the Source)&lt;/strong>
Is the information transmitted by a reliable news organization? Is it accompanied by a provenance proof (Content Credentials) like C2PA? It is crucial to develop the habit of cross-checking information sources.&lt;/li>
&lt;li>&lt;strong>Healthy Skepticism that &amp;ldquo;Everything Might be Fake&amp;rdquo; (Healthy Skepticism)&lt;/strong>
There is no need to become pessimistic, but the old common sense of &amp;ldquo;video = fact&amp;rdquo; must be discarded. We must consume information with the premise that audio, video, and text can all be easily forged in this era.&lt;/li>
&lt;/ol>
&lt;h1 id="conclusion">Conclusion
&lt;/h1>&lt;p>The evolution of AI technology has opened Pandora&amp;rsquo;s box. It is no longer possible to erase the technology itself that creates deepfakes.&lt;/p>
&lt;p>However, as explained in this article, engineers are confronting the threat of fake news with a variety of approaches, such as frequency analysis, biological signal detection, and provenance proof (C2PA) using cryptography. By combining these technical shields (defenses) with the social shield of &amp;ldquo;information literacy&amp;rdquo; that each of us possesses, we should be able to navigate the wave of fiction brought by AI and protect the value of truth.&lt;/p>
&lt;p>Precisely because we are in an era where the boundary between reality and fiction is melting, the human &amp;ldquo;will&amp;rdquo; to try and discern the truth has become more important than ever.&lt;/p></description></item></channel></rss>