Skip to content

Commit

Permalink
improving dualDirectionTailDetection + few other minor changes/refact…
Browse files Browse the repository at this point in the history
…oring of the new fast tracking
  • Loading branch information
oliviermirat committed Nov 28, 2023
1 parent 0b2878c commit 9c1aa6b
Show file tree
Hide file tree
Showing 7 changed files with 265 additions and 96 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.trackTail import trackTail
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.getNewFrameROI import getNewFrameROI
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.removeAnimalJustTrackedFromFrame import removeAnimalJustTrackedFromFrame
import numpy as np
import cv2

def animalDetectionBackToWholeImage(self, k, frame, wellNumber, animalNotTracked):

listOfAnimalIds = []
for i in range(len(animalNotTracked)):
if animalNotTracked[i]:
if self._trackingDataPerWell[wellNumber][i][k-1][0][0] == 0 and self._trackingDataPerWell[wellNumber][i][k-1][0][1] == 0:
listOfAnimalIds = [i] + listOfAnimalIds
else:
listOfAnimalIds.append(i)

curIdInListOfAnimalIds = 0
for i in range(len(animalNotTracked)):
if animalNotTracked[i]:

# Animal Id selection
animalId = listOfAnimalIds[curIdInListOfAnimalIds]
curIdInListOfAnimalIds += 1

# Frame ROI selection
wellXtop = self._wellPositions[wellNumber]['topLeftX']
wellYtop = self._wellPositions[wellNumber]['topLeftY']
lenghtWell_X = self._wellPositions[wellNumber]['lengthX']
lenghtWell_Y = self._wellPositions[wellNumber]['lengthY']
frameROI = frame[wellYtop:wellYtop+lenghtWell_Y, wellXtop:wellXtop+lenghtWell_X]

# Applying gaussian filter
paramGaussianBlur = self._hyperparameters["paramGaussianBlur"]
frameROI = cv2.GaussianBlur(frameROI, (paramGaussianBlur, paramGaussianBlur), 0)

# Tracking
(minVal, maxVal, headPosition, maxLoc) = cv2.minMaxLoc(frameROI)
if not(minVal >= self._hyperparameters["minimumHeadPixelValue"]):
a, self._lastFirstTheta[wellNumber] = trackTail(self, frameROI, headPosition, self._hyperparameters, wellNumber, k, self._lastFirstTheta[wellNumber])
if len(a):
a[0, :, 0] -= self._wellPositions[wellNumber]['topLeftX']
a[0, :, 1] -= self._wellPositions[wellNumber]['topLeftY']

self._trackingDataPerWell[wellNumber][animalId][k][:len(a[0])] = a

frameROI = getNewFrameROI(self, k, frame, wellNumber, animalId)

if np.sum(np.sum(255 - frameROI)) < self._hyperparameters["minimumPixelIntensitySumForAnimalDetection"]:

self._trackingDataPerWell[wellNumber][animalId][k] = self._trackingDataPerWell[wellNumber][animalId][k-1]

else:

# 'Removing' animal just tracked
if self._hyperparameters["nbAnimalsPerWell"] > 1:
frame = removeAnimalJustTrackedFromFrame(self, frame, wellNumber, animalId, k)
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.detectMovementWithRawVideoInsideTracking import detectMovementWithRawVideoInsideTracking
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.trackTail import trackTail
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.animalDetectionBackToWholeImage import animalDetectionBackToWholeImage
from zebrazoom.code.tracking.customTrackingImplementations.fastFishTracking.removeAnimalJustTrackedFromFrame import removeAnimalJustTrackedFromFrame
# import zebrazoom.code.tracking
import numpy as np
import time
import math
import cv2

def backgroundSubtractionOnlyOnROIs(self, frame, k):

# Color to grey scale transformation
frame = frame[:,:,0]

Expand All @@ -21,6 +23,8 @@ def backgroundSubtractionOnlyOnROIs(self, frame, k):

if self._hyperparameters["detectMovementWithRawVideoInsideTracking"] == 0 or k <= 2 or np.sum([self._auDessusPerAnimalIdList[wellNumber][i][k] for i in range(0, self._hyperparameters["nbAnimalsPerWell"])]):

