KIỂM SOÁT ẢNH “ĐEN” SỬ DỤNG MẠNG NƠ-RON

Một phần của tài liệu Mạng nơ-ron nhân tạo trong kiểm soát nội dung hình ảnh (Trang 62)

3.2.1. Thu thập, phân tích và xử lý dữ liệu

Dữ liệu đóng một vai trò rất quan trọng trong các giải pháp sử dụng mạng nơ-ron. Chất lượng, độ tin cậy, tính sẵn có và phù hợp của dữ liệu được sử dụng để phát triển hệ thống giúp cho các giải pháp thành công. Các mô hình đơn giản cũng có thể đạt được những kết quả nhất định nếu như dữ liệu được xử lý tốt, bộc lộ được các thông tin quan trọng. Bên cạnh đó, các mô hình tốt có thể sẽ không cho ta các kết quả mong muốn nếu dữ liệu đưa vào quá phức tạp và rắc rối.

Trong bài toán này, các ảnh đầu vào lấy mẫu có một kích thước bằng nhau để tạo nên tập cơ sở dữ liệu chuẩn giúp cho việc nhận dạng được chính xác. Với hình vuông cỡ 30×30 pixel, hình chữ nhật 25×35 pixel.

Việc xử lý dữ liệu bắt đầu bằng việc thu thập và phân tích dữ liệu, sau đó là bước tiền xử lý. Dữ liệu sau khi qua bước tiền xử lý được đưa vào mạng nơ-ron. Cuối cùng,

dữ liệu đầu ra của mạng nơ-ron qua bước hậu xử lý, bước này sẽ thực hiện biến đổi kết quả trả về của mạng nơ-ron sang dạng hiểu được theo yêu cầu của bài toán (hình 3.1). Sau đây, trong các mục tiếp theo, ta sẽ đi vào xem xét từng bước trong quá trình xử lý dữ liệu.

Hình 3.1: Xử lý dữ liệu

3.2.2. Cài đặt chương trình

Chương trình được phát triển trên nền tảng Microsoft .NET và phân tách thành các mô-đun riêng rẽ sau:

3.2.2.1. Mô-đun tiền xử lý

Ảnh đầu vào của toàn hệ thống là ảnh màu, tuy nhiên để làm giảm bớt độ phức tạp tính toán của ảnh đầu vào của mạng nơ-ron, tập các ảnh huấn luyện mạng nơ-ron đều là các ảnh mức xám. Tập các ảnh để huấn luyện mạng được xử lý (tiền xử lý) để nâng cao chất lượng độ tương phản của ảnh, độ sáng của ảnh, làm giảm hiểu ứng nhiễu, co giãn ảnh.

Với chức năng lọc nhiễu, tăng độ tương phản, tăng độ sáng ta sử dụng thư viện Aforge:

using AForge;

using AForge.Imaging;

using AForge.Imaging.Filters;

privateBitmap ApplyFilter( IFilter filter ) {

ClearCurrentImage( );

filteredImage = filter.Apply(sourceImage); return filteredImage

}

Lọc nhiễu

ApplyFilter( newContrastCorrection( ) );  Tăng độ tương phản

ApplyFilter( newContrastCorrection( ) );  Tăng độ sáng

ApplyFilter( newBrightnessCorrection( ) );

Co giãn ảnh

Các ảnh đầu vào với các cỡ khác nhau được co giãn về ảnh có kích thước xác định

publicstaticBitmap Scale(Bitmap Input, int newHeight, int newWidth)

{

double HRate = (double)Input.Height / newHeight;

double WRate = (double)Input.Width / newWidth;

Bitmap Result = newBitmap(newWidth, newHeight);

for (int i = 0; i < newHeight; i++) {

for (int j = 0; j < newWidth; j++) {

int x = (int)((double)j * WRate);

int y = (int)((double)i * HRate);

Result.SetPixel(j, i, Input.GetPixel(x, y)); }

}

return Result; }

3.2.2.2. Mô-đun trích chọn đặc trưng

Mô-đun này sẽ trích chọn các điểm da trong ảnh sau đó sẽ trích ra phần cần thiết cho quá trình nhận dạng.

Bước 1: Mô-đun thành phần phát hiện các điểm da trong ảnh với Histogram

Trong cách tiếp cận này, các lược đồ histogram được sử dụng để thể hiện mật độ trong không gian màu. Điều kiện rọi sáng đặc biệt trong các ảnh thường không biết trước và được ghi lại dưới các điều kiện khác nhau. Tuy nhiên, với một số lượng lớn dữ liệu điểm ảnh đào tạo được gán nhãn bao gồm tất cả các loại da người (Châu Á, Châu Âu, Châu Phi), vẫn có thể mô hình phân phối của các màu sắc da và không phải da trong không gian màu.

Cách tiếp cận này dựa trên histogram để phân vùng màu da. Không gian màu được lượng tử hóa thành dãy các ô, mỗi ô tương ứng với một dải màu. Mỗi ô sẽ lưu số lần các màu tương ứng có trong tập các ảnh đào tạo có chứa da. Sau quá trình đào tạo, histogram được chuẩn hóa (normalized)- chuyển các giá trị của histogram thành các phân phối xác suất rời rạc:

Để giảm số lượng không gian lưu trữ, các kỹ thuật lấy mẫu thô không gian màu thường được sử dụng. Hệ thống sử dụng cách lấy mẫu 32×32×32 dựa theo phân tích của Jones, Rehg. Trong đó skin[c] là giá trị của ô trong histogram tương ứng với vector màu c. Norm là tổng giá trị của tất cả các ô (Jones, Rehg 1999). Histogram sử dụng được xây dựng từ hơn 1 tỷ điểm ảnh được đánh giá bởi Jones, Rehg.

Các giá trị sau khi chuẩn hóa của các ô tạo nên các xác suất trước

