Tải bản đầy đủ (.docx) (26 trang)

BÁO CÁO BÀI TẬP LỚN HỌC PHẦN NHẬN DIỆN VÀ XỬ LÝ ẢNH Đề tài Xây dựng chương trình nhận dạng biển báo giao thông

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1022.82 KB, 26 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b><small>TRƯỜNG ĐẠI HỌC HẢNG HẢI VIỆT NAMKHOA CÔNG NGHỆ THÔNG TIN</small></b>

<b><small>---***---BÁO CÁO BÀI TẬP LỚN</small></b>

<b><small>HỌC PHẦN “NHẬN DIỆN VÀ XỬ LÝ ẢNH”</small></b>

<i><b><small>Đề tài:</small></b></i>

<i><b>Xây dựng chương trình nhận dạng biển báo giao thông</b></i>

<small>GVHD:TS. Nguyễn Hữu TuânSinh viên thực hiện: Khổng Đỗ Hạ Vũ - 87018</small>

<i><b><small>Hải Phòng, tháng năm 2023</small></b></i>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>LỜI NĨI ĐẦU</b>

Với cơng nghệ ngày một phát triển, ứng dụng công nghệ vào cuộc sống thường nhật hay công việc đang là xu hướng phát triển của xã hội hiện nây. Điều này vừa giúp các công việc được ứng dụng sẽ vận hành chính xác ,trơn tru vừa đảm bảo sự an tồn , tính chính xác cao cho các cơng việc với những đặc thù riêng.

Một đất nước phát triển luôn đi kèm với sự phát triển về kỹ thuật trong đó có thể kể đến việc sản xuất ơ tơ nội địa. VinFast hiện đang rất thành công trong việc sản xuất ơ tơ với chính sách mới tiến tới sản xuất ô tô điện và theo xu hướng công nghệ ô tô tự lái khả năng cao sẽ là bước phát triển tiếp theo của tập đoàn này.

Một trong những điều quan trọng để có thể sản xuất ơ tơ tự lái chính là khả năng nhận diện và hiểu được các quy tắc giao thơng – Hay nói cách khác là khả năng nhận diên biển báo giao thơng.Đó là ứng dụng cho phép máy tính tự động xác định và nhận dạng các vật thể qua hình ảnh hay khung hình của video. Để làm được điều này cần có một cơ sở dữ liệu về biển báo giao thơng, khi ứng dụng qt hình ảnh sẽ đối chiếu với cơ sở dữ liệu để đưa ra kết quả và nhận dạng hình ảnh đó. Xuất phát từ việc đó em đã nghiên cứu và tham khảo để hồn thành bài tập lớn “Xây dựng chương trình nhận dang biển báo giao thông”

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Mục lục

<small>CHƯƠNG I.GIỚI THIỆU BÀI TOÁN...4</small>

<small>1.1 Đặt vấn đề...4</small>

<small>1.2 Mục tiêu và nhiệm vụ nghiên cứu...4</small>

<small>1.3 Phương tiện công cụ sử dụng...4</small>

<small>1.4 Phương pháp sử dụng...4</small>

<small>CHƯƠNG II.CÁC THUẬT TOÁN VÀ KHÁI NIỆM ĐƯỢC SỬ DỤNG...5</small>

<small>2.1 Thuật toán Gauss...5</small>

<small>2.2 Toán tử Laplacian...5</small>

<small>2.3 Ảnh nhị phân (Binary image)...5</small>

<small>2.4 Ảnh xám (Gray image)...5</small>

<small>2.5 Biến đổi Hough (Hough Transform)...5</small>

<small>2.6 Giải thuật Canny...6</small>

<small>CHƯƠNG III : XÂY DỰNG CHƯƠNG TRÌNH...7</small>

<small>3.1 Khái qt bài tốn...7</small>

<small>3.2 Các bước thực hiện bài toán...7</small>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<small>CHƯƠNG IV: KẾT QUẢ CHẠY CHƯƠNG TRÌNH...22</small>