animalNotTracked = np.zeros((self._hyperparameters["nbAnimalsPerWell"]))

for animalId in range(0, self._hyperparameters["nbAnimalsPerWell"]):

if self._hyperparameters["detectMovementWithRawVideoInsideTracking"] == 0 or self._auDessusPerAnimalIdList[wellNumber][animalId][k] or k <= 2:
Expand Down Expand Up @@ -56,41 +60,35 @@ def backgroundSubtractionOnlyOnROIs(self, frame, k):
(minVal, maxVal, headPosition, maxLoc) = cv2.minMaxLoc(frameROI)
if minVal >= self._hyperparameters["minimumHeadPixelValue"]:
self._trackingDataPerWell[wellNumber][animalId][k] = self._trackingDataPerWell[wellNumber][animalId][k-1]
animalNotTracked[animalId] = 1
else:
if self._hyperparameters["trackTail"]:
# Tail tracking
a, self._lastFirstTheta[wellNumber] = trackTail(self, frameROI, headPosition, self._hyperparameters, wellNumber, k, self._lastFirstTheta[wellNumber])
a[0, :, 0] += roiXStart - self._wellPositions[wellNumber]['topLeftX']
a[0, :, 1] += roiYStart - self._wellPositions[wellNumber]['topLeftY']
self._trackingDataPerWell[wellNumber][animalId][k][:len(a[0])] = a
if len(a):
a[0, :, 0] += roiXStart - self._wellPositions[wellNumber]['topLeftX']
a[0, :, 1] += roiYStart - self._wellPositions[wellNumber]['topLeftY']
self._trackingDataPerWell[wellNumber][animalId][k][:len(a[0])] = a
else:
self._trackingDataPerWell[wellNumber][animalId][k] = self._trackingDataPerWell[wellNumber][animalId][k-1]
animalNotTracked[animalId] = 1
else:
self._trackingDataPerWell[wellNumber][animalId][k][0][0] = headPosition[0] + roiXStart - self._wellPositions[wellNumber]['topLeftX']
self._trackingDataPerWell[wellNumber][animalId][k][0][1] = headPosition[1] + roiYStart - self._wellPositions[wellNumber]['topLeftY']
else:
if k > 0:
animalNotTracked[animalId] = 1
self._trackingDataPerWell[wellNumber][animalId][k] = self._trackingDataPerWell[wellNumber][animalId][k-1]

# 'Removing' animal just tracked
if self._hyperparameters["nbAnimalsPerWell"] > 1:
if "largerPixelRemoval" in self._hyperparameters and self._hyperparameters["largerPixelRemoval"]:
frame = cv2.circle(frame.copy(), (int(self._trackingDataPerWell[wellNumber][animalId][k][0][0]), int(self._trackingDataPerWell[wellNumber][animalId][k][0][1])), int(self._hyperparameters["maxDepth"]/3), (255, 255, 255), -1)
for pointOnTail in range(1, len(self._trackingDataPerWell[wellNumber][animalId][k])):
start_point = (int(self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][0]), int(self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][1]))
end_point = (int(self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][0]), int(self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][1]))
if pointOnTail == 1:
end_point = (int(3 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][0] - 2 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][0]), int(3 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][1] - 2 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][1]))
if pointOnTail == len(self._trackingDataPerWell[wellNumber][animalId][k]) - 1:
end_point = (int(2 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][0] - self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][0]), int(2 * self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][1] - self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][1]))
cv2.line(frame, start_point, end_point, (255, 255, 255), int(self._hyperparameters["maxDepth"]/3))
else:
frame = cv2.circle(frame.copy(), (int(self._wellPositions[wellNumber]['topLeftX'] + self._trackingDataPerWell[wellNumber][animalId][k][0][0]), int(self._wellPositions[wellNumber]['topLeftY'] + self._trackingDataPerWell[wellNumber][animalId][k][0][1])), int(self._hyperparameters["maxDepth"]/4), (255, 255, 255), -1)
for pointOnTail in range(1, len(self._trackingDataPerWell[wellNumber][animalId][k])):
start_point = (int(self._wellPositions[wellNumber]['topLeftX'] + self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][0]), int(self._wellPositions[wellNumber]['topLeftY'] + self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail-1][1]))
end_point = (int(self._wellPositions[wellNumber]['topLeftX'] + self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][0]), int(self._wellPositions[wellNumber]['topLeftY'] + self._trackingDataPerWell[wellNumber][animalId][k][pointOnTail][1]))
cv2.line(frame, start_point, end_point, (255, 255, 255), int(self._hyperparameters["maxDepth"]/5))

