ユーザーが自分の写真をアップロードできる ASP.NET Web サイトを構築しています。毎日何千もの写真がアップロードされる可能性があります。私の上司から何度か尋ねられたことの 1 つは、編集者が最終決定を下す前に、いずれかの写真に「肌」が多すぎるかどうかを検出し、自動的に「成人向け」としてフラグを立てる方法がないかということです。
14 に答える
最善の策は、HSV 色空間で画像を処理することです ( rgb - hsv 変換については、こちらを参照してください)。肌の色はすべての種族でほぼ同じで、彩度が異なるだけです。HSV で画像を処理することで、肌の色を簡単に検索できます。
これは、色の範囲内のピクセル数を単純に数えることによって行うことができます。または、ピクセルの周囲で領域拡張を実行して、色の領域のサイズを計算することもできます。
編集: 粒子の粗い画像を処理するには、最初に画像に対してメディアン フィルターを実行し、次に色の数を減らして画像を最初にセグメント化することをお勧めします。画像を分類 (アダルトかどうか) し、満足のいくレベルの検出を得るために値がどのように動作するかを確認します。
編集:単純なカウントを行う必要があるいくつかのコードを次に示します(テストされていません。ここからのコードとrgbからhslへのコードの簡単なマッシュアップです)
Bitmap b = new Bitmap(_image);
BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat);
byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
byte* scan0 = (byte*)bData.Scan0.ToPointer();
int count;
for (int i = 0; i < bData.Height; ++i)
{
for (int j = 0; j < bData.Width; ++j)
{
byte* data = scan0 + i * bData.Stride + j * bitsPerPixel / 8;
byte r = data[2];
byte g = data[1];
byte b = data[0];
byte max = (byte)Math.Max(r, Math.Max(g, b));
byte min = (byte)Math.Min(r, Math.Min(g, b));
int h;
if(max == min)
h = 0;
else if(r > g && r > b)
h = (60 * ((g - b) / (max - min))) % 360;
else if (g > r && g > b)
h = 60 * ((b - r)/max - min) + 120;
else if (b > r && b > g)
h = 60 * ((r - g) / max - min) + 240;
if(h > _lowerThresh && h < _upperThresh)
count++;
}
}
b.UnlockBits(bData);
もちろん、これは、誰かの顔 (または手、足など) のクローズアップを投稿した最初のユーザーには失敗します。最終的には、コンピューターによる物体認識の方法に真のパラダイムシフトが起こるまで、これらすべての形態の自動検閲は失敗するでしょう。
それにもかかわらず、それを試みるべきではないと言っているわけではありません。しかし、私はこれらの問題を指摘したいと思います。完璧な (または良い) ソリューションを期待しないでください。存在しません。
ユーザーがいたずらな写真をアップロードしたかどうかを判断できる市販のソフトウェアが存在するとは思えません。最善の策は、ユーザーが画像の横にあるボタンを使用して、画像に「大人のみ」のフラグを立てることです。(明確化: 写真をアップロードしたユーザー以外のユーザーを意味します。これは、StackOverflow で投稿を攻撃的にマークする方法と同様です。)
また、専用の製品で同じことを試みたこのレビューを検討してください: http://www.dansdata.com/pornsweeper.htm .
もちろん、今日の StackOverflow ポッドキャストからリンクを盗みました:)。
ブログ投稿で汚い言葉を正確に検出するフィルターを作成することさえできず、上司はポルノ検出器を求めていますか? クラブチック!
あなたの答えは、タスクをクラウドソーシングすることにあると思います。これはほとんど常に機能し、非常にうまくスケーリングする傾向があります。
一部のユーザーを「管理者」にしてさまざまな権限を設定する必要はありません。各画像の近くに「不適切な」リンクを有効にしてカウントを維持するだけで済みます。
ECCV に掲載された Fleck/Forsyth 著の重要な論文 " Finding Naked People " を参照してください。(高度)。
理論的/アルゴリズム的な観点から興味深い質問です。この問題への 1 つのアプローチは、大きな肌色の領域を含む画像にフラグを立てることです (Trull が説明したように)。
ただし、表示される肌の量は攻撃的なイメージの決定要因ではなく、表示される肌の位置です。おそらく、顔検出 (アルゴリズムの検索) を使用して結果を絞り込むことができます。肌の領域が顔に比べてどれくらい大きいか、それらが顔に属しているかどうか (おそらくどれくらい下にあるか) を判断できます。
Flickr か Picasa がこれを実装していることは知っています。このルーチンは FleshFinder と呼ばれていたと思います。
これを行うためのアーキテクチャに関するヒント:
これを ASP.NET パイプラインとは別の Windows サービスとして実行します。画像をリアルタイムで分析するのではなく、サービスが処理するためにアップロードされる新しい画像のキューを作成します。
必要に応じて通常の System.Drawing を使用することもできますが、実際に大量の画像を処理する必要がある場合は、ネイティブ コードと高性能グラフィックス ライブラリを使用して、サービスからルーチンを P/invoke することをお勧めします。
リソースが利用可能であるため、バックグラウンドで画像を処理し、編集者のレビューに疑わしいものにフラグを付けます。これにより、レビューする画像の数が大幅に削減されますが、肌色の家の写真をアップロードする人を煩わせることはありません.
私は統計的な観点から問題に取り組みます。安全と思われる写真とそうでない写真を集めて (調査の楽しい 1 日になります)、それらの共通点を確認してください。色の範囲と彩度についてすべてを分析して、すべてのいたずらな写真と安全な写真のいくつかが持つ特徴を選択できるかどうかを確認します.
おそらく、 Slashdot で報告されているように、 Porn Breath Testが役立つでしょう。
Rigan Ap-apidは WorldComp '08 でまさにこの問題空間に関する論文を発表しました。論文はここにあると言われていますが、サーバーがタイムアウトしていました。私は論文のプレゼンテーションに出席し、彼は比較可能なシステムとその有効性、および彼自身のアプローチについて説明しました。彼に直接連絡するかもしれません。
Dolores LabsのCrowdSifterがうまくいくかもしれません。彼らは統計とクラウドソーシングが好きで、それについて話すのが好きなようで、私はいつも彼らのブログを読んでいます. 彼らは多くの処理に amazon のメカニカル タークを使用し、結果を処理して正しい答えを得る方法を知っています。少なくとも彼らのブログをチェックして、いくつかのクールな統計実験を確認してください.
Bill (および Craig の Google の引用) で前述したように、統計的手法は非常に効果的です。
あなたが調べたいかもしれない2つのアプローチは次のとおりです。
- ニューラルネットワーク
- 多変量解析 (MVA)
MVA のアプローチは、許容できる画像と許容できない画像の「代表的なサンプル」を取得することです。X データは各画像のバイト配列で、Y は許容できない場合は 1、許容できる場合は 0 として割り当てられます。このデータを使用して PLS モデルを作成します。モデルに対して新しいデータを実行し、Y の予測精度を確認します。
このバイナリ アプローチではなく、複数の Y を使用できます (例: 0 = 許容可能、1 = 水着/下着、2 = ポルノ)
モデルを構築するには、オープン ソース ソフトウェアを参照するか、多数の商用パッケージを利用できます (ただし、通常は安価ではありません)。
最良の統計的アプローチでさえ完全ではないため、ユーザーのフィードバックを含めることはおそらく良い考えです。
頑張ってください (最悪の場合、承認された有料の活動としていたずらな写真を収集することに時間を費やすことになります!)
申し訳ありませんが、正しい方向に向けることはできませんが、これが以前に行われたことについて読んだことを覚えています. それは、赤ちゃんの写真が誤って捕らえられてフラグが付けられたことについて不平を言う人々の文脈にありました. 何もなければ、あなたが車輪をすべて自分で発明する必要がないという希望を与えることができます... 他の誰かがこの道を進んでいます!