<small>CHƯƠNG V: ĐÁNH GIÁ VỀ CHƯƠNG TRÌNH VÀ KẾT LUẬN...25</small>

<small>Ưu điểm:...25</small>

<small>Nhược điểm:...25</small>

<small>Hướng phát triển trong tương lai...25</small>

<small>Lời kết...25</small>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

CHƯƠNG I.GIỚI THIỆU BÀI TOÁN

1.1 Đặt vấn đề

Với việc ứng dụng công nghệ thông tin để giải quyết các vấn đề trong giao thông là một vấn đề thiết yếu và quan trọng. Việc xây dựng hệ thống giao thông thông minh ở các xe tự động là vấn đề được quan tâm và phát triển trong và cả ngồi nước. Sự phát triển thường xun của cơng nghệ trong sản xuất ô tô với những cải tiến liên tục cho các dịng xe mới thì việc có một hệ thống nhận diện biển báo là một sự cải tiện nên có và được quan tâm đảm bảo sự chính xác trong xử lý và an tồn trong giao thông .

1.2 Mục tiêu và nhiệm vụ nghiên cứu

Mục tiêu: tạo ra một hệ thống có thể nhận dạng được cơ bản một số biển báo giao thông

Nhiệm vụ nghiên cứu:

Nghiên cứu tổng quan về xử lý ảnh

Nghiên cứu, phân tích các phương pháp nhận dạng, xử lý hình ảnh biển báo giao thơng

Tìm hiểu các biển báo giao thông

Thu thập dữ liệu các biển báo cho cơ sở dữ liệu hình ảnh để nhận dang biển báo giao thông

1.3 Phương tiện công cụ sử dụng

Thư viện sử dụng: OpenCV Ngơn ngữ lập trình: Python

Phần mềm sử dụng : Anaconda-Spyder

1.4 Phương pháp sử dụng

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

CHƯƠNG II.CÁC THUẬT TOÁN VÀ KHÁI NIỆM ĐƯỢC SỬ DỤNG

2.1 Thuật toán Gauss

Gaussian blur (làm mờ/mịn Gaussian) là kết quả của việc làm mờ hình ảnh bởi một hàm Gaussian.

Kỹ thuật này được sử dụng để giảm nhiễu ảnh và các chi tiết. Hiệu ứng hình ảnh của kỹ thuật Gaussian tương tự như việc nhìn một hình ảnh qua màn hình mờ. Trong thị giác máy tính, Gaussian được sử dụng để tăng cường hình ảnh ở các quy mô khác nhau hoặc như một kỹ thuật tăng cường dữ liệu trong học sâu.

2.2 Toán tử Laplacian

Là một toán tử vi phân, đặc biệt trong các toán tử elliptic, với nhiều áp dụng. Trong vật lý, nó được sử dụng trong mơ tả của q trình truyền sóng, q trình truyền nhiệt.

Dựa vào tốn tử Laplacian, ảnh sắc nét sẽ thu được bằng cách lấy ảnh gốc trừ đi Laplacian của nó

2.3 Ảnh nhị phân (Binary image)

Ảnh nhị phân (hay còn gọi là binary image trong tiếng Anh) là ảnh đen trắng chỉ có 2 giá trị là 0 và 255 (miền số nguyên) hoặc 0 và 1 (miền số thực / đối với ROI).

2.4 Ảnh xám (Gray image)

Ảnh xám hay còn gọi là ảnh đơn sắc (monochromatic). Ảnh 8 mức xám mỗi điểm ảnh sẽ có giá trị nằm trong đoạn [0-7], ảnh 256 mức xám mỗi điểm ảnh sẽ có giá trị nằm trong đoạn [0-255].

Giá trị của điểm ảnh bằng 0 đại diện cho điểm ảnh tối (đen), giá trị điểm ảnh lơn nhất đại diện cho điểm ảnh sáng (trắng).

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

