Update lpb
parent
0019a4373b
commit
27c77a5928
|
@ -1,2 +1,3 @@
|
||||||
flake.lock
|
|
||||||
ears/**
|
ears/**
|
||||||
|
pred/**
|
||||||
|
__pycache__/**
|
||||||
|
|
|
@ -47,7 +47,6 @@ class EarDataClass():
|
||||||
label = self.labels[idx]
|
label = self.labels[idx]
|
||||||
image = cv2.imread(image_path)
|
image = cv2.imread(image_path)
|
||||||
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
||||||
image = image.astype('float32') / 255.0
|
|
||||||
return image, label
|
return image, label
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1694529238,
|
||||||
|
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1699169573,
|
||||||
|
"narHash": "sha256-cvUb1xZkvOp3W2SzylStrTirhVd9zCeo5utJl9nSIhw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "aeefe2054617cae501809b82b44a8e8f7be7cc4b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
description = "Python development environment with Matplotlib and OpenCV";
|
description = "Python development environment";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05";
|
||||||
|
@ -18,6 +18,8 @@
|
||||||
opencv4
|
opencv4
|
||||||
pip
|
pip
|
||||||
pillow
|
pillow
|
||||||
|
tqdm
|
||||||
|
numpy
|
||||||
]);
|
]);
|
||||||
in {
|
in {
|
||||||
devShells.default = pkgs.mkShell {
|
devShells.default = pkgs.mkShell {
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
import cv2
|
||||||
|
from dataloader import EarDataClass
|
||||||
|
import os
|
||||||
|
from tqdm import tqdm
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
|
class ViolaJones:
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
left_ear_cascade="haarcascade_mcs_leftear.xml",
|
||||||
|
right_ear_cascade="haarcascade_mcs_rightear.xml",
|
||||||
|
scale_factor=1.05, # how much is image reduced at each image scale
|
||||||
|
min_neighbors=2, # How many candidates to classify as square
|
||||||
|
):
|
||||||
|
self.left_ear_cascade = cv2.CascadeClassifier(left_ear_cascade)
|
||||||
|
self.right_ear_cascade = cv2.CascadeClassifier(right_ear_cascade)
|
||||||
|
self.scale_factor = scale_factor
|
||||||
|
self.min_neighbors = min_neighbors
|
||||||
|
|
||||||
|
def _extract_ear(self, image, ear):
|
||||||
|
x, y, w, h = ear
|
||||||
|
return image[y : y + h, x : x + w]
|
||||||
|
|
||||||
|
def forward(self, image):
|
||||||
|
left_ears = self.left_ear_cascade.detectMultiScale(
|
||||||
|
image, self.scale_factor, self.min_neighbors
|
||||||
|
)
|
||||||
|
right_ears = self.right_ear_cascade.detectMultiScale(
|
||||||
|
image, self.scale_factor, self.min_neighbors
|
||||||
|
)
|
||||||
|
|
||||||
|
if len(left_ears) > 0:
|
||||||
|
# Crop out the region of interest
|
||||||
|
return left_ears[0], self._extract_ear(image, left_ears[0])
|
||||||
|
elif len(right_ears) > 0:
|
||||||
|
return right_ears[0], self._extract_ear(image, right_ears[0])
|
||||||
|
else:
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
class LBP:
|
||||||
|
def __init__(self, P=8, R=1):
|
||||||
|
self.P = P
|
||||||
|
self.R = R
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _bilinear_interpolation(self, image, x, y):
|
||||||
|
x1, y1 = int(x), int(y)
|
||||||
|
x2, y2 = min(x1 + 1, image.shape[1] - 1), min(y1 + 1, image.shape[0] - 1)
|
||||||
|
|
||||||
|
f11 = image[y1, x1]
|
||||||
|
f12 = image[y1, x2]
|
||||||
|
f21 = image[y2, x1]
|
||||||
|
f22 = image[y2, x2]
|
||||||
|
|
||||||
|
return (
|
||||||
|
f11 * (x2 - x) * (y2 - y)
|
||||||
|
+ f21 * (x - x1) * (y2 - y)
|
||||||
|
+ f12 * (x2 - x) * (y - y1)
|
||||||
|
+ f22 * (x - x1) * (y - y1)
|
||||||
|
)
|
||||||
|
|
||||||
|
def forward(self, img):
|
||||||
|
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||||||
|
lbp = np.zeros_like(gray_image)
|
||||||
|
for i in range(self.R, gray_image.shape[0] - self.R):
|
||||||
|
for j in range(self.R, gray_image.shape[1] - self.R):
|
||||||
|
center = gray_image[i, j]
|
||||||
|
lbp_code = 0
|
||||||
|
for p in range(self.P):
|
||||||
|
# Angle in radians
|
||||||
|
theta = 2 * np.pi * p / self.P
|
||||||
|
x = j + self.R * np.cos(theta)
|
||||||
|
y = i - self.R * np.sin(
|
||||||
|
theta
|
||||||
|
) # y coordinates go from top to bottom
|
||||||
|
pixel_value = self._bilinear_interpolation(gray_image, x, y)
|
||||||
|
lbp_code |= (1 << p) if pixel_value >= center else 0
|
||||||
|
lbp[i, j] = lbp_code
|
||||||
|
return lbp
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
dat = EarDataClass(root_dir="./ears", annot_file="identites.txt", mode="train")
|
||||||
|
vj = ViolaJones()
|
||||||
|
lbp = LBP()
|
||||||
|
for i in tqdm(range(len(dat))):
|
||||||
|
img, label = dat[i]
|
||||||
|
ear_lab, ear_img = vj.forward(img)
|
||||||
|
if ear_lab is not None:
|
||||||
|
# Save the image
|
||||||
|
print(lbp.forward(ear_img).shape)
|
||||||
|
os.makedirs("./pred", exist_ok=True)
|
||||||
|
# Save the image
|
||||||
|
cv2.imwrite(f"./pred/{i}.jpg", ear_img)
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue