File size: 5,755 Bytes
6e251da
 
 
 
c900cba
 
 
6e251da
 
c900cba
 
 
 
 
 
 
 
6e251da
c900cba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e251da
 
c900cba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e251da
c900cba
 
 
6e251da
c900cba
 
6e251da
 
c900cba
6e251da
c900cba
 
6e251da
 
 
c900cba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e251da
c900cba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e251da
c900cba
 
 
 
 
 
 
 
 
 
 
 
6e251da
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import streamlit as st
import cv2
import numpy as np
import tempfile
from PIL import Image
import torch
from torchvision import transforms, models
import time

# Set page config
st.set_page_config(
    page_title="Dog Language Understanding",
    page_icon="πŸ•",
    layout="wide"
)

class DogBehaviorAnalyzer:
    def __init__(self):
        # Initialize model (using pretrained ResNet for this example)
        self.model = models.resnet50(pretrained=True)
        self.model.eval()
        
        # Define image transformations
        self.transform = transforms.Compose([
            transforms.Resize((224, 224)),
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.485, 0.456, 0.406],
                              std=[0.229, 0.224, 0.225])
        ])
        
        # Define behavior mappings
        self.behaviors = {
            'tail_wagging': 'Your dog is happy and excited!',
            'barking': 'Your dog is trying to communicate or alert you.',
            'ears_perked': 'Your dog is alert and interested.',
            'lying_down': 'Your dog is relaxed and comfortable.',
            'jumping': 'Your dog is energetic and playful!'
        }

    def analyze_frame(self, frame):
        # Convert frame to PIL Image
        image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
        
        # Transform image
        input_tensor = self.transform(image)
        input_batch = input_tensor.unsqueeze(0)
        
        # Simulate behavior detection
        # In a real implementation, you'd use a properly trained model
        behaviors = []
        confidence_scores = np.random.random(len(self.behaviors))
        
        for behavior, score in zip(self.behaviors.keys(), confidence_scores):
            if score > 0.7:  # Threshold for detection
                behaviors.append(behavior)
        
        return behaviors

def main():
    st.title("πŸ• Dog Language Understanding")
    st.write("Upload a video of your dog to analyze their behavior!")

    # Initialize analyzer
    analyzer = DogBehaviorAnalyzer()

    # File uploader
    video_file = st.file_uploader("Upload Video", type=['mp4', 'avi', 'mov'])

    if video_file is not None:
        # Save uploaded file temporarily
        tfile = tempfile.NamedTemporaryFile(delete=False)
        tfile.write(video_file.read())

        # Video analysis
        cap = cv2.VideoCapture(tfile.name)
        
        # Create columns for layout
        col1, col2 = st.columns(2)
        
        with col1:
            st.subheader("Video Preview")
            video_placeholder = st.empty()
            
        with col2:
            st.subheader("Real-time Analysis")
            analysis_placeholder = st.empty()
            
            # Progress bar
            progress_bar = st.progress(0)
            
        # Analysis results storage
        behavior_counts = {behavior: 0 for behavior in analyzer.behaviors.keys()}
        
        frame_count = 0
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        
        while cap.isOpened():
            ret, frame = cap.read()
            if not ret:
                break
                
            frame_count += 1
            progress = frame_count / total_frames
            progress_bar.progress(progress)
            
            # Update video preview
            video_placeholder.image(
                cv2.cvtColor(frame, cv2.COLOR_BGR2RGB),
                channels="RGB",
                use_column_width=True
            )
            
            # Analyze frame
            detected_behaviors = analyzer.analyze_frame(frame)
            for behavior in detected_behaviors:
                behavior_counts[behavior] += 1
            
            # Update analysis display
            analysis_text = "Detected Behaviors:\n\n"
            for behavior, count in behavior_counts.items():
                if count > 0:
                    analysis_text += f"β€’ {behavior.replace('_', ' ').title()}: {count} times\n"
                    analysis_text += f"  {analyzer.behaviors[behavior]}\n\n"
            
            analysis_placeholder.text_area(
                "Analysis Results",
                analysis_text,
                height=300
            )
            
            time.sleep(0.1)  # Add small delay for visualization
            
        cap.release()
        
        # Final summary
        st.subheader("Analysis Summary")
        st.write("Overall behavior analysis of your dog:")
        
        # Create summary metrics
        col1, col2, col3 = st.columns(3)
        
        with col1:
            most_common = max(behavior_counts.items(), key=lambda x: x[1])[0]
            st.metric("Most Common Behavior", most_common.replace('_', ' ').title())
            
        with col2:
            total_behaviors = sum(behavior_counts.values())
            st.metric("Total Behaviors Detected", total_behaviors)
            
        with col3:
            behavior_variety = len([b for b in behavior_counts.values() if b > 0])
            st.metric("Behavior Variety", f"{behavior_variety} types")
        
        # Recommendations
        st.subheader("Recommendations")
        if total_behaviors > 0:
            st.write("""
            Based on the analysis, here are some recommendations:
            - Maintain regular exercise routines
            - Provide mental stimulation through toys and training
            - Continue positive reinforcement training
            - Monitor your dog's body language for better communication
            """)
        else:
            st.write("No behaviors detected. Try uploading a different video with clearer dog movements.")

if __name__ == "__main__":
    main()