2.5 Biến đổi Hough (Hough Transform)

Là một kỹ thuật phổ biến để phát hiện bất kỳ hình dạng nào nếu có thể biểu diễn hình dạng đó dưới dạng tốn học. Có thể phát hiện hình dạng ngay cả khi nó bị hỏng hoặc bị bóp méo một chút

2.6 Giải thuật Canny

Gồm 4 bước:

<i>Giảm nhiễu: </i>Làm mờ ảnh, giảm nhiễu

<i>Tính Gradient và hướng gradient</i>

<i>Non-maximum Suppression (viết tắt NMS): loại bỏ các pixel ở vị trí khơng phải</i>

cực đại tồn cục

<i>Ngưỡng kép (Double threshold)</i>

<i>Theo dõi cạnh bằng độ trễ (Edge Tracking by Hysteresis)</i>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

CHƯƠNG III : XÂY DỰNG CHƯƠNG TRÌNH

3.1 Khái qt bài tốn

Bài tốn nhận dang biển báo giao thông trải qua các bước sau:

Thông qua nguồn dữ liệu cụ thể là video được ghi lại , hệ thống sẽ xác định các biển báo trong khung hình và dối chiếu với cơ sở dữ liệu được lưu sẵn của hệ thống và xác định xem hình ảnh nhận được trong đó có phải biển báo giao thơng khơng. Sau khi nhận dang được đó là biển báo giao thông , hệ thống sẽ xử lý, nhận dang và đưa thông tin là tên của biển báo giao thơng

3.2 Các bước thực hiện bài tốn

Thu nhập các ảnh biển báo giao thông

Tạo 1 folder “Dataset” và đưa vào CSDL hình ảnh gồm các biển báo gồm các biển báo sau đây

Huấn luyện model phân loại biển bảo và kiểm thử

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Đầu tiên chuyển đổi từ ảnh sang định dạng YCrCb, thực hiện chia lấy các kênh màu của ảnh , thực hiện cần bằng sáng bằng equalizeHist , hàm cv2.merge lấy từng kênh màu của ảnh và hợp nhất thành một ảnh để chứa nhiều channel – multi channel image. Sau đó tiếp tục chuyển đổi ảnh về lại RGB và trả lại ảnh ở định dang RGB

<i><b>3.3.2 Hàm LaplacianOfGaussian</b></i>

def LaplacianOfGaussian(image):

LoG_image = cv2.GaussianBlur(image, (3,3), 0)

gray = cv2.cvtColor( LoG_image, cv2.COLOR_BGR2GRAY) LoG_image = cv2.Laplacian( gray, cv2.CV_8U,3,3,2) LoG_image = cv2.convertScaleAbs(LoG_image)

return LoG_image

Hàm sẽ sử dụng GaussiaanBlur làm mịn ảnh được cho vào , sao đó chuyển ảnh được làm mịn sang ảnh xám bằng cv2.cvtColor rồi tiếp tục dùng hàm cv2.Laplacian để làm giảm thiệu độ nhiễu của ảnh. Sau cùng dùng cv2.convertScaleAbs chia tỷ lệ,lấy giá trị tuyệt đối, chuyển đổi thành loại 8-bit

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<i><b>3.3.5 Hàm removeSmallComponents</b></i>

def removeSmallComponents(image, threshold):

nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=8)

sizes = stats[1:, -1]; nb_components = nb_components - 1 img2 = np.zeros((output.shape),dtype = np.uint8)

for i in range(0, nb_components): if sizes[i] >= threshold:

img2[output == i + 1] = 255 return img2

Hàm sẽ tìm các điểm trắng trong bức ảnh của bạn sau đó với mỗi thành phần đó chạy vịng lặp và chỉ giữ lại các điểm trên ngưỡng threshold

Hàm tìm các đường bao của ảnh nhị phân sử dụng hàm cv2.findContour để tìm các đường bao và trả lại các đường bao đó

