Nhận dạng hình ảnh, nhận dạng khuôn mặt, nhận dạng ký tự,… mới chỉ cách đây không lâu, chỉ khoảng vài thập niên, nhưng đã có rất nhiều nghiên cứu về nó. Các nghiên cứu ban đầu rất đơn giản, ảnh là đen trắng, ảnh ký tự in, ảnh chữ viết, sau này mở rộng ra là ảnh màu có nhiều góc độ khác nhau và định dạng khác nhau.
Ngày nay các hệ thống nhận dạng đặc biệt là nhận dạng hình ảnh đang được ứng dụng nhiều trong lĩnh vực thương mại, hay phát hiện tội phạm trong vấn đề an ninh và bảo mật. Nhận dạng hình ảnh tức là đưa những thông tin về đối tượng được đưa vào từ một hình ảnh hoặc từ camera. Bước đầu tiên của một hệ thống nhận dạng là dựa vào ảnh mẫu ban đầu đã được lưu trữ sẵn trong cơ sở dữ liệu và các hình ảnh bị biến dạng một mức độ nhất định và sau đó tiến hành nhận dạng đúng với mẫu ban đầu. Hiện nay lĩnh vực nhận dạng bằng hình ảnh đang được ứng dụng rất nhiều trong đời sống: nhận dạng biển số xe, nhận dạng vân tay, nhận dạng khuôn mặt, điểm danh, chấm công, nhận dạng mã sản phẩm,… nhằm giúp con người đưa ra những quyết định chính xác hơn trong công việc.
3.2.2 Mạng Hopfieldtrong nhận dạng hình ảnh.
Phát biểu bài toán: Quản lí điểm danh học sinh bằng ảnh thẻ, ảnh khuôn mặt. Với dữ liệu đầu vào là ảnh đen trắng kích cỡ 4x4 theo danh sách lớp học, trên định dạng file ảnh (*.bmp) và kiểu ảnh nhị phân. Yêu cầu là chương trình là nhận dạng ảnh dựa trên mẫu ảnh trong cơ sở dữ liệu và file ảnh đã bị biến dạng một mức độ nào đó so với ảnh gốc. Sử dụng công cụ là mạng NeuralHopfield và
đầu vào là các ảnh mẫu tạo ra độ biến dạng của ảnh mẫu sau đó trở lại ảnh ban đầu.
Ý tưởng giải quyết bài toán:
- Phân tích ảnh gốc: chia ảnh theo kích thước giới hạn, định dạng ảnh. - Chuyển đổi ảnh sang ma trận điểm ảnh.
- Chuyển thành ma trận tuyến tính và đưa vào mạng NeuralHopfield. Thuật toán :
Input : Ảnh mẫu, ảnh mẫu đã biến dạng ; Output : Ảnh mẫu ban đầu.
Bước 1 : Đưa ảnh mẫu ban đầu vào mạng Neural Hopfield ; Bước 2 : Chọn các bản mẫu của mạng ;
Bước 3 : Tạo mức độ biến dạng của ảnh mẫu ; Bước 4 : Khởi động mạng Neural Hopfield ; Bước 5 : Quay lại bước 1.
Ánh xạ bài toán lên mạng neural:
Ta gán cho mỗi cặp điểm (i, j) với i < j một neural ij với đầu vào là Vij. Như vậy với n điểm ta phải cần
2 ) 1 (n
n
Neural. Mỗi phương án của một trạng
thái của mạng ứng với Vij = 1 i - j 0 khác khi khi
Vậy bài toán đặt ra là: tìm một trang thái sao cho thoả mãn yêu cầu hàm f đạt giá trị min, hay:
n i j i j i j f d V min
Với: dij là khoảng cách từ điểm i đến điểm j. Và ràng buộc:
n i V n j i 1, 1,
Ràng buộc trên nhằm thoả điều kiện mỗi điểm chỉ được nối với đúng một điểm khác. Ta định nghĩa Vij = Vji khi j < i và Vii = 0. Đưa ra thành phần phạt vào hàm cần cực tiểu hóa ta có hàm năng lượng:
ij ij ij j 1 i j 1 E d V 1 V ; 2 2 Với là tham số.
Từ đây lấy đạo hàm riêng
ij V E ta xác định phương trình động học của các Neural: ij k ik ij ij V V V E dt dU
Hàm kích hoạt ở đây có thể chọn là hàm Meculloch-Pitts hay hàm Sigmoid. Và như vậy ta đã ánh xạ được bài toán sánh cặp có trọng lên mạng Neural nhân tạo.
3.2.3 Huấn luyện mạngHopfield.
Mạng Hopfield HF học dựa trên nguyên tắc có giám sát. Giả sử có M mẫu học tương ứng với các vectơ tín hiệu vào Xs , s = 1, 2,…, M.
Ký hiệu Wij là liên kết giữa hai neural i và j (Wij =Wji ) với Vi là đầu ra của neural i.
Ta xây dựng ma trận trọng số W như sau: W = (Wij) với
M si sj s 1 ij x x NÕu i j W 3.1 NÕui j 0
Ở đây 𝑃𝑠 = (𝑃𝑠1, … , 𝑃𝑠𝑁). (N là số neural của mạng)
N ij i j i j 1 E W V V ví i i, j = 1, 2,..., N (3.2) 2
3.2.4 Thuật toán mạng Neural Hopfield trong bài toán nhận dạng hình ảnh.
Giả sử đưa vào mạng vectơ tín hiệu X.
Sử dụng mạng để tính đầu ra tương ứng với tín hiệu vào X là quá trình lặp bao gồm các bước:
Bước 1: Ban đầu, đặt X(0) = X. Gọi Y(t) là vectơ tín hiệu ra tương ứng với một lần cho X(t) lan truyền trong mạng.
Y(t) = out(t) = Tinh (HF, X(t)).
Bước 2: Nếu Y(t) X(t)thì tiếp tục bước lặp với t=t+1 và X(t+1) = Y(t) = out(t)
Nếu Y(t) = X(t)thì dừng và khi đó X(t) được coi là kết quả xử lý của mạng khi có tín hiệu vào X. Điểm chú ý quan trọng là ma trận W không thay đổi trong quá trình sử dụng mạng.
Một vài tình huống nảy sinh: 1) Mạng không hội tụ. 2) Mạng hội tụ và X(t) = X.
3) Mạng hội tụ và X(t) = Xs với Xs là mẫu nào đó đã học. 4) Mạng hội tụ với X(t) Xs với mọi mẫu học Xs.
5) Mạng hội tụ với X(t) nào đó như trong 2) 3) 4) nhưng là ảnh ngược (1 thành -1, -1 thành 1).
6) Mạng có thể đưa ra luân phiên một vài mẫu học (hoặc ảnh ngược của chúng).
Trường hợp 2) có nghĩa rằng véc tơ X đã được đoán nhận đúng dựa trên mẫu học {Xs} hay nói cách khác, X có thể suy ra từ mẫu học.
Trường hợp 4) chỉ ra một vectơ mới, có thể xem là mẫu học và sẽ được dùng để cập nhật ma trận trọng số (xem (6)).
3.3 Ứng dụng mạngHopfield trong nhận dạng ảnh.
Xét bài toán phục hồi ảnh đen trắng kích cỡ 4 x 4. Như vậy mỗi ảnh sẽ có 16 điểm ảnh. Ta thiết kế một mạng neural hopfield với 16 neural vào và 16 neural ra.
Hình 3.1: Mạng neural hopfield với 16 neural vào và 16neural ra với n = 256neural.
Giả sử ban đầu ta có mẫu sau:
P = (0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1)
Đầu vào của mạng nhận được từ ma trận ảnh trên, lấy từng dòng một, những điểm ảnh có giá trị là 1 thì ta đổi thành -1, điểm ảnh có giá trị là 0 đổi thành 1, ta được đầu vào như sau:
P’ =(1, 1, -1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, -1,-1,-1) Đoạn code sau thực hiện công việc trên:
Bitmap b = newBitmap(imgPattern);
patternPixels = newint[imageDim, imageDim];
List<Neuron> pattern = newList<Neuron>(imageDim * imageDim);
for (int j = 0; j < imageDim; j++) {
Neuron n = newNeuron();
p = Math.Abs(b.GetPixel(i, j).ToArgb()); if (p < midColor)
{
b.SetPixel(i, j, Color.White);
n.State = NeuronStates.AlongField;//1
} else
{
b.SetPixel(i, j, Color.Black);
n.State = NeuronStates.AgainstField;//-1
}
pattern.Add(n);// add cac neural
}
Từ đầu vào của mạng ta tính ma trận trọng số dựa vào công thức (3.1): M si sj s 1 ij x x NÕu i j W NÕui j 0
Đoạn code sau thực hiện tính ma trận trọng số của mạng. Ở đây ma trận trọng số được lưu vào ma trận T:
publicvoid AddPattern(List<Neuron> Pattern)
{
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) {
if (i == j) T[i, j] = 0;
else T[i,j] +=(Pattern[i].State *
m++; }
Tạo mạng neural với kích thước 16 neural như sau:
Ban đầu tạo một số nguyên ngẫu nhiên trong đoạn [0, 1], nếu số đó là 0 thì gán điểm ảnh trong mạng đó là màu đen và trạng thái của neural tại điểm đó sẽ có giá trị là -1. Ngược lại là 1 thì gán điểm ảnh đó là màu trắng và trạng thái của neural tại điểm đó sẽ có giá trị là 1.
privatevoid CreateNNBut_Click(object sender, EventArgs e)
{
NN = newNeuralNetwork(imageDim*imageDim); panelStoredImages.Controls.Clear();
NN.EnergyChanged +=
newEnergyChangedHandler(NN_EnergyChanged);
Random rnd = newRandom(); int r = 0;
imNNState.pixels = newint[imageDim, imageDim]; for (int i = 0; i < imageDim; i++)
for (int j = 0; j < imageDim; j++) { r = rnd.Next(2); if (r == 0)imNNState.pixels[i, j]= Color.Black.ToArgb(); elseif (r == 1) imNNState.pixels[i, j] = Color.White.ToArgb(); } patternSelected = false; butAddPattern.Enabled = true; butRunDynamics.Enabled = false; imNNState.Visible = true; imNNState.Invalidate(); UpdatePropertiesPB();
}
Gán trạng thái cho các neural trong mạng:
List<HopfieldNeuralNetwork.Neuron> initialState = newList<HopfieldNeuralNetwork.Neuron>(NN.N);
for (int i = 0; i < imageDim; i++) for (int j=0;j<imageDim;j++)
{
Neuron neuron = newNeuron();
if (imNNState.pixels[i, j] ==
Color.Black.ToArgb()) neuron.State =
NeuronStates.AgainstField;//-1
elseif (imNNState.pixels[i, j]==
Color.White.ToArgb())
neuron.State = NeuronStates.AlongField;//1 initialState.Add(neuron);
}
Hàm năng lượng của mạng là: (Vì không có tín hiệu bên ngoài nên hệ số bias = 0) E= - i j N j i ijVV W 2 1 , với i, j= 1, 2, ..., N
Tại mỗi thời điểm t mỗi neural i tổng hợp các tín hiệu Vj từ những neural khác: N 1 i ij j j i U W V Ta có: Vi f Ui( i), với fi là hàm kích hoạt. Ở đây ta sử dụng hàm kích hoạt hardlims nên:
1 ,ví i i = 1,...., N (N lµ sè neural trong m¹ng) 1 i V
Năng lượng tại neural i là: Ei = -ViUi
Nếu Ei< 0 thì Vi(t+1) = Vi(t). Nếu Ei> 0 thì Vi(t+1) = -Vi(t).
Mạng đạt trạng thái cân bằng nếu: Vi(t+1) = Vi(t) với i= 1, 2,…, N Thủ tục tính giá trị năng lượng của mạng:
privatevoid CalculateEnergy()
{
doubletempE = 0;
for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (i != j)
tempE += T[i, j] * neurons[i].State * neurons[j].State;
e = -1 * tempE / 2; }
Thủ tục thay đổi trạng thái của neural thứ i tại thời điểm t+1 là (trạng thái của mạng neural được lưu vào biến u):
publicvoid Run(List<Neuron> initialState)
{ this.neurons = initialState; int k = 1;
int u = 0;
while(k != 0)
{ k = 0;
for (int i = 0; i < n; i++) { u = 0;
for (int j = 0; j < n; j++)
u += T[i, j] * (neurons[j].State);// tính năng lượng tại neural thứ i
if (neurons[i].ChangeState(h))//ktra trang thai
{ k++;
OnEnergyChanged(new EnergyEventArgs(e,i)); } } } CalculateEnergy(); }
Thủ tục OnEnergyChanged() được viết như sau: protectedvirtualvoid OnEnergyChanged(EnergyEventArgs e) {
if (EnergyChanged != null) EnergyChanged(this, e); }
Hàm kiểm tra năng lượng tại neural thứ i và thay đổi trạng thái của neural thứ i: public bool ChangeState(Double field) { bool res = false; if (field * this.State < 0) { this.state = -this.state; res = true; } return res; } Thủ tục làm biến dạng ảnh được viết như sau: void im_Click(object sender, EventArgs e) {
ImageMagnifier.ImageMagnifier im = ImageMagnifier.ImageMagnifier)sender; this.imNNState.ImageToMagnify = im.ImageToMagnify;
frmAddDistortion frmaddDistortion = newfrmAddDistortion(); frmaddDistortion.ShowDialog();
Random r = newRandom(); int p=0; int k=0; for(int i = 0;i<frmaddDistortion.DistortionLevel;i++) { p = r.Next(imageDim); k = r.Next(imageDim); if (imNNState.pixels[k, p]== Color.Black.ToArgb()) imNNState.pixels[k, p] = Color.White.ToArgb(); elseif (imNNState.pixels[k, p]== Color.White.ToArgb()) imNNState.pixels[k, p] = Color.Black.ToArgb(); } lblEnergy.Text = "0"; patternSelected = true; imNNState.Invalidate(); }
Thủ tục để khôi phục lại những điểm ảnh bị nhiễu:
private void NN_EnergyChanged(object sender,EnergyEventArgs e)
{
lblEnergy.Text = e.Energy.ToString(); int i = (int)e.NeuronIndex / imageDim;
int j = e.NeuronIndex % imageDim; if (imNNState.pixels[i, j] == Color.White.ToArgb()) imNNState.pixels[i, j] = Color.Black.ToArgb(); else if (imNNState.pixels[i, j] == Color.Black.ToArgb()) imNNState.pixels[i, j] = Color.White.ToArgb(); imNNState.Invalidate(); Application.DoEvents(); System.Threading.Thread.Sleep(100); }
Giả sử ta có 4 mẫu ảnh sau:
X1=(0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0) X3=(1,1,1,1,0,0,0,1,0,0,0,1,1,1,1,1)
X2=(0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0) X4=(1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1) Kết quả thử nghiệm với các ảnh trên có nhiễu tại 2,5,13 điểm ảnh (tương ứng với 13, 31 và 81%) được cho trên hình 3.2. Hơn nữa, với ảnh đầu vào có cùng số điểm ảnh biến dạng có thể dẫn tới những hành vi khác nhau (không hội tụ giống nhau, số vòng lặp khác nhau ...). Nếu có hơn 50% điểm ảnh biến dạng thì ảnh được tái tạo ở đầu ra là âm bản của ảnh gốc.
Mẫu X1 Mẫu X2 Mẫu X3 Mẫu X4
Hình 3.2 Thí nghiệm mạng với ảnh nhiễu.
3.4 Đánh giá kết quả nghiên cứu ứng dụng mạng Hopfield trong nhận dạng ảnh. dạng ảnh.
3.4.1Mục tiêu của chương trình.
Qua quá trình tìm hiểu về nhận dạng, về mạng neural nhân tạo nói chung, mạng Hopfield nói riêng, luận văn đã xây dựng được demo về nhận dạng ảnh đơn giản là ảnh nhị phân với khích cỡ 16x16 bằng mạng Hopfield. Nội dung chính của chương trình là: biến dạng ảnh ban đầu, rồi sau đó nhận dạng ra ảnh gốc (ảnh ở đây là ảnh có định dạng .bmp).
Công cụ sử dụng để xây dựng chương trình là: Microsoft Visual C# 2010 Express Edition với ngôn ngữ lập trình là C#.
1 2 1 2 2 2 2 3 3 5 4 4 Ảnh gốc
Ảnh nhiễu tại 2 điểm Ảnh kết quả số lần lặp Ảnh nhiễu tại 5 điểm
3.4.2. Demo và hình ảnh
Giao diện chính của chương trình:
Bước 1: Ta tiến hành tạo mạng neural (có kích thước gồm 256 neural). Kích chuột vào nút “Tạo mạng Neural (256 Neurons)”. Ta được giao diện như sau:
Bước 2: Đưa các mẫu ảnh vào (ảnh định dạng kiểu .bmp, kích thước 16x16 pixels). Kích chuột vào nút “Thêm bản mẫu vào mạng Neural”.
Chọn bất kỳ ảnh nào mà thỏa mãn điều kiện trên. Ví dụ ở đây ta chọn ảnh sau:
Lúc này ta để ý các thông số của mạng Neural: kích thước của mạng là 256, tổng số mẫu ảnh đưa vào là 1, giá trị năng lượng hiện tại là 0.
Sau đó ta kích chuột vào ảnh mà ta chọn để làm. Ta được giao diện như sau:
Khi đó xuất hiện một hộp thoại. Tùy vào yêu cầu mà ta chọn mức độ biến dạng của ảnh ban đầu. Ví dụ ở đây ta chọn mức độ biến dạng là 50%, sau đó kích vào nút “Thiết lập”. Ta được ảnh sau khi biến dạng như sau:
Bước 3: Ta bắt đầu chạy chương trình để nhận dạng ra ảnh ban đầu. Kích chuột vào nút “Khởi động mạng” ta được giao diện như sau:
Lúc này giá trị năng lượng hiện tại của mạng đã được thay đổi: -32640. Nếu ta muốn nhận tiếp tục nhận dạng ảnh khác nữa, ta có thể làm lại từ bước 1 đến bước 3, hoặc có thể kích chuột vào nút “Thêm bản mẫu vào mạng Neural”. Sau đó thực hiện tiếp các bước như trên.
Lúc này ta để ý thấy là: tổng số bản mẫu tăng lên 1 và có giá trị là 2, giá trị năng lượng của mạng lúc này cũng thay đổi thành: -49074.
3.4.3 Đánh giá kết quả.
Việc cài đặt chương trình mô phỏng hệ thống ứng dụng mạng Neural Hopfield nhận dạng hình ảnh ban đầu cho kết quả khả quan. Tuy nhiên việc sử dụng mạng Neural Hopfield cũng cần được thử nghiệm nhiều và so sánh với các thuật giải nhận dạng khác.
Một hạn chế trong luận văn này khi tiến hành cài đặt thuật giải và chạy thử nghiệm chỉ ra rằng số neural nói chung gấp 7 lần số ảnh mẫu cần phải nhớ trong mạng, việc các hình ảnh có kích thước khác nhau và ảnh mẫu cần nhớ nhiều cần phải lưu trữ số lượng lớn các trọng số. Do đó cần phải lưu trữ thông tin về hình ảnh cần mất số lượng lớn về dung lượng bộ nhớ. Đây chính là độ phức tạp của mạng Hopfield.
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Kết quả đạt được của luận văn:
Sau một thời gian tìm hiểu về quá trình nhận dạng, về mạng neural nhân tạo nói chung, mạng Hopfield nói riêng em đã nắm bắt được những vấn đề sau:
1. Bản chất của quá trình nhận dạng.
2. Các khái niệm cơ bản liên quan đến mạng neural nhân tạo.
3. Các ưu nhược, điểm của mạng neural nói chung, mạng Hopfield nói riêng.
4. Các mô hình, đặc trưng, cách huấn luyện mạng, các lĩnh vực ứng dụng,… của mạng neural nhân tạo nói chung, mạng Hopfield nói riêng.
5. Xây dựng ứng dụng một chương trình đơn giản về nhận dạng ảnh trên Microsoft Visual C# 2010 Express Edition với ngôn ngữ là C#.
Trong thời gian làm luận văn, mặc dù đã nỗ lực hết sức trong việc nghiên cứu tài liệu liên quan và sự giúp đỡ tận tình của thầy hướng dẫn và bạn bè đồng nghiệp. Song do thời gian có hạn và còn hạn chế nhiều về mặt kiến thức, kinh nghiệm trong quá trình tìm hiểu luận văn, không thể tránh khỏi những sai sót. Em mong rằng sẽ nhận được nhiều ý kiến đóng góp của các thầy cô và bạn bè đồng nghiệp để luận văn hoàn thiện hơn.
Các định hướng tiếp theo:
Phát triển đề tài này hoàn chỉnh với chuyên môn cao hơn, để xây dựng được một chương trình nhận dạng với bất kỳ loại ảnh nào và có tính năng cao hơn.
TÀI LIỆU THAM KHẢO
I. Tiếng việt
[1] Đỗ Năng Toàn và Phạm Việt Bình, Đại học Thái Nguyên, “Giáo trình xử lý ảnh số”. Nxb Khoa học và kỹ thuật, Hà Nội, 2008.
[2] Hoàng Kiếm, Nguyễn Ngọc Kỷ và các tác giả, Nhận dạng: các phương pháp và ứng dụng, Nhà xuất bản thống kê 7/1992.
[3] Lương Mạnh Bá, Nguyễn Thanh Thủy, Nhập môn xử lý ảnh số, NXB KHKT, 1999.
[4] Lê Minh Trung (biêndịch), Giáo trình mạng nơron nhân tạo, Nhà XB Thống kê, 1999.