frame = removeAnimalJustTrackedFromFrame(self, frame, wellNumber, animalId, k)

if "animalDetectionBackToWholeImage" in self._hyperparameters and self._hyperparameters["animalDetectionBackToWholeImage"] and np.sum(animalNotTracked):
animalDetectionBackToWholeImage(self, k, frame, wellNumber, animalNotTracked)

# Id invertion if necessary
if self._hyperparameters["nbAnimalsPerWell"] > 1:
if self._hyperparameters["nbAnimalsPerWell"] > 1 and False:
# NEED TO IMPROVE THIS IN THE FUTURE!!!
for animalId in range(0, self._hyperparameters["nbAnimalsPerWell"]-1):
dist_animalIdCurFrame_animal0PrevFrame = math.sqrt((self._trackingDataPerWell[wellNumber][animalId][k][0][0] - self._trackingDataPerWell[wellNumber][0][k-1][0][0])**2 + (self._trackingDataPerWell[wellNumber][animalId][k][0][1] - self._trackingDataPerWell[wellNumber][0][k-1][0][1])**2)
Expand All @@ -99,6 +97,22 @@ def backgroundSubtractionOnlyOnROIs(self, frame, k):
temp = self._trackingDataPerWell[wellNumber][0][k].copy()
self._trackingDataPerWell[wellNumber][0][k] = self._trackingDataPerWell[wellNumber][1][k]
self._trackingDataPerWell[wellNumber][1][k] = temp

# Checking for superimposed tracking, removing them if necessary
if ("checkAndRemoveSuperimposedTrackingIfPresent_minDistance" in self._hyperparameters) and (self._hyperparameters["checkAndRemoveSuperimposedTrackingIfPresent_minDistance"] != 0):
for animalId1 in range(0, self._hyperparameters["nbAnimalsPerWell"]-1):
for animalId2 in range(animalId1 + 1, self._hyperparameters["nbAnimalsPerWell"]):
min_distBetweenTwoPointsOfAnimals = 10000000000000000000000
for p1 in range(len(self._trackingDataPerWell[wellNumber][animalId1][k])):
for p2 in range(len(self._trackingDataPerWell[wellNumber][animalId2][k])):
distBetweenTwoPointsOfAnimals = math.sqrt((self._trackingDataPerWell[wellNumber][animalId1][k][p1][0] - self._trackingDataPerWell[wellNumber][animalId2][k][p2][0])**2 + (self._trackingDataPerWell[wellNumber][animalId1][k][p1][1] - self._trackingDataPerWell[wellNumber][animalId2][k][p2][1])**2)
if distBetweenTwoPointsOfAnimals < min_distBetweenTwoPointsOfAnimals:
min_distBetweenTwoPointsOfAnimals = distBetweenTwoPointsOfAnimals
if min_distBetweenTwoPointsOfAnimals < self._hyperparameters["checkAndRemoveSuperimposedTrackingIfPresent_minDistance"]:
# randomly choosing to remove animalId1, in the future should better choose which one to remove
for p1 in range(len(self._trackingDataPerWell[wellNumber][animalId1][k])):
self._trackingDataPerWell[wellNumber][animalId1][k][p1][0] = 0
self._trackingDataPerWell[wellNumber][animalId1][k][p1][1] = 0
else:
for animalId in range(0, self._hyperparameters["nbAnimalsPerWell"]):
self._trackingDataPerWell[wellNumber][animalId][k] = self._trackingDataPerWell[wellNumber][animalId][k-1]
Loading

0 comments on commit 9c1aa6b

Please sign in to comment.