Công cụ thực hành: python3.7+pycharm+opencv4.6 Kiến thức về thuật toán: Trích xuất tính năng HOG, xây dựng mô hình SVM Mục đích thực tế: Mục đích của cuộc chiến thực tế này là làm quen với thuật toán quy trình làm việc HOG+SVM và bước đầu nắm vững thuật toán hình ảnh truyền thống phân loại. Kỷ lục thực tế: Tôi nghĩ rằng sau khi học các nguyên tắc, ứng dụng thuật toán và thực hành thực hành, tôi sẽ có thể thực hiện thành công dự án phát hiện người đi bộ một cách hoàn toàn độc lập, nhưng quy trình thực tế không đạt yêu cầu nên kết quả chỉ ở mức tầm thường. Những thiếu sót bộc lộ trong quá trình chiến đấu thực tế bao gồm:
- Kiến thức cơ bản về opencv, numpy, python chưa toàn diện và vững chắc;
- Chưa hiểu sâu về dạng dữ liệu đầu ra của thuật toán HOG;
- Tôi có hiểu biết hạn chế về các tham số và phương thức chức năng liên quan của mô hình SVM, đặc biệt là vai trò và đầu ra của dữ liệu trong SVM.
Đánh giá thực tế: Tuy gập ghềnh nhưng vẫn ở mức khá.
1. Chuẩn bị
Dữ liệu được sử dụng trong trận chiến thực tế này là cơ sở dữ liệu về người đi bộ của MIT (có dữ liệu làm sẵn nhưng tôi quá lười để thu thập nó). Cơ sở dữ liệu này là cơ sở dữ liệu công cộng về người đi bộ trước đó, với tổng số 924 hình ảnh về người đi bộ (định dạng ppm, chiều rộng và chiều cao 64x128), từ vai đến chân. Khoảng cách là khoảng 80 pixel. Cơ sở dữ liệu chỉ chứa hai phối cảnh: trước và sau, không có mẫu âm và không phân biệt giữa tập huấn luyện và tập kiểm tra. Dalal và cộng sự đã sử dụng "HOG+SVM" và độ chính xác phát hiện trên cơ sở dữ liệu này là gần 100%. Liên kết tải xuống cơ sở dữ liệu có thể được tìm thấy ở đây.
2. Mã thực hành
""" Tải và sắp xếp tập dữ liệu-->Xử lý trước hình ảnh-->Trích xuất tính năng hình ảnh-->Trình phân loại thiết kế-->Độ chính xác của trình phân loại đầu ra-->Kiểm tra hình ảnh""" import cv2 import Random import glob import numpy as np # Tải tập dữ liệu hình ảnh cục bộ, thêm tất cả các tập dữ liệu vào danh sách, sau đó xáo trộn thứ tự dữ liệu def load_image(filename): path = glob.glob(filename) people, labels = [], [] for i trong đường dẫn: Persons.append(cv2.imread(i)) labels.append(1) Random.seed(1) Random.shuffle(persons) Persons = np.array(persons) trả về người, nhãn # Tiền xử lý ảnh, làm xám hình ảnh đầu vào độ, độ mờ Gaussian def image_preprocessing(image): cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # image = cv2.resize(image, dsize=(32, 64)) image_preprocess = cv2.GaussianBlur(image, (3, 3), sigmaX=1, sigmaY=1) return image_preprocess # Xây dựng trình phát hiện HOG def get_hog(): winSize = (64, 128) cellSize = (8, 8) blockSize = (16, 16) blockStride = (16, 16) nbins = 9 signatureGradient = True derivAperture = 1 # Tham số mặc định winSigma = -1. # Tham số mặc định histogramNormType = 0 # Tham số mặc định L2HysThreshold = 0.2 # Tham số mặc định gammaCorrection = 1 # Tham số mặc định nlevels = 64 # Tham số mặc định hog = cv2. HOGDescriptor(winSize, blockSize, blockStride, cellSize, nbins, derivAperture, winSigma, histogramNormType, L2HysThreshold, gammaCorrection, nlevels, signatureGradient) return hog # Tạo mô hình SVM và cấu hình tham số def SVM_model(): model = cv2.ml.SVM_create() model.setType(cv2.ml.SVM_ONE_CLASS ) model.setKernel(cv2.ml.SVM_POLY) model.setC(1) model.setNu(0.01) model.setDegree(0.1) model.setCoef0(0.5) model.setGamma(0.6) model.setTermCriteria((cv2.TERM_CRITERIA_MAX_ITER, int (1e2), 1e-5)) return model # Training model def SVM_train(mô hình, mẫu, phản hồi): model.train(mẫu, cv2.ml.ROW_SAMPLE, phản hồi) mô hình trả về # Tính độ chính xác của độ chính xác của trình phân loại def (model, data_train, labels_train): retval, result = model.predict( data_train ) temp = (np.array(labels_train) == result).mean() print(f'Độ chính xác của mô hình này là: {temp * 100}') # Trình phân loại kiểm tra def image_predict(model, data_test, samples, labels_test): retval, result = model.predict(samples) counter = 0 for i in (labels_test == result.ravel()): # Kết quả kiểm tra không khớp với thực tế kết quả Chỉ hiển thị kênh màu đỏ nếu không phải i: data_test[counter][..., :2] = 0 counter += 1 h1 = data_test[0] for i in data_test[1:12, ...]: h1 = np.hstack((h1, i)) h2 = data_test[12] for i in data_test[13:, ...]: h2 = np.hstack((h2, i)) return np .vstack((h1, h2)) if __name__ == "__main__": print('Load image...') datas, labels = Load_image('image\\Pedestrian phát hiện\\per*.ppm') temp, data_test = np.split(datas, [900]) print('Tiền xử lý dữ liệu...') datas = list(map(image_preprocessing, datas)) print('Trích xuất đào tạo HOG vectơ đặc trưng của dữ liệu...') hog = get_hog() hog_vector = list(map(hog.compute, datas)) print('Chia tập dữ liệu thành hai phần, 900 ảnh để huấn luyện và 24 ảnh để kiểm tra...') data_train, temp = np.split(datas, [900]) labels_train, labels_test = np.split(np .array (nhãn), [900]) hog_vector_train, hog_vector_test = np.split(hog_vector, [900]) print('Đào tạo mô hình SVM...') model = SVM_model() model_svm = SVM_train(model, hog_vector_train, labels_train) print('Xuất ra độ chính xác của mô hình phân loại...') độ chính xác(model_svm, hog_vector_train, labels_train) print ( 'Mô hình phân loại thử nghiệm...') result = image_predict(model_svm, data_test, hog_vector_test,labels_test) cv2.imshow('result, nhấn phím q để thoát', result) while 1: if cv2.waitKey() == ord('q'): break print('Kiểm tra các hình ảnh khác...') class_name = {0: "Không bao gồm người đi bộ", 1: "Bao gồm người đi bộ"} img = cv2.imread('image\\persontrain.png') img = cv2.resize(img, dsize=(64, 128)) img2 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img_preprocess = cv2.GaussianBlur(img2, (3, 3), sigmaX=1, sigmaY=1) # vector = np.array([hog.compute(img_preprocess)]) vector = np.expand_dims(hog.compute(img_preprocess), 0) ret = model_svm.predict(vector)[1].ravel() print(f"Picture img{ class_name[int(ret)]}") cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows() ''' Tải ảnh... Tiền xử lý dữ liệu... Trích xuất vectơ đặc trưng HOG của dữ liệu huấn luyện... Chia tập dữ liệu thành hai phần, 900 cho huấn luyện và 24 cho thử nghiệm... . ... Xuất ra độ chính xác của mô hình phân loại... Độ chính xác của mô hình là: 99,0 Kiểm tra mô hình phân loại... Kiểm tra các hình ảnh khác... Hình ảnh img chứa người đi bộ''
Kết quả cho bộ ảnh thử nghiệm: Các hình ảnh khác cho thử nghiệm:
3. Tóm tắt dự án
- Trích xuất đặc trưng của HOG là vectơ đặc trưng của hình ảnh, được sử dụng làm biến đầu vào "mẫu" của mô hình svm train(). Tất nhiên, khi sử dụng hàm dự đoán() trên ảnh thử nghiệm, đầu vào cũng là vectơ đặc trưng của ảnh --- "mẫu".
- Các SVMType khác nhau có chức năng khác nhau, chủ yếu được chia thành hai loại: phân loại và hồi quy. Các danh mục có thể được chia thành các danh mục duy nhất
MỘT_LỚP
và phân loại không đơn SVM_C_SVC
Và NO_SVC
. Dự án này sử dụng một loại phân loại duy nhất.
-
hog.conpute(img)
、 model.train(mẫu, bố cục, phản hồi)
、 mô hình.dự đoán(mẫu)
mối quan hệ:
-
hog.conpute(img)
Những gì được trích xuất là vectơ đặc trưng một chiều của một hình ảnh. Nếu bạn muốn trích xuất vectơ đặc trưng của một tập hợp hình ảnh, bạn có thể sử dụng. bản đồ()
Hoặc một vòng lặp for. hog.conpute(img)
Các kết quả được xử lý thường được sử dụng để huấn luyện và kiểm tra các mô hình.
-
model.train(mẫu, bố cục, phản hồi)
, ba tham số của hàm này là ma trận vectơ đặc trưng của tập mẫu huấn luyện, dạng ma trận của từng vectơ đặc trưng mẫu và ma trận nhãn. cách trình bày--- cv2.ml.ROW_MẪU
, chỉ ra rằng mỗi mẫu huấn luyện là một vectơ hàng; cv2.ml.MẪU_COL
, chỉ ra rằng mỗi mẫu huấn luyện là một vectơ cột. Giá trị của bố cục xác định dạng của từng vectơ đặc trưng mẫu trong các mẫu đầu vào trong ma trận.
-
mô hình.dự đoán(mẫu)
Dạng ma trận của các mẫu phụ thuộc vào model.train(mẫu, bố cục, phản hồi)
Giá trị của bố cục. Có hai giá trị trả về cho hàm này trả lại
Và kết quả
, giá trị nhãn của mẫu thử được lưu trữ trong kết quả.ravel()
ở giữa.
Cuối cùng, bài viết này về nhận dạng hình ảnh truyền thống [opencv]: nhận dạng người đi bộ hog+svm trong thực tế kết thúc tại đây. Nếu bạn muốn biết thêm về nhận dạng hình ảnh truyền thống [opencv]: nhận dạng người đi bộ hog+svm trong thực tế, vui lòng tìm kiếm các bài viết của CFSDN. để duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!