Các giá trị P(skin|c) thực sự là một xác suất có điều kiện P(c|skin) – xác suất quan sát thấy màu c, khi chúng ta thấy một điểm màu da.

) ( ) | ( ) ( ) | ( ) ( ) | ( ) | ( skin P skin c P skin P skin c P skin P skin c P c skin P     ) | (skin c

PP(skin|c)được tính trực tiếp từ các lược đồ màu da và lược đồ không phải da

Các xác suất trướcP(skin) và P(skin)có thể được ước lượng từ số mẫu là da và không phải là da trong tập mẫu đào tạo.

Có thể tránh phải tính toàn bộ biểu thức trên bằng cách chỉ cần so sánh P(skin|c)

P(skin|c) ) ( ) | ( ) ( ) | ( ) | ( ) | ( skin P skin c P skin P skin c P c skin P c skin P    

So sánh biểu thức trên với ngưỡng sẽ tạo ra luật quyết định:    ) | ( ) | ( skin c P skin c P

Nếu tỷ lệ lớn hơn Θ, điểm ảnh sẽ được coi là da, và ngược lại điểm ảnh được coi không phải là da.

Hình 3.2: Hình trái là ảnh đầu vào, hình phải là ảnh sau quá trình phát hiện da

Kết quả ra của quá trình phát hiện da là một bản đồ da đa mức xám, mức độ xám chỉ độ mức độ tin tưởng điểm ảnh đó là da. Bước tiếp theo là phân loại ảnh dựa theo hình dáng của vùng da.

Bước 2: Trích chọn thuộc tính dựa trên cửa sổ trượt

Nguyên tắc tìm kiếm bộ phận “đen” (chẳng hạn vòng 1 “đen”) trong ảnh được thực hiện bằng quét một cửa sổ có kích thước cố định bằng trung bình chiều dài × trung bình chiều cao của các mẫu (pattern) trên ảnh đầu vào. Tại mỗi vị trí, cửa sổ đó sẽ được đánh giá là bộ phận “đen” hay không dựa trên kết quả đầu ra của mạng nơ-ron. Một ảnh đầu vào được biểu diễn và xử lý đa phân giải với tỷ lệ kích thước giữa các ảnh được lựa chọn là 1:2.

Quá trình tìm kiếm vét cạn toàn bộ (full search) trên mặt phẳng ảnh sẽ tốn rất nhiều thời gian và gặp khó khăn đối với yêu cầu giảm thời gian này.

Mục tiêu đặt ra là phải giảm thời gian tìm kiếm. Tác giả đề nghị một giải pháp là việc tìm tiếm chỉ thực hiện trên vùng da đã được phân vùng ảnh, sẽ không tìm trên vùng không màu da. Như vậy khối phân tách màu da với thuật toán đã trình bày ở trên được tích hợp vào hệ thống phát hiện bộ phận “đen” cho quá trình phân tích tìm kiếm các bộ phận “đen” trong ảnh vào. Giải pháp này cho phép tăng tốc độ tìm kiếm đáng kể.

Hình 3.3: Ảnh được trích chọn đặc trưng

3.2.2.3. Mô-đun huấn luyện mạng nơ-ron

Các ảnh đưa vào huấn luyện được chuẩn hóa với độ phân giải là trung bình chiều dài × trung bình chiều cao, thường lân cận 1000 pixels.

Lựa chọn kiến trúc mạng đa lớp (Multilayer Peceptron - MLP) với giải thuật học lan truyền. Để có thể tạo mô hình học tốt, các yêu cầu theo tiêu chí dưới đây được đề nghị:

 Các ảnh có chứa bộ phận “đen” được càng nhiều thay đổi của bộ phận “đen” càng tốt, khi đó khả năng nhận dạng càng cao.

 Chất lượng ảnh càng rõ nét thì càng dễ huấn luyện.

Bên cạnh đó, bằng thực nghiệm tác giả thấy rằng khi giữ nguyên số điểm ảnh làm số nơ-ron đầu vào (ví dụ ảnh bộ phận có kích thước là 50×30 = 1500 điểm ảnh) thì thời gian huấn luyện của mạng là rất lâu (tính bằng giờ) nên tác giả đã đề xuất cải tiến cài đặt lại một số tham số của mạng nơ-ron như sau:

 Số nơ-ron đầu vào: 0.33 × (tích trung bình chiều cao × trung bình chiều rộng)

 Số nơ-ron lớp ẩn: 0.11 × (tích trung bình chiều cao × trung bình chiều rộng)

 Số nơ-ron lớp ra: bằng số mẫu huấn luyện.

Khi đó thời gian huấn luyện sẽ giảm xuống (tính bằng phút). Quá trình huấn luyện mạng được diễn ra như sau:

 Đưa nơ-ron đầu vào vào lớp  Tính toán giá trị đầu vào

 Tính toán kết quả đầu ra với giá trị đầu ra mong muốn với giá trị đầu vào. Quá trình này gọi là xác định lỗi.

 Thay đổi trọng số của nơ-ron dựa trên các lỗi trước.

 Lặp lại quá trình này cho đến khi đạt đến lỗi ít nhất mà có thể chấp nhận được (ví dụ, error < 1.1), tức là mạng nơ-ron được huấn luyện thành công hay đạt đến tối đa quá trình lặp, tức là quá trình huấn luyện mạng nơ-ron không thành công.

Quá trình huấn luyện được cài đặt như sau:

public bool Train() {

double currentError = 0; int currentIteration = 0;

NeuralEventArgs Args = new NeuralEventArgs() ; do

{

currentError = 0;

foreach (KeyValuePair<T, double[]> p in TrainingSet) {

NeuralNet.ForwardPropagate(p.Value, p.Key); NeuralNet.BackPropagate();

currentError += NeuralNet.GetError(); }

currentIteration++;

if (IterationChanged != null && currentIteration % 5 == 0) {

Args.CurrentError = currentError;

Args.CurrentIteration = currentIteration; IterationChanged(this, Args);

}

} while (currentError > maximumError && currentIteration < maximumIteration && !Args.Stop);

if (IterationChanged != null) { Args.CurrentError = currentError; Args.CurrentIteration = currentIteration; IterationChanged(this, Args); }

if (currentIteration >= maximumIteration || Args.Stop) return false; //Huan luyen loi

return true; }

Trong đó hàm ForwardPropagate() và BackPropagate() được cài đặt cụ thể như sau:

// Ham lan truyen xuoi

publicvoid ForwardPropagate(double[] pattern, T output) {

int i, j;

double total;

//Apply input cho mang

for (i = 0; i < PreInputNum; i++) {

PreInputLayer[i].Value = pattern[i]; }

//Tinh Inputs va Outputs cho lop Input

for (i = 0; i < InputNum; i++) {

total = 0.0;

for (j = 0; j < PreInputNum; j++) {

total += PreInputLayer[j].Value * PreInputLayer[j].Weights[i];

}

InputLayer[i].InputSum = total; InputLayer[i].Output = F(total); }

//Tinh Inputs va Outputs cho lop Hidden

for (i = 0; i < HiddenNum; i++) {

total = 0.0;

for (j = 0; j < InputNum; j++) {

total += InputLayer[j].Output * InputLayer[j].Weights[i];

}

HiddenLayer[i].InputSum = total; HiddenLayer[i].Output = F(total); }

//Tinh Inputs, Outputs, Targets, Errors cua lop Ouput

for (i = 0; i < OutputNum; i++) {

total = 0.0;

for (j = 0; j < HiddenNum; j++) {

total += HiddenLayer[j].Output * HiddenLayer[j].Weights[i];

} OutputLayer[i].InputSum = total; OutputLayer[i].output = F(total); OutputLayer[i].Target = OutputLayer[i].Value.CompareTo(output) == 0 ? 1.0 : 0.0; OutputLayer[i].Error = (OutputLayer[i].Target - OutputLayer[i].output) * (OutputLayer[i].output) * (1 - OutputLayer[i].output); } }

// Ham truyen nguoc de cap nhat trong so (weight)

publicvoid BackPropagate() {

int i, j;

double total;

//Fix Error tang Hidden

for (i = 0; i < HiddenNum; i++) {

total = 0.0;

for (j = 0; j < OutputNum; j++) {

total += HiddenLayer[i].Weights[j] * OutputLayer[j].Error;

}

HiddenLayer[i].Error = total; }

//Fix Error tang Layer

for (i = 0; i < InputNum; i++) {

total = 0.0;

for (j = 0; j < HiddenNum; j++) {

total += InputLayer[i].Weights[j] * HiddenLayer[j].Error;

}

InputLayer[i].Error = total; }

// Cap nhat trong so lop dau tien

for (i = 0; i < InputNum; i++) {

for (j = 0; j < PreInputNum; j++) {

PreInputLayer[j].Weights[i] +=

learningRate * InputLayer[i].Error * PreInputLayer[j].Value; }

}

//Cap nhat trong so lop thu 2

for (i = 0; i < HiddenNum; i++) {

for (j = 0; j < InputNum; j++) {

learningRate * HiddenLayer[i].Error * InputLayer[j].Output; }

}

//Cap nhat tron so lop thu 3

for (i = 0; i < OutputNum; i++) {

for (j = 0; j < HiddenNum; j++) {

HiddenLayer[j].Weights[i] +=

learningRate * OutputLayer[i].Error * HiddenLayer[j].Output; }

} }

3.2.2.4. Mô-đun nhận dạng và ra quyết định

Với ảnh đầu vào cần nhận dạng, sau khi dùng tiền xử lý, trích chọn đặc trưng cần thiết đem so sánh với các mẫu đã huấn luyện để rút ra mẫu trùng nhất (tính theo phần trăm).

// Nhan dang anh

publicvoid Recognize(double[] Input, ref T MatchedHigh, refdouble

OutputValueHight, ref T MatchedLow, refdouble OutputValueLow) {

int i, j;

double total = 0.0;

double max = -1;

//Apply input cho mang

for (i = 0; i < PreInputNum; i++) {

PreInputLayer[i].Value = Input[i]; }

//Tinh Inputs va Outputs cua lop Input

for (i = 0; i < InputNum; i++) {

total = 0.0;

for (j = 0; j < PreInputNum; j++) {

total += PreInputLayer[j].Value * PreInputLayer[j].Weights[i];

}

InputLayer[i].InputSum = total; InputLayer[i].Output = F(total); }

// Tinh Inputs va Outputs cua lop Hidden

for (i = 0; i < HiddenNum; i++) {

total = 0.0;

for (j = 0; j < InputNum; j++) {

total += InputLayer[j].Output * InputLayer[j].Weights[i];

}

HiddenLayer[i].InputSum = total; HiddenLayer[i].Output = F(total); }

//Tim Output trung voi mau

for (i = 0; i < OutputNum; i++) {

total = 0.0;

for (j = 0; j < HiddenNum; j++) {

total += HiddenLayer[j].Output* HiddenLayer[j].Weights[i];

} OutputLayer[i].InputSum = total; OutputLayer[i].output = F(total); if (OutputLayer[i].output > max) { MatchedLow = MatchedHigh; OutputValueLow = max; max = OutputLayer[i].output; MatchedHigh = OutputLayer[i].Value; OutputValueHight = max; } } }

Với những ảnh sau khi trích chọn đặc trưng trùng với mẫu đến 70% thì xác định đó là ảnh “đen” từ đó đưa ra màn hình cảnh báo. Sau đó nơ-ron cập nhật vào danh mục mẫu đã được training. Khả năng “tự học” là điểm rất hay của mạng nơ-ron nhân tạo.

3.2.3. Chương trình kiểm soát ảnh “đen” BlockPornImage 3.2.3.1. Một số hình ảnh về chương trình 3.2.3.1. Một số hình ảnh về chương trình

 Màn hình chính

Hình 3.4: Tab quản lý mạng và phát hiện ảnh

 Cấu hình mạng các tham số cho mạng nơ-ron 3 lớp

 Huấn luyện mạng

Hình 3.6: Mạng đang được huấn luyện

 Phát hiện ảnh

Hình 3.8: Ảnh đầu vào

3.2.3.2. Môi trường thử nghiệm

 Máy sử dụng Core i5, 2410M, 2.3GHz; RAM 4GB  Cài đặt Microsoft .NET 3.5

3.2.3.3. Kết quả thực nghiệm

Để đánh giá khả năng phát hiện điểm ảnh da trong ảnh, sử dụng hai thông số đánh giá là:

 Tỷ lệ các ảnh không phải “đen” được cho là “đen”  Tỷ lệ các ảnh “đen” được xác định là ảnh “đen”.

Để tạo cơ sở dữ liệu học, tác giả đã xây dựng một tập hợp hơn 1.342 ảnh mẫu “đen” với tương ứng với các lớp là các bộ phận “đen” của cơ thể với các tư thế, điều kiện ánh sáng khác nhau. Tập hợp các ảnh này được sử dụng để huấn luyện mạng nơ-ron MLP.

Hệ thống phát hiện thử với 100 ảnh màu được khác nhau. Sau đây là bảng kết quả thực nghiệm:

Phát hiện đúng Phát hiện sai

Số lượng 78 22

Tỷ lệ 78% 22%

Bảng 3.1: Kết quả thử nghiệm

Có một số trường hợp bộ phân loại ảnh làm việc chưa thật tốt. Ví dụ hình 3.9

Hình 3.10: Một số hình ảnh bị phân loại sai

Trong ảnh khiêu dâm thứ nhất chứa nhiều ảnh nhỏ nối với nhau. Cửa sổ quét vùng da lớn nhất của ảnh này là rất lớn, nhưng xác suất da trung bình trong vùng da đó lại nhỏ. Ảnh thứ hai bị phát hiện sai là do ảnh có màu sắc như da và xác suất da trung

bình trong cửa sổ quét toàn bộ vùng da và vùng da lớn nhất là rất cao. Ảnh thứ ba là một ảnh chân dung nhưng bị xác định là “đen” do có quá nhiều da và quần áo có màu như da.

Kết quả thực nghiệm của giải pháp đưa ra cho thấy các hình ảnh “đen” đã được phát hiện với tỷ lệ chính xác trong phạm vi cho phép và mang lại hiệu quả rõ rệt về thời gian.

Tóm tắt chương 3

Trong chương 3 đã trình bày quá trình thu thập, xử lý dữ liệu; phân tích, thiết kế chương trình thử nghiệm và đánh giá kết quả thử nghiệm.

PHẦN KẾT LUẬN

Phát hiện hình ảnh “đen” là một bài toán khó và mới. Để đáp ứng các yêu cầu đa dạng của thực tế, một giải pháp trọn vẹn và toàn diện cho vấn đề này đòi hỏi phải có khả năng xử lý tốt đáp ứng thời gian thực và đồng thời phải có khả năng đảm bảo độ phát hiện chính xác và hiệu quả khi có sự thay đổi của môi trường và đối tượng quan sát như: điều kiện ánh sáng, hướng, tư thế, sắc thái, sự che khuất bộ phận, sự xuất hiện có hoặc không của các thành phần phụ đi kèm… Đó là tất cả vấn đề đặt ra và đồi hỏi phải tiếp tục nghiên cứu.

Luận văn này đã nghiên cứu và cài đặt chương trình phát hiện ảnh “đen” bằng việc kết hợp sử dụng đặc trưng bất biến là màu da với kỹ thuật học của mạng nơ-ron để giảm thời gian tìm kiếm các bộ phận cần nhận dạng trong ảnh, để tăng tốc độ xử lý của hệ thống. Các kết quả thực nghiệm đã cho thấy những ưu điểm chủ yếu của giải pháp đưa ra vẫn đảm bảo tỷ lệ phát hiện chính xác trong phạm vi cho phép nhưng đã giảm đáng kể thời gian thực hiện. Tuy nhiên đây mới chỉ là kết quả bước đầu cũng chưa thể đáp ứng các yêu cầu thời gian thực.

Luận văn đã làm được:  Về mặt lý thuyết:

- Nắm được lý thuyết về xử lý ảnh

Một phần của tài liệu Mạng nơ-ron nhân tạo trong kiểm soát nội dung hình ảnh (Trang 62)