<i><b>3.3.7 Hàm contourIsSign</b></i>

def contourIsSign(perimeter, centroid, threshold): # perimeter, centroid, threshold

# # Compute signature of contour

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

signature = [float(dist) / max_value for dist in result ] # Check signature of contour.

temp = sum((1 - s) for s in signature) temp = temp / len(signature)

if temp < threshold: # is the sign return True, max_value + 2 else: # is not the sign return False, max_value + 2

Hàm sẽ tính tốn dựa vào tâm vầ chu vi và ngưỡng threshold , tạo một list result nhập thêm kết quả của mỗi distance theo cơng thức , tính giá trị max_value bằng giá trị lớn nhất của list result. Tạo list signature với mỗi giá trị bên trong list bằng khoảng cách chia cho giá trị lớn nhất của list kết quả . Tạo biến temp bằng tổng của 1 – s với mỗi s là biến trong list signature. Sau đó gán temp = temp chia cho số lượng biến trong signature . Nếu như nhỏ hơn thì trả về kết quả đúng tức là biển báo và max_value +2 ngược lại nếu lớn hơn trả về kết quả sai tức ko phải biển báo

top = max([int(center[0] - max_distance), 0])

bottom = min([int(center[0] + max_distance + 1), height-1]) left = max([int(center[1] - max_distance), 0])

right = min([int(center[1] + max_distance+1), width-1]) print(left, right, top, bottom)

return image[left:right, top:bottom] def cropSign(image, coordinate):

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

right = min([int(coordinate[1][0]), width-1]) #print(top,left,bottom,right)

return image[top:bottom,left:right]

Các hàm này sẽ cắt phần ảnh biển báo và lưu lại

<i><b>3.3.9 Hàm tìm kiếm biển báo</b></i>

def findLargestSign(image, contours, threshold, distance_theshold):

is_sign, distance = contourIsSign(c, [cX, cY], 1-threshold)

if is_sign and distance > max_distance and distance > distance_theshold: max_distance = distance

coordinate = np.reshape(c, [-1,2]) left, top = np.amin(coordinate, axis=0)

right, bottom = np.amax(coordinate, axis = 0) coordinate = [(left-2,top-2),(right+3,bottom+1)] sign = cropSign(image,coordinate)

return sign, coordinate

def findSigns(image, contours, threshold, distance_theshold): signs = []

coordinates = [] for c in contours:

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

# compute the center of the contour

is_sign, max_distance = contourIsSign(c, [cX, cY], 1-threshold) if is_sign and max_distance > distance_theshold:

sign = cropContour(image, [cX, cY], max_distance) signs.append(sign)

coordinate = np.reshape(c, [-1,2]) top, left = np.amin(coordinate, axis=0)

right, bottom = np.amax(coordinate, axis = 0)

coordinates.append([(top-2,left-2),(right+1,bottom+1)]) return signs, coordinates

<i><b>3.3.10 Hàm localization</b></i>

def localization(image, min_size_components, similitary_contour_with_circle, model, count, current_sign_type):

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

#signs, coordinates = findSigns(image, contours, similitary_contour_with_circle,

if sign is not None:

sign_type = getLabel(model, sign)

sign_type = sign_type if sign_type <= 8 else 8

return coordinate, original_image, sign_type, text

Hàm này sẽ xử lý dữ liệu ảnh đầu vào và trình chiếu ra ảnh nhị phân sau đó xác định biển báo nhận được là biển báo gì

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

mask = np.ones(img.shape[:2], dtype="uint8") * 255 if lines is not None:

for line in lines:

for x1,y1,x2,y2 in line:

cv2.line(mask,(x1,y1),(x2,y2),(0,0,0),2) return cv2.bitwise_and(img, img, mask=mask)

Sử dụng biến đổi Hough thể hiện hình ảnh dưới dạng toán học sử dụng cv2.bitwise_and qua đó loại bỏ viền

# Threshold the HSV image to get only blue colors mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) lower_white = np.array([0,0,128], dtype=np.uint8) upper_white = np.array([255,255,255], dtype=np.uint8) # Threshold the HSV image to get only blue colors

mask_white = cv2.inRange(hsv, lower_white, upper_white) lower_black = np.array([0,0,0], dtype=np.uint8)

upper_black = np.array([170,150,50], dtype=np.uint8) mask_black = cv2.inRange(hsv, lower_black, upper_black) mask_1 = cv2.bitwise_or(mask_blue, mask_white)

mask = cv2.bitwise_or(mask_1, mask_black) # Bitwise-AND mask and original image

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

#res = cv2.bitwise_and(frame,frame, mask= mask) return mask

Hàm dùng gaussianBlur để làm mịn ảnh sau đó chuyển định dạng ảnh sang không gian màu HSV, định dạng vùng xanh của ảnh trong không gian màu , chỉnh ngưỡng để lấy vùng xanh của ảnh, loại bỏ các màu sắc khác width = vidcap.get(3) # float

height = vidcap.get(4) # float

# Define the codec and create VideoWriter object fourcc = cv2.VideoWriter_fourcc(*'XVID')

out = cv2.VideoWriter('output.avi',fourcc, fps , (640,480)) # initialize the termination criteria for cam shift, indicating # a maximum of ten iterations or movement by a least one pixel # along with the bounding box of the ROI

termination = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

roiBox = None roiHist = None

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

#image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

coordinate, image, sign_type, text = localization(frame, args.min_size_components, args.similitary_contour_with_circle, model, count,

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

left = int(coordinate[0][0]*1.05) bottom = int(coordinate[1][1]*0.95) right = int(coordinate[1][0]*0.95)

position = [count, sign_type if sign_type <= 8 else 8, coordinate[0][0], coordinate[0][1], coordinate[1][0], coordinate[1][1]]

# grab the ROI for the bounding box and convert it # to the HSV color space

roi = frame[tl[1]:br[1], tl[0]:br[0]]

roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) #roi = cv2.cvtColor(roi, cv2.COLOR_BGR2LAB) # compute a HSV histogram for the ROI and store the # bounding box

roiHist = cv2.calcHist([roi], [0], None, [16], [0, 180])

roiHist = cv2.normalize(roiHist, roiHist, 0, 255, cv2.NORM_MINMAX)

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

# apply cam shift to the back projection, convert the # points to a bounding box, and then draw them

(r, roiBox) = cv2.CamShift(backProj, roiBox, termination)

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

position = [count, sign_type if sign_type <= 8 else 8, tl[0], tl[1], br[0],

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

Hàm thực hiện chính sẽ training xử lý dữ ảnh dầu vào từ video so sánh đối chiếu với ảnh trong cơ sở dữ liệu và trình chiếu kết quả ra gồm video output.avi là kết quả nhận dạng các biển báo có trong video . Đồng thời in ra kết quả training ảnh

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

CHƯƠNG IV: KẾT QUẢ CHẠY CHƯƠNG TRÌNH

Sau khi chạy video đầu vào sẽ xuất ra video output với kết quả nhận dạng các ảnh sau

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

CHƯƠNG V: ĐÁNH GIÁ VỀ CHƯƠNG TRÌNH VÀ KẾT

 Khả năng nhận diện còn phụ thuộc vào ánh sáng và môi trường xung quanh  Dữ liệu biển báo cịn khá ít chưa nhiều

Hướng phát triển trong tương lai

 Phát triển thuật toán nhận diện các biển báo phức tạp hơn  Tạo cơ sở dữ liệu lớn hơn

 Sử dụng thuật toán CNN để phân lớp và xử lý ảnh

Lời kết

Sau khi nghiên cứu và tham khảo , em đã có thể xây dựng một chương trình nhận diện cơ bản các biển báo giao thông, tuy nhiên vẫn cịn nhiều thiếu xót và hạn chế về thuật tốn và lập trình.

</div>

×